ZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS50ZXN0cy1mZWF0dXJlLy5jdnNpZ25vcmUgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0udGVzdHMtZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTQ0ODdjLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS50ZXN0cy1mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS50ZXN0cy1mZWF0dXJlLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLnRlc3RzLWZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0Njk5YzQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLnRlc3RzLWZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qZW0udGVzdHMtZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS50ZXN0cy1mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0udGVzdHMtZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2RjYzJlLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS50ZXN0cy1mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbAotZ2VuZXJhdGUucGx1Z2luQG9yZy5lY2xpcHNlLmplbS50ZXN0cy5zb3VyY2U9b3JnLmVjbGlwc2UuamVtLnRlc3RzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLnRlc3RzLWZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS50ZXN0cy1mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLnRlc3RzLWZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS50ZXN0cy1mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS50ZXN0cy1mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0udGVzdHMtZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+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+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLnRlc3RzLWZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLnRlc3RzLWZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2EwNjBiLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS50ZXN0cy1mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyAkU291cmNlOiAvY3Zzcm9vdC93ZWJ0b29scy9qZWV0b29scy5tb3ZlL3dlYnRvb2xzLmphdmFlZS50ZXN0cy5naXQvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLnRlc3RzLWZlYXR1cmUvQXR0aWMvZmVhdHVyZS5wcm9wZXJ0aWVzLHYgJAotIyAkUmV2aXNpb246IDEuOCAkICAkRGF0ZTogMjAwNi8wNS8xOCAxOTowOTo1NyAkCi0jCi0KLQotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUphdmEgRU1GIE1vZGVsIFRlc3RzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1WaXN1YWwgRWRpdG9yIHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1KYXZhIEVNRiBNb2RlbCBUZXN0cy4KLQotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLU1hcmNoIDE3LCAyMDA1XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS50ZXN0cy1mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLnRlc3RzLWZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ODcwMTcuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLnRlc3RzLWZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZW0udGVzdHMiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMS4yLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL3VwZGF0ZS5lY2xpcHNlLm9yZy90b29scy92ZS91cGRhdGVzLzEuMCIvPgotICAgICAgPGRpc2NvdmVyeSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly91cGRhdGUuZWNsaXBzZS5vcmcvdG9vbHMvdmUvdXBkYXRlcy8xLjAiLz4KLSAgIDwvdXJsPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmplbSIgdmVyc2lvbj0iMS4yLjAiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZW0udGVzdHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnRlc3QiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnBlcmZtc3IuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuYW50Lm9wdGlvbmFsLmp1bml0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmplbS50ZXN0cy5zb3VyY2UiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLnRlc3RzLWZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLnRlc3RzLWZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmFmOTY2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS50ZXN0cy1mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+TWFyY2ggMTcsIDIwMDU8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0gICAKLTx1bD4KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4gICAKLSAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotICAgCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS50ZXN0cy1mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0udGVzdHMtZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmNlZWQwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS50ZXN0cy1mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD48aGVhZD48dGl0bGU+QWJvdXQ8L3RpdGxlPgotCi0KLQotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+PC9oZWFkPjxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+TWF5IDIsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS50ZXN0cy1mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS50ZXN0cy1mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkzMTQ4OS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0udGVzdHMtZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWVjbGlwc2UzMi5wbmcKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uICh0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS50ZXN0cy1mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLnRlc3RzLWZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyMGNhODcuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLnRlc3RzLWZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MNCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzDQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQ0KLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4NCi0NCi0wPUBidWlsZEAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0udGVzdHMtZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLnRlc3RzLWZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRlZjJiYy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0udGVzdHMtZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgJFNvdXJjZTogL2N2c3Jvb3Qvd2VidG9vbHMvamVldG9vbHMubW92ZS93ZWJ0b29scy5qYXZhZWUudGVzdHMuZ2l0L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmplbS50ZXN0cy1mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL0F0dGljL2Fib3V0LnByb3BlcnRpZXMsdiAkCi0jICRSZXZpc2lvbjogMS43ICQgICREYXRlOiAyMDA2LzA1LzE4IDE5OjA5OjU3ICQKLSMKLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotYmx1cmI9SmF2YSBFTUYgTW9kZWwgVGVzdHMgU291cmNlXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzLiAyMDAwLCAyMDA2LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdmVwCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0udGVzdHMtZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLnRlc3RzLWZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRiMDhiYS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0udGVzdHMtZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5pbmksXAotICAgICAgICAgICAgICAgYWJvdXQubWFwcGluZ3MsXAotICAgICAgICAgICAgICAgYWJvdXQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlY2xpcHNlMzIucG5nLFwKLSAgICAgICAgICAgICAgIHNyYy8sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvCi1zb3VyY2VQbHVnaW4gPSB0cnVlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0udGVzdHMtZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIucG5nIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLnRlc3RzLWZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY4ZmFjMS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0udGVzdHMtZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtLnRlc3RzLWZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0udGVzdHMtZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI5ZDc1MS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0udGVzdHMtZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jICRTb3VyY2U6IC9jdnNyb290L3dlYnRvb2xzL2plZXRvb2xzLm1vdmUvd2VidG9vbHMuamF2YWVlLnRlc3RzLmdpdC9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZW0udGVzdHMtZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9BdHRpYy9wbHVnaW4ucHJvcGVydGllcyx2ICQKLSMgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjE6MDA6NTcgJAotIwotCi0KLXBsdWdpbk5hbWUgPSBKYXZhIEVNRiBNb2RlbCBUZXN0cyBTb3VyY2UKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV90ZXN0cy5mZWF0dXJlLy5jdnNpZ25vcmUgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV90ZXN0cy5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDQ4N2MuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdGVzdHMuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV90ZXN0cy5mZWF0dXJlLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdGVzdHMuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzliNDYxOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV90ZXN0cy5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdGVzdHMuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3Rlc3RzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3Rlc3RzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y0NzY5NC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV90ZXN0cy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3Rlc3RzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3Rlc3RzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV90ZXN0cy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV90ZXN0cy5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3Rlc3RzLmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3Rlc3RzLmZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+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+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3Rlc3RzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdGVzdHMuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2N2Y4NzkuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdGVzdHMuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1KU1QgRW50ZXJwcmlzZSBUZXN0cwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPUpTVCBlbnRlcnByaXNlIHRlc3RzCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLU1hcmNoIDE3LCAyMDA1XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3Rlc3RzLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmYTU5OTkuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3Rlc3RzLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMS41LjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9ImxpY2Vuc2UuaHRtbCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzLyIvPgotICAgPC91cmw+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLnBlcmZvcm1hbmNlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5wZXJmb3JtYW5jZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV90ZXN0cy5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3Rlc3RzLmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzQ3MDYwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3Rlc3RzLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzNjLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L2xvb3NlLmR0ZCI+Ci08IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQ0KWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsL25vdGljZS5odG1sIC0tPgotPEhUTUw+PEhFQUQ+PFRJVExFPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9USVRMRT4KLTxNRVRBIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2LjAwLjI4MDAuMTQ3OSIgbmFtZT1HRU5FUkFUT1I+PC9IRUFEPgotPEJPRFkgbGFuZz1FTi1VUyB2TGluaz1wdXJwbGUgbGluaz1ibHVlPgotPEgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvSDI+Ci08UD5KYW51YXJ5IDI4LCAyMDA1PC9QPgotPEgzPlVzYWdlIE9mIENvbnRlbnQ8L0gzPgotPFA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIAotQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0YgCi1USEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIAotQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCAKLUJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSAKLUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSAKLUFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIAotTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9QPgotPEgzPkFwcGxpY2FibGUgTGljZW5zZXM8L0gzPgotPFA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIAotRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIAotUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPEEgCi1ocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLTxQPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCAKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5IAotKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSAKLWFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9QPgotPFA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzIAotKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgCi1jb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyAKLWFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgCi1uYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICJmZWF0dXJlcyIuPC9QPgotPFA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkIAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgCi1GZWF0dXJlcy48L1A+Ci08UD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCAKLWluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIAotRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgCi0oIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSAKLWRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIAotbG9jYXRpb25zOjwvUD4KLTxVTD4KLSAgPExJPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeSAKLSAgPExJPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzIAotICA8TEk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zIAotICA8TEk+RmVhdHVyZSBkaXJlY3RvcmllcyA8L0xJPjwvVUw+Ci08UD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgCi11c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgCi1GZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyAKLWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIAotbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIAotZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIAotVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgCi1hbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IAotZGlyZWN0b3J5LjwvUD4KLTxQPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIAotT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIAotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L1A+Ci08VUw+Ci0gIDxMST5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9BPikgCi0KLSAgPExJPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9BPikgCi0KLSAgPExJPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L0E+KSAKLQotICA8TEk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvQT4pIAotICA8L0xJPjwvVUw+Ci08UD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgCi1wcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgCi1jb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L1A+Ci08SDM+Q3J5cHRvZ3JhcGh5PC9IMz4KLTxQPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSAKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIAotcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSAKLWVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyAKLWNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIAotdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvUD48L0JPRFk+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl90ZXN0cy5mZWF0dXJlLy5jdnNpZ25vcmUgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3Rlc3RzLmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0NDg3Yy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3Rlc3RzLmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl90ZXN0cy5mZWF0dXJlLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl90ZXN0cy5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzJlYTVlLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdGVzdHMuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53ZWJfdGVzdHMuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl90ZXN0cy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNDc2OTQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl90ZXN0cy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdGVzdHMuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl90ZXN0cy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl90ZXN0cy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3Rlc3RzLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl90ZXN0cy5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3Rlc3RzLmZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+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+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdGVzdHMuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3Rlc3RzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTNkNzEyLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdGVzdHMuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1KU1QgV2ViIFRlc3RzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249SlNUIFdlYiB0ZXN0cwotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1NYXJjaCAxNywgMjAwNVxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQwYjExYS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3Rlc3RzLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud2ViX3Rlc3RzLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMS41LjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9ImxpY2Vuc2UuaHRtbCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzLyIvPgotICAgPC91cmw+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRlc3RzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnRlc3RzLmVuY29kaW5nIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnRlc3RzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnRlc3RzLnBlcmZvcm1hbmNlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3Rlc3RzLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl90ZXN0cy5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM0NzA2MC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3Rlc3RzLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzNjLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L2xvb3NlLmR0ZCI+Ci08IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQ0KWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsL25vdGljZS5odG1sIC0tPgotPEhUTUw+PEhFQUQ+PFRJVExFPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9USVRMRT4KLTxNRVRBIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2LjAwLjI4MDAuMTQ3OSIgbmFtZT1HRU5FUkFUT1I+PC9IRUFEPgotPEJPRFkgbGFuZz1FTi1VUyB2TGluaz1wdXJwbGUgbGluaz1ibHVlPgotPEgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvSDI+Ci08UD5KYW51YXJ5IDI4LCAyMDA1PC9QPgotPEgzPlVzYWdlIE9mIENvbnRlbnQ8L0gzPgotPFA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIAotQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0YgCi1USEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIAotQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCAKLUJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSAKLUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSAKLUFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIAotTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9QPgotPEgzPkFwcGxpY2FibGUgTGljZW5zZXM8L0gzPgotPFA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIAotRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIAotUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPEEgCi1ocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLTxQPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCAKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5IAotKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSAKLWFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9QPgotPFA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzIAotKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgCi1jb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyAKLWFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgCi1uYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICJmZWF0dXJlcyIuPC9QPgotPFA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkIAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgCi1GZWF0dXJlcy48L1A+Ci08UD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCAKLWluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIAotRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgCi0oIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSAKLWRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIAotbG9jYXRpb25zOjwvUD4KLTxVTD4KLSAgPExJPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeSAKLSAgPExJPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzIAotICA8TEk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zIAotICA8TEk+RmVhdHVyZSBkaXJlY3RvcmllcyA8L0xJPjwvVUw+Ci08UD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgCi11c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgCi1GZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyAKLWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIAotbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIAotZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIAotVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgCi1hbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IAotZGlyZWN0b3J5LjwvUD4KLTxQPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIAotT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIAotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L1A+Ci08VUw+Ci0gIDxMST5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9BPikgCi0KLSAgPExJPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9BPikgCi0KLSAgPExJPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L0E+KSAKLQotICA8TEk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvQT4pIAotICA8L0xJPjwvVUw+Ci08UD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgCi1wcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgCi1jb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L1A+Ci08SDM+Q3J5cHRvZ3JhcGh5PC9IMz4KLTxQPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSAKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIAotcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSAKLWVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyAKLWNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIAotdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvUD48L0JPRFk+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzLy5jbGFzc3BhdGggYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJmMDRlMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iamF2YXRlc3RzLyIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InZtX3Rlc3RzIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy8uY3ZzaWdub3JlIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNDYzYWYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWJpbgotYnVpbGQueG1sCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvLnByb2plY3QgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZDU5NWIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuamVtLnRlc3RzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDY2Y2M3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwyODkgKzAsMCBAQAotI1R1ZSBGZWIgMjEgMTA6MDk6MTggRVNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWduX3R5cGVfbWVtYmVyc19vbl9jb2x1bW5zPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZW51bV9jb25zdGFudD0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2V4cGxpY2l0X2NvbnN0cnVjdG9yX2NhbGw9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9tZXRob2RfaW52b2NhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX3F1YWxpZmllZF9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2Fzc2lnbm1lbnQ9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYmluYXJ5X2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbXBhY3RfaWY9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbmRpdGlvbmFsX2V4cHJlc3Npb249ODAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2VudW1fY29uc3RhbnRzPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2V4cHJlc3Npb25zX2luX2FycmF5X2luaXRpYWxpemVyPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9tdWx0aXBsZV9maWVsZHM9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zZWxlY3Rvcl9pbl9tZXRob2RfaW52b2NhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJjbGFzc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fZW51bV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfaW1wb3J0cz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfcGFja2FnZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpZWxkPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmlyc3RfY2xhc3NfYm9keV9kZWNsYXJhdGlvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ltcG9ydHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZW1iZXJfdHlwZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21ldGhvZD0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX25ld19jaHVuaz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX3BhY2thZ2U9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5fdHlwZV9kZWNsYXJhdGlvbnM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2s9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2tfaW5fY2FzZT1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2NvbnN0YW50PWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfbWV0aG9kX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3N3aXRjaD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lcz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2NvbW1lbnRzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9oZWFkZXI9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9odG1sPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcGFyYW1ldGVyX2Rlc2NyaXB0aW9uPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9yb290X3RhZ3M9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9yb290X3RhZ3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfZm9yX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmxpbmVfbGVuZ3RoPTE1MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbXBhY3RfZWxzZV9pZj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5mb3JtYXRfZ3VhcmRpYW5fY2xhdXNlX29uX29uZV9saW5lPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19hbm5vdGF0aW9uX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9jb25zdGFudF9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b190eXBlX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JyZWFrc19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfZW1wdHlfbGluZXM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2Jsb2NrPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2JvZHk9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fc3dpdGNoPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2F0X2VuZF9vZl9maWxlX2lmX21pc3Npbmc9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2F0Y2hfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Vsc2VfaW5faWZfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2ZpbmFsbHlfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV93aGlsZV9pbl9kb19zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm5vdGF0aW9uX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X21ldGhvZF9ib2R5PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Nhc2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Fubm90YXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luaXRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9lbGxpcHNpcz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jYXNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZGVmYXVsdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luaXRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2VsbGlwc2lzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9zd2l0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9pZj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fcmV0dXJuPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fYnJhY2tldHNfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNlc19pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2tldHNfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2Vsc2Vfc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZW1wdHlfYXJyYXlfaW5pdGlhbGl6ZXJfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2ltcGxlX2lmX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF90aGVuX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5saW5lU3BsaXQ9MTUwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2JsYW5rX2xpbmVzX2F0X2JlZ2lubmluZ19vZl9tZXRob2RfYm9keT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2VtcHR5X2xpbmVzX3RvX3ByZXNlcnZlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5wdXRfZW1wdHlfc3RhdGVtZW50X29uX25ld19saW5lPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLmNoYXI9dGFiCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci51c2VfdGFic19vbmx5X2Zvcl9sZWFkaW5nX2luZGVudGF0aW9ucz1mYWxzZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU1ZTEzNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotI1R1ZSBGZWIgMjEgMTA6MDk6MTggRVNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1mb3JtYXR0ZXJfcHJvZmlsZT1fanZlCi1mb3JtYXR0ZXJfc2V0dGluZ3NfdmVyc2lvbj0xMAotb3JnLmVjbGlwc2UuamR0LnVpLmlnbm9yZWxvd2VyY2FzZW5hbWVzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC51aS5pbXBvcnRvcmRlcj1qYXZhO2phdmF4O29yZztvcmcuZWNsaXBzZS53dHA7b3JnLmVjbGlwc2UuamVtO29yZy5lY2xpcHNlLnZlLmludGVybmFsLmNkbTtvcmcuZWNsaXBzZS52ZS5pbnRlcm5hbC5jZGU7b3JnLmVjbGlwc2UudmUuaW50ZXJuYWwuamNtO29yZy5lY2xpcHNlLnZlLmludGVybmFsLmphdmE7b3JnLmVjbGlwc2UudmU7Y29tOwotb3JnLmVjbGlwc2UuamR0LnVpLm9uZGVtYW5kdGhyZXNob2xkPTMKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04Ij8+PHRlbXBsYXRlcy8+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvQmVhbkluZm8gQWxsU3VpdGVzIHdpdGggUmVtb3RlIERlYnVnLmxhdW5jaCBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9CZWFuSW5mbyBBbGxTdWl0ZXMgd2l0aCBSZW1vdGUgRGVidWcubGF1bmNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmU1YzgxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9CZWFuSW5mbyBBbGxTdWl0ZXMgd2l0aCBSZW1vdGUgRGVidWcubGF1bmNoCisrKyAvZGV2L251bGwKQEAgLTEsMjIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08bGF1bmNoQ29uZmlndXJhdGlvbiB0eXBlPSJvcmcuZWNsaXBzZS5wZGUudWkuSnVuaXRMYXVuY2hDb25maWciPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9InByb2R1Y3QiIHZhbHVlPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybS5pZGUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJib290c3RyYXAiIHZhbHVlPSIiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0idXNlUHJvZHVjdCIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0idm1pbnN0YWxsIiB2YWx1ZT0iamRrMS40LjJfMDUiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0idHJhY2luZyIgdmFsdWU9InRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQuanVuaXQuQ09OVEFJTkVSIiB2YWx1ZT0iIi8+Ci08bWFwQXR0cmlidXRlIGtleT0idHJhY2luZ09wdGlvbnMiPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2NvbXBhdGliaWxpdHkvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWcvcGFyc2luZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0ucHJveHkvcmVtb3RlL2RlYnVnL2lvY29uc29sZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5oZWxwLmJhc2UvZGVidWcvc2VhcmNoIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmhlbHAudWkvZGVidWciIHZhbHVlPSJ0cnVlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS50ZWFtLmN2cy5zc2gvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2xvYWRlci9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2VjbGlwc2VhZGFwdG9yL2RlYnVnL2xvY2F0aW9uIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZGVidWcvZmlsdGVyIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL21vbml0b3IvYnVpbGRlcnMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9kZWJ1Zy9wYWNrYWdlcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvbG9hZGVyL2RlYnVnL3N1Y2Nlc3MiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2RlYnVnL2xvZ3RyYWNlIiB2YWx1ZT0iZGVmYXVsdCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9kZWJ1Zy9jb250ZXh0IiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvbW9uaXRvci9jbGFzc2VzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS9kZWJ1Zy9sb2d0cmFjZWZpbGUiIHZhbHVlPSJkZWZhdWx0Ii8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9pbmRleG1hbmFnZXIiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2pvYnMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudGVhbS5jdnMuY29yZS9jdnNwcm90b2NvbCIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS91cmwvZGVidWcvY2FjaGVjb3B5IiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9sb2FkZXIvZGVidWcvcHJlZml4ZXMvc3VjY2VzcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS52ZS5qYXZhLmNvcmUvZGVidWcvbG9nbGV2ZWwiIHZhbHVlPSJkZWZhdWx0Ii8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvcmVnaXN0cnkvZGVidWcvZXZlbnRzL3BsdWdpbiIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9idWlsZGVyIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL2hpZXJhcmNoeSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9tb25pdG9yL2xpc3RlbmVycyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvbG9hZGVyL2RlYnVnL3ByZWZpeGVzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3NhdmUvdHJlZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS50ZWFtLmN2cy5jb3JlL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL3RyYWNlL2tleUJpbmRpbmdzLnZlcmJvc2UiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtL2RlYnVnL2xvZ3RyYWNlIiB2YWx1ZT0iZGVmYXVsdCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvamF2YWRlbHRhL3ZlcmJvc2UiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWcvcmVjb25jaWxlciIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9zYXZlL21hc3RlcnRhYmxlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS90aW1pbmcvc3RhcnR1cCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS90cmFjZS9jb250ZXh0cyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvbG9hZGVyL2RlYnVnL2FjdGl2YXRlcGx1Z2luIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5kZWJ1Zy9kZWJ1ZyIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL3NlbGVjdGlvbiIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvam9icy9lcnJvcm9uZGVhZGxvY2siIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvYnVmZmVybWFuYWdlciIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS90cmFjZS93b3JrYmVuY2gucmVzdG9yZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0udXRpbC9kZWJ1Zy9sb2d0cmFjZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQudWkvZGVidWciIHZhbHVlPSJ0cnVlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvbG9hZGVyL2RlYnVnL2ZpbHRlci9uYXRpdmUiIHZhbHVlPSIqIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS50ZWFtLmNvcmUvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvc2F2ZS9zbmFwc2hvdHMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvY29tcGlsZXIiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS90cmFjZS9hY3RpdmF0aW9uIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS51aS9kZWJ1Zy9sb2dsZXZlbCIgdmFsdWU9ImRlZmF1bHQiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnRlYW0uY3ZzLmNvcmUvbWV0YWZpbGVzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmhlbHAudWkvZGVidWcvaW5mb3BvcCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvcmVnaXN0cnkvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL3VybC9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2RlYnVnL21vbml0b3JidW5kbGVzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL2RlYnVnL3Vpam9iLmxvbmd3YXJuaW5nIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS5wcm94eS9kZWJ1Zy9sb2d0cmFjZSIgdmFsdWU9ImRlZmF1bHQiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3Jlc3RvcmUvbWV0YWluZm8iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS9kZWJ1Zy9pbnRlcm5hbGVycm9yL29wZW5EaWFsb2ciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvamF2YW1vZGVsIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUvZGVidWciIHZhbHVlPSJ0cnVlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQudWkvZGVidWcvYWxsVHlwZXNDYWNoZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5oZWxwL2RlYnVnIiB2YWx1ZT0idHJ1ZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvcmVzdG9yZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvbG9hZGVyL2RlYnVnL2ZhaWx1cmUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamZhY2UudGV4dC9kZWJ1Zy9Db250ZW50QXNzaXN0U3ViamVjdEFkYXB0ZXJzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5kZWJ1Zy51aS9kZWJ1ZyIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZGVidWcvZXZlbnRzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpLmludHJvL3RyYWNlL3ByaW50SFRNTCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2RlYnVnL3NlcnZpY2VzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2RlYnVnL3R5cGUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWciIHZhbHVlPSJ0cnVlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5oZWxwLmJhc2UvZGVidWciIHZhbHVlPSJ0cnVlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvcmVnaXN0cnkvZGVidWcvZXZlbnRzL2V4dGVuc2lvbiIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2VjbGlwc2VhZGFwdG9yL2RlYnVnL3BsYXRmb3JtYWRtaW4iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvYnVpbGQvZGVsdGEiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuZGVidWcudWkvZGVidWciIHZhbHVlPSJ0cnVlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS9kZWJ1Zy9jb25maWd1cmF0aW9uIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL3RyYWNlL3BhcnQuYWN0aXZhdGUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLnByb3h5L3JlbW90ZS9kZWJ1Zy9ub3RpbWVvdXRzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmhlbHAudWkvZGVidWcvZW1iZWRkZWRCcm93c2VyIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL2phdmFkZWx0YSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2RlYnVnL21hbmlmZXN0IiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZGVidWcvc2VjdXJpdHkiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvdHJhY2Uva2V5QmluZGluZ3MiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvcmVzdG9yZS9tYXJrZXJzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS90aW1pbmcvc2h1dGRvd24iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLnVpL2RlYnVnL2xvZ3RyYWNlZmlsZSIgdmFsdWU9ImRlZmF1bHQiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmhlbHAud2ViYXBwL2RlYnVnIiB2YWx1ZT0idHJ1ZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudmUuamF2YS5jb3JlL2RlYnVnL3ZldGltZXRyYWNlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3NhdmUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudmUuamF2YS5jb3JlL2RlYnVnL2xvZ3RyYWNlZmlsZSIgdmFsdWU9ImRlZmF1bHQiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL3RyYWNlL3BhcnQuY3JlYXRlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnZlLmphdmEuY29yZS9kZWJ1Zy9saXZld2luZG93IiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9sb2FkZXIvZGVidWcvY3JlYXRlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZGVidWcvc3RhcnRsZXZlbCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvbG9hZGVyL2RlYnVnL3ByZWZpeGVzL2ZhaWx1cmUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvdHJhY2Uvd29ya2JlbmNoLnN0YXJ0IiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL3RyYWNlL2hhbmRsZXJzLnZlcmJvc2UuY29tbWFuZElkIiB2YWx1ZT0iIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5hbnQuY29yZS9kZWJ1ZyIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnRlYW0uY3ZzLmNvcmUvZGlydHljYWNoaW5nIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3NhdmUvbWV0YWluZm8iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS9kZWJ1Zy9pbnN0YWxsaGFuZGxlciIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2RlYnVnL2J1bmRsZVRpbWUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2xvYWRlci9kZWJ1Zy9maWx0ZXIvbG9hZGVyIiB2YWx1ZT0iKiIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvYnVpbGQvbmVlZGJ1aWxkIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnZlLmphdmEuY29yZS9kZWJ1Zy9sb2d0cmFjZSIgdmFsdWU9ImRlZmF1bHQiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmhlbHAudWkvZGVidWcvZW1iZWRkZWRCcm93c2VyL2lucHJvY2VzcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9yZXN0b3JlL3N5bmNpbmZvIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL2J1aWxkL2ludm9raW5nIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnRlYW0uY3ZzLmNvcmUvc3luY2NoYW5nZWV2ZW50cyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvbG9hZGVyL2RlYnVnL2FjdGlvbnMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkuaW50cm8vdHJhY2UvbG9nSW5mbyIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9sb2FkZXIvZGVidWcvZmlsdGVyL3Jlc291cmNlIiB2YWx1ZT0iKiIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvYnVpbGQvZmFpbHVyZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS9kZWJ1Zy93ZWIiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvcmVmcmVzaCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2RlYnVnL2xvYWRlciIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL21vbml0b3IvYWN0aXZhdGlvbiIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS90cmFjZS9oYW5kbGVycy52ZXJib3NlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9kZWJ1Zy9sb2dsZXZlbCIgdmFsdWU9ImRlZmF1bHQiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZGVidWcvcGFja2FnZWFkbWluIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL3NlYXJjaCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS50ZWFtLmNvcmUvc3RyZWFtcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2RlYnVnL3BhY2thZ2VhZG1pbi90aW1pbmciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2pvYnMvYmVnaW5lbmQiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWcvaW5zdGFsbCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0ucHJveHkvcmVtb3RlL2RlYnVnL2RlYnVndm0iIHZhbHVlPSJ0cnVlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9oaXN0b3J5IiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnZlLmphdmEuY29yZS9kZWJ1Zy94bWx0ZXh0IiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS51dGlsL2RlYnVnL2xvZ3RyYWNlZmlsZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9wb3N0YWN0aW9uIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnRlYW0uY3ZzLmNvcmUvdGhyZWFkaW5nIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL3ppcGFjY2VzcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2VjbGlwc2VhZGFwdG9yL2RlYnVnL3BsYXRmb3JtYWRtaW4vcmVzb2x2ZXIiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvc2F2ZS9tYXJrZXJzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS5wcm94eS9yZW1vdGUvZGVidWcvdm10cmFjZW91dCIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS51aS9kZWJ1Zy9sb2d0cmFjZSIgdmFsdWU9ImRlZmF1bHQiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3Jlc3RvcmUvdHJlZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS9kZWJ1Zy93YXJuaW5nIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9jb250ZW50dHlwZXMvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy90cmFjZVByb3BlcnR5UmVzb2x2aW5nIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS91cmwvZGVidWcvY2FjaGVsb29rdXAiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL3JlZ2lzdHJ5L2RlYnVnL2R1bXAiIHZhbHVlPSIiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS9kZWJ1Zy9sb2dsZXZlbCIgdmFsdWU9ImRlZmF1bHQiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnBkZS5idWlsZC9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9wcmVmZXJlbmNlcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL3RyYWNlL2NsYXNzTG9hZGluZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvam9icy90aW1pbmciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9lY2xpcHNlYWRhcHRvci9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9zYXZlL3N5bmNpbmZvIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvdHJhY2UvZmlsdGVycyIgdmFsdWU9InRyYWNlLnByb3BlcnRpZXMiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS51dGlsL2RlYnVnL2xvZ2xldmVsIiB2YWx1ZT0iV0FSTklORyIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvdHJhY2UvZ3JhcGhpY3MiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LnVpL2RlYnVnL0FTVFByb3ZpZGVyIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9kZWJ1Zy9sb2d0cmFjZWZpbGUiIHZhbHVlPSJkZWZhdWx0Ii8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvY29uZmlnL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS91cmwvZGVidWcvY29ubmVjdCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS50ZWFtLmNvcmUvcmVmcmVzaGpvYiIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvbG9hZGVyL2RlYnVnL3Byb3BlcnRpZXMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvdHJhY2UvcGFydC5saXN0ZW5lcnMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudGVhbS5jdnMuc3NoL3NzaF9wcm90b2NvbCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS50ZWFtLmNvcmUvYmFja2dyb3VuZGV2ZW50cyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS9kZWJ1ZyIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS5wcm94eS9kZWJ1Zy9sb2d0cmFjZWZpbGUiIHZhbHVlPSJkZWZhdWx0Ii8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvam9icy9sb2NrcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9uYXR1cmVzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS5wcm94eS9kZWJ1Zy9sb2dsZXZlbCIgdmFsdWU9ImRlZmF1bHQiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL3RyYWNlL2NvbnRleHRzLnZlcmJvc2UiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvcmVzdG9yZS9tYXN0ZXJ0YWJsZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvcHJlZmVyZW5jZXMvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvdHJhY2UvcGVyc3BlY3RpdmUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvZGVidWcvam9iLnN0YWxlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL2NwcmVzb2x1dGlvbiIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9yZXN0b3JlL3NuYXBzaG90cyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS90cmFjZS9oYW5kbGVycyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9jb21wbGV0aW9uIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvbW9uaXRvci9yZXNvdXJjZXMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuaGVscC53ZWJhcHAvZGVidWcvd29ya2luZ3NldHMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkuaW50cm8vZGVidWciIHZhbHVlPSJ0cnVlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvZGVidWcvcGx1Z2luc3RvcHBlciIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2VjbGlwc2VhZGFwdG9yL2NvbnZlcnRlci9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5oZWxwL2RlYnVnL2NvbnRleHQiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL3JlZ2lzdHJ5L2RlYnVnL3Jlc29sdmUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS90cmFjZS9maWxlbmFtZSIgdmFsdWU9InJ1bnRpbWUudHJhY2VzIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZmFjZS50ZXh0L2RlYnVnL0Fubm90YXRpb25QYWludGVyIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmhlbHAvZGVidWcvcHJvdG9jb2xzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9sb2FkZXIvZGVidWcvZmlsdGVyL2NsYXNzIiB2YWx1ZT0iKiIvPgotPC9tYXBBdHRyaWJ1dGU+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ic2VsZWN0ZWRQbHVnaW4iIHZhbHVlPSJvcmcuZWNsaXBzZS5qZW0ucHJveHkiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0Lmp1bml0LktFRVBSVU5OSU5HX0FUVFIiIHZhbHVlPSJmYWxzZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9ImNoZWNrZWQiIHZhbHVlPSJvcmcuZWNsaXBzZS5qZW0ucHJveHkiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJhcHBsaWNhdGlvbiIgdmFsdWU9Im9yZy5lY2xpcHNlLnBkZS5qdW5pdC5ydW50aW1lLmNvcmV0ZXN0YXBwbGljYXRpb24iLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iY2xlYXJ3cyIgdmFsdWU9InRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLk1BSU5fVFlQRSIgdmFsdWU9Im9yZy5lY2xpcHNlLmplbS50ZXN0cy5iZWFuaW5mby5CZWFuSW5mb1N1aXRlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ibG9jYXRpb24xIiB2YWx1ZT0iRDpccnVudGltZS1qdW5pdC10ZXN0LXdvcmtzcGFjZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJkZWZhdWx0IiB2YWx1ZT0idHJ1ZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9InZtYXJncyIgdmFsdWU9IiIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJjbGVhckNvbmZpZyIgdmFsdWU9ImZhbHNlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuYXBwZW5kRW52aXJvbm1lbnRWYXJpYWJsZXMiIHZhbHVlPSJ0cnVlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5TT1VSQ0VfUEFUSF9QUk9WSURFUiIgdmFsdWU9Im9yZy5lY2xpcHNlLnBkZS51aS53b3JrYmVuY2hDbGFzc3BhdGhQcm92aWRlciIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9InByb2dhcmdzIiB2YWx1ZT0iLW9zIHdpbjMyIC13cyB3aW4zMiAtYXJjaCB4ODYgLW5sIGVuX1VTIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InVzZURlZmF1bHRDb25maWciIHZhbHVlPSJ0cnVlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0Lmp1bml0LlRFU1ROQU1FIiB2YWx1ZT0iIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5QUk9KRUNUX0FUVFIiIHZhbHVlPSJvcmcuZWNsaXBzZS5qZW0udGVzdHMiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iYXNrY2xlYXIiIHZhbHVlPSJ0cnVlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ibG9jYXRpb24wIiB2YWx1ZT0iRDpccnVudGltZS1qdW5pdC10ZXN0LXdvcmtzcGFjZSIvPgotPC9sYXVuY2hDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL0JlYW5JbmZvIEFsbFN1aXRlcy5sYXVuY2ggYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvQmVhbkluZm8gQWxsU3VpdGVzLmxhdW5jaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ4N2E4Yy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvQmVhbkluZm8gQWxsU3VpdGVzLmxhdW5jaAorKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGxhdW5jaENvbmZpZ3VyYXRpb24gdHlwZT0ib3JnLmVjbGlwc2UucGRlLnVpLkp1bml0TGF1bmNoQ29uZmlnIj4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJwcm9kdWN0IiB2YWx1ZT0ib3JnLmVjbGlwc2UucGxhdGZvcm0uaWRlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iYm9vdHN0cmFwIiB2YWx1ZT0iIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InVzZVByb2R1Y3QiIHZhbHVlPSJmYWxzZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9InZtaW5zdGFsbCIgdmFsdWU9Iko5XzE0Ml8yMDA0MDkyNiIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ0cmFjaW5nIiB2YWx1ZT0idHJ1ZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5qdW5pdC5DT05UQUlORVIiIHZhbHVlPSIiLz4KLTxtYXBBdHRyaWJ1dGUga2V5PSJ0cmFjaW5nT3B0aW9ucyI+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvY29tcGF0aWJpbGl0eS9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS9kZWJ1Zy9wYXJzaW5nIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmhlbHAuYmFzZS9kZWJ1Zy9zZWFyY2giIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLnByb3h5L3JlbW90ZS9kZWJ1Zy9pb2NvbnNvbGUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuaGVscC51aS9kZWJ1ZyIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnRlYW0uY3ZzLnNzaC9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvbG9hZGVyL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZWNsaXBzZWFkYXB0b3IvZGVidWcvbG9jYXRpb24iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9kZWJ1Zy9maWx0ZXIiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvbW9uaXRvci9idWlsZGVycyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2RlYnVnL3BhY2thZ2VzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9sb2FkZXIvZGVidWcvc3VjY2VzcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vZGVidWcvbG9ndHJhY2UiIHZhbHVlPSJkZWZhdWx0Ii8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2RlYnVnL2NvbnRleHQiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9tb25pdG9yL2NsYXNzZXMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvaW5kZXhtYW5hZ2VyIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS9kZWJ1Zy9sb2d0cmFjZWZpbGUiIHZhbHVlPSJkZWZhdWx0Ii8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvam9icyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS50ZWFtLmN2cy5jb3JlL2N2c3Byb3RvY29sIiB2YWx1ZT0idHJ1ZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL3VybC9kZWJ1Zy9jYWNoZWNvcHkiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2xvYWRlci9kZWJ1Zy9wcmVmaXhlcy9zdWNjZXNzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnZlLmphdmEuY29yZS9kZWJ1Zy9sb2dsZXZlbCIgdmFsdWU9ImRlZmF1bHQiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9yZWdpc3RyeS9kZWJ1Zy9ldmVudHMvcGx1Z2luIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL2J1aWxkZXIiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvaGllcmFyY2h5IiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9sb2FkZXIvZGVidWcvcHJlZml4ZXMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvbW9uaXRvci9saXN0ZW5lcnMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvc2F2ZS90cmVlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL3RyYWNlL2tleUJpbmRpbmdzLnZlcmJvc2UiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudGVhbS5jdnMuY29yZS9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0vZGVidWcvbG9ndHJhY2UiIHZhbHVlPSJkZWZhdWx0Ii8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS9kZWJ1Zy9yZWNvbmNpbGVyIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL2phdmFkZWx0YS92ZXJib3NlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3NhdmUvbWFzdGVydGFibGUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL3RpbWluZy9zdGFydHVwIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL3RyYWNlL2NvbnRleHRzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5kZWJ1Zy9kZWJ1ZyIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9sb2FkZXIvZGVidWcvYWN0aXZhdGVwbHVnaW4iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvc2VsZWN0aW9uIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9qb2JzL2Vycm9yb25kZWFkbG9jayIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9idWZmZXJtYW5hZ2VyIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL3RyYWNlL3dvcmtiZW5jaC5yZXN0b3JlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS51dGlsL2RlYnVnL2xvZ3RyYWNlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC51aS9kZWJ1ZyIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9sb2FkZXIvZGVidWcvZmlsdGVyL25hdGl2ZSIgdmFsdWU9IioiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnRlYW0uY29yZS9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9zYXZlL3NuYXBzaG90cyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9jb21waWxlciIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0udWkvZGVidWcvbG9nbGV2ZWwiIHZhbHVlPSJkZWZhdWx0Ii8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL3RyYWNlL2FjdGl2YXRpb24iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudGVhbS5jdnMuY29yZS9tZXRhZmlsZXMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuaGVscC51aS9kZWJ1Zy9pbmZvcG9wIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9yZWdpc3RyeS9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvdXJsL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZGVidWcvbW9uaXRvcmJ1bmRsZXMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvZGVidWcvdWlqb2IubG9uZ3dhcm5pbmciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLnByb3h5L2RlYnVnL2xvZ3RyYWNlIiB2YWx1ZT0iZGVmYXVsdCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvcmVzdG9yZS9tZXRhaW5mbyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL2RlYnVnL2ludGVybmFsZXJyb3Ivb3BlbkRpYWxvZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlL2RlYnVnIiB2YWx1ZT0idHJ1ZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvamF2YW1vZGVsIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmhlbHAvZGVidWciIHZhbHVlPSJ0cnVlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQudWkvZGVidWcvYWxsVHlwZXNDYWNoZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9yZXN0b3JlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9sb2FkZXIvZGVidWcvZmFpbHVyZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZmFjZS50ZXh0L2RlYnVnL0NvbnRlbnRBc3Npc3RTdWJqZWN0QWRhcHRlcnMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkuaW50cm8vdHJhY2UvcHJpbnRIVE1MIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZGVidWcvZXZlbnRzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5kZWJ1Zy51aS9kZWJ1ZyIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZGVidWcvc2VydmljZXMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWcvdHlwZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1ZyIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmhlbHAuYmFzZS9kZWJ1ZyIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9yZWdpc3RyeS9kZWJ1Zy9ldmVudHMvZXh0ZW5zaW9uIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZWNsaXBzZWFkYXB0b3IvZGVidWcvcGxhdGZvcm1hZG1pbiIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9idWlsZC9kZWx0YSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS9kZWJ1ZyIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2RlYnVnL2NvbmZpZ3VyYXRpb24iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvdHJhY2UvcGFydC5hY3RpdmF0ZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0ucHJveHkvcmVtb3RlL2RlYnVnL25vdGltZW91dHMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuaGVscC51aS9kZWJ1Zy9lbWJlZGRlZEJyb3dzZXIiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvamF2YWRlbHRhIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZGVidWcvbWFuaWZlc3QiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvdHJhY2Uva2V5QmluZGluZ3MiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9kZWJ1Zy9zZWN1cml0eSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9yZXN0b3JlL21hcmtlcnMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL3RpbWluZy9zaHV0ZG93biIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5oZWxwLndlYmFwcC9kZWJ1ZyIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnZlLmphdmEuY29yZS9kZWJ1Zy92ZXRpbWV0cmFjZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0udWkvZGVidWcvbG9ndHJhY2VmaWxlIiB2YWx1ZT0iZGVmYXVsdCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvc2F2ZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS52ZS5qYXZhLmNvcmUvZGVidWcvbG9ndHJhY2VmaWxlIiB2YWx1ZT0iZGVmYXVsdCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvdHJhY2UvcGFydC5jcmVhdGUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudmUuamF2YS5jb3JlL2RlYnVnL2xpdmV3aW5kb3ciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2xvYWRlci9kZWJ1Zy9jcmVhdGUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9kZWJ1Zy9zdGFydGxldmVsIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9sb2FkZXIvZGVidWcvcHJlZml4ZXMvZmFpbHVyZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS90cmFjZS93b3JrYmVuY2guc3RhcnQiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvdHJhY2UvaGFuZGxlcnMudmVyYm9zZS5jb21tYW5kSWQiIHZhbHVlPSIiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmFudC5jb3JlL2RlYnVnIiB2YWx1ZT0idHJ1ZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudGVhbS5jdnMuY29yZS9kaXJ0eWNhY2hpbmciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvc2F2ZS9tZXRhaW5mbyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2RlYnVnL2luc3RhbGxoYW5kbGVyIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZGVidWcvYnVuZGxlVGltZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvbG9hZGVyL2RlYnVnL2ZpbHRlci9sb2FkZXIiIHZhbHVlPSIqIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS52ZS5qYXZhLmNvcmUvZGVidWcvbG9ndHJhY2UiIHZhbHVlPSJkZWZhdWx0Ii8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9idWlsZC9uZWVkYnVpbGQiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvcmVzdG9yZS9zeW5jaW5mbyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5oZWxwLnVpL2RlYnVnL2VtYmVkZGVkQnJvd3Nlci9pbnByb2Nlc3MiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvYnVpbGQvaW52b2tpbmciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudGVhbS5jdnMuY29yZS9zeW5jY2hhbmdlZXZlbnRzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9sb2FkZXIvZGVidWcvYWN0aW9ucyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS5pbnRyby90cmFjZS9sb2dJbmZvIiB2YWx1ZT0idHJ1ZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2xvYWRlci9kZWJ1Zy9maWx0ZXIvcmVzb3VyY2UiIHZhbHVlPSIqIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS9kZWJ1Zy93ZWIiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvYnVpbGQvZmFpbHVyZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9yZWZyZXNoIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZGVidWcvbG9hZGVyIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvbW9uaXRvci9hY3RpdmF0aW9uIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL3RyYWNlL2hhbmRsZXJzLnZlcmJvc2UiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2RlYnVnL2xvZ2xldmVsIiB2YWx1ZT0iZGVmYXVsdCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9kZWJ1Zy9wYWNrYWdlYWRtaW4iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvc2VhcmNoIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnRlYW0uY29yZS9zdHJlYW1zIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9qb2JzL2JlZ2luZW5kIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZGVidWcvcGFja2FnZWFkbWluL3RpbWluZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS9kZWJ1Zy9pbnN0YWxsIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS5wcm94eS9yZW1vdGUvZGVidWcvZGVidWd2bSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9oaXN0b3J5IiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnZlLmphdmEuY29yZS9kZWJ1Zy94bWx0ZXh0IiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS51dGlsL2RlYnVnL2xvZ3RyYWNlZmlsZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS50ZWFtLmN2cy5jb3JlL3RocmVhZGluZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9wb3N0YWN0aW9uIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL3ppcGFjY2VzcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9zYXZlL21hcmtlcnMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9lY2xpcHNlYWRhcHRvci9kZWJ1Zy9wbGF0Zm9ybWFkbWluL3Jlc29sdmVyIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS5wcm94eS9yZW1vdGUvZGVidWcvdm10cmFjZW91dCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0udWkvZGVidWcvbG9ndHJhY2UiIHZhbHVlPSJkZWZhdWx0Ii8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9yZXN0b3JlL3RyZWUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWcvd2FybmluZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvY29udGVudHR5cGVzL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMvdHJhY2VQcm9wZXJ0eVJlc29sdmluZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvdXJsL2RlYnVnL2NhY2hlbG9va3VwIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9yZWdpc3RyeS9kZWJ1Zy9kdW1wIiB2YWx1ZT0iIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0vZGVidWcvbG9nbGV2ZWwiIHZhbHVlPSJkZWZhdWx0Ii8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5wZGUuYnVpbGQvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvcHJlZmVyZW5jZXMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS90cmFjZS9jbGFzc0xvYWRpbmciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2pvYnMvdGltaW5nIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZWNsaXBzZWFkYXB0b3IvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvc2F2ZS9zeW5jaW5mbyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL3RyYWNlL2ZpbHRlcnMiIHZhbHVlPSJ0cmFjZS5wcm9wZXJ0aWVzIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0udXRpbC9kZWJ1Zy9sb2dsZXZlbCIgdmFsdWU9IldBUk5JTkciLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL3RyYWNlL2dyYXBoaWNzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC51aS9kZWJ1Zy9BU1RQcm92aWRlciIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vZGVidWcvbG9ndHJhY2VmaWxlIiB2YWx1ZT0iZGVmYXVsdCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2NvbmZpZy9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvdXJsL2RlYnVnL2Nvbm5lY3QiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudGVhbS5jb3JlL3JlZnJlc2hqb2IiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2xvYWRlci9kZWJ1Zy9wcm9wZXJ0aWVzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL3RyYWNlL3BhcnQubGlzdGVuZXJzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnRlYW0uY3ZzLnNzaC9zc2hfcHJvdG9jb2wiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudGVhbS5jb3JlL2JhY2tncm91bmRldmVudHMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWciIHZhbHVlPSJ0cnVlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0ucHJveHkvZGVidWcvbG9ndHJhY2VmaWxlIiB2YWx1ZT0iZGVmYXVsdCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2pvYnMvbG9ja3MiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvbmF0dXJlcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0ucHJveHkvZGVidWcvbG9nbGV2ZWwiIHZhbHVlPSJkZWZhdWx0Ii8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS90cmFjZS9jb250ZXh0cy52ZXJib3NlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3Jlc3RvcmUvbWFzdGVydGFibGUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL3ByZWZlcmVuY2VzL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL3RyYWNlL3BlcnNwZWN0aXZlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL2RlYnVnL2pvYi5zdGFsZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9jcHJlc29sdXRpb24iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvcmVzdG9yZS9zbmFwc2hvdHMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvdHJhY2UvaGFuZGxlcnMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvY29tcGxldGlvbiIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL21vbml0b3IvcmVzb3VyY2VzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmhlbHAud2ViYXBwL2RlYnVnL3dvcmtpbmdzZXRzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpLmludHJvL2RlYnVnIiB2YWx1ZT0idHJ1ZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2RlYnVnL3BsdWdpbnN0b3BwZXIiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9lY2xpcHNlYWRhcHRvci9jb252ZXJ0ZXIvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuaGVscC9kZWJ1Zy9jb250ZXh0IiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9yZWdpc3RyeS9kZWJ1Zy9yZXNvbHZlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvdHJhY2UvZmlsZW5hbWUiIHZhbHVlPSJydW50aW1lLnRyYWNlcyIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamZhY2UudGV4dC9kZWJ1Zy9Bbm5vdGF0aW9uUGFpbnRlciIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5oZWxwL2RlYnVnL3Byb3RvY29scyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvbG9hZGVyL2RlYnVnL2ZpbHRlci9jbGFzcyIgdmFsdWU9IioiLz4KLTwvbWFwQXR0cmlidXRlPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9InNlbGVjdGVkUGx1Z2luIiB2YWx1ZT0ib3JnLmVjbGlwc2UuamVtLnByb3h5Ii8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5qdW5pdC5LRUVQUlVOTklOR19BVFRSIiB2YWx1ZT0iZmFsc2UiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJjaGVja2VkIiB2YWx1ZT0ib3JnLmVjbGlwc2UuamVtLnByb3h5Ii8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iYXBwbGljYXRpb24iIHZhbHVlPSJvcmcuZWNsaXBzZS5wZGUuanVuaXQucnVudGltZS5jb3JldGVzdGFwcGxpY2F0aW9uIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImNsZWFyd3MiIHZhbHVlPSJ0cnVlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5NQUlOX1RZUEUiIHZhbHVlPSJvcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm8uQmVhbkluZm9TdWl0ZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9ImxvY2F0aW9uMSIgdmFsdWU9IkQ6XHJ1bnRpbWUtanVuaXQtdGVzdC13b3Jrc3BhY2UiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iZGVmYXVsdCIgdmFsdWU9InRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJ2bWFyZ3MiIHZhbHVlPSIiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iY2xlYXJDb25maWciIHZhbHVlPSJmYWxzZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLmFwcGVuZEVudmlyb25tZW50VmFyaWFibGVzIiB2YWx1ZT0idHJ1ZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuU09VUkNFX1BBVEhfUFJPVklERVIiIHZhbHVlPSJvcmcuZWNsaXBzZS5wZGUudWkud29ya2JlbmNoQ2xhc3NwYXRoUHJvdmlkZXIiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJwcm9nYXJncyIgdmFsdWU9Ii1vcyB3aW4zMiAtd3Mgd2luMzIgLWFyY2ggeDg2IC1ubCBlbl9VUyIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ1c2VEZWZhdWx0Q29uZmlnIiB2YWx1ZT0idHJ1ZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5qdW5pdC5URVNUTkFNRSIgdmFsdWU9IiIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuUFJPSkVDVF9BVFRSIiB2YWx1ZT0ib3JnLmVjbGlwc2UuamVtLnRlc3RzIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImFza2NsZWFyIiB2YWx1ZT0idHJ1ZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9ImxvY2F0aW9uMCIgdmFsdWU9IkQ6XHJ1bnRpbWUtanVuaXQtdGVzdC13b3Jrc3BhY2UiLz4KLTwvbGF1bmNoQ29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9KYXZhIEFsbFN1aXRlcy5sYXVuY2ggYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvSmF2YSBBbGxTdWl0ZXMubGF1bmNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjUzMDU5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9KYXZhIEFsbFN1aXRlcy5sYXVuY2gKKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxsYXVuY2hDb25maWd1cmF0aW9uIHR5cGU9Im9yZy5lY2xpcHNlLnBkZS51aS5KdW5pdExhdW5jaENvbmZpZyI+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0icHJvZHVjdCIgdmFsdWU9Im9yZy5lY2xpcHNlLnBsYXRmb3JtLmlkZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9ImJvb3RzdHJhcCIgdmFsdWU9IiIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ1c2VQcm9kdWN0IiB2YWx1ZT0iZmFsc2UiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0idHJhY2luZyIgdmFsdWU9InRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQuanVuaXQuQ09OVEFJTkVSIiB2YWx1ZT0iIi8+Ci08bWFwQXR0cmlidXRlIGtleT0idHJhY2luZ09wdGlvbnMiPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudGVhbS5jdnMuY29yZS9zeW5jY2hhbmdlZXZlbnRzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnZlLmphdmEuY29yZS9kZWJ1Zy94bWx0ZXh0IiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmhlbHAud2ViYXBwL2RlYnVnL3dvcmtpbmdzZXRzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZGVmYXVsdHByb2ZpbGUvbG9nZmlsZW5hbWUiIHZhbHVlPSIiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9sb2FkZXIvZGVidWcvZmlsdGVyL2xvYWRlciIgdmFsdWU9IioiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS9kZWJ1Zy9sb2d0cmFjZSIgdmFsdWU9ImRlZmF1bHQiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9sb2FkZXIvZGVidWcvYWN0aW9ucyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0ucHJveHkvZGVidWcvdHJhY2VleHByZXNzaW9uc3RpbWV0aHJlc2hvbGQiIHZhbHVlPSIxMDAiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS91cmwvZGVidWcvY29ubmVjdCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZmFjZS50ZXh0L2RlYnVnL0NvbnRlbnRBc3Npc3RTdWJqZWN0QWRhcHRlcnMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvcGVyZi9saXN0ZW5lcnMiIHZhbHVlPSI1MDAiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3Jlc3RvcmUvbWFya2VycyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9idWlsZC9uZWVkYnVpbGQiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLnV0aWwvZGVidWcvbG9ndHJhY2UiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvdHJhY2UvZ3JhcGhpY3MiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvcmVzb2x1dGlvbiIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS50ZWFtLmN2cy5zc2gvc3NoX3Byb3RvY29sIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvcGVyZi9zbmFwc2hvdCIgdmFsdWU9IjUwMCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9tb25pdG9yL2FjdGl2YXRpb24iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL3JlZ2lzdHJ5L2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZGVidWcvcGFja2FnZXMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvZGVidWcvc2hvd1N5c3RlbUpvYnMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2xvYWRlci9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvbG9hZGVyL2RlYnVnL3ByZWZpeGVzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS5wcm94eS9yZW1vdGUvZGVidWcvdm10cmFjZW91dCIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS91cmwvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9tb25pdG9yL2NsYXNzZXMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWciIHZhbHVlPSJ0cnVlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2VjbGlwc2VhZGFwdG9yL2NvbnZlcnRlci9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvZGVidWcvY29udGV4dCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2VjbGlwc2VhZGFwdG9yL2RlYnVnL3BsYXRmb3JtYWRtaW4iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuaGVscC51aS9kZWJ1Zy9lbWJlZGRlZEJyb3dzZXIiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvZGVidWcvc3d0ZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL3ByZWZlcmVuY2VzL3NldCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9qYXZhbW9kZWwiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudGVhbS5jb3JlL3N0cmVhbXMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2pvYnMvbG9ja3MiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvdHJhY2Uva2V5QmluZGluZ3MiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkuaW50cm8vdHJhY2UvcHJpbnRIVE1MIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9yZWdpc3RyeS9kZWJ1Zy9kdW1wIiB2YWx1ZT0iIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQudWkvZGVidWcvVHlwZUNvbnN0cmFpbnRzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL2phdmFkZWx0YS92ZXJib3NlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnIiB2YWx1ZT0idHJ1ZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy90cmFjZVByb3BlcnR5UmVzb2x2aW5nIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3Jlc3RvcmUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS90cmFjZS9maWxlbmFtZSIgdmFsdWU9InJ1bnRpbWUudHJhY2VzIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS9kZWJ1Zy93ZWIiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL3JlZ2lzdHJ5L2RlYnVnL3Jlc29sdmUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9idWlsZC9kZWx0YSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL3RyYWNlL2FjdGl2YXRpb24iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvc2VhcmNoIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC51aS9kZWJ1Zy9jaGVja0NvcmVCaW5kaW5nSXNFcXVhbFRvIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnZlLmphdmEuY29yZS9kZWJ1Zy9sb2d0cmFjZSIgdmFsdWU9ImRlZmF1bHQiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL2NvbXBpbGVyIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpmYWNlLnRleHQvZGVidWcvQW5ub3RhdGlvblBhaW50ZXIiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LnVpL2RlYnVnIiB2YWx1ZT0idHJ1ZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL3JlZ2lzdHJ5L2RlYnVnL2V2ZW50cy9wbHVnaW4iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWcvY29uZmlndXJhdGlvbiIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vZGVidWcvbG9ndHJhY2UiIHZhbHVlPSJkZWZhdWx0Ii8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS90cmFjZS9wYXJ0LmFjdGl2YXRlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvcmVzb2x2ZXIvaW1wb3J0cyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL3RyYWNlL2ZpbHRlcnMiIHZhbHVlPSJ0cmFjZS5wcm9wZXJ0aWVzIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2VjbGlwc2VhZGFwdG9yL2RlYnVnL3BsYXRmb3JtYWRtaW4vcmVzb2x2ZXIiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuaGVscC51aS9kZWJ1Zy9pbmZvcG9wIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9kZWJ1Zy9sb2d0cmFjZWZpbGUiIHZhbHVlPSJkZWZhdWx0Ii8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvcmVnaXN0cnkvZGVidWcvZXZlbnRzL2V4dGVuc2lvbiIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0udWkvZGVidWcvbG9ndHJhY2VmaWxlIiB2YWx1ZT0iZGVmYXVsdCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLnVpL2RlYnVnL2xvZ3RyYWNlIiB2YWx1ZT0iZGVmYXVsdCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuaGVscC53ZWJhcHAvZGVidWciIHZhbHVlPSJ0cnVlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9oaWVyYXJjaHkiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvcmVmcmVzaCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS50ZWFtLmN2cy5jb3JlL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnRlYW0uY29yZS9iYWNrZ3JvdW5kZXZlbnRzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL2NwcmVzb2x1dGlvbiIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS50ZWFtLmN2cy5jb3JlL3RocmVhZGluZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0ucHJveHkvZGVidWcvbG9nbGV2ZWwiIHZhbHVlPSJkZWZhdWx0Ii8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS9kZWJ1Zy93YXJuaW5nIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9kZWJ1Zy9sb2dsZXZlbCIgdmFsdWU9ImRlZmF1bHQiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3NhdmUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9yZXNvbHZlci9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS9kZWJ1Zy9pbnN0YWxsIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL2RlYnVnL2ludGVybmFsZXJyb3Ivb3BlbkRpYWxvZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvam9icy9lcnJvcm9uZGVhZGxvY2siIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuaGVscC51aS9kZWJ1Zy9lbWJlZGRlZEJyb3dzZXIvaW5wcm9jZXNzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvcHJvZmlsZS9pbXBsIiB2YWx1ZT0ib3JnLmVjbGlwc2Uub3NnaS5wcm9maWxlLkRlZmF1bHRQcm9maWxlTG9nZ2VyIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL3Byb2ZpbGUvYmVuY2htYXJrIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS9kZWJ1Zy9sb2d0cmFjZWZpbGUiIHZhbHVlPSJkZWZhdWx0Ii8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS9kZWJ1Zy9wYXJzaW5nIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9wcmVmZXJlbmNlcy9nZW5lcmFsIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3Jlc3RvcmUvc3luY2luZm8iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudGVhbS5jdnMuY29yZS9jdnNwcm90b2NvbCIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL3Bvc3RhY3Rpb24iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvdHJhY2UvcGVyc3BlY3RpdmUubGlzdGVuZXJzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnRlYW0uY29yZS90aHJlYWRpbmciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLnByb3h5L3JlbW90ZS9kZWJ1Zy9ub3RpbWVvdXRzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS91cmwvZGVidWcvY2FjaGVsb29rdXAiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9kZWJ1Zy9wYWNrYWdlYWRtaW4vdGltaW5nIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2RlYnVnL3JlY29uY2lsZXIiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLnByb3h5L2RlYnVnL3RyYWNlZXhwcmVzc2lvbnMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9kZWJ1Zy9zZWN1cml0eSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0ucHJveHkvcmVtb3RlL2RlYnVnL2RlYnVndm0iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9kZWJ1Zy9tYW5pZmVzdCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5oZWxwL2RlYnVnL2NvbnRleHQiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvYnVpbGRlciIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL3Jlc29sdmVyL3JlcXVpcmVzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3NhdmUvc3luY2luZm8iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudmUuamF2YS5jb3JlL2RlYnVnL2xvZ2xldmVsIiB2YWx1ZT0iZGVmYXVsdCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9wcm9maWxlL3N0YXJ0dXAiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2xvYWRlci9kZWJ1Zy9maWx0ZXIvcmVzb3VyY2UiIHZhbHVlPSIqIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2RlYnVnL3NlcnZpY2VzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9sb2FkZXIvZGVidWcvYWN0aXZhdGVwbHVnaW4iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudGVhbS5jdnMuc3NoL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL3RyYWNlL2hhbmRsZXJzLnZlcmJvc2UiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvc2F2ZS9tYXJrZXJzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnZlLmphdmEuY29yZS9kZWJ1Zy9saXZld2luZG93IiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2RlYnVnL2luc3RhbGxoYW5kbGVyIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZGVidWcvc3RhcnRsZXZlbCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL21vbml0b3IvcmVzb3VyY2VzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS5wcm94eS9yZW1vdGUvZGVidWcvaW9jb25zb2xlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnZlLmphdmEuY29yZS9kZWJ1Zy92ZXRpbWV0cmFjZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0udWkvZGVidWcvbG9nbGV2ZWwiIHZhbHVlPSJkZWZhdWx0Ii8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9qYXZhZGVsdGEiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvc2VsZWN0aW9uIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3ByZWZlcmVuY2VzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3Jlc3RvcmUvdHJlZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS90cmFjZS93b3JrYmVuY2gucmVzdG9yZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS90cmFjZS9wYXJ0LmNyZWF0ZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5oZWxwL2RlYnVnL3Byb3RvY29scyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9yZXN0b3JlL3NuYXBzaG90cyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9uYXR1cmVzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmhlbHAuYmFzZS9kZWJ1Zy9zZWFyY2giIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudGVhbS5jdnMuY29yZS9kaXJ0eWNhY2hpbmciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtL2RlYnVnL2xvZ2xldmVsIiB2YWx1ZT0iZGVmYXVsdCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9kZWZhdWx0cHJvZmlsZS9idWZmZXJzaXplIiB2YWx1ZT0iMjU2Ii8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvbG9hZGVyL2RlYnVnL2ZpbHRlci9uYXRpdmUiIHZhbHVlPSIqIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy96aXBhY2Nlc3MiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2xvYWRlci9kZWJ1Zy9wcm9wZXJ0aWVzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS91cmwvZGVidWcvY2FjaGVjb3B5IiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvcmVzb2x2ZXIvY3ljbGVzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9sb2FkZXIvZGVidWcvY3JlYXRlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL3RyYWNlL2luY2x1ZGUudGltaW5ncyIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL3RyYWNlL2tleUJpbmRpbmdzLnZlcmJvc2UiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9kZWJ1Zy9idW5kbGVUaW1lIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9qb2JzL2JlZ2luZW5kIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnRlYW0uY3ZzLmNvcmUvbWV0YWZpbGVzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9wcmVmZXJlbmNlcy9nZXQiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudGVhbS5jb3JlL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9wZXJmL3N1Y2Nlc3MiIHZhbHVlPSJ0cnVlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2RlYnVnL2V2ZW50cyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvY29tcGF0aWJpbGl0eS9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS9kZWJ1Zy9kZWNsYXJlZEltYWdlcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2RlYnVnL21vbml0b3JidW5kbGVzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9sb2FkZXIvZGVidWcvcHJlZml4ZXMvc3VjY2VzcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5wZGUuYnVpbGQvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLnV0aWwvZGVidWcvbG9ndHJhY2VmaWxlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZWNsaXBzZWFkYXB0b3IvZGVidWcvbG9jYXRpb24iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvdHJhY2UvY29udGV4dHMudmVyYm9zZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5oZWxwLmJhc2UvZGVidWciIHZhbHVlPSJ0cnVlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvZGVidWcvcGx1Z2luc3RvcHBlciIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvam9icyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS90cmFjZS93b3JrYmVuY2guc3RhcnQiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLnByb3h5L2RlYnVnL2xvZ3RyYWNlIiB2YWx1ZT0iZGVmYXVsdCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2NvbnRlbnR0eXBlcy9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9zdHJpbmdzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC51aS9kZWJ1Zy9jaGVja0NvcmVCaW5kaW5nR2V0SmF2YUVsZW1lbnQiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvc2F2ZS9tZXRhaW5mbyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvdGltaW5nL3N0YXJ0dXAiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9yZXNvbHZlci93aXJpbmciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9wcm9maWxlL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9wZXJmIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL3RyYWNlL2NvbnRleHRzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL2J1aWxkL2ludm9raW5nIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9sb2FkZXIvZGVidWcvZmFpbHVyZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS9kZWJ1Zy91aWpvYi5sb25nd2FybmluZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0udXRpbC9kZWJ1Zy9sb2dsZXZlbCIgdmFsdWU9IldBUk5JTkciLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3BlcmYvYnVpbGRlcnMiIHZhbHVlPSIxMDAwMCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWcvdHlwZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS90cmFjZS9wYWdlLmxpc3RlbmVycyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS9kZWJ1Zy9qb2Iuc3RhbGUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LnVpL2RlYnVnL2FsbFR5cGVzQ2FjaGUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLnByb3h5L2RlYnVnL2xvZ3RyYWNlZmlsZSIgdmFsdWU9ImRlZmF1bHQiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL2hpc3RvcnkiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudGVhbS5jb3JlL3JlZnJlc2hqb2IiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkuaW50cm8vZGVidWciIHZhbHVlPSJ0cnVlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9jb21wbGV0aW9uIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZWNsaXBzZWFkYXB0b3IvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS9kZWJ1ZyIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmhlbHAvZGVidWciIHZhbHVlPSJ0cnVlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS90cmFjZS9wZXJzcGVjdGl2ZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9pbmRleG1hbmFnZXIiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9kZWJ1Zy9wYWNrYWdlYWRtaW4iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9kZWJ1Zy9sb2FkZXIiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvYnVpbGQvZmFpbHVyZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS90cmFjZS9oYW5kbGVycyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9zYXZlL3RyZWUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2NvbmZpZy9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2RlZmF1bHRwcm9maWxlL2xvZ3N5bmNocm9ub3VzbHkiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS90cmFjZS9jbGFzc0xvYWRpbmciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuaGVscC51aS9kZWJ1ZyIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3Jlc3RvcmUvbWV0YWluZm8iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvc2F2ZS9tYXN0ZXJ0YWJsZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvcGVyZi9mYWlsdXJlIiB2YWx1ZT0idHJ1ZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL3RyYWNlL2hhbmRsZXJzLnZlcmJvc2UuY29tbWFuZElkIiB2YWx1ZT0iIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9idWZmZXJtYW5hZ2VyIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZGVidWcvZmlsdGVyIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvcmVzb2x2ZXIvZ3JvdXBpbmciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvdHJhY2UvcGFydC5saXN0ZW5lcnMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LnVpL2RlYnVnL0FTVFByb3ZpZGVyIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9sb2FkZXIvZGVidWcvc3VjY2VzcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9yZXN0b3JlL21hc3RlcnRhYmxlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpLmludHJvL3RyYWNlL2xvZ0luZm8iIHZhbHVlPSJ0cnVlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS52ZS5qYXZhLmNvcmUvZGVidWcvbG9ndHJhY2VmaWxlIiB2YWx1ZT0iZGVmYXVsdCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2xvYWRlci9kZWJ1Zy9maWx0ZXIvY2xhc3MiIHZhbHVlPSIqIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvam9icy90aW1pbmciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2xvYWRlci9kZWJ1Zy9wcmVmaXhlcy9mYWlsdXJlIiB2YWx1ZT0iZmFsc2UiLz4KLTwvbWFwQXR0cmlidXRlPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJhdXRvbWF0aWNWYWxpZGF0ZSIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ic2VsZWN0ZWRQbHVnaW4iIHZhbHVlPSJvcmcuZWNsaXBzZS5qZW0ucHJveHkiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0Lmp1bml0LktFRVBSVU5OSU5HX0FUVFIiIHZhbHVlPSJmYWxzZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJhdXRvbWF0aWNBZGQiIHZhbHVlPSJ0cnVlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ibG9jYXRpb24iIHZhbHVlPSJEOlxydW50aW1lLWp1bml0LXRlc3Qtd29ya3NwYWNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iY29uZmlnTG9jYXRpb24iIHZhbHVlPSIiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iY2xlYXJ3cyIgdmFsdWU9InRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLk1BSU5fVFlQRSIgdmFsdWU9Im9yZy5lY2xpcHNlLmplbS50ZXN0cy5BbGxTdWl0ZXMiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJsb2NhdGlvbjEiIHZhbHVlPSJEOlxydW50aW1lLWp1bml0LXRlc3Qtd29ya3NwYWNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5QUk9HUkFNX0FSR1VNRU5UUyIgdmFsdWU9Ii1vcyB3aW4zMiAtd3Mgd2luMzIgLWFyY2ggeDg2IC1ubCBlbl9VUyIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9InBkZS52ZXJzaW9uIiB2YWx1ZT0iMy4yIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImRlZmF1bHQiIHZhbHVlPSJ0cnVlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImNsZWFyQ29uZmlnIiB2YWx1ZT0iZmFsc2UiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5hcHBlbmRFbnZpcm9ubWVudFZhcmlhYmxlcyIgdmFsdWU9InRydWUiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0idXNlRGVmYXVsdENvbmZpZ0FyZWEiIHZhbHVlPSJ0cnVlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5TT1VSQ0VfUEFUSF9QUk9WSURFUiIgdmFsdWU9Im9yZy5lY2xpcHNlLnBkZS51aS53b3JrYmVuY2hDbGFzc3BhdGhQcm92aWRlciIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ1c2VEZWZhdWx0Q29uZmlnIiB2YWx1ZT0idHJ1ZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5qdW5pdC5URVNUTkFNRSIgdmFsdWU9IiIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuUFJPSkVDVF9BVFRSIiB2YWx1ZT0ib3JnLmVjbGlwc2UuamVtLnRlc3RzIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImFza2NsZWFyIiB2YWx1ZT0idHJ1ZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJpbmNsdWRlT3B0aW9uYWwiIHZhbHVlPSJ0cnVlIi8+Ci08L2xhdW5jaENvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhZjkyMzguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmplbS50ZXN0czsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NQYXRoOiBqYXZhdGVzdHMuamFyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qZW0udGVzdHMuSmF2YVRlc3RzUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBpbml0UGFyc2VyVGVzdDQ2Mzc2O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuamVtLnRlc3RzLAotIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5iYXNpYywKLSBvcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm8sCi0gb3JnLmVjbGlwc2UuamVtLnRlc3RzLmluc3RhbnRpYXRpb24sCi0gb3JnLmVjbGlwc2UuamVtLnRlc3RzLm1vZGVsTGlzdGVuZXJzLAotIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eSwKLSBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaWRlLAotIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLAotIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLnRyZWUsCi0gb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LnJlbW90ZQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmplbS5wcm94eSwKLSBvcmcuanVuaXQsCi0gb3JnLmVjbGlwc2UuYW50LmNvcmUsCi0gb3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlLAotIG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsCi0gb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZywKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUsCi0gb3JnLmVjbGlwc2UuamVtLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLAotIG9yZy5lY2xpcHNlLmplbS51dGlsCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2Fib3V0Lmh0bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZjZWVkMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPjxoZWFkPjx0aXRsZT5BYm91dDwvdGl0bGU+Ci0KLQotCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj48L2hlYWQ+PGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5NYXkgMiwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2Fib3V0LmluaSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5MzE0ODkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9ZWNsaXBzZTMyLnBuZwotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2Fib3V0Lm1hcHBpbmdzIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGRhYWI0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvYWJvdXQucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTI5ZWE1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgJFNvdXJjZTogL2N2c3Jvb3Qvd2VidG9vbHMvamVldG9vbHMubW92ZS93ZWJ0b29scy5qYXZhZWUudGVzdHMuZ2l0L3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9hYm91dC5wcm9wZXJ0aWVzLHYgJAotIyAkUmV2aXNpb246IDEuOCAkICAkRGF0ZTogMjAwNi8wNS8xOCAxOTowOTo1NiAkCi0jCi0KLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLWJsdXJiPUphdmEgRU1GIE1vZGVsIFRlc3RzXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzLiAyMDAwLCAyMDA2LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdmVwCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvYnVpbGQucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTAxYjM2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBqYXZhdGVzdHMuamFyLFwKLSAgICAgICAgICAgICAgIHZtL3Rlc3RzLmphcixcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHRlc3RkYXRhLyxcCi0gICAgICAgICAgICAgICB0ZXN0LnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5pbmksXAotICAgICAgICAgICAgICAgYWJvdXQubWFwcGluZ3MsXAotICAgICAgICAgICAgICAgYWJvdXQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlY2xpcHNlMzIucG5nLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLwotamFycy5jb21waWxlLm9yZGVyID0gdm0vdGVzdHMuamFyLFwKLSAgICAgICAgICAgICAgICAgICAgIGphdmF0ZXN0cy5qYXIKLXNvdXJjZS52bS90ZXN0cy5qYXIgPSB2bV90ZXN0cy8KLXNvdXJjZS5qYXZhdGVzdHMuamFyID0gamF2YXRlc3RzLwotc3JjLmluY2x1ZGVzID0gcHJveHkuamFycwpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2VjbGlwc2UzMi5wbmcgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvZWNsaXBzZTMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY4ZmFjMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvZWNsaXBzZTMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvSW5pdFBhcnNlclRlc3Q0NjM3Ni5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9Jbml0UGFyc2VyVGVzdDQ2Mzc2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMzZhZGEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9Jbml0UGFyc2VyVGVzdDQ2Mzc2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBJbml0UGFyc2VyVGVzdDQ2Mzc2LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6NTg6NTQgJCAKLSAqLwotIAotLyoqCi0gKiBUaGlzIGlzIHRvIHRlc3QgZm9yIGRlZmVjdCBbNDYzNzZdLgotICogCi0gKiBTYW1lTmFtZSB0ZXN0LiBUaGlzIGlzIHRlc3Qgd2hlcmUgeW91IGhhdmUgdGhpczoKLSAqIAlpbml0UGFyc2VyVGVzdDQ2Mzc2LlNhbWVOYW1lVGVzdENsYXNzLmphdmEKLSAqIAlJbml0UGFyc2VyVGVzdDQ2Mzc2LmphdmEKLSAqICAKLSAqIEJlZm9yZSBbNDYzNzZdIHRoZSBTdGF0aWMgcGFyc2VyIHdvdWxkIGZpbmQgdGhyb3cgTm9DbGFzc0RlZkZvdW5kRXJyb3Igb24gaW5pdFBhcnNlclRlc3Q0NjM3NiB3aGVuIGxvb2tpbmcgZm9yCi0gKiBTYW1lTmFtZVRlc3RDbGFzcyBhbmQgbmV2ZXIgZmluZCB0aGUgY2xhc3MuCi0gKiAKLSAqIFRvIGNvbXBpbGUgaW4gRWNsaXBzZSB3ZSBuZWVkIHRvIGhhdmUgb25lIG9mIHRoZSBjbGFzc2VzIGJlIGluIHRoZSBkZWZhdWx0IHBhY2thZ2UuIEVjbGlwc2UgY29tcGxhaW5zIGlmIHdlIGRpZG4ndC4KLSAqIEJ1dCB0aGVyZSBpcyBub3RoaW5nIHRvIHN0b3AgdGhpcyBmcm9tIGhhcHBlbmluZyB3aXRoIHBhY2thZ2VzIHRvbyBpZiB0aGV5IGFyZSBzcHJlYWQgYWNyb3NzIGNvbXBpbGUgZ3JvdXBzLiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBJbml0UGFyc2VyVGVzdDQ2Mzc2IHsKLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9pbml0UGFyc2VyVGVzdDQ2Mzc2L1NhbWVOYW1lVGVzdENsYXNzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL2luaXRQYXJzZXJUZXN0NDYzNzYvU2FtZU5hbWVUZXN0Q2xhc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmExZjdiMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL2luaXRQYXJzZXJUZXN0NDYzNzYvU2FtZU5hbWVUZXN0Q2xhc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2UgaW5pdFBhcnNlclRlc3Q0NjM3NjsKLS8qCi0gKiAgJFJDU2ZpbGU6IFNhbWVOYW1lVGVzdENsYXNzLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6NTg6NTUgJCAKLSAqLwotLyoqCi0gKiBUaGlzIGlzIHRvIHRlc3QgZm9yIGRlZmVjdCBbNDYzNzZdLgotICogCi0gKiBTYW1lTmFtZSB0ZXN0LiBUaGlzIGlzIHRlc3Qgd2hlcmUgeW91IGhhdmUgdGhpczoKLSAqIAlJbml0UGFyc2VyVGVzdDQ2Mzc2LlNhbWVOYW1lVGVzdENsYXNzLmphdmEKLSAqIAlJbml0UGFyc2VyVGVzdDQ2Mzc2LmphdmEKLSAqIAotICogYW5kCi0gKiAKLSAqIAluZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuU2FtZU5hbWVUZXN0Q2xhc3MuUmVhbENsYXNzKCkKLSAqIAotICogQmVmb3JlIFs0NjM3Nl0gdGhlIFN0YXRpYyBwYXJzZXIgd291bGQgZmluZCBTYW1lTmFtZVRlc3RDbGFzcy5qYXZhIGluc3RlYWQgb2YgdGhlIFJlYWxDbGFzcyBhbmQgd291bGQgb2YgZmFpbGVkLgotICogVG8gY29tcGlsZSBpbiBFY2xpcHNlIHdlIG5lZWQgdG8gaGF2ZSBvbmUgb2YgdGhlIGNsYXNzZXMgYmUgaW4gdGhlIGRlZmF1bHQgcGFja2FnZS4gRWNsaXBzZSBjb21wbGFpbnMgaWYgd2UgZGlkbid0LgotICogQnV0IHRoZXJlIGlzIG5vdGhpbmcgdG8gc3RvcCB0aGlzIGZyb20gaGFwcGVuaW5nIHdpdGggcGFja2FnZXMgdG9vIGlmIHRoZXkgYXJlIHNwcmVhZCBhY3Jvc3MgY29tcGlsZSBncm91cHMuICAKLSAqLwotcHVibGljIGNsYXNzIFNhbWVOYW1lVGVzdENsYXNzIHsKLQkKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7Ci0JCS8vIFRvIG1ha2UgdGVzdCBlYXNpZXIsIHdlIHNpbXBseSBsb29raW5nIGlmIGJvdGggb2Ygc2FtZSB0eXBlLgotCQlyZXR1cm4gb3RoZXIgIT0gbnVsbCAmJiBvdGhlci5nZXRDbGFzcygpID09IFNhbWVOYW1lVGVzdENsYXNzLmNsYXNzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvLmNsYXNzcGF0aCBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNTAxMTYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL0FsbFN1aXRlcy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvQWxsU3VpdGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNGFmZmMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvQWxsU3VpdGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0czsKLS8qCi0gKiAgJFJDU2ZpbGU6IEFsbFN1aXRlcy5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS44ICQgICREYXRlOiAyMDA1LzEwLzE0IDIwOjU3OjMwICQgCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udGVzdHMuYmFzaWMuQmFzaWNTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm8uQmVhbkluZm9TdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udGVzdHMuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uU3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnRlc3RzLm1vZGVsTGlzdGVuZXJzLkxpc3RlbmVyc1N1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pZGUuSURFUHJveHlTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5Jbml0UGFyc2VyU3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIudHJlZS5BU1RQYXJzZXJTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkucmVtb3RlLlJlbW90ZVByb3h5U3VpdGU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgQWxsU3VpdGVzIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQkvLyBUZXN0YSBjYXNlcyB0byBiZSBpbmNsdWRlIGluIHRoZSBzdWl0ZQotCXByaXZhdGUgc3RhdGljIENsYXNzIHN1aXRlc0xpc3RbXSA9IHsKLQkJQmFzaWNTdWl0ZS5jbGFzcywKLQkJSW5pdFBhcnNlclN1aXRlLmNsYXNzLCAgCi0JCUFTVFBhcnNlclN1aXRlLmNsYXNzLAotCQlSZW1vdGVQcm94eVN1aXRlLmNsYXNzLAotCQlJREVQcm94eVN1aXRlLmNsYXNzLAotCQlCZWFuSW5mb1N1aXRlLmNsYXNzLAotCQlJbnN0YW50aWF0aW9uU3VpdGUuY2xhc3MsCi0JCUxpc3RlbmVyc1N1aXRlLmNsYXNzLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwa2dOYW1lID0gIkphdmEgRU1GIE1vZGVsIGpVbml0IFRlc3QgU3VpdGUiIDsKLSAgICAKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgUGFja2FnZVN1aXRlLgotCSAqLwotCXB1YmxpYyBBbGxTdWl0ZXMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXBvcHVsYXRlU3VpdGUoKSA7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFBhY2thZ2VTdWl0ZS4KLQkgKiBAcGFyYW0gdGhlQ2xhc3MKLQkgKi8KLQlwdWJsaWMgQWxsU3VpdGVzKENsYXNzIHRoZUNsYXNzKSB7Ci0JCXN1cGVyKHRoZUNsYXNzKTsKLQkJcG9wdWxhdGVTdWl0ZSgpIDsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgUGFja2FnZVN1aXRlLgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIEFsbFN1aXRlcyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQkJcG9wdWxhdGVTdWl0ZSgpIDsKLQl9Ci0KLSAgICBwcml2YXRlIHZvaWQgcG9wdWxhdGVTdWl0ZSAoKSB7Ci0gICAgCWZvciAoaW50IGk9MDsgaTxzdWl0ZXNMaXN0Lmxlbmd0aDsgaSsrKQotICAgIAkgIHRyeSB7Ci0JCQlUZXN0IHRzID0gKFRlc3QpIHN1aXRlc0xpc3RbaV0ubmV3SW5zdGFuY2UoKSA7Ci0JCQlhZGRUZXN0KHRzKSA7Ci0JCSAgfQotCQkgIGNhdGNoIChFeGNlcHRpb24gZSkge30JCSAKLSAgICB9Ci0gICAgCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IEFsbFN1aXRlcyhwa2dOYW1lKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL0phdmFQcm9qZWN0VXRpbC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvSmF2YVByb2plY3RVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MzBlODEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvSmF2YVByb2plY3RVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0czsKLS8qCi0gKiAgJFJDU2ZpbGU6IEphdmFQcm9qZWN0VXRpbC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xNSAkICAkRGF0ZTogMjAwNi8wNS8xNyAyMDoxMzo1NiAkIAotICovCi0KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLkFudFJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklKb2JNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLlByb3h5UGx1Z2luOwotCi0vKioKLSAqIFRoZSBwdXJwb3NlIG9mIHRoaXMgY2xhc3MgaXMgdG8gYmUgYSB1dGlsaXR5IGZvciBtYW5pcHVsYXRpbmcvcG9wdWxhdGluZyBqYXZhIHByb2plY3RzLgotICogIDEpIEdldCBhIGphdmEgcHJvamVjdCBhcyBvbmUgb2YgdGhlIHJlc291cmNlcy4KLSAqICAyKSBDcmVhdGUgYSBwcm9qZWN0IGZyb20gYSBkaXJlY3RvcnkuIFRoZSBkaXJlY3RvcnkgbmVlZHMgdG8gYmUgYWxsIHNldCB1cCB0byBiZSBhIHByb2plY3QgYWxyZWFkeS4gVHlwaWNhbGx5Ci0gKiAgICAgZnJvbSBhbiB1bnppcC4KLSAqLwotCi1wdWJsaWMgY2xhc3MgSmF2YVByb2plY3RVdGlsIHsJCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBnZXRQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQkJcmV0dXJuIChwcm9qZWN0LmV4aXN0cygpKSA/IHByb2plY3Q6IG51bGw7Ci0JfQotCQotCQotCS8qKgotCSAqIENyZWF0ZSBhIHByb2plY3QgZnJvbSB0aGUgcGF0aC4gVGhlIHBhdGggd2lsbCBiZSBhIGNvbXBsZXRlIHByb2plY3QsIGluY2x1ZGluZyBhIC5wcm9qZWN0IGZpbGUuCi0JICogCi0JICogQHBhcmFtIHdvcmtzcGFjZQotCSAqIEBwYXJhbSBwcm9qZWN0UGF0aCBOZWVkcyB0byBiZSBhIGNvbXBsZXRlIHBhdGggdG8gYSBkaXJlY3Rvcnkgd2l0aGluIHRoZSBmaWxlIHN5c3RlbS4gVGhlIGRpcmVjdG9yeSBtdXN0IGJlIGEgY29tcGxldGUgcHJvamVjdCBpbmNsdWRpbmcgLnByb2plY3QgZmlsZS4KLQkgKiBAcGFyYW0gcG0KLQkgKiBAcmV0dXJuIFRoZSBuZXcgSVByb2plY3QuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBjcmVhdGVQcm9qZWN0KElXb3Jrc3BhY2Ugd29ya3NwYWNlLCBJUGF0aCBwcm9qZWN0UGF0aCwgZmluYWwgSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUHJvamVjdERlc2NyaXB0aW9uIG5ld0Rlc2NyaXB0aW9uID0gbnVsbDsKLQkJCi0JCUZpbGUgcHJvamVjdEZpbGUgPSBuZXcgRmlsZShwcm9qZWN0UGF0aC50b0ZpbGUoKSwgSVByb2plY3REZXNjcmlwdGlvbi5ERVNDUklQVElPTl9GSUxFX05BTUUpOwotCQlpZiAoIXByb2plY3RGaWxlLmV4aXN0cygpKQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhVGVzdHNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIDAsICJQcm9qZWN0IGZpbGUgbm90IGluIHByb2plY3QgZGlyZWN0b3J5LiBDb3VsZG4ndCBjcmVhdGUgcHJvamVjdCBcIiIrcHJvamVjdFBhdGgudG9TdHJpbmcoKSsiXCIiLCBudWxsKSk7Ci0KLQotCQlJUGF0aCBwcm9qZWN0RmlsZVBhdGggPSBuZXcgUGF0aChwcm9qZWN0RmlsZS5nZXRQYXRoKCkpOwotCQluZXdEZXNjcmlwdGlvbiA9IHdvcmtzcGFjZS5sb2FkUHJvamVjdERlc2NyaXB0aW9uKHByb2plY3RGaWxlUGF0aCk7Ci0JCQotCQkvLyBjcmVhdGUgdGhlIG5ldyBwcm9qZWN0IG9wZXJhdGlvbgotCQlmaW5hbCBJUHJvamVjdCBwcm9qZWN0ID0gd29ya3NwYWNlLmdldFJvb3QoKS5nZXRQcm9qZWN0KG5ld0Rlc2NyaXB0aW9uLmdldE5hbWUoKSk7CQkKLQkJZmluYWwgSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOwotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7CQkKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQlwcm9qZWN0LmNyZWF0ZShkZXNjcmlwdGlvbiwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxMDAwKSk7Ci0JCQkJcHJvamVjdC5vcGVuKG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMTAwMCkpOwkJCQkKLQkJCX0KLQkJfSwgcHJvamVjdCwgMCwgcG0pOwotCQkKLQkJcmV0dXJuIHByb2plY3Q7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGVtcHR5IHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZSByb290LiBJZiB0aGVyZSBpcyBhIC5wcm9qZWN0IGZpbGUgYWxyZWFkeSB0aGVyZSwgdGhlbiB1c2UgaXQuCi0JICogQHBhcmFtIHdvcmtzcGFjZSBUaGUgd29ya3NwYWNlIHRvIGNyZWF0ZSBwcm9qZWMgaW4uCi0JICogQHBhcmFtIHByb2plY3RQYXRoIFRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0LiBJdCBzaG91bGQgb25seSBiZSBvbmUgc2VnbWVudCBsb25nLCBhbmQgdGhhdCB3aWxsIGJlIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0LgotCSAqIEBwYXJhbSBwbQotCSAqIEByZXR1cm4gVGhlIHByb2plY3QuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBjcmVhdGVFbXB0eUphdmFQcm9qZWN0KElXb3Jrc3BhY2Ugd29ya3NwYWNlLCBJUGF0aCBwcm9qZWN0UGF0aCwgZmluYWwgSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlwcm9qZWN0UGF0aCA9IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0RnVsbFBhdGgoKS5hcHBlbmQocHJvamVjdFBhdGgpOwkvLyBQdXQgaXQgaW50byB0aGUgd29ya3NwYWNlIHJlbGF0aXZlLgotCQlGaWxlIHByb2plY3RGaWxlID0gbmV3IEZpbGUocHJvamVjdFBhdGgudG9GaWxlKCksIElQcm9qZWN0RGVzY3JpcHRpb24uREVTQ1JJUFRJT05fRklMRV9OQU1FKTsKLQkJaWYgKHByb2plY3RGaWxlLmV4aXN0cygpKQotCQkJcmV0dXJuIGNyZWF0ZVByb2plY3Qod29ya3NwYWNlLCBwcm9qZWN0UGF0aCwgcG0pOwkvLyBMZXQgaXQgYmUgY3JlYXRlZCBub3JtYWxseS4KLQotCQkvLyBjcmVhdGUgdGhlIG5ldyBwcm9qZWN0IG9wZXJhdGlvbgotCQlmaW5hbCBJUHJvamVjdCBwcm9qZWN0ID0gd29ya3NwYWNlLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3RQYXRoLmxhc3RTZWdtZW50KCkpOwkJCi0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5ydW4obmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsJCQotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCXByb2plY3QuY3JlYXRlKG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMTAwMCkpOwotCQkJCXByb2plY3Qub3BlbihuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEwMDApKTsKLQkJCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotCQkJCVN0cmluZ1tdIG5hdHVyZWlkcyA9IGRlc2NyaXB0aW9uLmdldE5hdHVyZUlkcygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmF0dXJlaWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChuYXR1cmVpZHNbaV0uZXF1YWxzKCJvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlIikpCi0JCQkJCQlyZXR1cm47CS8vIEFscmVhZHkgaGFzIG5hdHVyZS4KLQkJCQl9Ci0JCQkJU3RyaW5nW10gbmV3TmF0dXJlaWRzID0gbmV3IFN0cmluZ1tuYXR1cmVpZHMubGVuZ3RoKzFdOwotCQkJCW5ld05hdHVyZWlkc1swXSA9ICJvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlIjsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KG5hdHVyZWlkcywgMCwgbmV3TmF0dXJlaWRzLCAxLCBuYXR1cmVpZHMubGVuZ3RoKTsKLQkJCQlkZXNjcmlwdGlvbi5zZXROYXR1cmVJZHMobmV3TmF0dXJlaWRzKTsKLQkJCQlwcm9qZWN0LnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEwMDApKTsKLQkJCQkvLyBOZWVkIHRvIHB1dCBvdXQgYSBjbGFzc2ZpbGUgdG9vLiBXZSBuZWVkIGEgc3JjIGFuZCBhIGJpbiBkaXJlY3RvcnkgZm9yIHRoZSBjbGFzc3BhdGguCi0JCQkJSUZvbGRlciBzZiA9IHByb2plY3QuZ2V0Rm9sZGVyKCJzcmMiKTsKLQkJCQlzZi5jcmVhdGUodHJ1ZSwgdHJ1ZSwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxMDAwKSk7Ci0JCQkJSUZvbGRlciBiZiA9IHByb2plY3QuZ2V0Rm9sZGVyKCJiaW4iKTsKLQkJCQliZi5jcmVhdGUodHJ1ZSwgdHJ1ZSwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxMDAwKSk7Ci0JCQkJSUZpbGUgY3AgPSBwcm9qZWN0LmdldEZpbGUoIi5jbGFzc3BhdGgiKTsgCi0JCQkJdHJ5IHsKLQkJCQkJY3AuY3JlYXRlKGdldENsYXNzKCkuZ2V0UmVzb3VyY2UoIi5jbGFzc3BhdGgiKS5vcGVuU3RyZWFtKCksIHRydWUsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMTAwMCkpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0sIHdvcmtzcGFjZS5nZXRSb290KCksIDAsIHBtKTsKLQkJCi0JCXJldHVybiBwcm9qZWN0OwotCX0KLQkKLQkvKioKLQkgKiBEZWxldGUgYSBwcm9qZWN0IGFuZCBhbGwgZmlsZXMgZnJvbSB0aGUgcHJvamVjdC4KLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJcHJvamVjdC5kZWxldGUodHJ1ZSwgZmFsc2UsIG51bGwpOyAvLyBHZXQgcmlkIG9mIHRoZSBwcm9qZWN0IGFuZCB0aGUgZmlsZXMgdGhlbXNlbHZlcy4KLQkJfQotCX0KLQkKLQotCS8qKgotCSAqIFRoaXMgc2V0cyB0aGUgd29ya3NwYWNlIGF1dG9idWlsZCB0byB0aGUgc3BlY2lmaWVkIHN0YXRlLiBJdCByZXR1cm5zIHdoYXQKLQkgKiB0aGUgc3RhdGUgd2FzIHByZXZpb3VzbHkgc28gdGhhdCBpdCBjYW4gYmUgbGF0ZXIgcmVzdG9yZWQuCi0JICogQHBhcmFtIGF1dG9CdWlsZAotCSAqIEByZXR1cm4gUHJldmlvdXMgYXV0b0J1aWxkIHN0YXRlLgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzZXRBdXRvQnVpbGQoYm9vbGVhbiBhdXRvQnVpbGQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCWlmIChhdXRvQnVpbGQgIT0gd29ya3NwYWNlLmlzQXV0b0J1aWxkaW5nKCkpIHsKLQkJCUlXb3Jrc3BhY2VEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHdvcmtzcGFjZS5nZXREZXNjcmlwdGlvbigpOwotCQkJZGVzY3JpcHRpb24uc2V0QXV0b0J1aWxkaW5nKHRydWUpOwotCQkJd29ya3NwYWNlLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKLQkJCXJldHVybiAhYXV0b0J1aWxkOwkvLyBJdCB3YXNuJ3QgdGhpcyBzdGF0ZS4JCQkKLQkJfSBlbHNlCi0JCQlyZXR1cm4gYXV0b0J1aWxkOwkvLyBJdCBhbHJlYWR5IGlzIHRoaXMgc3RhdGUuIAkJCi0JfQotCQotCS8qKgotCSAqIEltcG9ydCB0aGUgZ2l2ZW4gcHJvamVjdHMgZnJvbSB0aGUgZ2l2ZW4gemlwZmlsZXMgaW50byB0aGUgY3VycmVudCB3b3Jrc3BhY2Ugcm9vdC4KLQkgKiBAcGFyYW0gcHJvamVjdE5hbWVzIFRoZSBhcnJheSBvZiBwcm9qZWN0IG5hbWVzIHRvIGNyZWF0ZQotCSAqIEBwYXJhbSB6aXBGaWxlcyBUaGUgemlwZmlsZXMgY29udGFpbmluZyBlYWNoIHByb2plY3QuIEl0IG11c3QgYmUgYSBjb21wbGV0ZSBwcm9qZWN0LiAKLQkgKiAgICAgICAgICAgICAgICAgVGhlIGZpcnN0IGRpcmVjdG9yeSBpbiB0aGUgemlwIG11c3QgYmUgdGhlIHByb2plY3QgZGlyZWN0b3J5LiAKLQkgKiAgICAgICAgICAgICAgICAgSXQgbXVzdCBiZSB0aGUgc2FtZSBuYW1lIGFzIGZyb20gcHJvamVjdE5hbWVzLiBBbHNvIGl0IG11c3QgaW5jbHVkZSBhIC5wcm9qZWN0IGZpbGUKLQkgKiAgICAgICAgICAgICAgICAgaW4gdGhhdCBkaXJlY3RvcnkuCi0JICogQHJldHVybiBUaGUgYXJyYXkgb2YgSVByb2plY3RzIHRoYXQgd2VyZSBjcmVhdGVkLgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2plY3RbXSBpbXBvcnRQcm9qZWN0cyhmaW5hbCBTdHJpbmdbXSBwcm9qZWN0TmFtZXMsIGZpbmFsIFN0cmluZ1tdIHppcEZpbGVzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIERlbGV0ZS9jcmVhdGUvcG9wdWxhdGUgd2l0aGluIGEgcnVubmFibGUgc28gdGhhdCB0aGUgYnVpbGQgaXMgZG9uZSBvbmx5IGFmdGVyIGFsbCBjaGFuZ2VzIGhhdmUgYmVlbiBtYWRlLgotCQkvLyBNYWtlIHN1cmUgYXV0b2J1aWxkIGlzIG9uLgotCQlmaW5hbCBJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJZmluYWwgSVByb2plY3RbXSByZXN1bHQgPSBuZXcgSVByb2plY3RbcHJvamVjdE5hbWVzLmxlbmd0aF07Ci0JCXdvcmtzcGFjZS5ydW4obmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQkvLyBGaXJzdCBpbXBvcnQgYWxsLCB0aGVuIGFmdGVyIHRoYXQsIGNyZWF0ZSB0aGUgcHJvamVjdHMuCi0JCQkJSVBhdGggcm9vdExvY2F0aW9uID0gd29ya3NwYWNlLmdldFJvb3QoKS5nZXRMb2NhdGlvbigpOwotCQkJCXRyeSB7Ci0JCQkJCVN0cmluZyBhbnRGaWxlID0gRmlsZUxvY2F0b3IudG9GaWxlVVJMKEphdmFUZXN0c1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRFbnRyeSgidGVzdGRhdGEvdW56aXAueG1sIikpLmdldEZpbGUoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB6aXBGaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCQkJLy8gRmlyc3QgY3JlYXRlL3JlY3JlYXRlIHRoZSBwcm9qZWN0LgotCQkJCQkJSVByb2plY3QgcCA9IGdldFByb2plY3QocHJvamVjdE5hbWVzW2ldKTsKLQkJCQkJCWlmIChwICE9IG51bGwpCi0JCQkJCQkJcC5kZWxldGUodHJ1ZSwgdHJ1ZSwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCA1MCkpOyAvLyBHZXQgcmlkIG9mIGl0LCB3ZSB3YW50IGEgY2xlYW4gb25lIGZvciB0ZXN0aW5nLgotCQkJCQkKLQkJCQkJCS8vIE5vdyBpbXBvcnQgdGhlIHJlcXVlc3RlZCBmaWxlcy4KLQkJCQkJCUFudFJ1bm5lciBhbnQgPSBuZXcgQW50UnVubmVyKCk7Ci0JCQkJCQlhbnQuc2V0QnVpbGRGaWxlTG9jYXRpb24oYW50RmlsZSk7Ci0JCQkJCQlhbnQuc2V0QXJndW1lbnRzKG5ldyBTdHJpbmdbXSB7ICItRHppcGZyb209IiArIHppcEZpbGVzW2ldLCAiLUR6aXB0bz0iICsgcm9vdExvY2F0aW9uLnRvU3RyaW5nKCl9KTsKLQkJCQkJCWFudC5ydW4obmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCA1MCkpOwotCQkJCQl9Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgemlwRmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCXJlc3VsdFtpXSA9IGNyZWF0ZVByb2plY3Qod29ya3NwYWNlLCByb290TG9jYXRpb24uYXBwZW5kKHByb2plY3ROYW1lc1tpXSksIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgNTApKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJfSwgd29ya3NwYWNlLmdldFJvb3QoKSwgMCwgbnVsbCk7Ci0JCQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXN0YXRpYyBpbnQgY2ZTdWZmaXggPSAwOwotCS8qKgotCSAqIEFkZCBhIHBhdGggdG8gcGx1Z2luIGphciB0byB0aGUgamF2YSBwcm9qZWN0J3MgY2xhc3MgcGF0aC4KLQkgKiBAcGFyYW0gYnVuZGxlIFRoZSBwbHVnaW4gd2hlcmUgdGhlIGphciBpcyBsb2NhdGVkLgotCSAqIEBwYXJhbSBwYXRoVG9KYXIgUGF0aCB0byB0aGUgamFyIHdpdGhpbiB0aGUgYWJvdmUgcGx1Z2luCi0JICogQHBhcmFtIHByb2plY3QgamF2YSBwcm9qZWN0IHRvIGFkZCB0by4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkQnVuZGxlSmFyVG9QYXRoKEJ1bmRsZSBidW5kbGUsIFN0cmluZyBwYXRoVG9KYXIsIGZpbmFsIElKYXZhUHJvamVjdCBwcm9qZWN0LCBJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWZpbmFsIElQYXRoIGFjdHVhbFBhdGggPSBuZXcgUGF0aChQcm94eVBsdWdpbi5nZXRQbHVnaW4oKS5sb2NhbGl6ZUZyb21CdW5kbGVBbmRGcmFnbWVudHMoYnVuZGxlLCBwYXRoVG9KYXIpKTsKLQkJaWYgKGFjdHVhbFBhdGguaXNFbXB0eSgpKQotCQkJcmV0dXJuOwkvLyBEaWRuJ3QgZXhpc3QuCi0JCQotCQlmaW5hbCBJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJd29ya3NwYWNlLnJ1bihuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewkJCi0JCQkJaWYgKGFjdHVhbFBhdGgudG9GaWxlKCkuaXNGaWxlKCkpIHsKLQkJCQkJLy8gSXQgaXMgYSBqYXIsIHRoaXMgd2lsbCBiZSBkdXJpbmcgcnVudGltZQotCQkJCQkvLyBDcmVhdGUgYW4gZXh0ZXJuYWwgamFyIGVudHJ5LgotCQkJCQlJQ2xhc3NwYXRoRW50cnlbXSByYXcgPSBwcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwotCQkJCQlJQ2xhc3NwYXRoRW50cnlbXSBuZXdSYXcgPSBuZXcgSUNsYXNzcGF0aEVudHJ5W3Jhdy5sZW5ndGgrMV07Ci0JCQkJCW5ld1Jhd1tyYXcubGVuZ3RoXSA9IEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeShhY3R1YWxQYXRoLCBudWxsLCBudWxsKTsKLQkJCQkJU3lzdGVtLmFycmF5Y29weShyYXcsIDAsIG5ld1JhdywgMCwgcmF3Lmxlbmd0aCk7Ci0JCQkJCXByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKG5ld1JhdywgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxMDApKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBJdCBpcyBhIHBhdGggdG8gY2xhc3MgZm9sZGVyLCB0aGlzIHdpbGwgYmUgZHVyaW5nIGRldmVsb3BtZW50IHRpbWUuCi0JCQkJCS8vIEJ1dCBjbGFzc2ZvbGRlcnMgTVVTVCBleGlzdCBpbiB0aGUgd29ya3NwYWNlLiBKRFQgZG9lc24ndCB1bmRlcnN0YW5kIHRoZW0gb3V0c2lkZSB3b3Jrc3BhY2UsCi0JCQkJCS8vIHNvIHdlIHdpbGwgbGluayBpdCBpbnRvIHRoZSBwcm9qZWN0LgotCQkJCQlJRm9sZGVyIGNmID0gcHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKCJsaW5rYmluIisoKytjZlN1ZmZpeCkpOwotCQkJCQljZi5jcmVhdGVMaW5rKGFjdHVhbFBhdGgsIDAsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMTAwKSk7Ci0JCQkJCS8vIENyZWF0ZSBjbGFzcyBmb2xkZXIgZW50cnkuCi0JCQkJCUlDbGFzc3BhdGhFbnRyeVtdIHJhdyA9IHByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JCQkJCUlDbGFzc3BhdGhFbnRyeVtdIG5ld1JhdyA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbcmF3Lmxlbmd0aCsxXTsKLQkJCQkJbmV3UmF3W3Jhdy5sZW5ndGhdID0gSmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KGNmLmdldEZ1bGxQYXRoKCksIG51bGwsIG51bGwpOwotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHJhdywgMCwgbmV3UmF3LCAwLCByYXcubGVuZ3RoKTsKLQkJCQkJcHJvamVjdC5zZXRSYXdDbGFzc3BhdGgobmV3UmF3LCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEwMCkpOwotCQkJCX0KLQkJCX0KLQkJfSwgd29ya3NwYWNlLmdldFJvb3QoKSwgMCwgcG0pOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgd2FpdEZvckF1dG9CdWlsZCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSUpvYk1hbmFnZXIgam9iTWFuYWdlciA9IFBsYXRmb3JtLmdldEpvYk1hbmFnZXIoKTsKLQkJaWYgKGpvYk1hbmFnZXIuZmluZChSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQpLmxlbmd0aCA+IDApIHsKLQkJCXdoaWxlICh0cnVlKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJam9iTWFuYWdlci5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL0phdmFUZXN0c1BsdWdpbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvSmF2YVRlc3RzUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhZDYyYWUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvSmF2YVRlc3RzUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0czsKLS8qCi0gKiAgJFJDU2ZpbGU6IEphdmFUZXN0c1BsdWdpbi5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS42ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjU4OjU0ICQgCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotCi0vKioKLSAqIEBhdXRob3IgcmljaGt1bHAKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgSmF2YVRlc3RzUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQotCXByaXZhdGUgc3RhdGljIEphdmFUZXN0c1BsdWdpbiBQTFVHSU47Ci0JLyoqCi0JICogQHBhcmFtIGRlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgSmF2YVRlc3RzUGx1Z2luKCkgewotCQlQTFVHSU4gPSB0aGlzOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEphdmFUZXN0c1BsdWdpbiBnZXRQbHVnaW4oKSB7Ci0JCXJldHVybiBQTFVHSU47Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9iYXNpYy9CYXNpY1N1aXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9iYXNpYy9CYXNpY1N1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2NGZmYjguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvYmFzaWMvQmFzaWNTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBCYXNpY1N1aXRlLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDYvMDUvMTcgMjA6MTM6NTYgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMuYmFzaWM7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBqdW5pdC5leHRlbnNpb25zLlRlc3RTZXR1cDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5KYXZhUHJvamVjdFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnRlc3RzLkphdmFUZXN0c1BsdWdpbjsKLQotLyoqCi0gKiBUaGlzIGlzIGJhc2ljIEpFTSB0ZXN0aW5nIG5vdCBjb3ZlcmVkIGJ5IHNwZWNpZmljIGNvbXBvbmVudHMgdGVzdHMuCi0gKiAKLSAqIEBhdXRob3IgcmljaGt1bHAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBCYXNpY1N1aXRlIGV4dGVuZHMgVGVzdFNldHVwIHsKLQotCS8vIFRlc3QgY2FzZXMgdG8gYmUgaW5jbHVkZSBpbiB0aGUgc3VpdGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzcyB0ZXN0c0xpc3RbXSA9IHsgVGVzdFdvcmtiZW5jaFV0aWxzMTEyNjc4LmNsYXNzfTsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBCYXNpY1N1aXRlKCkgewotCQl0aGlzKCJUZXN0IEJhc2ljIEpFTSBTdWl0ZSIpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIEJhc2ljU3VpdGUoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmV3IFRlc3RTdWl0ZShuYW1lKSB7Ci0JCQl7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0c0xpc3QubGVuZ3RoOyBpKyspIHsKLQkJCQkJYWRkVGVzdFN1aXRlKHRlc3RzTGlzdFtpXSk7Ci0JCQkJfQotCi0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBCYXNpY1N1aXRlKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9CQVNJQ19QUk9KRUNUID0gIlRlc3QgQmFzaWMiOwkvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBib29sZWFuIG9sZEF1dG9CdWlsZGluZ1N0YXRlOyAvLyBhdXRvQnVpbGRpbmcgc3RhdGUgYmVmb3JlIHdlIHN0YXJ0ZWQuCQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiLS0gSW5pdGlhbGl6aW5nIHRoZSBCYXNpYyB0ZXN0IGRhdGEgLS0iKTsgLy8kTk9OLU5MUy0xJAotCQlvbGRBdXRvQnVpbGRpbmdTdGF0ZSA9IEphdmFQcm9qZWN0VXRpbC5zZXRBdXRvQnVpbGQodHJ1ZSk7Ci0JCVVSTCBpbnN0YWxsVVJMID0gSmF2YVRlc3RzUGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCIvIik7Ci0JCVN0cmluZ1tdIHppcFBhdGhzID0gbmV3IFN0cmluZ1sxXTsKLQkJemlwUGF0aHNbMF0gPSBGaWxlTG9jYXRvci50b0ZpbGVVUkwobmV3IFVSTChpbnN0YWxsVVJMLCAidGVzdGRhdGEvdGVzdGJhc2ljLnppcCIpKS5nZXRGaWxlKCk7Ci0JCUlQcm9qZWN0W10gcHJvamVjdHMgPQotCQkJSmF2YVByb2plY3RVdGlsLmltcG9ydFByb2plY3RzKAotCQkJCW5ldyBTdHJpbmdbXSB7IFRFU1RfQkFTSUNfUFJPSkVDVCB9LAotCQkJCXppcFBhdGhzKTsKLQkJYXNzZXJ0Tm90TnVsbChwcm9qZWN0c1swXSk7Ci0JCUphdmFQcm9qZWN0VXRpbC53YWl0Rm9yQXV0b0J1aWxkKCk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiLS0gRGF0YSBpbml0aWFsaXplZCAtLSIpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJSmF2YVByb2plY3RVdGlsLmRlbGV0ZVByb2plY3QoSmF2YVByb2plY3RVdGlsLmdldFByb2plY3QoVEVTVF9CQVNJQ19QUk9KRUNUKSk7Ci0JCQl9Ci0JCX0sIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCksIDAsIG51bGwpOwotCi0JCUphdmFQcm9qZWN0VXRpbC5zZXRBdXRvQnVpbGQob2xkQXV0b0J1aWxkaW5nU3RhdGUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvYmFzaWMvVGVzdFdvcmtiZW5jaFV0aWxzMTEyNjc4LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9iYXNpYy9UZXN0V29ya2JlbmNoVXRpbHMxMTI2NzguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFkMzg0OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9iYXNpYy9UZXN0V29ya2JlbmNoVXRpbHMxMTI2NzguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBUZXN0V29ya2JlbmNoVXRpbHMxMTI2NzguamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMSAkICAkRGF0ZTogMjAwNS8xMC8xNCAyMDo1NzozMCAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5iYXNpYzsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLldyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2U7Ci0gCi0KLS8qKgotICogVGVzdCBidWc6ICBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTEyNjc4Ci0gKiBAc2luY2UgMS4yLjAKLSAqLwotcHVibGljIGNsYXNzIFRlc3RXb3JrYmVuY2hVdGlsczExMjY3OCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCS8qKgotCSAqIAotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXB1YmxpYyBUZXN0V29ya2JlbmNoVXRpbHMxMTI2NzgoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5hbWUKLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgVGVzdFdvcmtiZW5jaFV0aWxzMTEyNjc4KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX1JFU09VUkNFX1BBVEggPSAiVGVzdCBCYXNpYy93b3JrYmVuY2hVdGlsL0ZpbGVSZXNvdXJjZS54bWkiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVF9GT1VORF9GSUxFX1JFU09VUkNFX1BBVEggPSAiVGVzdCBCYXNpYy93b3JrYmVuY2hVdGlsL05vRmlsZVJlc291cmNlLnhtaSI7Ci0JCi0JLyoqCi0JICogVGVzdCB7QGxpbmsgV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlI2dldElGaWxlKFVSSSl9IHdpdGggcGxhdGZvcm0gcmVzb3VyY2UgdXJpLgotCSAqIAotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RHZXRJRmlsZVBsYXRmb3JtUmVzb3VyY2UoKSB7Ci0JCVVSSSB1cmkgPSBVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShGSUxFX1JFU09VUkNFX1BBVEgpOwotCQlJRmlsZSBmaWxlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmdldElGaWxlKHVyaSk7Ci0JCWFzc2VydE5vdE51bGwoZmlsZSk7Ci0JCWFzc2VydFRydWUoZmlsZS5leGlzdHMoKSk7Ci0KLQkJdXJpID0gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoTk9UX0ZPVU5EX0ZJTEVfUkVTT1VSQ0VfUEFUSCk7Ci0JCWZpbGUgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuZ2V0SUZpbGUodXJpKTsKLQkJYXNzZXJ0Tm90TnVsbChmaWxlKTsKLQkJYXNzZXJ0RmFsc2UoZmlsZS5leGlzdHMoKSk7Ci0JCQotCQkvLyBUZXN0IGEgcmVsYXRpdmUgZm9ybSB0aGF0IGlzIG5vdCBhIHZhbGlkIHByb2plY3QuCi0JCXVyaSA9IFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKCJOb3RQcm9qZWN0L2ZpbGUueG1pIik7IAkKLQkJZmlsZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5nZXRJRmlsZSh1cmkpOwotCQlhc3NlcnROdWxsKGZpbGUpOwkJCi0JfQotCQotCS8qKgotCSAqIFRlc3Qge0BsaW5rIFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZSNnZXRJRmlsZShVUkkpfSB3aXRoIGEgcmVsYXRpdmUgdXJpIChlLmcuICJwcm9qZWN0L2ZpbGUiKS4KLQkgKiAKLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0SUZpbGVQcm9qZWN0UmVsYXRpdmVSZXNvdXJjZSgpIHsKLQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVVUkkoRklMRV9SRVNPVVJDRV9QQVRIKTsKLQkJSUZpbGUgZmlsZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5nZXRJRmlsZSh1cmkpOwotCQlhc3NlcnROb3ROdWxsKGZpbGUpOwotCQlhc3NlcnRUcnVlKGZpbGUuZXhpc3RzKCkpOwotCi0JCXVyaSA9IFVSSS5jcmVhdGVVUkkoTk9UX0ZPVU5EX0ZJTEVfUkVTT1VSQ0VfUEFUSCk7Ci0JCWZpbGUgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuZ2V0SUZpbGUodXJpKTsKLQkJYXNzZXJ0Tm90TnVsbChmaWxlKTsKLQkJYXNzZXJ0RmFsc2UoZmlsZS5leGlzdHMoKSk7Ci0JCQotCQkvLyBUZXN0IGEgcmVsYXRpdmUgZm9ybSB0aGF0IGlzIG5vdCBhIHZhbGlkIHByb2plY3QuCi0JCXVyaSA9IFVSSS5jcmVhdGVVUkkoIk5vdFByb2plY3QvZmlsZS54bWkiKTsgCQotCQlmaWxlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmdldElGaWxlKHVyaSk7Ci0JCWFzc2VydE51bGwoZmlsZSk7Ci0JCQotCX0KLQkKLQkvKioKLQkgKiBUZXN0IHtAbGluayBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UjZ2V0SUZpbGUoVVJJKX0gd2l0aCBhIG5vbi1wbGF0Zm9ybSByZXNvdXJjZSB1cmkuCi0JICogCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEdldElGaWxlTm90UGxhdGZvcm1SZXNvdXJjZSgpIHsKLQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVVUkkoInBsYXRmb3JtOi9wbHVnaW4veHl6L2FiYyIpOwotCQlJRmlsZSBmaWxlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmdldElGaWxlKHVyaSk7Ci0JCWFzc2VydE51bGwoZmlsZSk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3Qge0BsaW5rIFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZSNnZXRSZXNvdXJjZShVUkkpfSB3aXRoIGEgcGxhdGZvcm0gcmVzb3VyY2UgdXJpLgotCSAqIAotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RHZXRSZXNvdXJjZVBsYXRmb3JtUmVzb3VyY2UoKSB7Ci0JCVVSSSB1cmkgPSBVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShGSUxFX1JFU09VUkNFX1BBVEgpOwotCQlSZXNvdXJjZSByZXMgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuZ2V0UmVzb3VyY2UodXJpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXMpOwotCQlhc3NlcnRUcnVlKHJlcy5pc0xvYWRlZCgpKTsKLQkJCi0JCXVyaSA9IFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKE5PVF9GT1VORF9GSUxFX1JFU09VUkNFX1BBVEgpOwotCQlib29sZWFuIGdvb2QgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXJlcyA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5nZXRSZXNvdXJjZSh1cmkpOwotCQl9IGNhdGNoIChXcmFwcGVkRXhjZXB0aW9uIGUpIHsKLQkJCWdvb2QgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZ29vZCk7Ci0KLQkJLy8gVGVzdCBhIHJlbGF0aXZlIGZvcm0gdGhhdCBpcyBub3QgYSB2YWxpZCBwcm9qZWN0LgotCQl1cmkgPSBVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSSgiTm90UHJvamVjdC9maWxlLnhtaSIpOyAJCi0JCXJlcyA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5nZXRSZXNvdXJjZSh1cmkpOwotCQlhc3NlcnROdWxsKHJlcyk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3Qge0BsaW5rIFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZSNnZXRSZXNvdXJjZShVUkkpfSB3aXRoIGEgcmVsYXRpdmUgdXJpIChlLmcuICJwcm9qZWN0L2ZpbGUiKS4KLQkgKiAKLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UmVzb3VyY2VQcm9qZWN0UmVsYXRpdmVSZXNvdXJjZSgpIHsKLQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVVUkkoRklMRV9SRVNPVVJDRV9QQVRIKTsKLQkJUmVzb3VyY2UgcmVzID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmdldFJlc291cmNlKHVyaSk7Ci0JCWFzc2VydE5vdE51bGwocmVzKTsKLQkJYXNzZXJ0VHJ1ZShyZXMuaXNMb2FkZWQoKSk7Ci0JCQotCQlib29sZWFuIGdvb2QgPSBmYWxzZTsKLQkJdXJpID0gVVJJLmNyZWF0ZVVSSShOT1RfRk9VTkRfRklMRV9SRVNPVVJDRV9QQVRIKTsKLQkJdHJ5IHsKLQkJCXJlcyA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5nZXRSZXNvdXJjZSh1cmkpOwotCQl9IGNhdGNoIChXcmFwcGVkRXhjZXB0aW9uIGUpIHsKLQkJCWdvb2QgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZ29vZCk7Ci0KLQkJLy8gVGVzdCBhIHJlbGF0aXZlIGZvcm0gdGhhdCBpcyBub3QgYSB2YWxpZCBwcm9qZWN0LgotCQl1cmkgPSBVUkkuY3JlYXRlVVJJKCJOb3RQcm9qZWN0L2ZpbGUueG1pIik7IAkKLQkJcmVzID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmdldFJlc291cmNlKHVyaSk7Ci0JCWFzc2VydE51bGwocmVzKTsKLQl9CQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9iZWFuaW5mby9BYnN0cmFjdEJlYW5JbmZvVGVzdENhc2UuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL2JlYW5pbmZvL0Fic3RyYWN0QmVhbkluZm9UZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjRkMjhjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL2JlYW5pbmZvL0Fic3RyYWN0QmVhbkluZm9UZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm87Ci0vKgotICogICRSQ1NmaWxlOiBBYnN0cmFjdEJlYW5JbmZvVGVzdENhc2UuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMTAgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6NTg6NTQgJCAKLSAqLwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5JbXBsaWNpdEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLlByb3BlcnR5RGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5hZGFwdGVycy5CZWFuaW5mb05hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29yZS5VdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnRlc3RzLkphdmFQcm9qZWN0VXRpbDsKLQotLyoqCi0gKiBAYXV0aG9yIHJpY2hrdWxwCi0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RCZWFuSW5mb1Rlc3RDYXNlIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIEFic3RyYWN0QmVhbkluZm9UZXN0Q2FzZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQWJzdHJhY3RCZWFuSW5mb1Rlc3RDYXNlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQmVhbmluZm9OYXR1cmUgbmF0dXJlOwotCXByb3RlY3RlZCBSZXNvdXJjZVNldCByc2V0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgCi0JCVRFU1RfQkVBTklORk9fUFJPSkVDVCA9ICJUZXN0IEJlYW5JbmZvIiwJLy8kTk9OLU5MUy0xJAotCQlURVNUX0JFQU5JTkZPX0JFQU5JTkZPU19QUk9KRUNUID0gIlRlc3QgQmVhbkluZm8gQmVhbkluZm9zIiwgLy8kTk9OLU5MUy0xJAotCQlURVNUX0JFQU5JTkZPX1BSRVJFUV9QUk9KRUNUID0gIlRlc3QgQmVhbkluZm8gUHJlcmVxIjsgLy8kTk9OLU5MUy0xJAotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlJUHJvamVjdCBiaVByb2plY3QgPSBKYXZhUHJvamVjdFV0aWwuZ2V0UHJvamVjdChURVNUX0JFQU5JTkZPX1BST0pFQ1QpOwotCQlhc3NlcnROb3ROdWxsKGJpUHJvamVjdCk7IAotCQluYXR1cmUgPSBCZWFuaW5mb05hdHVyZS5nZXRSdW50aW1lKGJpUHJvamVjdCk7Ci0JCWFzc2VydE5vdE51bGwobmF0dXJlKTsKLQkJcnNldCA9IG5hdHVyZS5nZXRSZXNvdXJjZVNldCgpOwotCQlhc3NlcnROb3ROdWxsKHJzZXQpOwotCQkvLyBXZSBhbHNvIHdhbnQgdG8gcmVtb3ZlIGFueSBiZWFuaW5mb3MgZnJvbSB0aGUgc2VhcmNoIHBhdGggdGhhdCBhcmVuJ3QgZnJvbSB0ZXN0aW5nIHNvIHRoYXQgd2UgZG9uJ3QgZ2V0IGFueSB3ZWlyZCBzaWRlLWVmZmVjdHMuCi0JCVByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gbmF0dXJlLmdldFJlZ2lzdHJ5KCk7Ci0JCUlBcnJheUJlYW5Qcm94eSBzcCA9IFV0aWxpdGllcy5nZXRCZWFuSW5mb1NlYXJjaFBhdGgocmVnaXN0cnkpOwotCQkvLyByZW1vdmUgYW55IHRoYXQgZG9uJ3Qgc3RhcnQgd2l0aCBvcmcuZWNsaXBzZS5qZW0udGVzdHMuCi0JCWludCBsZW4gPSBzcC5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJU3RyaW5nIHBhdGggPSAoKElTdHJpbmdCZWFuUHJveHkpIHNwLmdldChpKSkuc3RyaW5nVmFsdWUoKTsKLQkJCWlmICghcGF0aC5zdGFydHNXaXRoKCJvcmcuZWNsaXBzZS5qZW0udGVzdHMiKSkKLQkJCQlVdGlsaXRpZXMucmVtb3ZlQmVhbkluZm9QYXRoKHJlZ2lzdHJ5LCBwYXRoKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgaW50IG9iakZlYXR1cmVzLCBvYmpOb25Qcm9wZXJ0aWVzOwkvLyBPYmplY3QgZmVhdHVyZXMgY291bnQgYW5kIE9iamVjdCBub24tcHJvcGVydGllcyBjb3VudC4gVGhpcyBpcyBvbmx5IGluaXRpYWxpemVkIGFzIG5lZWRlZC4KLQlwcm90ZWN0ZWQgU2V0IG9iakZlYXR1cmVzU2V0OwotCS8qKgotCSAqIFRvIGluaXRpYWxpemUgdGhlIG9iakZlYXR1cmVzIGFuZCBvYmpOb25Qcm9wZXJ0aWVzIGNvdW50cyB3aGVuIG5lY2Vzc2FyeS4gTm90IG5lZWRlZCBmb3IgYWxsIHRlc3RzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9iakZlYXR1cmVzU2V0dXAoKSB7Ci0JCS8vIEdldCB0aGUgbnVtYmVyIG9mIGZlYXR1cmVzIHRoYXQgamF2YS5sYW5nLk9iamVjdCBoYXM6Ci0JCUphdmFDbGFzcyBvYmpDbGFzcyA9IChKYXZhQ2xhc3MpIHJzZXQuZ2V0RU9iamVjdChVUkkuY3JlYXRlVVJJKCJqYXZhOi9qYXZhLmxhbmcjT2JqZWN0IiksIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCW9iakZlYXR1cmVzU2V0ID0gbmV3IEhhc2hTZXQoKTsKLQkJb2JqRmVhdHVyZXMgPSBvYmpDbGFzcy5nZXRQcm9wZXJ0aWVzKCkuc2l6ZSgpOwotCQkvLyBGaW5kIHRoZSBudW1iZXIgb2YgYWx3YXlzIGluaGVyaXRlZCBwcm9wZXJ0aWVzLgotCQlvYmpOb25Qcm9wZXJ0aWVzID0gMDsKLQkJZm9yIChJdGVyYXRvciBpdHIwID0gb2JqQ2xhc3MuZ2V0UHJvcGVydGllcygpLml0ZXJhdG9yKCk7IGl0cjAuaGFzTmV4dCgpOykgewotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIHAgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBpdHIwLm5leHQoKTsKLQkJCW9iakZlYXR1cmVzU2V0LmFkZChwKTsKLQkJCVByb3BlcnR5RGVjb3JhdG9yIHBkID0gVXRpbGl0aWVzLmdldFByb3BlcnR5RGVjb3JhdG9yKHApOwotCQkJaWYgKCBwZCA9PSBudWxsIHx8IChwZC5nZXRJbXBsaWNpdERlY29yYXRvckZsYWcoKSA9PSBJbXBsaWNpdEl0ZW0uTk9UX0lNUExJQ0lUX0xJVEVSQUwgJiYgIXBkLmlzTWVyZ2VJbnRyb3NwZWN0aW9uKCkpKQotCQkJCW9iak5vblByb3BlcnRpZXMrKzsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvYmVhbmluZm8vQmVhbkluZm9TdWl0ZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvYmVhbmluZm8vQmVhbkluZm9TdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGU0ZDkwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL2JlYW5pbmZvL0JlYW5JbmZvU3VpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvOwotLyoKLSAqICAkUkNTZmlsZTogQmVhbkluZm9TdWl0ZS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xMiAkICAkRGF0ZTogMjAwNi8wNS8xNyAyMDoxMzo1NiAkIAotICovCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQganVuaXQuZXh0ZW5zaW9ucy5UZXN0U2V0dXA7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uYWRhcHRlcnMuQmVhbmluZm9OYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnRlc3RzLkphdmFQcm9qZWN0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udGVzdHMuSmF2YVRlc3RzUGx1Z2luOwotCi0vKioKLSAqIEBhdXRob3IgcmljaGt1bHAKLSAqCi0gKiBUaGlzIGlzIHRoZSB0cnVlIHRlc3Qgc3VpdGUgZm9yIEJlYW5pbmZvIFRlc3RpbmcuCi0gKi8KLXB1YmxpYyBjbGFzcyBCZWFuSW5mb1N1aXRlIGV4dGVuZHMgVGVzdFNldHVwIHsKLQotCS8vIFRlc3QgY2FzZXMgdG8gYmUgaW5jbHVkZSBpbiB0aGUgc3VpdGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzcyB0ZXN0c0xpc3RbXSA9Ci0JCXsgVGVzdFJlZmxlY3Rpb24uY2xhc3MsIC8vIE5PVEU6IFRoaXMgb25lIG11c3QgYWx3YXlzIGJlIGZpcnN0IGJlY2F1c2UgaXQgZG9lcyBzb21lIHRlc3RzIHRoYXQgZGVwZW5kIG9uIHRoaXMuCi0JCVRlc3RTdGFuZGFyZC5jbGFzcywgVGVzdEFXVFN3aW5nVUkuY2xhc3MgfTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBCZWFuSW5mb1N1aXRlLgotCSAqLwotCXB1YmxpYyBCZWFuSW5mb1N1aXRlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5ldyBUZXN0U3VpdGUobmFtZSkgewotCQkJewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGVzdHNMaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWFkZFRlc3RTdWl0ZSh0ZXN0c0xpc3RbaV0pOwotCQkJCX0KLQkJCX0KLQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIEJlYW5JbmZvU3VpdGUoKSB7Ci0JCXRoaXMoIlRlc3QgQmVhbkluZm8gU3VpdGUiKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgQmVhbkluZm9TdWl0ZSgpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBvbGRBdXRvQnVpbGRpbmdTdGF0ZTsgLy8gYXV0b0J1aWxkaW5nIHN0YXRlIGJlZm9yZSB3ZSBzdGFydGVkLgotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiLS0gSW5pdGlhbGl6aW5nIHRoZSBCZWFuSW5mbyB0ZXN0IGRhdGEgLS0iKTsgLy8kTk9OLU5MUy0xJAotCQlvbGRBdXRvQnVpbGRpbmdTdGF0ZSA9IEphdmFQcm9qZWN0VXRpbC5zZXRBdXRvQnVpbGQodHJ1ZSk7Ci0JCVVSTCBpbnN0YWxsVVJMID0gSmF2YVRlc3RzUGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCIvIik7Ci0JCVN0cmluZ1tdIHppcFBhdGhzID0gbmV3IFN0cmluZ1szXTsKLQkJemlwUGF0aHNbMF0gPSBGaWxlTG9jYXRvci50b0ZpbGVVUkwobmV3IFVSTChpbnN0YWxsVVJMLCAidGVzdGRhdGEvdGVzdGJlYW5pbmZvLnppcCIpKS5nZXRGaWxlKCk7Ci0JCXppcFBhdGhzWzFdID0gRmlsZUxvY2F0b3IudG9GaWxlVVJMKG5ldyBVUkwoaW5zdGFsbFVSTCwgInRlc3RkYXRhL3Rlc3RiZWFuaW5mb2JlYW5pbmZvcy56aXAiKSkuZ2V0RmlsZSgpOwotCQl6aXBQYXRoc1syXSA9IEZpbGVMb2NhdG9yLnRvRmlsZVVSTChuZXcgVVJMKGluc3RhbGxVUkwsICJ0ZXN0ZGF0YS90ZXN0YmVhbmluZm9wcmVxLnppcCIpKS5nZXRGaWxlKCk7Ci0JCUlQcm9qZWN0W10gcHJvamVjdHMgPQotCQkJSmF2YVByb2plY3RVdGlsLmltcG9ydFByb2plY3RzKAotCQkJCW5ldyBTdHJpbmdbXSB7Ci0JCQkJCUFic3RyYWN0QmVhbkluZm9UZXN0Q2FzZS5URVNUX0JFQU5JTkZPX1BST0pFQ1QsCi0JCQkJCUFic3RyYWN0QmVhbkluZm9UZXN0Q2FzZS5URVNUX0JFQU5JTkZPX0JFQU5JTkZPU19QUk9KRUNULAotCQkJCQlBYnN0cmFjdEJlYW5JbmZvVGVzdENhc2UuVEVTVF9CRUFOSU5GT19QUkVSRVFfUFJPSkVDVCB9LAotCQkJCXppcFBhdGhzKTsKLQkJYXNzZXJ0Tm90TnVsbChwcm9qZWN0c1swXSk7Ci0JCWFzc2VydE5vdE51bGwocHJvamVjdHNbMV0pOwotCQlhc3NlcnROb3ROdWxsKHByb2plY3RzWzJdKTsKLQkJSmF2YVByb2plY3RVdGlsLndhaXRGb3JBdXRvQnVpbGQoKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCItLSBEYXRhIGluaXRpYWxpemVkIC0tIik7IC8vJE5PTi1OTFMtMSQKLQotCQlCZWFuaW5mb05hdHVyZSBuYXR1cmUgPSBCZWFuaW5mb05hdHVyZS5nZXRSdW50aW1lKHByb2plY3RzWzBdKTsKLQkJYXNzZXJ0Tm90TnVsbChuYXR1cmUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5ydW4obmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQlKYXZhUHJvamVjdFV0aWwuZGVsZXRlUHJvamVjdChKYXZhUHJvamVjdFV0aWwuZ2V0UHJvamVjdChBYnN0cmFjdEJlYW5JbmZvVGVzdENhc2UuVEVTVF9CRUFOSU5GT19QUk9KRUNUKSk7Ci0JCQkJSmF2YVByb2plY3RVdGlsLmRlbGV0ZVByb2plY3QoSmF2YVByb2plY3RVdGlsLmdldFByb2plY3QoQWJzdHJhY3RCZWFuSW5mb1Rlc3RDYXNlLlRFU1RfQkVBTklORk9fQkVBTklORk9TX1BST0pFQ1QpKTsKLQkJCQlKYXZhUHJvamVjdFV0aWwuZGVsZXRlUHJvamVjdChKYXZhUHJvamVjdFV0aWwuZ2V0UHJvamVjdChBYnN0cmFjdEJlYW5JbmZvVGVzdENhc2UuVEVTVF9CRUFOSU5GT19QUkVSRVFfUFJPSkVDVCkpOwotCQkJfQotCQl9LCBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLCAwLCBudWxsKTsKLQotCQlKYXZhUHJvamVjdFV0aWwuc2V0QXV0b0J1aWxkKG9sZEF1dG9CdWlsZGluZ1N0YXRlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL2JlYW5pbmZvL1Rlc3RBV1RTd2luZ1VJLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9iZWFuaW5mby9UZXN0QVdUU3dpbmdVSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjlhNTA0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL2JlYW5pbmZvL1Rlc3RBV1RTd2luZ1VJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm87Ci0vKgotICogICRSQ1NmaWxlOiBUZXN0QVdUU3dpbmdVSS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS44ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjU4OjU1ICQgCi0gKi8KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLk1ldGhvZFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5Qcm9wZXJ0eURlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29yZS5VdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5KYXZhVGVzdHNQbHVnaW47Ci0KLS8qKgotICogQGF1dGhvciByaWNoa3VscAotICoKLSAqIEFXVC9Td2luZyB0ZXN0cwotICovCi1wdWJsaWMgY2xhc3MgVGVzdEFXVFN3aW5nVUkgZXh0ZW5kcyBBYnN0cmFjdEJlYW5JbmZvVGVzdENhc2UgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFRlc3RBV1RTd2luZ1VJKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIFRlc3RBV1RTd2luZ1VJKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkvKgotCSAqIFRoZSBudW1iZXIgb2YgcHJvcGVydGllcyBrZWVwIGluY3JlYXNpbmcgYnkgdmVyc2lvbiwKLQkgKiBidXQgdGhlcmUgaXMgYSBtaW5pbWFsIHNldC4gVGhpcyBtaW5pbWFsIHNldCB3aWxsIGJlCi0JICogc3RvcmVkIGluIGEgZmlsZSBhbmQgY2FuIGJlIGxvYWRlZCBieSB0aGlzIG1ldGhvZC4KLQkgKiBUaGlzIHNldCBjYW4gYmUgdXNlZCB0byBtYWtlIHN1cmUgdGhhdCBhdCBsZWFzdCB0aGUKLQkgKiByZXF1aXJlZCBwcm9wZXJ0aWVzIGFyZSB0aGVyZS4KLQkgKiAKLQkgKiBUaGUgZmlsZW5hbWUgaGFzIHRvIGJlIHJlbGF0aXZlIHRvIHRoZSB0ZXN0cyBwbHVnaW4uCi0JICovCi0JcHJvdGVjdGVkIFNldCBnZXROYW1lcyhTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVNldCBuYW1lcyA9IG5ldyBIYXNoU2V0KDUwKTsKLQkJVVJMIHVybCA9IEphdmFUZXN0c1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRFbnRyeShmaWxlbmFtZSk7Ci0JCWFzc2VydE5vdE51bGwodXJsKTsKLQkJQnVmZmVyZWRSZWFkZXIgcmRyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcih1cmwub3BlblN0cmVhbSgpKSk7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgbGluZSA9IG51bGw7Ci0JCQl3aGlsZSAoKGxpbmUgPSByZHIucmVhZExpbmUoKSkgIT0gbnVsbCkKLQkJCQluYW1lcy5hZGQobGluZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlyZHIuY2xvc2UoKTsKLQkJfQotCQlyZXR1cm4gbmFtZXM7Ci0JfQotCQotCS8qCi0JICogVGVzdCB0aGUgbmFtZXMgYWdhaW5zdCB0aGUgc2V0LiBQcmludCB0aG9zZSBub3QgZm91bmQgaW4gdGhlIHNldCwgCi0JICogb3IgdGhvc2UgaW4gdGhlIGFnYWluc3RTZXQgdGhhdCB3ZXJlbid0IGZvdW5kLiBUaHJvdyBhc3NlcnQgZXJyb3IgaWYKLQkgKiBhbnkgZnJvbSBhZ2FpbnN0IHNldCBub3QgZm91bmQuIAotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlc3RJbmNsdWRlc0FsbE5hbWVzKFN0cmluZyBpZCwgTGlzdCB0ZXN0TmFtZXMsIFNldCBhZ2FpbnN0U2V0LCBTZXQgZXhjbHVkZSkgewotCQlTZXQgd29ya2luZ0FnYWluc3QgPSBuZXcgSGFzaFNldChhZ2FpbnN0U2V0LnNpemUoKSk7Ci0JCXdvcmtpbmdBZ2FpbnN0LmFkZEFsbChhZ2FpbnN0U2V0KTsJLy8gVGhlcmUgbWF5IGJlIGR1cCB0ZXN0TmFtZXMgKGxpa2UgZm9yIG9wZXJhdGlvbnMpLCBzbyBpbiB0aGF0IGNhc2Ugd2UgbGVhdmUgYWdhaW5zdFNldCBhbG9uZS4KLQkJYm9vbGVhbiB3cm90ZUFueSA9IGZhbHNlOwotCQlmb3IgKEl0ZXJhdG9yIGl0ciA9IHRlc3ROYW1lcy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgewotCQkJRU5hbWVkRWxlbWVudCB0ZXN0TmFtZSA9IChFTmFtZWRFbGVtZW50KSBpdHIubmV4dCgpOwotCQkJaWYgKGV4Y2x1ZGUuY29udGFpbnModGVzdE5hbWUpKQotCQkJCWNvbnRpbnVlOwkvLyBUaGlzIGlzIG9uZSB3ZSB3YW50IHRvIGlnbm9yZQotCQkJaWYgKGFnYWluc3RTZXQuY29udGFpbnModGVzdE5hbWUuZ2V0TmFtZSgpKSkKLQkJCQl3b3JraW5nQWdhaW5zdC5yZW1vdmUodGVzdE5hbWUuZ2V0TmFtZSgpKTsJLy8gR2V0IHJpZCBvZiBpdCBzaW5jZSBmb3VuZC4KLQkJCWVsc2UgewotCQkJCWlmICghd3JvdGVBbnkpIHsKLQkJCQkJd3JvdGVBbnkgPSB0cnVlOwotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5hbWVzIGluIGxpc3QgdGhhdCBhcmUgbmV3IGZvciAiICsgaWQgKyAnOicpOwotCQkJCX0KLQkJCQlTeXN0ZW0ub3V0LnByaW50KCIgICIpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbih0ZXN0TmFtZS5nZXROYW1lKCkpOwotCQkJfQotCQl9Ci0JCWlmICh3cm90ZUFueSkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRW5kIG9mIG5ldyBuYW1lcy4iKTsKLQkJCi0JCWlmICghd29ya2luZ0FnYWluc3QuaXNFbXB0eSgpKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5hbWVzIHRoYXQgc2hvdWxkIG9mIGJlZW4gZm91bmQsIGJ1dCB3ZXJlbid0IGZvciAiICsgaWQgKyAnOicpOwotCQkJZm9yIChJdGVyYXRvciBpdHIgPSB3b3JraW5nQWdhaW5zdC5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgewotCQkJCVN0cmluZyBuYW1lID0gKFN0cmluZykgaXRyLm5leHQoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50KCIgICIpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihuYW1lKTsKLQkJCX0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRW5kIG9mIG1pc3NpbmcgbmFtZXMiKTsKLQkJCWZhaWwoIk1pc3Npbmcgc29tZSByZXF1aXJlZCBuYW1lcyBmb3IgIitpZCsnLicpOwotCQl9Ci0JfQotCQotCS8qCi0JICogV3JpdGUgdGhlIG5hbWVzIG91dC4gQ2FsbCBvbmx5IHdoZW4gd2FudCB0byB1cGRhdGUgbGlzdC4gRmlsZW5hbWUgbXVzdAotCSAqIGJlIGEgbG9jYWwgZmlsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB3cml0ZU5hbWVzKFN0cmluZyBmaWxlbmFtZSwgTGlzdCBwcm9wcywgU2V0IGV4Y2x1ZGluZykgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCVByaW50V3JpdGVyIHByID0gbmV3IFByaW50V3JpdGVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGVuYW1lKSk7Ci0JCXRyeSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ciA9IHByb3BzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7Ci0JCQkJRU5hbWVkRWxlbWVudCBlbGVtZW50ID0gKEVOYW1lZEVsZW1lbnQpIGl0ci5uZXh0KCk7Ci0JCQkJaWYgKGV4Y2x1ZGluZyAhPSBudWxsICYmIGV4Y2x1ZGluZy5jb250YWlucyhlbGVtZW50KSkKLQkJCQkJY29udGludWU7Ci0JCQkJcHIucHJpbnRsbihlbGVtZW50LmdldE5hbWUoKSk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlwci5jbG9zZSgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJlZmxlY3QgdGhlIGVudGlyZSBzdXBlciB0eXBlIGhpZXJhcmNoeSBvZiB0aGUgY2xhc3MgcGFzc2VkIGluLCBpbmNsdWRpbmcgdGhlIGNsYXNzIGl0c2VsZi4KLQkgKiBAcGFyYW0gamNsYXNzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmbGVjdEhpZXJhY2h5KEphdmFDbGFzcyBqY2xhc3MpIHsKLQkJSmF2YUNsYXNzIGxvb3BDbGFzcyA9IGpjbGFzczsKLQkJd2hpbGUgKGxvb3BDbGFzcyAhPSBudWxsKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlJlZmxlY3RpbmcgZm9yICIgKyBsb29wQ2xhc3MuZ2V0UXVhbGlmaWVkTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJbG9vcENsYXNzLmlzRmluYWwoKTsgLy8gVGhpcyBjYXVzZXMgcmVmbGVjdGlvbi4KLQkJCWxvb3BDbGFzcyA9IGxvb3BDbGFzcy5nZXRTdXBlcnR5cGUoKTsKLQkJfQkJCi0JfQotCQotCS8qKgotCSAqIFVzZSB3aGVuIHRoZSBjb21wYXJlcyBkb24ndCBtYXRjaCB0byBnZXQgYSBzb3J0ZWQgbGlzdCBvZiBvcGVyYXRpb25zIHNvIHRoYXQKLQkgKiBtYW51YWxseSB2ZXJpZnkgdGhlIGNvdW50LgotCSAqIEBwYXJhbSBqY2xhc3MKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzaG93U29ydGVkT3BlcmF0aW9ucyhKYXZhQ2xhc3MgamNsYXNzKSB7Ci0JCQkgTGlzdCBhbGxCID0gamNsYXNzLmdldEVBbGxPcGVyYXRpb25zKCk7Ci0JCQkgU3RyaW5nW10gbmFtZXMgPSBuZXcgU3RyaW5nW2FsbEIuc2l6ZSgpXTsKLQkJCSBmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJIG5hbWVzW2ldID0gKChNZXRob2RQcm94eSkgYWxsQi5nZXQoaSkpLmdldE1ldGhvZCgpLmdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmUoKTsKLQkJCSB9Ci0JCQkgQXJyYXlzLnNvcnQobmFtZXMpOwotCQkJIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tIExpc3Qgb2YgT3BlcmF0aW9ucyBmb3IgIiArIGpjbGFzcy50b1N0cmluZygpKTsKLQkJCSBmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJIFN5c3RlbS5vdXQucHJpbnRsbihuYW1lc1tpXSk7Ci0JCQkgfQkJCi0JfQotCQotCS8qKgotCSAqIFVzZSB3aGVuIHRoZSBjb21wYXJlcyBkb24ndCBtYXRjaCB0byBnZXQgYSBzb3J0ZWQgbGlzdCBvZiBwcm9wZXJ0aWVzIHNvIHRoYXQKLQkgKiBtYW51YWxseSB2ZXJpZnkgdGhlIGNvdW50LgotCSAqIEBwYXJhbSBqY2xhc3MKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzaG93U29ydGVkUHJvcGVydGllcyhKYXZhQ2xhc3MgamNsYXNzKSB7Ci0JCUxpc3QgYWxsUCA9IGpjbGFzcy5nZXRBbGxQcm9wZXJ0aWVzKCk7Ci0JCVN0cmluZ1tdIG5hbWVzID0gbmV3IFN0cmluZ1thbGxQLnNpemUoKV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCW5hbWVzW2ldID0gKChFU3RydWN0dXJhbEZlYXR1cmUpIGFsbFAuZ2V0KGkpKS5nZXROYW1lKCk7Ci0JCX0KLQkJQXJyYXlzLnNvcnQobmFtZXMpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLSBMaXN0IG9mIHByb3BlcnRpZXMgZm9yICIgKyBqY2xhc3MudG9TdHJpbmcoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihuYW1lc1tpXSk7Ci0JCX0JCQotCX0KLQkKLQlwcm90ZWN0ZWQgSmF2YUNsYXNzIGdldEJ1dHRvbigpIHsKLQkJcmV0dXJuIChKYXZhQ2xhc3MpIHJzZXQuZ2V0RU9iamVjdChVUkkuY3JlYXRlVVJJKCJqYXZhOi9qYXZhLmF3dCNCdXR0b24iKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUNsYXNzIGdldEpMYWJlbCgpIHsKLQkJcmV0dXJuIChKYXZhQ2xhc3MpIHJzZXQuZ2V0RU9iamVjdChVUkkuY3JlYXRlVVJJKCJqYXZhOi9qYXZheC5zd2luZyNKTGFiZWwiKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEV4dGVybmFsSmFyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJb2JqRmVhdHVyZXNTZXR1cCgpOwotCQkKLQkJLy8gVGhpcyB0ZXN0cyBnZXR0aW5nIGJlYW5pbmZvIG91dCBvZiBqYXIuIFRoZSBqYXIgaXMgd2l0aGluIHRoZSBwcm9qZWN0LiBJdCBjb250YWlucyBCdXR0b25CZWFuSW5mby4KLQkJSmF2YUNsYXNzIGJ1dHRvbiA9IGdldEJ1dHRvbigpOwotCQlyZWZsZWN0SGllcmFjaHkoYnV0dG9uKTsJLy8gRmlyc3QgcmVmbGVjdCBhbGwgcGFyZW50cyAobm90IGludHJvc3BlY3QpLgotCQkvLyBOb3cgY2F1c2UgaW50cm9zcGVjdGlvbi4KLQkJCi0JCS8vIFRvIHdyaXRlIG91dCB0aGUgbmFtZXMgaWYgd2FudCBuZXcgc2V0LgotLy8JCXdyaXRlTmFtZXMoImQ6L3RlbXAvZXh0amFycHJvcHMudHh0IiwgYnV0dG9uLmdldEFsbFByb3BlcnRpZXMoKSwgb2JqRmVhdHVyZXNTZXQpOwkJCi0JCQotCQlTZXQgbmFtZXMgPSBnZXROYW1lcygidGVzdGRhdGEvZXh0amFycHJvcHMudHh0Iik7Ci0JCXRlc3RJbmNsdWRlc0FsbE5hbWVzKCJCdXR0b24iLCBidXR0b24uZ2V0QWxsUHJvcGVydGllcygpLCBuYW1lcywgb2JqRmVhdHVyZXNTZXQpOwotCi0JCS8vIFRvIHdyaXRlIG91dCB0aGUgbmFtZXMgaWYgd2FudCBuZXcgc2V0LgotLy8JCXdyaXRlTmFtZXMoImQ6L3RlbXAvZXh0amFyb3BzLnR4dCIsIGJ1dHRvbi5nZXRFT3BlcmF0aW9ucygpLCBDb2xsZWN0aW9ucy5FTVBUWV9TRVQpOwkJCi0JCQotCQluYW1lcyA9IGdldE5hbWVzKCJ0ZXN0ZGF0YS9leHRqYXJvcHMudHh0Iik7Ci0JCXRlc3RJbmNsdWRlc0FsbE5hbWVzKCJCdXR0b24iLCBidXR0b24uZ2V0RU9wZXJhdGlvbnMoKSwgbmFtZXMsIENvbGxlY3Rpb25zLkVNUFRZX1NFVCk7Ci0JCQotLy8JCXNob3dTb3J0ZWRQcm9wZXJ0aWVzKGJ1dHRvbik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKTGFiZWwoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlvYmpGZWF0dXJlc1NldHVwKCk7Ci0JCQotCQkvLyBUaGlzIHRlc3RzIEpMYWJlbCBiZWFuaW5mbyBvdXQgb2YgY3VycmVudCBwcm9qZWN0LCBidXQgdGhyb3VnaCBzZWFyY2ggcGF0aC4KLQkJSmF2YUNsYXNzIGpsYWJlbCA9IGdldEpMYWJlbCgpOwotCQlyZWZsZWN0SGllcmFjaHkoamxhYmVsKTsJLy8gRmlyc3QgcmVmbGVjdCBhbGwgcGFyZW50cyAobm90IGludHJvc3BlY3QpLgotCQkvLyBOb3cgY2F1c2UgaW50cm9zcGVjdGlvbi4KLQkKLQkJLy8gVG8gd3JpdGUgb3V0IHRoZSBuYW1lcyBpZiB3YW50IG5ldyBzZXQuCi0vLwkJd3JpdGVOYW1lcygiZDovdGVtcC9qbGFiZWxwcm9wcy50eHQiLCBqbGFiZWwuZ2V0QWxsUHJvcGVydGllcygpLCBvYmpGZWF0dXJlc1NldCk7Ci0JCQotCQlTZXQgbmFtZXMgPSBnZXROYW1lcygidGVzdGRhdGEvamxhYmVscHJvcHMudHh0Iik7Ci0JCXRlc3RJbmNsdWRlc0FsbE5hbWVzKCJKTGFiZWwiLCBqbGFiZWwuZ2V0QWxsUHJvcGVydGllcygpLCBuYW1lcywgb2JqRmVhdHVyZXNTZXQpOwotCQkKLQkJLy8gVG8gd3JpdGUgb3V0IHRoZSBuYW1lcyBpZiB3YW50IG5ldyBzZXQuCi0vLwkJd3JpdGVOYW1lcygiZDovdGVtcC9qbGFiZWxvcHMudHh0IiwgamxhYmVsLmdldEVBbGxPcGVyYXRpb25zKCksIENvbGxlY3Rpb25zLkVNUFRZX1NFVCk7CQkKLQotCQluYW1lcyA9IGdldE5hbWVzKCJ0ZXN0ZGF0YS9qbGFiZWxvcHMudHh0Iik7Ci0JCXRlc3RJbmNsdWRlc0FsbE5hbWVzKCJKTGFiZWwiLCBqbGFiZWwuZ2V0RUFsbE9wZXJhdGlvbnMoKSwgbmFtZXMsIENvbGxlY3Rpb25zLkVNUFRZX1NFVCk7Ci0JCQotLy8JCXNob3dTb3J0ZWRQcm9wZXJ0aWVzKGpsYWJlbCk7Ci0vLwkJc2hvd1NvcnRlZE9wZXJhdGlvbnMoamxhYmVsKTsKLQkJCi0JCS8vIFRlc3QgdGhhdCBpc1ByZWZlcnJlZCB3b3JrcyBib3RoIGZvciAxLjMgSlZNIGFuZCAxLjQgYW5kIGxhdGVyIHNpbmNlIHRoZXJlIHdhcyBhIGJ1ZyBpbiAxLjMuCi0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBlbmFibGVkU0YgPSBqbGFiZWwuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCJlbmFibGVkIik7IC8vJE5PTi1OTFMtMSQKLQkJUHJvcGVydHlEZWNvcmF0b3IgcGQgPSBVdGlsaXRpZXMuZ2V0UHJvcGVydHlEZWNvcmF0b3IoZW5hYmxlZFNGKTsKLQkJYXNzZXJ0VHJ1ZShwZC5pc1ByZWZlcnJlZCgpKTsKLQl9Ci0JCi0JLyoKLQkgKiBBdCB0aW1lIG9mIHRoaXMgdGVzdCBjcmVhdGlvbiwgdGhpcyBpcyB0aGUgc29ydGVkIGxpc3RzIGZvciBjb21wYXJpc29uIHB1cnBvc2VzLgotCSAqIAotCQktLS0gTGlzdCBvZiBwcm9wZXJ0aWVzIGZvciBqYXZhLmF3dC5CdXR0b24KLQkJYWN0aW9uQ29tbWFuZAotCQlhbGlnbm1lbnRYCi0JCWFsaWdubWVudFkKLQkJYmFja2dyb3VuZAotCQlib3VuZHMKLQkJY2xhc3MKLQkJY29sb3JNb2RlbAotCQljb21wb25lbnRPcmllbnRhdGlvbgotCQljdXJzb3IKLQkJZW5hYmxlZAotCQlldmVudHMKLQkJZm9jdXNUcmF2ZXJzYWJsZQotCQlmb250Ci0JCWZvcmVncm91bmQKLQkJZ3JhcGhpY3MKLQkJaW1wbGljaXQKLQkJaW5pdGlhbGl6YXRpb25TdHJpbmcKLQkJaW5zdGFudGlhdGVVc2luZwotCQlsYWJlbAotCQlsb2NhbGUKLQkJbG9jYXRpb24KLQkJbG9jYXRpb25PblNjcmVlbgotCQltYXhpbXVtU2l6ZQotCQltaW5pbXVtU2l6ZQotCQluYW1lCi0JCXBhcmVudAotCQlwcmVmZXJyZWRTaXplCi0JCXNlcmlhbGl6ZURhdGEKLQkJc2hvd2luZwotCQlzaXplCi0JCXRvb2xraXQKLQkJdHJlZUxvY2sKLQkJdmFsaWQKLQkJdmlzaWJsZQotCQkKLQkJLS0tIExpc3Qgb2YgcHJvcGVydGllcyBmb3IgamF2YXguc3dpbmcuSkxhYmVsCi0JCWFsaWdubWVudFgKLQkJYWxpZ25tZW50WQotCQlhdXRvc2Nyb2xscwotCQliYWNrZ3JvdW5kCi0JCWJvcmRlcgotCQlib3VuZHMKLQkJY2xhc3MKLQkJY29sb3JNb2RlbAotCQljb21wb25lbnRDb3VudAotCQljb21wb25lbnRPcmllbnRhdGlvbgotCQljb21wb25lbnRzCi0JCWN1cnNvcgotCQlkZWJ1Z0dyYXBoaWNzT3B0aW9ucwotCQlkaXNhYmxlZEljb24KLQkJZGlzcGxheWVkTW5lbW9uaWMKLQkJZG91YmxlQnVmZmVyZWQKLQkJZW5hYmxlZAotCQlldmVudHMKLQkJZm9jdXNDeWNsZVJvb3QKLQkJZm9jdXNUcmF2ZXJzYWJsZQotCQlmb250Ci0JCWZvcmVncm91bmQKLQkJZ3JhcGhpY3MKLQkJaGVpZ2h0Ci0JCWhvcml6b250YWxBbGlnbm1lbnQKLQkJaG9yaXpvbnRhbFRleHRQb3NpdGlvbgotCQlpY29uCi0JCWljb25UZXh0R2FwCi0JCWltcGxpY2l0Ci0JCWluaXRpYWxpemF0aW9uU3RyaW5nCi0JCWluc2V0cwotCQlpbnN0YW50aWF0ZVVzaW5nCi0JCWxhYmVsRm9yCi0JCWxheW91dAotCQlsb2NhbGUKLQkJbG9jYXRpb24KLQkJbG9jYXRpb25PblNjcmVlbgotCQltYW5hZ2luZ0ZvY3VzCi0JCW1heGltdW1TaXplCi0JCW1pbmltdW1TaXplCi0JCW5hbWUKLQkJbmV4dEZvY3VzYWJsZUNvbXBvbmVudAotCQlvcGFxdWUKLQkJb3B0aW1pemVkRHJhd2luZ0VuYWJsZWQKLQkJcGFpbnRpbmdUaWxlCi0JCXBhcmVudAotCQlwcmVmZXJyZWRTaXplCi0JCXJlZ2lzdGVyZWRLZXlTdHJva2VzCi0JCXJlcXVlc3RGb2N1c0VuYWJsZWQKLQkJcm9vdFBhbmUKLQkJc2VyaWFsaXplRGF0YQotCQlzaG93aW5nCi0JCXNpemUKLQkJdGV4dAotCQl0b29sVGlwVGV4dAotCQl0b29sa2l0Ci0JCXRvcExldmVsQW5jZXN0b3IKLQkJdHJlZUxvY2sKLQkJdmFsaWQKLQkJdmFsaWRhdGVSb290Ci0JCXZlcnRpY2FsQWxpZ25tZW50Ci0JCXZlcnRpY2FsVGV4dFBvc2l0aW9uCi0JCXZpc2libGUKLQkJdmlzaWJsZVJlY3QKLQkJd2lkdGgKLQkJeAotCQl5Ci0JCi0JCS0tLSBMaXN0IG9mIE9wZXJhdGlvbnMgZm9yIGphdmF4LnN3aW5nLkpMYWJlbAotCQlhZGQoamF2YS5hd3QuQ29tcG9uZW50KQotCQlhZGQoamF2YS5hd3QuQ29tcG9uZW50LGludCkKLQkJYWRkKGphdmEuYXd0LkNvbXBvbmVudCxqYXZhLmxhbmcuT2JqZWN0KQotCQlhZGQoamF2YS5hd3QuQ29tcG9uZW50LGphdmEubGFuZy5PYmplY3QsaW50KQotCQlhZGQoamF2YS5hd3QuUG9wdXBNZW51KQotCQlhZGQoamF2YS5sYW5nLlN0cmluZyxqYXZhLmF3dC5Db21wb25lbnQpCi0JCWFkZE5vdGlmeSgpCi0JCWNoZWNrSW1hZ2UoamF2YS5hd3QuSW1hZ2UsamF2YS5hd3QuaW1hZ2UuSW1hZ2VPYnNlcnZlcikKLQkJY29tcHV0ZVZpc2libGVSZWN0KGphdmEuYXd0LlJlY3RhbmdsZSkKLQkJY29udGFpbnMoaW50LGludCkKLQkJY29udGFpbnMoamF2YS5hd3QuUG9pbnQpCi0JCWNyZWF0ZUltYWdlKGludCxpbnQpCi0JCWNyZWF0ZUltYWdlKGphdmEuYXd0LmltYWdlLkltYWdlUHJvZHVjZXIpCi0JCWNyZWF0ZVRvb2xUaXAoKQotCQlkaXNwYXRjaEV2ZW50KGphdmEuYXd0LkFXVEV2ZW50KQotCQlkb0xheW91dCgpCi0JCWVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotCQlmaXJlUHJvcGVydHlDaGFuZ2UoamF2YS5sYW5nLlN0cmluZyxib29sZWFuLGJvb2xlYW4pCi0JCWZpcmVQcm9wZXJ0eUNoYW5nZShqYXZhLmxhbmcuU3RyaW5nLGNoYXIsY2hhcikKLQkJZmlyZVByb3BlcnR5Q2hhbmdlKGphdmEubGFuZy5TdHJpbmcsZG91YmxlLGRvdWJsZSkKLQkJZmlyZVByb3BlcnR5Q2hhbmdlKGphdmEubGFuZy5TdHJpbmcsZmxvYXQsZmxvYXQpCi0JCWZpcmVQcm9wZXJ0eUNoYW5nZShqYXZhLmxhbmcuU3RyaW5nLGludCxpbnQpCi0JCWZpcmVQcm9wZXJ0eUNoYW5nZShqYXZhLmxhbmcuU3RyaW5nLGxvbmcsbG9uZykKLQkJZmlyZVByb3BlcnR5Q2hhbmdlKGphdmEubGFuZy5TdHJpbmcsc2hvcnQsc2hvcnQpCi0JCWdldEFjY2Vzc2libGVDb250ZXh0KCkKLQkJZ2V0QWN0aW9uRm9yS2V5U3Ryb2tlKGphdmF4LnN3aW5nLktleVN0cm9rZSkKLQkJZ2V0QWxpZ25tZW50WCgpCi0JCWdldEFsaWdubWVudFkoKQotCQlnZXRBdXRvc2Nyb2xscygpCi0JCWdldEJhY2tncm91bmQoKQotCQlnZXRCb3JkZXIoKQotCQlnZXRCb3VuZHMoKQotCQlnZXRCb3VuZHMoamF2YS5hd3QuUmVjdGFuZ2xlKQotCQlnZXRDbGFzcygpCi0JCWdldENsaWVudFByb3BlcnR5KGphdmEubGFuZy5PYmplY3QpCi0JCWdldENvbG9yTW9kZWwoKQotCQlnZXRDb21wb25lbnQoaW50KQotCQlnZXRDb21wb25lbnRBdChpbnQsaW50KQotCQlnZXRDb21wb25lbnRBdChqYXZhLmF3dC5Qb2ludCkKLQkJZ2V0Q29tcG9uZW50Q291bnQoKQotCQlnZXRDb21wb25lbnRzKCkKLQkJZ2V0Q29uZGl0aW9uRm9yS2V5U3Ryb2tlKGphdmF4LnN3aW5nLktleVN0cm9rZSkKLQkJZ2V0Q3Vyc29yKCkKLQkJZ2V0RGlzYWJsZWRJY29uKCkKLQkJZ2V0RGlzcGxheWVkTW5lbW9uaWMoKQotCQlnZXRGb250KCkKLQkJZ2V0Rm9udE1ldHJpY3MoamF2YS5hd3QuRm9udCkKLQkJZ2V0Rm9yZWdyb3VuZCgpCi0JCWdldEdyYXBoaWNzKCkKLQkJZ2V0SGVpZ2h0KCkKLQkJZ2V0SG9yaXpvbnRhbEFsaWdubWVudCgpCi0JCWdldEhvcml6b250YWxUZXh0UG9zaXRpb24oKQotCQlnZXRJY29uKCkKLQkJZ2V0SWNvblRleHRHYXAoKQotCQlnZXRJbnNldHMoKQotCQlnZXRMYWJlbEZvcigpCi0JCWdldExheW91dCgpCi0JCWdldExvY2FsZSgpCi0JCWdldExvY2F0aW9uKCkKLQkJZ2V0TG9jYXRpb24oamF2YS5hd3QuUG9pbnQpCi0JCWdldExvY2F0aW9uT25TY3JlZW4oKQotCQlnZXRNYXhpbXVtU2l6ZSgpCi0JCWdldE1pbmltdW1TaXplKCkKLQkJZ2V0TmFtZSgpCi0JCWdldE5leHRGb2N1c2FibGVDb21wb25lbnQoKQotCQlnZXRQYXJlbnQoKQotCQlnZXRQcmVmZXJyZWRTaXplKCkKLQkJZ2V0UmVnaXN0ZXJlZEtleVN0cm9rZXMoKQotCQlnZXRSb290UGFuZSgpCi0JCWdldFNpemUoKQotCQlnZXRTaXplKGphdmEuYXd0LkRpbWVuc2lvbikKLQkJZ2V0VGV4dCgpCi0JCWdldFRvb2xUaXBUZXh0KCkKLQkJZ2V0VG9vbGtpdCgpCi0JCWdldFRvcExldmVsQW5jZXN0b3IoKQotCQlnZXRUcmVlTG9jaygpCi0JCWdldFVJKCkKLQkJZ2V0VmVydGljYWxBbGlnbm1lbnQoKQotCQlnZXRWZXJ0aWNhbFRleHRQb3NpdGlvbigpCi0JCWdldFZpc2libGVSZWN0KCkKLQkJZ2V0V2lkdGgoKQotCQlnZXRYKCkKLQkJZ2V0WSgpCi0JCWdyYWJGb2N1cygpCi0JCWhhc0ZvY3VzKCkKLQkJaGFzaENvZGUoKQotCQlpbnZhbGlkYXRlKCkKLQkJaXNBbmNlc3Rvck9mKGphdmEuYXd0LkNvbXBvbmVudCkKLQkJaXNEb3VibGVCdWZmZXJlZCgpCi0JCWlzRW5hYmxlZCgpCi0JCWlzRm9jdXNDeWNsZVJvb3QoKQotCQlpc0ZvY3VzVHJhdmVyc2FibGUoKQotCQlpc01hbmFnaW5nRm9jdXMoKQotCQlpc09wYXF1ZSgpCi0JCWlzT3B0aW1pemVkRHJhd2luZ0VuYWJsZWQoKQotCQlpc1JlcXVlc3RGb2N1c0VuYWJsZWQoKQotCQlpc1Nob3dpbmcoKQotCQlpc1ZhbGlkKCkKLQkJaXNWYWxpZGF0ZVJvb3QoKQotCQlpc1Zpc2libGUoKQotCQlsaXN0KCkKLQkJbGlzdChqYXZhLmlvLlByaW50U3RyZWFtKQotCQlsaXN0KGphdmEuaW8uUHJpbnRTdHJlYW0saW50KQotCQlsaXN0KGphdmEuaW8uUHJpbnRXcml0ZXIsaW50KQotCQlub3RpZnkoKQotCQlub3RpZnlBbGwoKQotCQlwYWludChqYXZhLmF3dC5HcmFwaGljcykKLQkJcGFpbnRBbGwoamF2YS5hd3QuR3JhcGhpY3MpCi0JCXBhaW50SW1tZWRpYXRlbHkoamF2YS5hd3QuUmVjdGFuZ2xlKQotCQlwcmVwYXJlSW1hZ2UoamF2YS5hd3QuSW1hZ2UsamF2YS5hd3QuaW1hZ2UuSW1hZ2VPYnNlcnZlcikKLQkJcHJpbnQoamF2YS5hd3QuR3JhcGhpY3MpCi0JCXByaW50QWxsKGphdmEuYXd0LkdyYXBoaWNzKQotCQlwdXRDbGllbnRQcm9wZXJ0eShqYXZhLmxhbmcuT2JqZWN0LGphdmEubGFuZy5PYmplY3QpCi0JCXJlbW92ZShpbnQpCi0JCXJlbW92ZShqYXZhLmF3dC5Db21wb25lbnQpCi0JCXJlbW92ZShqYXZhLmF3dC5NZW51Q29tcG9uZW50KQotCQlyZW1vdmVBbGwoKQotCQlyZW1vdmVOb3RpZnkoKQotCQlyZXBhaW50KCkKLQkJcmVwYWludChqYXZhLmF3dC5SZWN0YW5nbGUpCi0JCXJlcXVlc3REZWZhdWx0Rm9jdXMoKQotCQlyZXF1ZXN0Rm9jdXMoKQotCQlyZXNldEtleWJvYXJkQWN0aW9ucygpCi0JCXJldmFsaWRhdGUoKQotCQlzY3JvbGxSZWN0VG9WaXNpYmxlKGphdmEuYXd0LlJlY3RhbmdsZSkKLQkJc2V0QWxpZ25tZW50WChmbG9hdCkKLQkJc2V0QWxpZ25tZW50WShmbG9hdCkKLQkJc2V0QXV0b3Njcm9sbHMoYm9vbGVhbikKLQkJc2V0QmFja2dyb3VuZChqYXZhLmF3dC5Db2xvcikKLQkJc2V0Qm9yZGVyKGphdmF4LnN3aW5nLmJvcmRlci5Cb3JkZXIpCi0JCXNldEJvdW5kcyhpbnQsaW50LGludCxpbnQpCi0JCXNldEJvdW5kcyhqYXZhLmF3dC5SZWN0YW5nbGUpCi0JCXNldEN1cnNvcihqYXZhLmF3dC5DdXJzb3IpCi0JCXNldERlYnVnR3JhcGhpY3NPcHRpb25zKGludCkKLQkJc2V0RGlzYWJsZWRJY29uKGphdmF4LnN3aW5nLkljb24pCi0JCXNldERpc3BsYXllZE1uZW1vbmljKGNoYXIpCi0JCXNldERvdWJsZUJ1ZmZlcmVkKGJvb2xlYW4pCi0JCXNldEVuYWJsZWQoYm9vbGVhbikKLQkJc2V0Rm9udChqYXZhLmF3dC5Gb250KQotCQlzZXRGb3JlZ3JvdW5kKGphdmEuYXd0LkNvbG9yKQotCQlzZXRIb3Jpem9udGFsQWxpZ25tZW50KGludCkKLQkJc2V0SG9yaXpvbnRhbFRleHRQb3NpdGlvbihpbnQpCi0JCXNldEljb24oamF2YXguc3dpbmcuSWNvbikKLQkJc2V0SWNvblRleHRHYXAoaW50KQotCQlzZXRMYWJlbEZvcihqYXZhLmF3dC5Db21wb25lbnQpCi0JCXNldExheW91dChqYXZhLmF3dC5MYXlvdXRNYW5hZ2VyKQotCQlzZXRMb2NhbGUoamF2YS51dGlsLkxvY2FsZSkKLQkJc2V0TG9jYXRpb24oaW50LGludCkKLQkJc2V0TG9jYXRpb24oamF2YS5hd3QuUG9pbnQpCi0JCXNldE1heGltdW1TaXplKGphdmEuYXd0LkRpbWVuc2lvbikKLQkJc2V0TWluaW11bVNpemUoamF2YS5hd3QuRGltZW5zaW9uKQotCQlzZXROYW1lKGphdmEubGFuZy5TdHJpbmcpCi0JCXNldE5leHRGb2N1c2FibGVDb21wb25lbnQoamF2YS5hd3QuQ29tcG9uZW50KQotCQlzZXRPcGFxdWUoYm9vbGVhbikKLQkJc2V0UHJlZmVycmVkU2l6ZShqYXZhLmF3dC5EaW1lbnNpb24pCi0JCXNldFJlcXVlc3RGb2N1c0VuYWJsZWQoYm9vbGVhbikKLQkJc2V0U2l6ZShpbnQsaW50KQotCQlzZXRTaXplKGphdmEuYXd0LkRpbWVuc2lvbikKLQkJc2V0VGV4dChqYXZhLmxhbmcuU3RyaW5nKQotCQlzZXRUb29sVGlwVGV4dChqYXZhLmxhbmcuU3RyaW5nKQotCQlzZXRVSShqYXZheC5zd2luZy5wbGFmLkxhYmVsVUkpCi0JCXNldFZlcnRpY2FsQWxpZ25tZW50KGludCkKLQkJc2V0VmVydGljYWxUZXh0UG9zaXRpb24oaW50KQotCQlzZXRWaXNpYmxlKGJvb2xlYW4pCi0JCXRvU3RyaW5nKCkKLQkJdHJhbnNmZXJGb2N1cygpCi0JCXVucmVnaXN0ZXJLZXlib2FyZEFjdGlvbihqYXZheC5zd2luZy5LZXlTdHJva2UpCi0JCXVwZGF0ZShqYXZhLmF3dC5HcmFwaGljcykKLQkJdXBkYXRlVUkoKQotCQl2YWxpZGF0ZSgpCi0JCXdhaXQoKQotCQl3YWl0KGxvbmcpCi0JCXdhaXQobG9uZyxpbnQpCi0JCQkKLQkgKi8KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvYmVhbmluZm8vVGVzdFJlZmxlY3Rpb24uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL2JlYW5pbmZvL1Rlc3RSZWZsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkNmZhOGEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvYmVhbmluZm8vVGVzdFJlZmxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5iZWFuaW5mbzsKLS8qCi0gKiAgJFJDU2ZpbGU6IFRlc3RSZWZsZWN0aW9uLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjggJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6NTg6NTUgJCAKLSAqLwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5Qcm9wZXJ0eURlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29yZS5VdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5UeXBlS2luZDsKLQotLyoqCi0gKiBAYXV0aG9yIHJpY2hrdWxwCi0gKiBUaGlzIG9uZSBpcyBmb3IgdGVzdGluZyByZWZsZWN0aW9uLiBJdCBpcyBzZXBhcmF0ZSBzbyB0aGF0Ci0gKiB0ZXN0IHN1aXRlIGNhbiBndWFyZW50ZWUgdGhhdCBpdCBpcyBmaXJzdC4KLSAqLwotcHVibGljIGNsYXNzIFRlc3RSZWZsZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RCZWFuSW5mb1Rlc3RDYXNlIHsKLQotCXB1YmxpYyBUZXN0UmVmbGVjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgVGVzdFJlZmxlY3Rpb24oU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZWZsZWN0aW9uKCkgewotCQkvLyBUZXN0IG9uZSB3aXRob3V0IGEgYmVhbmluZm8uIFRoaXMgd2lsbCBkbyByZWZsZWN0aW9uLgotCQlKYXZhQ2xhc3MgdGVzdDFDbGFzcyA9Ci0JCQkoSmF2YUNsYXNzKSByc2V0LmdldEVPYmplY3QoVVJJLmNyZWF0ZVVSSSgiamF2YTovb3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvI1Rlc3QxQ2xhc3MiKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWFzc2VydFNhbWUoVHlwZUtpbmQuQ0xBU1NfTElURVJBTCwgdGVzdDFDbGFzcy5nZXRLaW5kKCkpOwotCQkKLQkJLy8gVGVzdCB0aGF0IHRoZSByZWZsZWN0aW9uIGtleSBjYW4gZmluZCBmZWF0dXJlcyB0aGF0IGFyZW4ndCB5ZXQgbG9hZGVkLgotCQlPYmplY3QgZm9vID0gcnNldC5nZXRFT2JqZWN0KFVSSS5jcmVhdGVVUkkoImphdmE6L29yZy5lY2xpcHNlLmplbS50ZXN0cy5iZWFuaW5mbyNUZXN0MUNsYXNzL2ZvbyIpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKGZvbyk7Ci0JCQotCQkvLyBUZXN0IHRoYXQgdGhlIHJlZmxlY3Rpb24ga2V5IGNhbiBmaW5kIG9wZXJhdGlvbnMgdGhhdCBhcmVuJ3QgeWV0IGxvYWRlZC4KLQkJT2JqZWN0IGdldEZvbyA9Ci0JCQlyc2V0LmdldEVPYmplY3QoVVJJLmNyZWF0ZVVSSSgiamF2YTovb3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvI1Rlc3QxQ2xhc3Mvb3BlcmF0aW9uL2dldEZvbyIpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKGdldEZvbyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElubmVyUmVmbGVjdGlvbkluRGVmYXVsdCgpIHsKLQkJLy8gVGVzdCB0aGF0IGEgcHJvcGVydHkgb2YgY2xhc3MgKHRocm91Z2ggcmVmbGVjdGlvbikgaXMgYW4gaW5uZXIgY2xhc3MsIGFuZCB0aGUgY2xhc3MgaXMgcmVzb2x2ZWQgY29ycmVjdGx5LgotCQlKYXZhQ2xhc3MgdGVzdElubmVyQ2xhc3MgPQotCQkJKEphdmFDbGFzcykgcnNldC5nZXRFT2JqZWN0KFVSSS5jcmVhdGVVUkkoImphdmE6LyNUZXN0RGVmYXVsdElubmVyIiksIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCQotCQlhc3NlcnRTYW1lKFR5cGVLaW5kLkNMQVNTX0xJVEVSQUwsIHRlc3RJbm5lckNsYXNzLmdldEtpbmQoKSk7Ci0JCQotCQlFTGlzdCBwcm9wZXJ0aWVzID0gdGVzdElubmVyQ2xhc3MuZ2V0UHJvcGVydGllcygpOwotCQlhc3NlcnRFcXVhbHMoMSwgcHJvcGVydGllcy5zaXplKCkpOwotCQkKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIHBmID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgcHJvcGVydGllcy5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscygicHJvcGVydHlJbm5lciIsIHBmLmdldE5hbWUoKSk7Ci0JCQotCQlQcm9wZXJ0eURlY29yYXRvciBwZCA9IFV0aWxpdGllcy5nZXRQcm9wZXJ0eURlY29yYXRvcihwZik7Ci0JCWFzc2VydE5vdE51bGwocGQpOwotCQkKLQkJSmF2YUNsYXNzIHBkVHlwZSA9IChKYXZhQ2xhc3MpIHBkLmdldFByb3BlcnR5VHlwZSgpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3REZWZhdWx0SW5uZXIkSW5uZXIiLCBwZFR5cGUuZ2V0TmFtZSgpKTsgCi0JCWFzc2VydFNhbWUoVHlwZUtpbmQuQ0xBU1NfTElURVJBTCwgcGRUeXBlLmdldEtpbmQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJbm5lclJlZmxlY3Rpb25JblBhY2thZ2UoKSB7Ci0JCS8vIFRlc3QgdGhhdCBhIHByb3BlcnR5IG9mIGNsYXNzICh0aHJvdWdoIHJlZmxlY3Rpb24pIGlzIGFuIGlubmVyIGNsYXNzLCBhbmQgdGhlIGNsYXNzIGlzIHJlc29sdmVkIGNvcnJlY3RseS4KLQkJSmF2YUNsYXNzIHRlc3RJbm5lckNsYXNzID0KLQkJCShKYXZhQ2xhc3MpIHJzZXQuZ2V0RU9iamVjdChVUkkuY3JlYXRlVVJJKCJqYXZhOi9vcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm8jVGVzdElubmVyIiksIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCQotCQlhc3NlcnRTYW1lKFR5cGVLaW5kLkNMQVNTX0xJVEVSQUwsIHRlc3RJbm5lckNsYXNzLmdldEtpbmQoKSk7Ci0JCQotCQlFTGlzdCBwcm9wZXJ0aWVzID0gdGVzdElubmVyQ2xhc3MuZ2V0UHJvcGVydGllcygpOwotCQlhc3NlcnRFcXVhbHMoMSwgcHJvcGVydGllcy5zaXplKCkpOwotCQkKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIHBmID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgcHJvcGVydGllcy5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscygicHJvcGVydHlJbm5lciIsIHBmLmdldE5hbWUoKSk7Ci0JCQotCQlQcm9wZXJ0eURlY29yYXRvciBwZCA9IFV0aWxpdGllcy5nZXRQcm9wZXJ0eURlY29yYXRvcihwZik7Ci0JCWFzc2VydE5vdE51bGwocGQpOwotCQkKLQkJSmF2YUNsYXNzIHBkVHlwZSA9IChKYXZhQ2xhc3MpIHBkLmdldFByb3BlcnR5VHlwZSgpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3RJbm5lciRJbm5lciIsIHBkVHlwZS5nZXROYW1lKCkpOyAKLQkJYXNzZXJ0U2FtZShUeXBlS2luZC5DTEFTU19MSVRFUkFMLCBwZFR5cGUuZ2V0S2luZCgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0IGdldFJlYWxQcm9wcyhMaXN0IHByb3BzKSB7Ci0JCWludCBzaXplID0gcHJvcHMuc2l6ZSgpOwotCQlMaXN0IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0KHNpemUpOwotCQlmb3IgKGludCBpPTA7IGk8c2l6ZTsgaSsrKSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZiA9IChFU3RydWN0dXJhbEZlYXR1cmUpIHByb3BzLmdldChpKTsKLQkJCWlmIChVdGlsaXRpZXMuZ2V0UHJvcGVydHlEZWNvcmF0b3IoZikgIT0gbnVsbCkKLQkJCQluZXdMaXN0LmFkZChmKTsKLQkJfQotCQlyZXR1cm4gbmV3TGlzdDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEludGVyZmFjZVByb3BlcnR5UmVmbGVjdGlvbigpIHsKLQkJLy8gVGVzdCB0aGUgcmVmbGVjdGlvbiBvZiBpbnRlcmZhY2VzIHdpdGggbXVsdGlwbGUgZXh0ZW5kcyBvbiB0aGVtIHNvIHRoYXQgcHJvcGVyaXRpZXMgYXJlIGNvcnJlY3QuCi0JCUphdmFDbGFzcyB0ZXN0UHJvcENsYXNzID0KLQkJCShKYXZhQ2xhc3MpIHJzZXQuZ2V0RU9iamVjdChVUkkuY3JlYXRlVVJJKCJqYXZhOi9vcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm8udGVzdCNOb3RUb3BHdXkiKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCQlhc3NlcnRUcnVlKHRlc3RQcm9wQ2xhc3MuaXNJbnRlcmZhY2UoKSk7Ci0JCQotCQkvLyBUZXN0IHRoYXQgd2UgZG9uJ3QgcGljayB1cCB0aGUgZXh0ZW5kcyBzdHVmZgotCQlMaXN0IHByb3BzID0gZ2V0UmVhbFByb3BzKHRlc3RQcm9wQ2xhc3MuZ2V0UHJvcGVydGllcygpKTsKLQkJLy8gRm9yZ290IHRoZXJlIG1heSBiZSBub24tcHJvcGVydGllcyBwcm9wZXJ0aWVzLgotCQlhc3NlcnRFcXVhbHMoMSwgcHJvcHMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJudW1iZXIiLCAoKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgcHJvcHMuZ2V0KDApKS5nZXROYW1lKCkpOwotCQkKLQkJLy8gVGVzdCB0aGF0IHdlIHBpY2sgdXAgdGhlIGV4dGVuZHMgc3R1ZmYKLQkJcHJvcHMgPSBnZXRSZWFsUHJvcHModGVzdFByb3BDbGFzcy5nZXRBbGxQcm9wZXJ0aWVzKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgcHJvcHMuc2l6ZSgpKTsKLQkJTGlzdCB2YWxpZE5hbWVzID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyJudW1iZXIiLCAib2JqZWN0IiwgImludGVnZXIifSk7Ci0JCWZvciAoSXRlcmF0b3IgaXRyID0gcHJvcHMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaXRyLm5leHQoKTsKLQkJCWFzc2VydFRydWUoIkV4dHJhIGZlYXR1cmU6IitmZWF0dXJlLmdldE5hbWUoKSwgdmFsaWROYW1lcy5jb250YWlucyhmZWF0dXJlLmdldE5hbWUoKSkpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJbnRlcmZhY2VFdmVudFJlZmxlY3Rpb24oKSB7Ci0JCS8vIFRlc3QgdGhlIHJlZmxlY3Rpb24gb2YgaW50ZXJmYWNlcyB3aXRoIG11bHRpcGxlIGV4dGVuZHMgb24gdGhlbSBzbyB0aGF0IGV2ZW50cyBhcmUgY29ycmVjdC4KLQkJSmF2YUNsYXNzIHRlc3RFdmVudENsYXNzID0KLQkJCShKYXZhQ2xhc3MpIHJzZXQuZ2V0RU9iamVjdChVUkkuY3JlYXRlVVJJKCJqYXZhOi9vcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm8udGVzdCNOb3RUb3BHdXkiKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCQlhc3NlcnRUcnVlKHRlc3RFdmVudENsYXNzLmlzSW50ZXJmYWNlKCkpOwotCQkKLQkJLy8gVGVzdCB0aGF0IHdlIGRvbid0IHBpY2sgdXAgdGhlIGV4dGVuZHMgc3R1ZmYKLQkJTGlzdCBldmVudHMgPSB0ZXN0RXZlbnRDbGFzcy5nZXRFdmVudHMoKTsKLQkJYXNzZXJ0VHJ1ZShldmVudHMuaXNFbXB0eSgpKTsKLQkJCi0JCS8vIFRlc3QgdGhhdCB3ZSBwaWNrIHVwIHRoZSBleHRlbmRzIHN0dWZmCi0JCWV2ZW50cyA9IHRlc3RFdmVudENsYXNzLmdldEFsbEV2ZW50cygpOwotCQlhc3NlcnRFcXVhbHMoMSwgZXZlbnRzLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdDFDbGFzc0V2ZW50IiwgKChKYXZhRXZlbnQpIGV2ZW50cy5nZXQoMCkpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJbnRlcmZhY2VPcGVyYXRpb25zUmVmbGVjdGlvbigpIHsKLQkJLy8gVGVzdCB0aGUgcmVmbGVjdGlvbiBvZiBpbnRlcmZhY2VzIHdpdGggbXVsdGlwbGUgZXh0ZW5kcyBvbiB0aGVtIHNvIHRoYXQgcHJvcGVyaXRpZXMgYXJlIGNvcnJlY3QuCi0JCUphdmFDbGFzcyB0ZXN0T3BDbGFzcyA9Ci0JCQkoSmF2YUNsYXNzKSByc2V0LmdldEVPYmplY3QoVVJJLmNyZWF0ZVVSSSgiamF2YTovb3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvLnRlc3QjTm90VG9wR3V5IiksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkJYXNzZXJ0VHJ1ZSh0ZXN0T3BDbGFzcy5pc0ludGVyZmFjZSgpKTsKLQkJCi0JCS8vIFRlc3QgdGhhdCB3ZSBkb24ndCBwaWNrIHVwIHRoZSBleHRlbmRzIHN0dWZmCi0JCUxpc3Qgb3BzID0gdGVzdE9wQ2xhc3MuZ2V0RU9wZXJhdGlvbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9wcy5zaXplKCkpOwotCQlMaXN0IHZhbGlkTmFtZXMgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ImdldE51bWJlciIsICJzZXROdW1iZXIifSk7Ci0JCWZvciAoSXRlcmF0b3IgaXRyID0gb3BzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7Ci0JCQlFT3BlcmF0aW9uIG9wID0gKEVPcGVyYXRpb24pIGl0ci5uZXh0KCk7Ci0JCQlhc3NlcnRUcnVlKCJFeHRyYSBvcGVyYXRpb246IitvcC5nZXROYW1lKCksIHZhbGlkTmFtZXMuY29udGFpbnMob3AuZ2V0TmFtZSgpKSk7Ci0JCX0KLQkJCi0JCQotCQkvLyBUZXN0IHRoYXQgd2UgcGljayB1cCB0aGUgZXh0ZW5kcyBzdHVmZgotCQlvcHMgPSB0ZXN0T3BDbGFzcy5nZXRFQWxsT3BlcmF0aW9ucygpOwotCQlhc3NlcnRFcXVhbHMoOCwgb3BzLnNpemUoKSk7Ci0JCXZhbGlkTmFtZXMgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ImdldE51bWJlciIsICJzZXROdW1iZXIiLCAiZ2V0T2JqZWN0IiwgInNldE9iamVjdCIsICJnZXRJbnRlZ2VyIiwgInNldEludGVnZXIiLCAiYWRkVGVzdDFDbGFzc0V2ZW50TGlzdGVuZXIiLCAicmVtb3ZlVGVzdDFDbGFzc0V2ZW50TGlzdGVuZXIifSk7Ci0JCWZvciAoSXRlcmF0b3IgaXRyID0gb3BzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7Ci0JCQlFT3BlcmF0aW9uIG9wID0gKEVPcGVyYXRpb24pIGl0ci5uZXh0KCk7Ci0JCQlhc3NlcnRUcnVlKCJFeHRyYSBvcGVyYXRpb246IitvcC5nZXROYW1lKCksIHZhbGlkTmFtZXMuY29udGFpbnMob3AuZ2V0TmFtZSgpKSk7Ci0JCX0KLQl9Ci0JCi0JCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9iZWFuaW5mby9UZXN0U3RhbmRhcmQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL2JlYW5pbmZvL1Rlc3RTdGFuZGFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2M5MmIyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL2JlYW5pbmZvL1Rlc3RTdGFuZGFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm87Ci0vKgotICogICRSQ1NmaWxlOiBUZXN0U3RhbmRhcmQuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMTQgJCAgJERhdGU6IDIwMDYvMDUvMTcgMjA6MTM6NTYgJCAKLSAqLwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29yZS5VdGlsaXRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS4qOwotCi0vKioKLSAqIEBhdXRob3IgcmljaGt1bHAKLSAqCi0gKiBTdGFuZGFyZCBCZWFuSW5mbyB0ZXN0cy4KLSAqLwotcHVibGljIGNsYXNzIFRlc3RTdGFuZGFyZCBleHRlbmRzIEFic3RyYWN0QmVhbkluZm9UZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgVGVzdFN0YW5kYXJkKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBUZXN0U3RhbmRhcmQoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlDbGFzc1R5cGUoKSB7Ci0JCS8vIFRlc3Qgb25lIGRpbWVuc2lvbiBhcnJheSB0eXBlIGZvciBhIGNsYXNzIGFzIGZpbmFsIGNvbXBvbmVudAotCQlKYXZhQ2xhc3MgYXQgPSAoSmF2YUNsYXNzKSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UucmVmbGVjdFR5cGUoIm9yZy5lY2xpcHNlLmplbS50ZXN0cy5iZWFuaW5mby5UZXN0MUNsYXNzW10iLCByc2V0KTsKLQkJCi0JCWFzc2VydFRydWUoYXQuaXNBcnJheSgpKTsKLQkJYXNzZXJ0U2FtZShUeXBlS2luZC5DTEFTU19MSVRFUkFMLCBhdC5nZXRLaW5kKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgKChBcnJheVR5cGUpIGF0KS5nZXRBcnJheURpbWVuc2lvbnMoKSk7Ci0JCWFzc2VydFRydWUoYXQuaXNQdWJsaWMoKSk7Ci0JCWFzc2VydFRydWUoImphdmEubGFuZy5PYmplY3QiLmVxdWFscyhhdC5nZXRTdXBlcnR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpKTsKLQkJYXNzZXJ0VHJ1ZShhdC5nZXRJbXBsZW1lbnRzSW50ZXJmYWNlcygpLnNpemUoKSA9PSAyKTsKLQkJYXNzZXJ0VHJ1ZShhdC5nZXRNZXRob2RzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShhdC5nZXRGaWVsZHMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKGF0LmdldFByb3BlcnRpZXMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKGF0LmdldEV2ZW50cygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUoYXQuZ2V0RU9wZXJhdGlvbnMoKS5pc0VtcHR5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheVByaW1pdGl2ZVR5cGUoKSB7Ci0JCS8vIFRlc3Qgb25lIGRpbWVuc2lvbiBhcnJheSB0eXBlIGZvciBhIGNsYXNzIGFzIGZpbmFsIGNvbXBvbmVudAotCQlKYXZhQ2xhc3MgYXQgPSAoSmF2YUNsYXNzKSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UucmVmbGVjdFR5cGUoImludFtdIiwgcnNldCk7Ci0JCQotCQlhc3NlcnRUcnVlKGF0LmlzQXJyYXkoKSk7Ci0JCWFzc2VydFNhbWUoVHlwZUtpbmQuQ0xBU1NfTElURVJBTCwgYXQuZ2V0S2luZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsICgoQXJyYXlUeXBlKSBhdCkuZ2V0QXJyYXlEaW1lbnNpb25zKCkpOwkJCi0JCWFzc2VydFRydWUoYXQuaXNQdWJsaWMoKSk7Ci0JCWFzc2VydFRydWUoImphdmEubGFuZy5PYmplY3QiLmVxdWFscyhhdC5nZXRTdXBlcnR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpKTsKLQkJYXNzZXJ0VHJ1ZShhdC5nZXRJbXBsZW1lbnRzSW50ZXJmYWNlcygpLnNpemUoKSA9PSAyKTsKLQkJYXNzZXJ0VHJ1ZShhdC5nZXRNZXRob2RzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShhdC5nZXRGaWVsZHMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKGF0LmdldFByb3BlcnRpZXMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKGF0LmdldEV2ZW50cygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUoYXQuZ2V0RU9wZXJhdGlvbnMoKS5pc0VtcHR5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheVVuZGVmaW5lZCgpIHsKLQkJLy8gVGVzdCBvbmUgZGltZW5zaW9uIGFycmF5IHR5cGUgZm9yIGEgY2xhc3MgYXMgZmluYWwgY29tcG9uZW50IHRoYXQgaXMgdW5kZWZpbmVkLgotCQlKYXZhQ2xhc3MgYXQgPSAoSmF2YUNsYXNzKSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UucmVmbGVjdFR5cGUoIlhZWltdIiwgcnNldCk7Ci0JCQotCQlhc3NlcnRUcnVlKGF0LmlzQXJyYXkoKSk7Ci0JCWFzc2VydFNhbWUoVHlwZUtpbmQuVU5ERUZJTkVEX0xJVEVSQUwsIGF0LmdldEtpbmQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFycmF5Q2xhc3NUeXBlMkRpbSgpIHsKLQkJLy8gVGVzdCBvbmUgZGltZW5zaW9uIGFycmF5IHR5cGUgZm9yIGEgY2xhc3MgYXMgZmluYWwgY29tcG9uZW50Ci0JCUphdmFDbGFzcyBhdCA9IChKYXZhQ2xhc3MpIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5yZWZsZWN0VHlwZSgib3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvLlRlc3QxQ2xhc3NbXVtdIiwgcnNldCk7Ci0JCQotCQlhc3NlcnRUcnVlKGF0LmlzQXJyYXkoKSk7Ci0JCWFzc2VydFNhbWUoVHlwZUtpbmQuQ0xBU1NfTElURVJBTCwgYXQuZ2V0S2luZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsICgoQXJyYXlUeXBlKSBhdCkuZ2V0QXJyYXlEaW1lbnNpb25zKCkpOwotCQlhc3NlcnRUcnVlKGF0LmlzUHVibGljKCkpOwotCQlhc3NlcnRUcnVlKCJqYXZhLmxhbmcuT2JqZWN0Ii5lcXVhbHMoYXQuZ2V0U3VwZXJ0eXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKSk7Ci0JCWFzc2VydFRydWUoYXQuZ2V0SW1wbGVtZW50c0ludGVyZmFjZXMoKS5zaXplKCkgPT0gMik7Ci0JCWFzc2VydFRydWUoYXQuZ2V0TWV0aG9kcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUoYXQuZ2V0RmllbGRzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShhdC5nZXRQcm9wZXJ0aWVzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShhdC5nZXRFdmVudHMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKGF0LmdldEVPcGVyYXRpb25zKCkuaXNFbXB0eSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlQcmltaXRpdmVUeXBlMkRpbSgpIHsKLQkJLy8gVGVzdCBvbmUgZGltZW5zaW9uIGFycmF5IHR5cGUgZm9yIGEgY2xhc3MgYXMgZmluYWwgY29tcG9uZW50Ci0JCUphdmFDbGFzcyBhdCA9IChKYXZhQ2xhc3MpIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5yZWZsZWN0VHlwZSgiaW50W11bXSIsIHJzZXQpOwotCQkKLQkJYXNzZXJ0VHJ1ZShhdC5pc0FycmF5KCkpOwotCQlhc3NlcnRTYW1lKFR5cGVLaW5kLkNMQVNTX0xJVEVSQUwsIGF0LmdldEtpbmQoKSk7Ci0JCWFzc2VydEVxdWFscygyLCAoKEFycmF5VHlwZSkgYXQpLmdldEFycmF5RGltZW5zaW9ucygpKTsJCQotCQlhc3NlcnRUcnVlKGF0LmlzUHVibGljKCkpOwotCQlhc3NlcnRUcnVlKCJqYXZhLmxhbmcuT2JqZWN0Ii5lcXVhbHMoYXQuZ2V0U3VwZXJ0eXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKSk7Ci0JCWFzc2VydFRydWUoYXQuZ2V0SW1wbGVtZW50c0ludGVyZmFjZXMoKS5zaXplKCkgPT0gMik7Ci0JCWFzc2VydFRydWUoYXQuZ2V0TWV0aG9kcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUoYXQuZ2V0RmllbGRzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShhdC5nZXRQcm9wZXJ0aWVzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShhdC5nZXRFdmVudHMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKGF0LmdldEVPcGVyYXRpb25zKCkuaXNFbXB0eSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlVbmRlZmluZWQyRGltKCkgewotCQkvLyBUZXN0IG9uZSBkaW1lbnNpb24gYXJyYXkgdHlwZSBmb3IgYSBjbGFzcyBhcyBmaW5hbCBjb21wb25lbnQgdGhhdCBpcyB1bmRlZmluZWQuCi0JCUphdmFDbGFzcyBhdCA9IChKYXZhQ2xhc3MpIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5yZWZsZWN0VHlwZSgiWFlaW11bXSIsIHJzZXQpOwotCQkKLQkJYXNzZXJ0VHJ1ZShhdC5pc0FycmF5KCkpOwotCQlhc3NlcnRTYW1lKFR5cGVLaW5kLlVOREVGSU5FRF9MSVRFUkFMLCBhdC5nZXRLaW5kKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheUlubmVyQ2xhc3NUeXBlKCkgewotCQkvLyBUZXN0IG9uZSBkaW1lbnNpb24gYXJyYXkgdHlwZSBmb3IgYSBjbGFzcyBhcyBmaW5hbCBjb21wb25lbnQKLQkJSmF2YUNsYXNzIGF0ID0gKEphdmFDbGFzcykgSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLnJlZmxlY3RUeXBlKCJvcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm8uQ3VzdG9tZXIkQWNjb3VudFtdIiwgcnNldCk7Ci0JCQotCQlhc3NlcnRUcnVlKGF0LmlzQXJyYXkoKSk7Ci0JCWFzc2VydFNhbWUoVHlwZUtpbmQuQ0xBU1NfTElURVJBTCwgYXQuZ2V0S2luZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsICgoQXJyYXlUeXBlKSBhdCkuZ2V0QXJyYXlEaW1lbnNpb25zKCkpOwotCQlhc3NlcnRUcnVlKGF0LmlzUHVibGljKCkpOwotCQlhc3NlcnRUcnVlKCJqYXZhLmxhbmcuT2JqZWN0Ii5lcXVhbHMoYXQuZ2V0U3VwZXJ0eXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKSk7Ci0JCWFzc2VydFRydWUoYXQuZ2V0SW1wbGVtZW50c0ludGVyZmFjZXMoKS5zaXplKCkgPT0gMik7Ci0JCWFzc2VydFRydWUoYXQuZ2V0TWV0aG9kcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUoYXQuZ2V0RmllbGRzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShhdC5nZXRQcm9wZXJ0aWVzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShhdC5nZXRFdmVudHMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKGF0LmdldEVPcGVyYXRpb25zKCkuaXNFbXB0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEJlYW5EZWNvcmF0b3JSZWZsZWN0ZWQoKSB7Ci0JCUphdmFDbGFzcyB0ZXN0MUNsYXNzID0gZ2V0VGVzdDFDbGFzcygpOwotCi0JCS8vIFRlc3QgdGhlIGJlYW4gZGVjb3JhdG9yLgotCQlCZWFuRGVjb3JhdG9yIGJkID0gVXRpbGl0aWVzLmdldEJlYW5EZWNvcmF0b3IodGVzdDFDbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiVGVzdDFDbGFzcyIsIGJkLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0TnVsbChiZC5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFDbGFzcyBnZXRUZXN0MUNsYXNzKCkgewotCQlKYXZhQ2xhc3MgdGVzdDFDbGFzcyA9Ci0JCQkoSmF2YUNsYXNzKSByc2V0LmdldEVPYmplY3QoVVJJLmNyZWF0ZVVSSSgiamF2YTovb3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvI1Rlc3QxQ2xhc3MiKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHRlc3QxQ2xhc3M7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RMb2NhbFJlZmxlY3RlZFByb3BlcnRpZXMoKSB7Ci0JCUVMaXN0IGFsbExvY2FsRmVhdHVyZXMgPSBnZXRUZXN0MUNsYXNzKCkuZ2V0UHJvcGVydGllcygpOwotCQlhc3NlcnRFcXVhbHMoMiwgYWxsTG9jYWxGZWF0dXJlcy5zaXplKCkpOwotCQkKLQkJSXRlcmF0b3IgaXRyID0gVXRpbGl0aWVzLmdldFByb3BlcnRpZXNJdGVyYXRvcihhbGxMb2NhbEZlYXR1cmVzKTsKLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQl3aGlsZSAoaXRyLmhhc05leHQoKSkgewotCQkJUHJvcGVydHlEZWNvcmF0b3IgcGQgPSAoUHJvcGVydHlEZWNvcmF0b3IpIGl0ci5uZXh0KCk7Ci0JCQlpZiAocGQuZ2V0TmFtZSgpLmVxdWFscygiZm9vIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQlhc3NlcnRUcnVlKHBkIGluc3RhbmNlb2YgSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yKTsKLQkJCQlJbmRleGVkUHJvcGVydHlEZWNvcmF0b3IgaXAgPSAoSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yKSBwZDsKLQkJCQlKYXZhSGVscGVycyB0eXBlID0gKEphdmFIZWxwZXJzKSBpcC5nZXRQcm9wZXJ0eVR5cGUoKTsKLQkJCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmdbXSIsIHR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJCQlpZiAoIXR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscygiamF2YS5sYW5nLlN0cmluZ1tdIikpOyAvLyROT04tTkxTLTEkCi0JCQkJCQotCQkJCU1ldGhvZCBtdGhkID0gaXAuZ2V0UmVhZE1ldGhvZCgpOwotCQkJCWFzc2VydFNhbWUocnNldC5nZXRFT2JqZWN0KFVSSS5jcmVhdGVVUkkoImphdmE6L29yZy5lY2xpcHNlLmplbS50ZXN0cy5iZWFuaW5mbyNUZXN0MUNsYXNzLmdldEZvbygiKSwgdHJ1ZSksIG10aGQpOwotCQkJCQotCQkJCW10aGQgPSBpcC5nZXRXcml0ZU1ldGhvZCgpOwotCQkJCWFzc2VydFNhbWUocnNldC5nZXRFT2JqZWN0KFVSSS5jcmVhdGVVUkkoImphdmE6L29yZy5lY2xpcHNlLmplbS50ZXN0cy5iZWFuaW5mbyNUZXN0MUNsYXNzLnNldEZvbyhqYXZhLmxhbmcuU3RyaW5nW10iKSwgdHJ1ZSksIG10aGQpOwotCQkJCQotCQkJCW10aGQgPSBpcC5nZXRJbmRleGVkUmVhZE1ldGhvZCgpOwotCQkJCWFzc2VydFNhbWUocnNldC5nZXRFT2JqZWN0KFVSSS5jcmVhdGVVUkkoImphdmE6L29yZy5lY2xpcHNlLmplbS50ZXN0cy5iZWFuaW5mbyNUZXN0MUNsYXNzLmdldEZvbyhpbnQiKSwgdHJ1ZSksIG10aGQpOwotCQkJCQotCQkJCW10aGQgPSBpcC5nZXRJbmRleGVkV3JpdGVNZXRob2QoKTsKLQkJCQlhc3NlcnRTYW1lKHJzZXQuZ2V0RU9iamVjdChVUkkuY3JlYXRlVVJJKCJqYXZhOi9vcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm8jVGVzdDFDbGFzcy5zZXRGb28oaW50LGphdmEubGFuZy5TdHJpbmciKSwgdHJ1ZSksIG10aGQpOwotCQkJCQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJYXNzZXJ0VHJ1ZShmb3VuZCk7CQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdExvY2FsUmVmbGVjdGVkT3BlcmF0aW9ucygpIHsKLQkJSmF2YUNsYXNzIHRlc3QxQ2xhc3MgPSBnZXRUZXN0MUNsYXNzKCk7Ci0JCQotCQkvLyBUZXN0IGxvY2FsIG9wZXJhdGlvbnMuCi0JCUVMaXN0IGFsbExvY2FsT3BlcmF0aW9ucyA9IHRlc3QxQ2xhc3MuZ2V0RU9wZXJhdGlvbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKDEwLCBhbGxMb2NhbE9wZXJhdGlvbnMuc2l6ZSgpKTsKLQkJSXRlcmF0b3IgaXRyID0gYWxsTG9jYWxPcGVyYXRpb25zLml0ZXJhdG9yKCk7Ci0JCS8vIFRoaXMgaXMgdGhlIGRlc2lyZWQgbWV0aG9kIHRoYXQgdGhlIG9wZXJhdGlvbiBvZiBpbnRlcmVzdCBwb2ludHMgdG8uCi0JCU1ldGhvZCBkZXNpcmVkID0KLQkJCShNZXRob2QpIHJzZXQuZ2V0RU9iamVjdChVUkkuY3JlYXRlVVJJKAotCQkJCSJqYXZhOi9vcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm8jVGVzdDFDbGFzcy5zZXRGb28oaW50LGphdmEubGFuZy5TdHJpbmciKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQl3aGlsZSAoaXRyLmhhc05leHQoKSkgewotCQkJTWV0aG9kUHJveHkgYmhhdiA9IChNZXRob2RQcm94eSkgaXRyLm5leHQoKTsKLQkJCWlmIChiaGF2LmdldE1ldGhvZCgpID09IGRlc2lyZWQpIHsKLQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJTGlzdCBwYXJtcyA9IFV0aWxpdGllcy5nZXRNZXRob2REZWNvcmF0b3IoYmhhdikuZ2V0UGFyYW1ldGVyRGVzY3JpcHRvcnMoKTsKLQkJCQlhc3NlcnRFcXVhbHMoMiwgcGFybXMuc2l6ZSgpKTsKLQkJCQlQYXJhbWV0ZXJEZWNvcmF0b3IgcG1kID0gKFBhcmFtZXRlckRlY29yYXRvcikgcGFybXMuZ2V0KDApOwotCQkJCWFzc2VydEVxdWFscygiaW5kZXgiLCBwbWQuZ2V0TmFtZSgpKTsKLQkJCQkKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKGZvdW5kKTsJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TG9jYWxSZWZsZWN0ZWRFdmVudHMoKSB7Ci0JCUphdmFDbGFzcyB0ZXN0MUNsYXNzID0gZ2V0VGVzdDFDbGFzcygpOwotCQkKLQkJLy8gVGVzdCBldmVudCBzZXQgcmVmbGVjdGVkLgotCQlMaXN0IGV2ZW50cyA9IHRlc3QxQ2xhc3MuZ2V0RXZlbnRzKCk7Ci0JCWFzc2VydEVxdWFscygyLCBldmVudHMuc2l6ZSgpKTsKLQkJSXRlcmF0b3IgaXRyID0gZXZlbnRzLml0ZXJhdG9yKCk7Ci0JCWJvb2xlYW4gZm91bmRldnQxID0gZmFsc2UsIGZvdW5kZXZ0MiA9IGZhbHNlOwotCQl3aGlsZSAoaXRyLmhhc05leHQoKSkgewotCQkJSmF2YUV2ZW50IGV2ZW50ID0gKEphdmFFdmVudCkgaXRyLm5leHQoKTsKLQkJCWlmICgidGVzdDFDbGFzc0V2ZW50Ii5lcXVhbHMoZXZlbnQuZ2V0TmFtZSgpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJZm91bmRldnQxID0gdHJ1ZTsKLQkJCQlFdmVudFNldERlY29yYXRvciBlZGVjID0gVXRpbGl0aWVzLmdldEV2ZW50U2V0RGVjb3JhdG9yKGV2ZW50KTsKLQkJCQlMaXN0IG1saXN0ID0gZWRlYy5nZXRMaXN0ZW5lck1ldGhvZHMoKTsKLQkJCQlhc3NlcnRFcXVhbHMoMiwgbWxpc3Quc2l6ZSgpKTsKLQkJCX0gZWxzZSBpZiAoInRlc3QxQ2xhc3NVbmljYXN0RXZlbnQiLmVxdWFscyhldmVudC5nZXROYW1lKCkpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlmb3VuZGV2dDIgPSB0cnVlOwotCQkJCUV2ZW50U2V0RGVjb3JhdG9yIGVkZWMgPSBVdGlsaXRpZXMuZ2V0RXZlbnRTZXREZWNvcmF0b3IoZXZlbnQpOwotCQkJCWFzc2VydFRydWUoZWRlYy5pc1VuaWNhc3QoKSk7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShmb3VuZGV2dDEpOwotCQlhc3NlcnRUcnVlKGZvdW5kZXZ0Mik7Ci0JfQotCQotCXByb3RlY3RlZCBKYXZhQ2xhc3MgZ2V0VGVzdDJDbGFzc0IoKSB7Ci0JCXJldHVybiAoSmF2YUNsYXNzKSByc2V0LmdldEVPYmplY3QoVVJJLmNyZWF0ZVVSSSgiamF2YTovb3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvI1Rlc3QyQ2xhc3NCIiksIHRydWUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJlYW5EZWNvcmF0b3JJbnRyb3NwZWN0ZWQoKSB7Ci0JCS8vIFRlc3Qgb25lIHdpdGggYSBiZWFuaW5mby4KLQkJSmF2YUNsYXNzIHRlc3QyQ2xhc3NCID0gZ2V0VGVzdDJDbGFzc0IoKTsKLQkJQmVhbkRlY29yYXRvciBiZCA9IFV0aWxpdGllcy5nZXRCZWFuRGVjb3JhdG9yKHRlc3QyQ2xhc3NCKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0MkNsYXNzQiIsIGJkLmdldE5hbWUoKSk7Ci0JCQotCQkvLyBUaGUgZm9sbG93aW5nIHdpbGwgdGVzdCBpZiBzZWFyY2ggYWNyb3NzIGJlYW5pbmZvIHNlYXJjaCBwYXRoIHdvcmtlZC4gSXQgd291bGQgZmFpbCBpZiBpdCBkaWRuJ3Qgd29yay4KLQkJYXNzZXJ0RXF1YWxzKCJBIG5hbWUgZm9yIHRoaXMgY2xhc3MuIiwgYmQuZ2V0RGlzcGxheU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RmFsc2UoYmQuaXNFeHBlcnQoKSk7Ci0JCS8vIEN1c3RvbWl6ZXIgY2xhc3Mgc2V0IGluIEJlYW5JbmZvLCBidXQgYm9ndXMgZm9yIG5vdyB0byBzYW1lIGNsYXNzIGFzIGJlaW5nIGludHJvc3BlY3RlZC4KLQkJYXNzZXJ0U2FtZSh0ZXN0MkNsYXNzQiwgYmQuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TG9jYWxJbnRyb3NwZWN0ZWRQcm9wZXJ0aWVzKCkgewotCQlKYXZhQ2xhc3MgdGVzdDJDbGFzc0IgPSBnZXRUZXN0MkNsYXNzQigpOwotCQlFTGlzdCBhbGxMb2NhbEZlYXR1cmVzID0gdGVzdDJDbGFzc0IuZ2V0UHJvcGVydGllcygpOwotCQlhc3NlcnRFcXVhbHMoMiwgYWxsTG9jYWxGZWF0dXJlcy5zaXplKCkpOwotCQkKLQkJSXRlcmF0b3IgaXRyID0gVXRpbGl0aWVzLmdldFByb3BlcnRpZXNJdGVyYXRvcihhbGxMb2NhbEZlYXR1cmVzKTsKLQkJYm9vbGVhbiBnb3RTZXQgPSBmYWxzZSwgZ290Rm9vID0gZmFsc2U7Ci0JCXdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0JCQlQcm9wZXJ0eURlY29yYXRvciBwZCA9IChQcm9wZXJ0eURlY29yYXRvcikgaXRyLm5leHQoKTsKLQkJCU1ldGhvZCBtdGhkID0gbnVsbDsKLQkJCWlmIChwZC5nZXROYW1lKCkuZXF1YWxzKCJzZXRBIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWdvdFNldCA9IHRydWU7Ci0JCQkJbXRoZCA9IHBkLmdldFJlYWRNZXRob2QoKTsKLQkJCQlhc3NlcnRTYW1lKHJzZXQuZ2V0RU9iamVjdChVUkkuY3JlYXRlVVJJKCJqYXZhOi9vcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm8jVGVzdDJDbGFzc0IuaXNTZXRBKCIpLCB0cnVlKSwgbXRoZCk7Ci0JCQl9IGVsc2UgaWYgKHBkLmdldE5hbWUoKS5lcXVhbHMoImZvbyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlnb3RGb28gPSB0cnVlOwotCQkJCUluZGV4ZWRQcm9wZXJ0eURlY29yYXRvciBpcGQgPSAoSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yKSBwZDsKLQkJCQltdGhkID0gaXBkLmdldEluZGV4ZWRSZWFkTWV0aG9kKCk7Ci0JCQkJYXNzZXJ0U2FtZShyc2V0LmdldEVPYmplY3QoVVJJLmNyZWF0ZVVSSSgiamF2YTovb3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvI1Rlc3QyQ2xhc3NCLmdldEZvbyhpbnQiKSwgdHJ1ZSksIG10aGQpOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoZ290U2V0KTsKLQkJYXNzZXJ0VHJ1ZShnb3RGb28pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TG9jYWxJbnRyb3NwZWN0ZWRPcGVyYXRpb25zKCkgewotCQlKYXZhQ2xhc3MgdGVzdDJDbGFzc0IgPSBnZXRUZXN0MkNsYXNzQigpOwotCQkKLQkJRUxpc3QgYWxsTG9jYWxPcGVyYXRpb25zID0gdGVzdDJDbGFzc0IuZ2V0RU9wZXJhdGlvbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGFsbExvY2FsT3BlcmF0aW9ucy5zaXplKCkpOyAKLQotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCUl0ZXJhdG9yIGl0ciA9IHRlc3QyQ2xhc3NCLmdldEVPcGVyYXRpb25zKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLQkJCUVPcGVyYXRpb24gYmhhdiA9IChFT3BlcmF0aW9uKSBpdHIubmV4dCgpOwotCQkJaWYgKGJoYXYuZ2V0TmFtZSgpLmVxdWFscygic2V0U2V0QSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlMaXN0IHBhcm1zID0gVXRpbGl0aWVzLmdldE1ldGhvZERlY29yYXRvcihiaGF2KS5nZXRQYXJhbWV0ZXJEZXNjcmlwdG9ycygpOwotCQkJCWFzc2VydEVxdWFscygxLCBwYXJtcy5zaXplKCkpOwotCQkJCVBhcmFtZXRlckRlY29yYXRvciBwbWQgPSAoUGFyYW1ldGVyRGVjb3JhdG9yKSBwYXJtcy5nZXQoMCk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJhQm9vbGVhblNldHRpbmciLCBwbWQuZ2V0TmFtZSgpKTsKLQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShmb3VuZCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RMb2NhbEludHJvc3BlY3RlZEV2ZW50cygpIHsKLQkJSmF2YUNsYXNzIHRlc3QyQ2xhc3NCID0gZ2V0VGVzdDJDbGFzc0IoKTsKLQkJCi0JCS8vIFRlc3QgZXZlbnQgc2V0IGludHJvc3BlY3RlZC4KLQkJRUxpc3QgZXZlbnRzID0gdGVzdDJDbGFzc0IuZ2V0RXZlbnRzKCk7Ci0JCWFzc2VydEVxdWFscygxLCBldmVudHMuc2l6ZSgpKTsKLQkJSmF2YUV2ZW50IGV2ZW50ID0gKEphdmFFdmVudCkgZXZlbnRzLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKCJvdmVycmlkZU5hbWUiLCBldmVudC5nZXROYW1lKCkpOyAgLy8kTk9OLU5MUy0xJAotCQlFdmVudFNldERlY29yYXRvciBlZGVjID0gVXRpbGl0aWVzLmdldEV2ZW50U2V0RGVjb3JhdG9yKGV2ZW50KTsKLQkJYXNzZXJ0RXF1YWxzKCJJVGVzdDFDbGFzc0V2ZW50TGlzdGVuZXIiLCBlZGVjLmdldExpc3RlbmVyVHlwZSgpLmdldE5hbWUoKSk7Ci0JCUxpc3QgbWxpc3QgPSBlZGVjLmdldExpc3RlbmVyTWV0aG9kcygpOwotCQlhc3NlcnRFcXVhbHMoMSwgbWxpc3Quc2l6ZSgpKTsKLQkJTWV0aG9kUHJveHkgbXByb3h5ID0gKE1ldGhvZFByb3h5KSBtbGlzdC5nZXQoMCk7Ci0JCU1ldGhvZERlY29yYXRvciBtZGVjID0gVXRpbGl0aWVzLmdldE1ldGhvZERlY29yYXRvcihtcHJveHkpOwotCQlhc3NlcnRFcXVhbHMoImV2ZW50MSIsIG1kZWMuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIkV2ZW50IDEiLCBtZGVjLmdldERpc3BsYXlOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTdXBlclR5cGVzKCkgewotCQlKYXZhQ2xhc3MgdGVzdENsYXNzID0gZ2V0VGVzdDFDbGFzcygpOwotCQlvYmpGZWF0dXJlc1NldHVwKCk7CS8vIEdldCBudW1iZXIgb2YgZmVhdHVyZXMgZm9yIE9iamVjdC4gVGhpcyBjYW4gdmFyeSBkZXBlbmRpbmcgb24gZXh0ZW5zaW9ucywgc28gdGhhdCBpcyB3aHkgd2UgY29tcHV0ZSBpdC4KLQkJCi0JCS8vIE5vdyBkbyB0aGUgdGVzdGluZyBvZiBtZXJnaW5nIHdpdGggc3VwZXIgdHlwZXMuCi0JCWFzc2VydEVxdWFscygyK29iakZlYXR1cmVzLCB0ZXN0Q2xhc3MuZ2V0QWxsUHJvcGVydGllcygpLnNpemUoKSk7Ci0JCUphdmFDbGFzcyB0ZXN0MUNsYXNzQSA9IGdldFRlc3QxQ2xhc3NBKCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCh0ZXN0MUNsYXNzQSk7Ci0JCWFzc2VydEVxdWFscygzK29iakZlYXR1cmVzLCB0ZXN0MUNsYXNzQS5nZXRBbGxQcm9wZXJ0aWVzKCkuc2l6ZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUNsYXNzIGdldFRlc3QxQ2xhc3NBKCkgewotCQlyZXR1cm4gKEphdmFDbGFzcykgcnNldC5nZXRFT2JqZWN0KFVSSS5jcmVhdGVVUkkoImphdmE6L29yZy5lY2xpcHNlLmplbS50ZXN0cy5iZWFuaW5mbyNUZXN0MUNsYXNzQSIpLCB0cnVlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFN1cGVyVHlwZXNFdmVudHMoKSB7Ci0JCUphdmFDbGFzcyB0ZXN0MUNsYXNzQSA9IGdldFRlc3QxQ2xhc3NBKCk7IAotCQkJCi0JCS8vIFRlc3QgbWVyZ2luZyBzdXBlcnR5cGVzIGV2ZW50IHNldC4KLQkJTGlzdCBldmVudHMgPSB0ZXN0MUNsYXNzQS5nZXRBbGxFdmVudHMoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGV2ZW50cy5zaXplKCkpOwotCQlJdGVyYXRvciBpdHIgPSBldmVudHMuaXRlcmF0b3IoKTsKLQkJYm9vbGVhbiBmb3VuZGV2dDEgPSBmYWxzZTsKLQkJYm9vbGVhbiBmb3VuZGV2dDIgPSBmYWxzZTsKLQkJd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLQkJCUphdmFFdmVudCBldmVudCA9IChKYXZhRXZlbnQpIGl0ci5uZXh0KCk7Ci0JCQlpZiAoInRlc3QxQ2xhc3NFdmVudCIuZXF1YWxzKGV2ZW50LmdldE5hbWUoKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWZvdW5kZXZ0MSA9IHRydWU7Ci0JCQkJRXZlbnRTZXREZWNvcmF0b3IgZWRlYyA9IFV0aWxpdGllcy5nZXRFdmVudFNldERlY29yYXRvcihldmVudCk7Ci0JCQkJTGlzdCBtbGlzdCA9IGVkZWMuZ2V0TGlzdGVuZXJNZXRob2RzKCk7Ci0JCQkJYXNzZXJ0RXF1YWxzKDIsIG1saXN0LnNpemUoKSk7Ci0JCQl9IGVsc2UgaWYgKCJ0ZXN0MUNsYXNzVW5pY2FzdEV2ZW50Ii5lcXVhbHMoZXZlbnQuZ2V0TmFtZSgpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJZm91bmRldnQyID0gdHJ1ZTsKLQkJCQlFdmVudFNldERlY29yYXRvciBlZGVjID0gVXRpbGl0aWVzLmdldEV2ZW50U2V0RGVjb3JhdG9yKGV2ZW50KTsKLQkJCQlhc3NlcnRUcnVlKGVkZWMuaXNVbmljYXN0KCkpOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoZm91bmRldnQxKTsKLQkJYXNzZXJ0VHJ1ZShmb3VuZGV2dDIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSmF2YUNsYXNzIGdldFRlc3QyQ2xhc3MoKSB7Ci0JCXJldHVybiAoSmF2YUNsYXNzKSByc2V0LmdldEVPYmplY3QoVVJJLmNyZWF0ZVVSSSgiamF2YTovb3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvI1Rlc3QyQ2xhc3MiKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHJvdGVjdGVkIEphdmFDbGFzcyBnZXRUZXN0MkNsYXNzQSgpIHsKLQkJcmV0dXJuIChKYXZhQ2xhc3MpIHJzZXQuZ2V0RU9iamVjdChVUkkuY3JlYXRlVVJJKCJqYXZhOi9vcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm8jVGVzdDJDbGFzc0EiKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQl9CQotCQotCXB1YmxpYyB2b2lkIHRlc3RTdXBlclR5cGVIaWRlUHJvcGVydHkoKSB7Ci0JCUphdmFDbGFzcyB0ZXN0MkNsYXNzID0gZ2V0VGVzdDJDbGFzcygpOwotCQlvYmpGZWF0dXJlc1NldHVwKCk7Ci0JCQotCQkvLyBUZXN0MkNsYXNzQmVhbkluZm8gZXhwbGljaXRseSBoaWRlcyBPYmplY3QgKHN1cGVyKSBmcm9tIGl0cyBCZWFuSW5mbywgc28gb25seSB0aGUgbm9uLUJlYW5JbmZvIHByb3BlcnRpZXMgd2lsbCBzaG93LgkJCi0JCWFzc2VydEVxdWFscygyK29iak5vblByb3BlcnRpZXMsIHRlc3QyQ2xhc3MuZ2V0QWxsUHJvcGVydGllcygpLnNpemUoKSk7Ci0JCQotCQkvLyBUcnkgd2l0aCBzdWJjbGFzc2VzLiBNYWtlIHN1cmUgdGhhdCBUZXN0MkNsYXNzQmVhbkluZm8gaXMgdXNlZCB3aXRoIHRoZSBzdWJjbGFzc2VzLgotCQlKYXZhQ2xhc3MgdGVzdDJDbGFzc0EgPSBnZXRUZXN0MkNsYXNzQSgpOwkJCi0JCWFzc2VydEVxdWFscygzK29iak5vblByb3BlcnRpZXMsIHRlc3QyQ2xhc3NBLmdldEFsbFByb3BlcnRpZXMoKS5zaXplKCkpOwotCQkKLQkJSmF2YUNsYXNzIHRlc3QyQ2xhc3NCID0gZ2V0VGVzdDJDbGFzc0IoKTsJCQotCQlhc3NlcnRFcXVhbHMoNCtvYmpOb25Qcm9wZXJ0aWVzLCB0ZXN0MkNsYXNzQi5nZXRBbGxQcm9wZXJ0aWVzKCkuc2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEluZGV4ZWRCZWFuSW5mbygpIHsKLQkJSmF2YUNsYXNzIHRlc3QyQ2xhc3MgPSBnZXRUZXN0MkNsYXNzKCk7Ci0JCQotCQkvLyBUZXN0IHRoYXQgSW5kZXhlZCB0aHJ1IGJlYW5pbmZvIHdvcmtzCi0JCUl0ZXJhdG9yIGl0ciA9IFV0aWxpdGllcy5nZXRQcm9wZXJ0aWVzSXRlcmF0b3IodGVzdDJDbGFzcy5nZXRQcm9wZXJ0aWVzKCkpOwotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCXdoaWxlIChpdHIuaGFzTmV4dCgpKSB7CQkKLQkJCVByb3BlcnR5RGVjb3JhdG9yIHBkID0gKFByb3BlcnR5RGVjb3JhdG9yKSBpdHIubmV4dCgpOwkJCQotCQkJaWYgKHBkLmdldE5hbWUoKS5lcXVhbHMoImZvb0JhciIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJYXNzZXJ0VHJ1ZShwZCBpbnN0YW5jZW9mIEluZGV4ZWRQcm9wZXJ0eURlY29yYXRvcik7Ci0JCQkJSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yIGlwID0gKEluZGV4ZWRQcm9wZXJ0eURlY29yYXRvcikgcGQ7Ci0JCQkJSmF2YUhlbHBlcnMgdHlwZSA9IChKYXZhSGVscGVycykgaXAuZ2V0UHJvcGVydHlUeXBlKCk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nW10iLCB0eXBlLmdldFF1YWxpZmllZE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlNZXRob2QgbXRoZCA9IGlwLmdldFJlYWRNZXRob2QoKTsKLQkJCQlhc3NlcnRTYW1lKHJzZXQuZ2V0RU9iamVjdChVUkkuY3JlYXRlVVJJKCJqYXZhOi9vcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm8jVGVzdDJDbGFzcy5nZXRGb29CYXIoIiksIHRydWUpLCBtdGhkKTsgLy8kTk9OLU5MUy0xJAotCQkJCW10aGQgPSBpcC5nZXRXcml0ZU1ldGhvZCgpOwotCQkJCWFzc2VydFNhbWUocnNldC5nZXRFT2JqZWN0KFVSSS5jcmVhdGVVUkkoImphdmE6L29yZy5lY2xpcHNlLmplbS50ZXN0cy5iZWFuaW5mbyNUZXN0MkNsYXNzLnNldEZvb0JhcihqYXZhLmxhbmcuU3RyaW5nW10iKSwgdHJ1ZSksIG10aGQpOyAvLyROT04tTkxTLTEkCi0JCQkJbXRoZCA9IGlwLmdldEluZGV4ZWRSZWFkTWV0aG9kKCk7Ci0JCQkJYXNzZXJ0U2FtZShyc2V0LmdldEVPYmplY3QoVVJJLmNyZWF0ZVVSSSgiamF2YTovb3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvI1Rlc3QyQ2xhc3MuZ2V0Rm9vQmFyKGludCIpLCB0cnVlKSwgbXRoZCk7IC8vJE5PTi1OTFMtMSQKLQkJCQltdGhkID0gaXAuZ2V0SW5kZXhlZFdyaXRlTWV0aG9kKCk7Ci0JCQkJYXNzZXJ0U2FtZShyc2V0LmdldEVPYmplY3QoVVJJLmNyZWF0ZVVSSSgiamF2YTovb3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvI1Rlc3QyQ2xhc3Muc2V0Rm9vQmFyKGludCxqYXZhLmxhbmcuU3RyaW5nIiksIHRydWUpLCBtdGhkKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJYXNzZXJ0VHJ1ZShmb3VuZCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFDbGFzcyBnZXRUZXN0MkNsYXNzQygpIHsKLQkJcmV0dXJuIChKYXZhQ2xhc3MpIHJzZXQuZ2V0RU9iamVjdChVUkkuY3JlYXRlVVJJKCJqYXZhOi9vcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm8jVGVzdDJDbGFzc0MiKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEJlYW5JbmZvUHJvamVjdCgpIHsKLQkJSmF2YUNsYXNzIHRlc3QyQ2xhc3NDID0gZ2V0VGVzdDJDbGFzc0MoKTsKLQkJCi0JCS8vIFRoaXMgd2lsbCB0ZXN0IHRoYXQgd2UgY291bGQgZmluZCBUZXN0MkNsYXNzQyBCZWFuSW5mbyB0aGF0IGlzIGluIGFub3RoZXIgQmVhbkluZm8gcHJvamVjdCAoaS5lLiBhIHByb2plY3QKLQkJLy8gdGhhdCBpcyBzcGVjaWZpY2FsbHkgZm9yIEJlYW5JbmZvJ3MgZm9yIGEgc3BlY2lmaWMgY29kZSBwcm9qZWN0KS4KLQkJQmVhbkRlY29yYXRvciBiZCA9IFV0aWxpdGllcy5nZXRCZWFuRGVjb3JhdG9yKHRlc3QyQ2xhc3NDKTsKLQkJYXNzZXJ0Tm90TnVsbChiZCk7Ci0JCWFzc2VydEVxdWFscygiVGVzdDJDbGFzc0MgZnJvbSBCZWFuSW5mbyIsIGJkLmdldERpc3BsYXlOYW1lKCkpOwotCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE92ZXJyaWRlKCkgewotCQkKLQkJLy8gVGVzdCB0aGF0IHRoZSBsb2NhbCBwcm9wZXJ0eSBpcyBleHBlcnQgYmVjYXVzZSBpdCBvdmVycm9kZSBmcm9tIFRlc3QyQ2xhc3NCIGFuZCBtYWRlIGl0IGV4cGVydC4KLQkJSmF2YUNsYXNzIHRlc3QyQ2xhc3NCID0gZ2V0VGVzdDJDbGFzc0IoKTsKLQkJCi0JCS8vIFRlc3QgdGhhdCB0aGUgbG9jYWwgcHJvcGVydHkgaXMgbm90IGV4cGVydCBpbiBUZXN0MkNsYXNzQi4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIHAgPSB0ZXN0MkNsYXNzQi5nZXRFU3RydWN0dXJhbEZlYXR1cmUoInNldEEiKTsKLQkJYXNzZXJ0Tm90TnVsbChwKTsKLQkJUHJvcGVydHlEZWNvcmF0b3IgcGQgPSBVdGlsaXRpZXMuZ2V0UHJvcGVydHlEZWNvcmF0b3IocCk7Ci0JCWFzc2VydEZhbHNlKHBkLmlzRXhwZXJ0KCkpOwotCi0JCS8vIE5vdyBnZXQgc3ViY2xhc3Mgd2l0aCBvdmVycmlkZS4KLQkJSmF2YUNsYXNzIHRlc3QyQ2xhc3NDID0gZ2V0VGVzdDJDbGFzc0MoKTsKLQkJCi0JCS8vIFRlc3QgdGhhdCB0aGUgbG9jYWwgcHJvcGVydHkgaXMgbm93IGV4cGVydCBiZWNhdXNlIGl0IG92ZXJyb2RlIGZyb20gVGVzdDJDbGFzc0IgYW5kIG1hZGUgaXQgZXhwZXJ0LgotCQlwID0gdGVzdDJDbGFzc0MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCJzZXRBIik7Ci0JCWFzc2VydE5vdE51bGwocCk7Ci0JCXBkID0gVXRpbGl0aWVzLmdldFByb3BlcnR5RGVjb3JhdG9yKHApOwotCQlhc3NlcnRUcnVlKHBkLmlzRXhwZXJ0KCkpOwkJCi0JfQotCQotCXByb3RlY3RlZCBKYXZhQ2xhc3MgZ2V0VGVzdDJDbGFzc1ByZXEoKSB7Ci0JCXJldHVybiAoSmF2YUNsYXNzKSByc2V0LmdldEVPYmplY3QoVVJJLmNyZWF0ZVVSSSgiamF2YTovb3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvLnByZXJlcSNUZXN0MkNsYXNzUHJlcSIpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkJCi0JcHVibGljIHZvaWQgdGVzdFByZXJlcWVkUHJvamVjdHMoKSB7Ci0JCUphdmFDbGFzcyB0ZXN0MkNsYXNzUHJlcmVxID0gZ2V0VGVzdDJDbGFzc1ByZXEoKTsKLQkJb2JqRmVhdHVyZXNTZXR1cCgpOwotCQkgCi0JCS8vIFRlc3QgZmluZGluZyBiZWFuaW5mb3MgZm9yIGNsYXNzZXMgaW4gYW5vdGhlciBwcm9qZWN0IChwcmUtcmVxZWQgcHJvamVjdCkuCQkKLQkJYXNzZXJ0RXF1YWxzKDErb2JqRmVhdHVyZXMsIHRlc3QyQ2xhc3NQcmVyZXEuZ2V0QWxsUHJvcGVydGllcygpLnNpemUoKSk7Ci0JCS8vIFZlcmlmeSBCZWFuSW5mbyBhbmQgbm90IGpzdXQgaW50cm9zcGVjdGlvbi4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGYgPSB0ZXN0MkNsYXNzUHJlcmVxLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgiYVNldCIpOwotCQlhc3NlcnROb3ROdWxsKGYpOwotCQlQcm9wZXJ0eURlY29yYXRvciBwZCA9IFV0aWxpdGllcy5nZXRQcm9wZXJ0eURlY29yYXRvcihmKTsKLQkJYXNzZXJ0VHJ1ZShwZC5pc0V4cGVydCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVByb3BSZWJ1aWxkKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlvYmpGZWF0dXJlc1NldHVwKCk7Ci0JCQotCQkvLyBUZXN0IHJlbW92aW5nIGEgcHJvcGVydHkgZGlyZWN0bHkgZnJvbSBhIHN1cGVyIGNsYXNzIGNhdXNlcyB0aGUgc3ViY2xhc3NlcyB0byByZS1idWlsZCB0aGVpciBwcm9wZXJ0aWVzLgotCQlKYXZhQ2xhc3MgdGVzdDFDbGFzcyA9IGdldFRlc3QxQ2xhc3MoKTsKLQkJSmF2YUNsYXNzIHRlc3QxQ2xhc3NBID0gZ2V0VGVzdDFDbGFzc0EoKTsKLQkJLy8gR2V0IGFuZCB0ZXN0IHRoZSBwcm9wZXJ0aWVzIGZpcnN0IHRvIGNhdXNlIGludHJvc3BlY3Rpb24gZm9yIGJvdGggQkVGT1JFIHRoZSBtb2RpZmljYXRpb24uCi0JCWFzc2VydEVxdWFscygyK29iakZlYXR1cmVzLCB0ZXN0MUNsYXNzLmdldEFsbFByb3BlcnRpZXMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMytvYmpGZWF0dXJlcywgdGVzdDFDbGFzc0EuZ2V0QWxsUHJvcGVydGllcygpLnNpemUoKSk7Ci0JCXRyeSB7Ci0JCQl0ZXN0MUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5yZW1vdmUoMCk7IC8vIFJlbW92ZSB0aGUgZmlyc3Qgb25lLiBUaGV5IHNob3VsZCBib3RoIG5vdyByZWJ1aWxkLgotCQkJYXNzZXJ0RXF1YWxzKDErb2JqRmVhdHVyZXMsIHRlc3QxQ2xhc3MuZ2V0QWxsUHJvcGVydGllcygpLnNpemUoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoMitvYmpGZWF0dXJlcywgdGVzdDFDbGFzc0EuZ2V0QWxsUHJvcGVydGllcygpLnNpemUoKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQkvLyBOZWVkIHRvIGNsb3NlIGFuZCByZW9wZW4gdGhlIHByb2plY3Qgc28gdGhhdCB0byByZXN0b3JlIHRoZSBjb3JyZWN0IHNoYXBlIGZvciB0ZXN0MUNsYXNzIGZvciBvdGhlciB0ZXN0cy4KLQkJCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQkJZmluYWwgSVByb2plY3QgcHJvamVjdCA9IG5hdHVyZS5nZXRQcm9qZWN0KCk7Ci0JCQlJU2NoZWR1bGluZ1J1bGUgcHJvamVjdFJ1bGUgPSB3b3Jrc3BhY2UuZ2V0UnVsZUZhY3RvcnkoKS5tb2RpZnlSdWxlKHByb2plY3QpOwotCQkJd29ya3NwYWNlLnJ1bihuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlICgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJCXByb2plY3QuY2xvc2UobW9uaXRvcik7Ci0JCQkJCXByb2plY3Qub3Blbihtb25pdG9yKTsKLQkJCQl9Ci0JCQl9LCBwcm9qZWN0UnVsZSwgMCwgbnVsbCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUV2ZW50UmVidWlsZCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gVGVzdCByZW1vdmluZyBhbiBldmVudCBkaXJlY3RseSBmcm9tIGEgc3VwZXIgY2xhc3MgY2F1c2VzIHRoZSBzdWJjbGFzc2VzIHRvIHJlLWJ1aWxkIHRoZWlyIGFsbEV2ZW50cy4KLQkJSmF2YUNsYXNzIHRlc3QxQ2xhc3MgPSBnZXRUZXN0MUNsYXNzKCk7Ci0JCUphdmFDbGFzcyB0ZXN0MUNsYXNzQSA9IGdldFRlc3QxQ2xhc3NBKCk7Ci0JCS8vIEdldCBhbmQgdGVzdCB0aGUgZXZlbnRzIGZpcnN0IHRvIGNhdXNlIGludHJvc3BlY3Rpb24gZm9yIGJvdGggQkVGT1JFIHRoZSBtb2RpZmljYXRpb24uCi0JCWFzc2VydEVxdWFscygyLCB0ZXN0MUNsYXNzLmdldEFsbEV2ZW50cygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCB0ZXN0MUNsYXNzQS5nZXRBbGxFdmVudHMoKS5zaXplKCkpOwkJCi0JCXRyeSB7Ci0JCQl0ZXN0MUNsYXNzLmdldEV2ZW50cygpLnJlbW92ZSgwKTsgLy8gUmVtb3ZlIHRoZSBmaXJzdCBvbmUuIFRoZXkgc2hvdWxkIG5vdyBib3RoIHJlYnVpbGQuCi0JCQlhc3NlcnRFcXVhbHMoMSwgdGVzdDFDbGFzcy5nZXRBbGxFdmVudHMoKS5zaXplKCkpOwotCQkJYXNzZXJ0RXF1YWxzKDEsIHRlc3QxQ2xhc3NBLmdldEFsbEV2ZW50cygpLnNpemUoKSk7CQkJCi0JCX0gZmluYWxseSB7Ci0JCQkvLyBOZWVkIHRvIGNsb3NlIGFuZCByZW9wZW4gdGhlIHByb2plY3Qgc28gdGhhdCB0byByZXN0b3JlIHRoZSBjb3JyZWN0IHNoYXBlIGZvciB0ZXN0MUNsYXNzIGZvciBvdGhlciB0ZXN0cy4KLQkJCWZpbmFsIElQcm9qZWN0IHByb2plY3QgPSBuYXR1cmUuZ2V0UHJvamVjdCgpOwotCQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCQlJU2NoZWR1bGluZ1J1bGUgcHJvamVjdFJ1bGUgPSB3b3Jrc3BhY2UuZ2V0UnVsZUZhY3RvcnkoKS5tb2RpZnlSdWxlKHByb2plY3QpOwotCQkJd29ya3NwYWNlLnJ1bihuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlICgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJCXByb2plY3QuY2xvc2UobW9uaXRvcik7Ci0JCQkJCXByb2plY3Qub3Blbihtb25pdG9yKTsKLQkJCQl9Ci0JCQl9LCBwcm9qZWN0UnVsZSwgMCwgbnVsbCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIEphdmFDbGFzcyBnZXRDdXN0b21lcigpIHsKLQkJcmV0dXJuIChKYXZhQ2xhc3MpIHJzZXQuZ2V0RU9iamVjdChVUkkuY3JlYXRlVVJJKCJqYXZhOi9vcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm8jQ3VzdG9tZXIiKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElubmVyQ2xhc3MoKSB7Ci0JCUphdmFDbGFzcyBjdXN0b21lciA9IGdldEN1c3RvbWVyKCk7Ci0JCQotCQkvLyBOb3cgdGVzdCBjdXN0b21lciB0byBtYWtlIHN1cmUgdGhhdCBpdCBpbnRyb3NwZWN0cyBjb3JyZWN0bHksIHBsdXMgdGhlIGlubmVyIGNsYXNzIG9mIG9uZSBvZiBpdHMgcHJvcGVydGllcyBkb2VzIHRvby4KLQkJTGlzdCBhbGxMb2NhbEZlYXR1cmVzID0gY3VzdG9tZXIuZ2V0UHJvcGVydGllcygpOwotCQlhc3NlcnRFcXVhbHMoMiwgYWxsTG9jYWxGZWF0dXJlcy5zaXplKCkpOwotCQlJdGVyYXRvciBpdHIgPSBhbGxMb2NhbEZlYXR1cmVzLml0ZXJhdG9yKCk7Ci0JCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBlYSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGl0ci5uZXh0KCk7Ci0JCQlpZiAoInNhdmluZ3MiLmVxdWFscyhlYS5nZXROYW1lKCkpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJSmF2YUNsYXNzIGlubmVyQ2xhc3MgPSAoSmF2YUNsYXNzKSBlYS5nZXRFVHlwZSgpOwkvLyBUaGlzIHByb3BlcnR5IHR5cGUgaXMgYW4gaW5uZXJjbGFzcyBvZiBDdXN0b21lcgotCQkJCWFzc2VydEVxdWFscygiQ3VzdG9tZXIkQWNjb3VudCIsIGlubmVyQ2xhc3MuZ2V0TmFtZSgpKTsKLQkJCQlhbGxMb2NhbEZlYXR1cmVzID0gaW5uZXJDbGFzcy5nZXRQcm9wZXJ0aWVzKCk7Ci0JCQkJYXNzZXJ0RXF1YWxzKDIsIGFsbExvY2FsRmVhdHVyZXMuc2l6ZSgpKTsKLQkJCX0KLQkJfQotCQkKLQkJYXNzZXJ0VHJ1ZShmb3VuZCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFDbGFzcyBnZXRUZXN0Qm91bmROb3RCb3VuZCgpIHsKLQkJcmV0dXJuIChKYXZhQ2xhc3MpIHJzZXQuZ2V0RU9iamVjdChVUkkuY3JlYXRlVVJJKCJqYXZhOi9vcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm8jVGVzdEJvdW5kTm90Qm91bmQiKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE5vdEJvdW5kUmVmbGVjdGlvbigpIHsKLQkJSmF2YUNsYXNzIHRlc3RCb3VuZE5vdEJvdW5kID0gZ2V0VGVzdEJvdW5kTm90Qm91bmQoKTsKLQkJCi0JCS8vIE5vdyB0ZXN0IHRoYXQgcHJvcGVydGllcyBhcmUgYm91bmQgY29ycmVjdGx5IG9uIHJlZmxlY3Rpb24uIEZpcnN0IHRlc3QgcmVmbGVjdCBub3QgYm91bmQgY29ycmVjdC4KLQkJLy8gVGhpcyBpcyBkZXRlcm1pbmVkIGJ5IG5vIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbWV0aG9kIG9uIGNsYXNzLgkJCi0JCUxpc3QgYWxsTG9jYWxGZWF0dXJlcyA9IHRlc3RCb3VuZE5vdEJvdW5kLmdldFByb3BlcnRpZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGFsbExvY2FsRmVhdHVyZXMuc2l6ZSgpKTsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGVhID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgYWxsTG9jYWxGZWF0dXJlcy5nZXQoMCk7Ci0JCVByb3BlcnR5RGVjb3JhdG9yIHBkID0gVXRpbGl0aWVzLmdldFByb3BlcnR5RGVjb3JhdG9yKGVhKTsKLQkJYXNzZXJ0Tm90TnVsbChwZCk7Ci0JCWFzc2VydEZhbHNlKHBkLmlzQm91bmQoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBKYXZhQ2xhc3MgZ2V0VGVzdEJvdW5kU3VwZXIoKSB7Ci0JCXJldHVybiAoSmF2YUNsYXNzKSByc2V0LmdldEVPYmplY3QoVVJJLmNyZWF0ZVVSSSgiamF2YTovb3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvI1Rlc3RCb3VuZFN1cGVyIiksIHRydWUpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RCb3VuZFJlZmxlY3Rpb24oKSB7Ci0JCUphdmFDbGFzcyB0ZXN0Qm91bmRTdXBlciA9IGdldFRlc3RCb3VuZFN1cGVyKCk7Ci0JCQotCQkvLyBUZXN0IHRoYXQgcmVmbGVjdGlvbiBjYW4gZmluZCBib3VuZCBwcm9wZXJ0eS4KLQkJLy8gVGhpcyBpcyBkZXRlcm1pbmVkIGJ5IGZpbmRpbmcgYWRkL3JlbW92ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIG1ldGhvZCBvbiBjbGFzcy4JCQotCQlMaXN0IGFsbExvY2FsRmVhdHVyZXMgPSB0ZXN0Qm91bmRTdXBlci5nZXRQcm9wZXJ0aWVzKCk7Ci0JCWFzc2VydEVxdWFscygxLCBhbGxMb2NhbEZlYXR1cmVzLnNpemUoKSk7Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBlYSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGFsbExvY2FsRmVhdHVyZXMuZ2V0KDApOwotCQlQcm9wZXJ0eURlY29yYXRvciBwZCA9IFV0aWxpdGllcy5nZXRQcm9wZXJ0eURlY29yYXRvcihlYSk7Ci0JCWFzc2VydE5vdE51bGwocGQpOwotCQlhc3NlcnRUcnVlKHBkLmlzQm91bmQoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFDbGFzcyBnZXRUZXN0Qm91bmRTdWIoKSB7Ci0JCXJldHVybiAoSmF2YUNsYXNzKSByc2V0LmdldEVPYmplY3QoVVJJLmNyZWF0ZVVSSSgiamF2YTovb3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvI1Rlc3RCb3VuZFN1YiIpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Qm91bmRSZWZsZWN0aW9uU3ViY2xhc3MoKSB7Ci0JCUphdmFDbGFzcyB0ZXN0Qm91bmRTdWIgPSBnZXRUZXN0Qm91bmRTdWIoKTsKLQotCQkvLyBUZXN0IHRoYXQgcmVmbGVjdGlvbiBjYW4gZmluZCBib3VuZCBwcm9wZXJ0eSBkdWUgdG8gaW5oZXJpdCBmcm9tIGEgYm91bmQgY2xhc3MuCi0JCS8vIFRoaXMgaXMgZGV0ZXJtaW5lZCBieSBmaW5kaW5nIGFkZC9yZW1vdmUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBtZXRob2Qgb24gY2xhc3MgKGJ1dCBmcm9tIGEgc3VwZXIgY2xhc3MpLgkJCQkJCQotCQlMaXN0IGFsbExvY2FsRmVhdHVyZXMgPSB0ZXN0Qm91bmRTdWIuZ2V0UHJvcGVydGllcygpOwotCQlhc3NlcnRFcXVhbHMoMSwgYWxsTG9jYWxGZWF0dXJlcy5zaXplKCkpOwkJCi0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBlYSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGFsbExvY2FsRmVhdHVyZXMuZ2V0KDApOwotCQlQcm9wZXJ0eURlY29yYXRvciBwZCA9IFV0aWxpdGllcy5nZXRQcm9wZXJ0eURlY29yYXRvcihlYSk7Ci0JCWFzc2VydE5vdE51bGwocGQpOwotCQlhc3NlcnRUcnVlKHBkLmlzQm91bmQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RPdmVycmlkZXNGaWxlKCkgewotCQkvLyBUZXN0IHRoYXQgb3ZlcnJpZGUgZmlsZXMgZ2V0IGFwcGxpZWQgY29ycmVjdGx5LgotCQlKYXZhQ2xhc3MgdGVzdE92ZXJyaWRlID0gKEphdmFDbGFzcykgcnNldC5nZXRFT2JqZWN0KFVSSS5jcmVhdGVVUkkoImphdmE6L29yZy5lY2xpcHNlLmplbS50ZXN0cy5iZWFuaW5mbyNUZXN0T3ZlcnJpZGVzIiksIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwodGVzdE92ZXJyaWRlKTsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIHh5eiA9IHRlc3RPdmVycmlkZS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoInh5eiIpOwotCQlhc3NlcnROb3ROdWxsKHh5eik7Ci0JCS8vIFRlc3QgdGhhdCBpdCBoYXMgdGhlIGNvcnJlY3QgdHlwZSBzbyB0aGF0IHdlIGtub3cgaXQgd2FzIHJlZmxlY3RlZCBjb3JyZWN0bHkuCi0JCWFzc2VydEVxdWFscyhyc2V0LmdldEVPYmplY3QoVVJJLmNyZWF0ZVVSSSgiamF2YTovI2ludCIpLCB0cnVlKSwgeHl6LmdldEVUeXBlKCkpOwotCQkKLQkJLy8gVGVzdCB0aGF0IHdlIGhhdmUgdGhlIGFubm90YXRpb24gd2UgYWRkZWQuCi0JCWFzc2VydE5vdE51bGwoeHl6LmdldEVBbm5vdGF0aW9uKCJPdmVycmlkZSBBbm5vdGF0aW9uIikpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0NzkwODMoKSB7Ci0JCS8vIFRlc3QgYnVnIDc5MDgzOiBOdWxsIEVUeXBlcyBmcm9tIG92ZXJyaWRlcyB0aGF0IGRpZG4ndCBoYXZlIGEgcmVmbGVjdGlvbiB0byBnaXZlIGl0IHRoZSB0eXBlLiBCZWFuSW5mbyBzaG91bGQgbWFrZSBpdCBFT2JqZWN0IHR5cGUuCi0JCUphdmFDbGFzcyB0ZXN0T3ZlcnJpZGUgPSAoSmF2YUNsYXNzKSByc2V0LmdldEVPYmplY3QoVVJJLmNyZWF0ZVVSSSgiamF2YTovb3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvI1Rlc3RPdmVycmlkZXMiKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCh0ZXN0T3ZlcnJpZGUpOwotCQlFU3RydWN0dXJhbEZlYXR1cmUgdGVzdDc5MDgzID0gdGVzdE92ZXJyaWRlLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgidGVzdDc5MDgzIik7Ci0JCWFzc2VydE5vdE51bGwodGVzdDc5MDgzKTsKLQkJYXNzZXJ0RXF1YWxzKEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RU9iamVjdCgpLCB0ZXN0NzkwODMuZ2V0RVR5cGUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvaW5zdGFudGlhdGlvbi9JbnN0YW50aWF0aW9uU3VpdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL2luc3RhbnRpYXRpb24vSW5zdGFudGlhdGlvblN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1YzBiOTYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvaW5zdGFudGlhdGlvbi9JbnN0YW50aWF0aW9uU3VpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMuaW5zdGFudGlhdGlvbjsKLS8qCi0gKiAgJFJDU2ZpbGU6IEluc3RhbnRpYXRpb25TdWl0ZS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xMiAkICAkRGF0ZTogMjAwNi8wNS8xNyAyMDoxMzo1NiAkIAotICovCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQganVuaXQuZXh0ZW5zaW9ucy5UZXN0U2V0dXA7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uYWRhcHRlcnMuQmVhbmluZm9OYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZS5KYXZhSW5zdGFudGlhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udGVzdHMuSmF2YVByb2plY3RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5KYXZhVGVzdHNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvLkFic3RyYWN0QmVhbkluZm9UZXN0Q2FzZTsKLQotLyoqCi0gKiBAYXV0aG9yIHJpY2hrdWxwCi0gKgotICovCi1wdWJsaWMgY2xhc3MgSW5zdGFudGlhdGlvblN1aXRlIGV4dGVuZHMgVGVzdFNldHVwIHsKLQotCS8vIFRlc3QgY2FzZXMgdG8gYmUgaW5jbHVkZSBpbiB0aGUgc3VpdGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzcyB0ZXN0c0xpc3RbXSA9IHsgVGVzdFN0YW5kYXJkLmNsYXNzLCB9OwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEluc3RhbnRpYXRpb25TdWl0ZSgpIHsKLQkJdGhpcygiVGVzdCBJbnN0YW50aWF0aW9uIFN1aXRlIik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgSW5zdGFudGlhdGlvblN1aXRlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5ldyBUZXN0U3VpdGUobmFtZSkgewotCQkJewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGVzdHNMaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWFkZFRlc3RTdWl0ZSh0ZXN0c0xpc3RbaV0pOwotCQkJCX0KLQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgSW5zdGFudGlhdGlvblN1aXRlKCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIG9sZEF1dG9CdWlsZGluZ1N0YXRlOyAvLyBhdXRvQnVpbGRpbmcgc3RhdGUgYmVmb3JlIHdlIHN0YXJ0ZWQuCQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiLS0gSW5pdGlhbGl6aW5nIHRoZSBJbnN0YW50aWF0aW9uIHRlc3QgZGF0YSAtLSIpOyAvLyROT04tTkxTLTEkCi0JCW9sZEF1dG9CdWlsZGluZ1N0YXRlID0gSmF2YVByb2plY3RVdGlsLnNldEF1dG9CdWlsZCh0cnVlKTsKLQkJVVJMIGluc3RhbGxVUkwgPSBKYXZhVGVzdHNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoIi8iKTsKLQkJU3RyaW5nW10gemlwUGF0aHMgPSBuZXcgU3RyaW5nWzJdOwotCQl6aXBQYXRoc1swXSA9IEZpbGVMb2NhdG9yLnRvRmlsZVVSTChuZXcgVVJMKGluc3RhbGxVUkwsICJ0ZXN0ZGF0YS90ZXN0YmVhbmluZm8uemlwIikpLmdldEZpbGUoKTsKLQkJemlwUGF0aHNbMV0gPSBGaWxlTG9jYXRvci50b0ZpbGVVUkwobmV3IFVSTChpbnN0YWxsVVJMLCAidGVzdGRhdGEvdGVzdGJlYW5pbmZvcHJlcS56aXAiKSkuZ2V0RmlsZSgpOwotCQlJUHJvamVjdFtdIHByb2plY3RzID0KLQkJCUphdmFQcm9qZWN0VXRpbC5pbXBvcnRQcm9qZWN0cygKLQkJCQluZXcgU3RyaW5nW10geyBBYnN0cmFjdEJlYW5JbmZvVGVzdENhc2UuVEVTVF9CRUFOSU5GT19QUk9KRUNULCBBYnN0cmFjdEJlYW5JbmZvVGVzdENhc2UuVEVTVF9CRUFOSU5GT19QUkVSRVFfUFJPSkVDVCB9LAotCQkJCXppcFBhdGhzKTsKLQkJYXNzZXJ0Tm90TnVsbChwcm9qZWN0c1swXSk7Ci0JCWFzc2VydE5vdE51bGwocHJvamVjdHNbMV0pOwotCQlKYXZhUHJvamVjdFV0aWwud2FpdEZvckF1dG9CdWlsZCgpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tIERhdGEgaW5pdGlhbGl6ZWQgLS0iKTsgLy8kTk9OLU5MUy0xJAotCi0JCUJlYW5pbmZvTmF0dXJlIG5hdHVyZSA9IEJlYW5pbmZvTmF0dXJlLmdldFJ1bnRpbWUocHJvamVjdHNbMF0pOwotCQlhc3NlcnROb3ROdWxsKG5hdHVyZSk7Ci0JCUphdmFJbnN0YW50aWF0aW9uLmluaXRpYWxpemUobmF0dXJlLmdldFJlc291cmNlU2V0KCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5ydW4obmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQlKYXZhUHJvamVjdFV0aWwuZGVsZXRlUHJvamVjdChKYXZhUHJvamVjdFV0aWwuZ2V0UHJvamVjdChBYnN0cmFjdEJlYW5JbmZvVGVzdENhc2UuVEVTVF9CRUFOSU5GT19QUk9KRUNUKSk7Ci0JCQkJSmF2YVByb2plY3RVdGlsLmRlbGV0ZVByb2plY3QoSmF2YVByb2plY3RVdGlsLmdldFByb2plY3QoQWJzdHJhY3RCZWFuSW5mb1Rlc3RDYXNlLlRFU1RfQkVBTklORk9fUFJFUkVRX1BST0pFQ1QpKTsKLQkJCX0KLQkJfSwgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSwgMCwgbnVsbCk7Ci0KLQkJSmF2YVByb2plY3RVdGlsLnNldEF1dG9CdWlsZChvbGRBdXRvQnVpbGRpbmdTdGF0ZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9pbnN0YW50aWF0aW9uL1Rlc3RTdGFuZGFyZC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvaW5zdGFudGlhdGlvbi9UZXN0U3RhbmRhcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhjMTNhYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9pbnN0YW50aWF0aW9uL1Rlc3RTdGFuZGFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIFNlcCAzLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLmluc3RhbnRpYXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uYWRhcHRlcnMuQmVhbmluZm9OYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5pdFN0cmluZ0FsbG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZS5JSmF2YURhdGFUeXBlSW5zdGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZS5JSmF2YU9iamVjdEluc3RhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnRlc3RzLkphdmFQcm9qZWN0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm8uQWJzdHJhY3RCZWFuSW5mb1Rlc3RDYXNlOwotCi0vKioKLSAqIEBhdXRob3IgcmljaGt1bHAKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgVGVzdFN0YW5kYXJkIGV4dGVuZHMgVGVzdENhc2UgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFRlc3RTdGFuZGFyZCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBUZXN0U3RhbmRhcmQoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEJlYW5pbmZvTmF0dXJlIG5hdHVyZTsKLQlwcm90ZWN0ZWQgUmVzb3VyY2VTZXQgcnNldDsKLQlwcm90ZWN0ZWQgSmF2YUhlbHBlcnMgYm9vbFR5cGU7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCUlQcm9qZWN0IGJpUHJvamVjdCA9IEphdmFQcm9qZWN0VXRpbC5nZXRQcm9qZWN0KEFic3RyYWN0QmVhbkluZm9UZXN0Q2FzZS5URVNUX0JFQU5JTkZPX1BST0pFQ1QpOwotCQlhc3NlcnROb3ROdWxsKGJpUHJvamVjdCk7Ci0JCW5hdHVyZSA9IEJlYW5pbmZvTmF0dXJlLmdldFJ1bnRpbWUoYmlQcm9qZWN0KTsKLQkJYXNzZXJ0Tm90TnVsbChuYXR1cmUpOwotCQlyc2V0ID0gbmF0dXJlLmdldFJlc291cmNlU2V0KCk7Ci0JCWFzc2VydE5vdE51bGwocnNldCk7Ci0JCWJvb2xUeXBlID0gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLnJlZmxlY3RUeXBlKCJib29sZWFuIiwgcnNldCk7Ci0JCWFzc2VydE5vdE51bGwoYm9vbFR5cGUpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhQ2xhc3MgZ2V0VGVzdDFDbGFzcygpIHsKLQkJcmV0dXJuIChKYXZhQ2xhc3MpIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5yZWZsZWN0VHlwZSgib3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvLlRlc3QxQ2xhc3MiLCByc2V0KTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbml0KCkgewotCQlKYXZhQ2xhc3MgdGVzdDFDbGFzcyA9IGdldFRlc3QxQ2xhc3MoKTsKLQotCQkvLyBUZXN0IGluc3RhbnRpYXRlIGFuIGluc3RhbmNlLgotCQlJSmF2YU9iamVjdEluc3RhbmNlIGppMSA9IChJSmF2YU9iamVjdEluc3RhbmNlKSB0ZXN0MUNsYXNzLmdldEVQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpLmNyZWF0ZSh0ZXN0MUNsYXNzKTsKLQkJamkxLnNldEFsbG9jYXRpb24oSW5zdGFudGlhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUluaXRTdHJpbmdBbGxvY2F0aW9uKCJuZXcgVGVzdDFDbGFzcygpIikpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEluaXQoamkxKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYXNzZXJ0SW5pdChJSmF2YU9iamVjdEluc3RhbmNlIGppMSkgewotCQkvLyBIZXJlIGJlY2F1c2UgdHdvIHRlc3RzIHdpbGwgZG8gc2FtZSB0ZXN0IHNlcXVlbmNlLgotCQlhc3NlcnRUcnVlKGppMS5pc1NldEFsbG9jYXRpb24oKSk7Ci0JCUluaXRTdHJpbmdBbGxvY2F0aW9uIGFsbG9jID0gKEluaXRTdHJpbmdBbGxvY2F0aW9uKSBqaTEuZ2V0QWxsb2NhdGlvbigpOwotCQlhc3NlcnRFcXVhbHMoIm5ldyBUZXN0MUNsYXNzKCkiLCBhbGxvYy5nZXRJbml0U3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByb3BlcnR5QWNjZXNzKCkgewotCQlKYXZhQ2xhc3MgdGVzdDFDbGFzcyA9IGdldFRlc3QxQ2xhc3MoKTsKLQkJSUphdmFPYmplY3RJbnN0YW5jZSBqaTEgPSAoSUphdmFPYmplY3RJbnN0YW5jZSkgdGVzdDFDbGFzcy5nZXRFUGFja2FnZSgpLmdldEVGYWN0b3J5SW5zdGFuY2UoKS5jcmVhdGUodGVzdDFDbGFzcyk7Ci0JCWppMS5zZXRBbGxvY2F0aW9uKEluc3RhbnRpYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJbml0U3RyaW5nQWxsb2NhdGlvbigibmV3IFRlc3QxQ2xhc3MoKSIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIFRlc3QgcHJvcGVydHkgc2V0L2dldCBvZiBhIGR5bmFtaWMgcHJvcGVydHkuCi0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBzZXRTRiA9IHRlc3QxQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCJzZXQiKTsKLQkJYXNzZXJ0Tm90TnVsbChzZXRTRik7Ci0JCWFzc2VydFNhbWUoYm9vbFR5cGUsIHNldFNGLmdldEVUeXBlKCkpOwotCQlJSmF2YURhdGFUeXBlSW5zdGFuY2Ugc2V0dGluZyA9IChJSmF2YURhdGFUeXBlSW5zdGFuY2UpIHNldFNGLmdldEVUeXBlKCkuZ2V0RVBhY2thZ2UoKS5nZXRFRmFjdG9yeUluc3RhbmNlKCkuY3JlYXRlKChFQ2xhc3MpIHNldFNGLmdldEVUeXBlKCkpOwotCQlzZXR0aW5nLnNldEFsbG9jYXRpb24oSW5zdGFudGlhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUluaXRTdHJpbmdBbGxvY2F0aW9uKCJ0cnVlIikpOyAvLyROT04tTkxTLTEkCi0JCWppMS5lU2V0KAotCQkJc2V0U0YsCi0JCQlzZXR0aW5nKTsKLQkJYXNzZXJ0UHJvcGVydHkoamkxKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYXNzZXJ0UHJvcGVydHkoSUphdmFPYmplY3RJbnN0YW5jZSBqaTEpIHsKLQkJLy8gSGVyZSBiZWNhdXNlIHR3byB0ZXN0cyB3aWxsIGRvIHNhbWUgdGVzdCBzZXF1ZW5jZS4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIHNldFNGID0gamkxLmVDbGFzcygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgic2V0Iik7Ci0JCU9iamVjdCB2ID0gamkxLmVHZXQoc2V0U0YpOwotCQlhc3NlcnROb3ROdWxsKHYpOwotCQlhc3NlcnRUcnVlKHYgaW5zdGFuY2VvZiBJSmF2YURhdGFUeXBlSW5zdGFuY2UpOwotCQlJSmF2YURhdGFUeXBlSW5zdGFuY2UgZHR2ID0gKElKYXZhRGF0YVR5cGVJbnN0YW5jZSkgdjsKLQkJYXNzZXJ0U2FtZShib29sVHlwZSwgZHR2LmdldEphdmFUeXBlKCkpOwotCQlhc3NlcnRUcnVlKGR0di5pc1NldEFsbG9jYXRpb24oKSk7Ci0JCUluaXRTdHJpbmdBbGxvY2F0aW9uIGFsbG9jID0gKEluaXRTdHJpbmdBbGxvY2F0aW9uKSBkdHYuZ2V0QWxsb2NhdGlvbigpOwotCQlhc3NlcnRFcXVhbHMoInRydWUiLCBhbGxvYy5nZXRJbml0U3RyaW5nKCkpOwotCX0KLQotCXByb3RlY3RlZCBJSmF2YU9iamVjdEluc3RhbmNlIHNldHVwSW5zdGFuY2UoKSB7Ci0JCS8vIFNldHVwIHRoZSBzdGFuZGFyZCB0ZXN0IGluc3RhbmNlIHdpdGhvdXQgdGhlIGFzc2VydGlvbnMuIEZvciB1c2UgaW4gb3RoZXIgdGVzdHMuCi0JCUphdmFDbGFzcyB0ZXN0MUNsYXNzID0gZ2V0VGVzdDFDbGFzcygpOwotCQlJSmF2YU9iamVjdEluc3RhbmNlIGppMSA9IChJSmF2YU9iamVjdEluc3RhbmNlKSB0ZXN0MUNsYXNzLmdldEVQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpLmNyZWF0ZSh0ZXN0MUNsYXNzKTsKLQkJamkxLnNldEFsbG9jYXRpb24oSW5zdGFudGlhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUluaXRTdHJpbmdBbGxvY2F0aW9uKCJuZXcgVGVzdDFDbGFzcygpIikpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gVGVzdCBwcm9wZXJ0eSBzZXQvZ2V0IG9mIGEgZHluYW1pYyBwcm9wZXJ0eS4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIHNldFNGID0gdGVzdDFDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmUoInNldCIpOwotCQlJSmF2YURhdGFUeXBlSW5zdGFuY2Ugc2V0dGluZyA9IChJSmF2YURhdGFUeXBlSW5zdGFuY2UpIHNldFNGLmdldEVUeXBlKCkuZ2V0RVBhY2thZ2UoKS5nZXRFRmFjdG9yeUluc3RhbmNlKCkuY3JlYXRlKChFQ2xhc3MpIHNldFNGLmdldEVUeXBlKCkpOwotCQlzZXR0aW5nLnNldEFsbG9jYXRpb24oSW5zdGFudGlhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUluaXRTdHJpbmdBbGxvY2F0aW9uKCJ0cnVlIikpOyAvLyROT04tTkxTLTEkCi0JCWppMS5lU2V0KAotCQkJc2V0U0YsCi0JCQlzZXR0aW5nKTsKLQkJcmV0dXJuIGppMTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHNldHVwUmVzb3VyY2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlJSmF2YU9iamVjdEluc3RhbmNlIGppMSA9IHNldHVwSW5zdGFuY2UoKTsKLQotCQkvLyBXcml0ZSBpdCBvdXQsIHNlZSBpZiBpdCBpcyB3aGF0IGl0IHNob3VsZCBiZSwgdGhlbiByZWFkIGl0IGluIGFuZCBzZWUgaWYgaXQgbG9hZHMgY29ycmVjdGx5LgotCQlSZXNvdXJjZVNldCByc3dvcmsxID0gbmF0dXJlLm5ld1Jlc291cmNlU2V0KCk7IC8vIFJzb3VyY2Ugc2V0IHRvIHdyaXRlIGZyb20KLQotCQlSZXNvdXJjZSByID0gcnN3b3JrMS5jcmVhdGVSZXNvdXJjZShVUkkuY3JlYXRlVVJJKCJmLnhtaSIpKTsgLy8kTk9OLU5MUy0xJAotCQlyLmdldENvbnRlbnRzKCkuYWRkKGppMSk7Ci0JCS8vIEJpdCBvZiBhIGtsdWRnZSwgYnV0IGFsbCByZWZlcmVuY2VzIGluIGphdmEgbW9kZWwgYXJlIHNoYXJlZCwgc28gdG8gc2VyaWFsaXplIHdlIG5lZWQgdG8gZ2V0IHRoZSAKLQkJLy8gInNldCIgc2V0dGluZyBhbmQgYWRkIHRvIHRoZSByZXNvdXJjZSBzbyB0aGF0IGl0IGlzIGNvbnRhaW5lZCBzb21ld2hlcmUuCi0JCXIuZ2V0Q29udGVudHMoKS5hZGQoamkxLmVHZXQoamkxLmVDbGFzcygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgic2V0IikpKTsKLQotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm8gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCXIuc2F2ZShibywgQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKLQkJcmV0dXJuIGJvLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb24oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBUZXN0IHRoZSBzZXJpYWxpemF0aW9uIHRoYXQgaXQgcHJvZHVjZXMgY29ycmVjdCBvdXRwdXQgc3RyaW5nLgotCQlTdHJpbmcgb3V0ID0gc2V0dXBSZXNvdXJjZSgpOwotCQkvLyBOZWVkIHRvIGNyZWF0ZSBhIHByaW50IHN0cmVhbSBzbyB0aGF0IHdlIGdldCB0aGUgY29ycmVjdCBsb2NhbCBuZXdsaW5lIGNoYXJzIGluIHRvIG1hdGNoIGZyb20gdGhlIHJlc291cmNlLgotCQlTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKG91dC5sZW5ndGgoKSArIDUwKTsKLQkJUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoc3cpOwotCQlwdy5wcmludGxuKCI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJBU0NJSVwiPz4iKTsKLQkJcHcucHJpbnRsbigKLQkJCSI8eG1pOlhNSSB4bWk6dmVyc2lvbj1cIjIuMFwiIHhtbG5zOnhtaT1cImh0dHA6Ly93d3cub21nLm9yZy9YTUlcIiB4bWxuczp4c2k9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZVwiIHhtbG5zOl8tamF2YXByaW09XCJqYXZhOi9cIiB4bWxuczpvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbj1cImh0dHA6Ly8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24uZWNvcmVcIiB4bWxuczpvcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm89XCJqYXZhOi9vcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm9cIj4iKTsKLQkJcHcucHJpbnRsbigiICA8b3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvOlRlc3QxQ2xhc3Mgc2V0PVwiLzFcIj4iKTsKLQkJcHcucHJpbnRsbigiICAgIDxhbGxvY2F0aW9uIHhzaTp0eXBlPVwib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb246SW5pdFN0cmluZ0FsbG9jYXRpb25cIiBpbml0U3RyaW5nPVwibmV3IFRlc3QxQ2xhc3MoKVwiLz4iKTsKLQkJcHcucHJpbnRsbigiICA8L29yZy5lY2xpcHNlLmplbS50ZXN0cy5iZWFuaW5mbzpUZXN0MUNsYXNzPiIpOwotCQlwdy5wcmludGxuKCIgIDxfLWphdmFwcmltOmJvb2xlYW4+Iik7Ci0JCXB3LnByaW50bG4oIiAgICA8YWxsb2NhdGlvbiB4c2k6dHlwZT1cIm9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uOkluaXRTdHJpbmdBbGxvY2F0aW9uXCIgaW5pdFN0cmluZz1cInRydWVcIi8+Iik7Ci0JCXB3LnByaW50bG4oIiAgPC9fLWphdmFwcmltOmJvb2xlYW4+Iik7Ci0JCXB3LnByaW50bG4oIjwveG1pOlhNST4iKTsKLQkJcHcuY2xvc2UoKTsKLQkJYXNzZXJ0RXF1YWxzKHN3LnRvU3RyaW5nKCksIG91dCk7Ci0JfQotCQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVhZGluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIFRlc3QgcmVhZGluZyBzZXJpYWxpemF0aW9uIGJhY2sgaW4gcHJvZHVjZXMgY29ycmVjdCBvYmplY3RzLgotCQkvLyBSZXJ1biB0ZXN0cy4KLQkJU3RyaW5nIG91dCA9IHNldHVwUmVzb3VyY2UoKTsKLQotCQlSZXNvdXJjZVNldCByc3dvcmsyID0gbmF0dXJlLm5ld1Jlc291cmNlU2V0KCk7IC8vIFJlc291cmNlIHNldCB0byByZWFkIGludG8KLQkJUmVzb3VyY2UgckluID0gcnN3b3JrMi5jcmVhdGVSZXNvdXJjZShVUkkuY3JlYXRlVVJJKCJmMS54bWkiKSk7IC8vJE5PTi1OTFMtMSQKLQkJckluLmxvYWQobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG91dC5nZXRCeXRlcygpKSwgQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKLQkJSmF2YUNsYXNzIHRlc3QxQ2xhc3MgPSBnZXRUZXN0MUNsYXNzKCk7Ci0JCUlKYXZhT2JqZWN0SW5zdGFuY2UgamkxID0gKElKYXZhT2JqZWN0SW5zdGFuY2UpIEVjb3JlVXRpbC5nZXRPYmplY3RCeVR5cGUockluLmdldENvbnRlbnRzKCksIHRlc3QxQ2xhc3MpOwotCQlhc3NlcnROb3ROdWxsKGppMSk7Ci0JCWFzc2VydEluaXQoamkxKTsKLQkJYXNzZXJ0UHJvcGVydHkoamkxKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL21vZGVsTGlzdGVuZXJzL0lMaXN0ZW5lclRlc3Rlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvbW9kZWxMaXN0ZW5lcnMvSUxpc3RlbmVyVGVzdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzZTU2NjIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvbW9kZWxMaXN0ZW5lcnMvSUxpc3RlbmVyVGVzdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBJTGlzdGVuZXJUZXN0ZXIuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDo1ODo1NSAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5tb2RlbExpc3RlbmVyczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnRpb25GYWlsZWRFcnJvcjsKLSAKLQotLyoqCi0gKiBGb3IgbWFueSBvZiB0aGUgbGlzdGVuZXIgdGVzdHMsIHRoZSBhY3R1YWwgQXNzZXJ0IGlzIGRvbmUgb24gYSBzYWZlIHJ1bm5hYmxlIHNvIHRoYXQgaXQgY2FuJ3QgYmUgCi0gKiBub3JtYWxseSBzZW50LiBTbyB3ZSB3aWxsIGhhdmUgYSBsaXN0ZW5lciB0ZXN0ZXIgdGhhdCB3aWxsIHJldHJpZXZlIHRoZSBleGNlcHRpb24gYW5kIHdpbGwKLSAqIGJlIGNhbGxlZCB0byBnZXQgaXQgZnJvbSB0aGUgbWFpbiB0aHJlYWQuCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTGlzdGVuZXJUZXN0ZXIgewotCi0JcHVibGljIHZvaWQgaXNFeGNlcHRpb24oKSB0aHJvd3MgQXNzZXJ0aW9uRmFpbGVkRXJyb3I7Ci0JcHVibGljIHZvaWQgaXNDb21wbGV0ZSgpIHRocm93cyBBc3NlcnRpb25GYWlsZWRFcnJvcjsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL21vZGVsTGlzdGVuZXJzL0xpc3RlbmVyc1N1aXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9tb2RlbExpc3RlbmVycy9MaXN0ZW5lcnNTdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjU0MTMzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL21vZGVsTGlzdGVuZXJzL0xpc3RlbmVyc1N1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLm1vZGVsTGlzdGVuZXJzOwotLyoKLSAqICAkUkNTZmlsZTogTGlzdGVuZXJzU3VpdGUuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNyAkICAkRGF0ZTogMjAwNi8wNS8xNyAyMDoxMzo1NiAkIAotICovCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQganVuaXQuZXh0ZW5zaW9ucy5UZXN0U2V0dXA7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udGVzdHMuSmF2YVByb2plY3RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5KYXZhVGVzdHNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvLkFic3RyYWN0QmVhbkluZm9UZXN0Q2FzZTsKLQotLyoqCi0gKiBAYXV0aG9yIHJpY2hrdWxwCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTGlzdGVuZXJzU3VpdGUgZXh0ZW5kcyBUZXN0U2V0dXAgewotCi0JLy8gVGVzdCBjYXNlcyB0byBiZSBpbmNsdWRlIGluIHRoZSBzdWl0ZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzIHRlc3RzTGlzdFtdID0geyBUZXN0SkVNLmNsYXNzLCBUZXN0QmVhbkluZm8uY2xhc3N9OwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIExpc3RlbmVyc1N1aXRlKCkgewotCQl0aGlzKCJUZXN0IExpc3RlbmVycyBTdWl0ZSIpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIExpc3RlbmVyc1N1aXRlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5ldyBUZXN0U3VpdGUobmFtZSkgewotCQkJewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGVzdHNMaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWFkZFRlc3RTdWl0ZSh0ZXN0c0xpc3RbaV0pOwotCQkJCX0KLQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgTGlzdGVuZXJzU3VpdGUoKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gb2xkQXV0b0J1aWxkaW5nU3RhdGU7IC8vIGF1dG9CdWlsZGluZyBzdGF0ZSBiZWZvcmUgd2Ugc3RhcnRlZC4JCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCItLSBJbml0aWFsaXppbmcgdGhlIExpc3RlbmVycyB0ZXN0IGRhdGEgLS0iKTsgLy8kTk9OLU5MUy0xJAotCQlvbGRBdXRvQnVpbGRpbmdTdGF0ZSA9IEphdmFQcm9qZWN0VXRpbC5zZXRBdXRvQnVpbGQodHJ1ZSk7Ci0JCVVSTCBpbnN0YWxsVVJMID0gSmF2YVRlc3RzUGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCIvIik7Ci0JCVN0cmluZ1tdIHppcFBhdGhzID0gbmV3IFN0cmluZ1syXTsKLQkJemlwUGF0aHNbMF0gPSBGaWxlTG9jYXRvci50b0ZpbGVVUkwobmV3IFVSTChpbnN0YWxsVVJMLCAidGVzdGRhdGEvdGVzdGJlYW5pbmZvLnppcCIpKS5nZXRGaWxlKCk7Ci0JCXppcFBhdGhzWzFdID0gRmlsZUxvY2F0b3IudG9GaWxlVVJMKG5ldyBVUkwoaW5zdGFsbFVSTCwgInRlc3RkYXRhL3Rlc3RiZWFuaW5mb3ByZXEuemlwIikpLmdldEZpbGUoKTsKLQkJSVByb2plY3RbXSBwcm9qZWN0cyA9Ci0JCQlKYXZhUHJvamVjdFV0aWwuaW1wb3J0UHJvamVjdHMoCi0JCQkJbmV3IFN0cmluZ1tdIHsgQWJzdHJhY3RCZWFuSW5mb1Rlc3RDYXNlLlRFU1RfQkVBTklORk9fUFJPSkVDVCwgQWJzdHJhY3RCZWFuSW5mb1Rlc3RDYXNlLlRFU1RfQkVBTklORk9fUFJFUkVRX1BST0pFQ1QgfSwKLQkJCQl6aXBQYXRocyk7Ci0JCWFzc2VydE5vdE51bGwocHJvamVjdHNbMF0pOwotCQlhc3NlcnROb3ROdWxsKHByb2plY3RzWzFdKTsKLQkJSmF2YVByb2plY3RVdGlsLndhaXRGb3JBdXRvQnVpbGQoKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCItLSBEYXRhIGluaXRpYWxpemVkIC0tIik7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5ydW4obmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQlKYXZhUHJvamVjdFV0aWwuZGVsZXRlUHJvamVjdChKYXZhUHJvamVjdFV0aWwuZ2V0UHJvamVjdChBYnN0cmFjdEJlYW5JbmZvVGVzdENhc2UuVEVTVF9CRUFOSU5GT19QUk9KRUNUKSk7Ci0JCQkJSmF2YVByb2plY3RVdGlsLmRlbGV0ZVByb2plY3QoSmF2YVByb2plY3RVdGlsLmdldFByb2plY3QoQWJzdHJhY3RCZWFuSW5mb1Rlc3RDYXNlLlRFU1RfQkVBTklORk9fUFJFUkVRX1BST0pFQ1QpKTsKLQkJCX0KLQkJfSwgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSwgMCwgbnVsbCk7Ci0KLQkJSmF2YVByb2plY3RVdGlsLnNldEF1dG9CdWlsZChvbGRBdXRvQnVpbGRpbmdTdGF0ZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9tb2RlbExpc3RlbmVycy9UZXN0QmVhbkluZm8uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL21vZGVsTGlzdGVuZXJzL1Rlc3RCZWFuSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjBhMDZkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL21vZGVsTGlzdGVuZXJzL1Rlc3RCZWFuSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogVGVzdEJlYW5JbmZvLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjcgJCAgJERhdGU6IDIwMDYvMDUvMTcgMjA6MTM6NTYgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMubW9kZWxMaXN0ZW5lcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmFkYXB0ZXJzLkJlYW5pbmZvTW9kZWxTeW5jaHJvbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvcmUuSUJlYW5pbmZvU3VwcGxpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuUHJveHlGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0UmVzb3VyY2VTZXQ7Ci0gCi0KLS8qKgotICogVGhpcyBpcyBmb3IgdGVzdGluZyB0aGUgSkVNIFJlZmxlY3Rpb24gbGlzdGVuZXJzCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIFRlc3RCZWFuSW5mbyBleHRlbmRzIFRlc3RMaXN0ZW5lcnMgewotCQotCUJlYW5pbmZvTW9kZWxTeW5jaHJvbml6ZXIgc3luYzsKLQlUZXN0QmVhbmluZm9BZGFwdGVyRmFjdG9yeSBmYWN0b3J5OwotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlmYWN0b3J5ID0gbmV3IFRlc3RCZWFuaW5mb0FkYXB0ZXJGYWN0b3J5KG5ldyBJQmVhbmluZm9TdXBwbGllcigpIHsKLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29yZS5JQmVhbmluZm9TdXBwbGllciNnZXRSZWdpc3RyeSgpCi0JCQkgKi8KLQkJCXB1YmxpYyBQcm94eUZhY3RvcnlSZWdpc3RyeSBnZXRSZWdpc3RyeSgpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29yZS5JQmVhbmluZm9TdXBwbGllciNpc1JlZ2lzdHJ5Q3JlYXRlZCgpCi0JCQkgKi8KLQkJCXB1YmxpYyBib29sZWFuIGlzUmVnaXN0cnlDcmVhdGVkKCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29yZS5JQmVhbmluZm9TdXBwbGllciNjbG9zZVJlZ2lzdHJ5KCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgY2xvc2VSZWdpc3RyeSgpIHsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29yZS5JQmVhbmluZm9TdXBwbGllciNnZXRQcm9qZWN0KCkKLQkJCSAqLwotCQkJcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCQkJcmV0dXJuIGpwLmdldFByb2plY3QoKTsKLQkJCX0KLQotCQkJcHVibGljIFByb2plY3RSZXNvdXJjZVNldCBnZXROZXdSZXNvdXJjZVNldCgpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcHVibGljIFJlc291cmNlU2V0IGdldFByb2plY3RSZXNvdXJjZVNldCgpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfSk7CS8vIE5lZWRzIHRvIGJlIHNldCBmaXJzdCBzbyB0aGF0IHN1cGVyLnNldFVQKCkgY2FsbHMgdG8gc3BlY2lhbCBzZXR1cHMgd2lsbCBoYXZlIGEgZmFjdG9yeS4KLQkJc3VwZXIuc2V0VXAoKTsJLy8gQ2FsbGVkIGZpcnN0IHNvIHRoYXQgYW55IHNldHVwIHdvbid0IGZpcmUgb3VyIHN5bmNocm9uaXplci4KLQkJCi0JCS8vIEJhc2ljIGZvciB0aGlzIGlzIGFkZCBvdXIgc3BlY2lhbCBsaXN0ZW5lci4gKERvbid0IG5lZWQgZnVsbCBKRU0gbW9kZWwgY2x1dHRlcmluZyB0aGluZ3MgdXApLgkJCi0JCXN5bmMgPSBuZXcgQmVhbmluZm9Nb2RlbFN5bmNocm9uaXplcihmYWN0b3J5LCBqcCk7Ci0JCXNldFRlc3RlcihmYWN0b3J5KTsKLQl9Ci0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnRlc3RzLm1vZGVsTGlzdGVuZXJzLlRlc3RMaXN0ZW5lcnMjc2V0VXBDbG9zZSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXBDbG9zZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcENsb3NlKCk7Ci0JCWZhY3Rvcnkuc2V0VGVzdENhc2VzKG5ldyBpbnRbMF0sIG5ldyBPYmplY3RbMF0pOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMubW9kZWxMaXN0ZW5lcnMuVGVzdExpc3RlbmVycyNzZXRVcE9wZW4oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwT3BlbigpIHsKLQkJc3VwZXIuc2V0VXBPcGVuKCk7Ci0JCWZhY3Rvcnkuc2V0VGVzdENhc2VzKG5ldyBpbnRbMF0sIG5ldyBPYmplY3RbMF0pOwkJCi0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5tb2RlbExpc3RlbmVycy5UZXN0TGlzdGVuZXJzI3NldFVwQWRkTWV0aG9kSW5Xb3JraW5nQ29weSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXBBZGRNZXRob2RJbldvcmtpbmdDb3B5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwQWRkTWV0aG9kSW5Xb3JraW5nQ29weSgpOwotCQlmYWN0b3J5LnNldFRlc3RDYXNlcyhuZXcgaW50WzBdLCBuZXcgT2JqZWN0WzBdKTsJCQotCX0KLQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMubW9kZWxMaXN0ZW5lcnMuVGVzdExpc3RlbmVycyNzZXRVcFNhdmVGcm9tV29ya2luZ0NvcHkoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwU2F2ZUZyb21Xb3JraW5nQ29weSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcFNhdmVGcm9tV29ya2luZ0NvcHkoKTsKLQkJZmFjdG9yeS5zZXRUZXN0Q2FzZXMobmV3IGludFtdIHtUZXN0QmVhbmluZm9BZGFwdGVyRmFjdG9yeS5NQVJLX1NUQUxFX0lOVFJPU1BFQ1RJT05fUExVU19JTk5FUn0sIG5ldyBPYmplY3RbXSB7bmV3IE9iamVjdFtdIHsib3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvLlRlc3QxQ2xhc3MiLCBCb29sZWFuLkZBTFNFfX0pOyAJCQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMubW9kZWxMaXN0ZW5lcnMuVGVzdExpc3RlbmVycyNzZXRVcFJldmVydCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXBSZXZlcnQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXBSZXZlcnQoKTsKLQkJZmFjdG9yeS5zZXRUZXN0Q2FzZXMobmV3IGludFswXSwgbmV3IE9iamVjdFswXSk7CQkKLQl9Ci0JCi0vLwkvKiAobm9uLUphdmFkb2MpCi0vLwkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5tb2RlbExpc3RlbmVycy5UZXN0TGlzdGVuZXJzI3NldHVwRGVsZXRlTWV0aG9kTm9Xb3JraW5nQ29weSgpCi0vLwkgKi8KLS8vCXByb3RlY3RlZCB2b2lkIHNldHVwRGVsZXRlTWV0aG9kTm9Xb3JraW5nQ29weSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotLy8JCXN1cGVyLnNldHVwRGVsZXRlTWV0aG9kTm9Xb3JraW5nQ29weSgpOwotLy8JCWZhY3Rvcnkuc2V0VGVzdENhc2VzKG5ldyBpbnRbXSB7VGVzdEJlYW5pbmZvQWRhcHRlckZhY3RvcnkuTUFSS19TVEFMRV9JTlRST1NQRUNUSU9OX1BMVVNfSU5ORVJ9LCBuZXcgT2JqZWN0W10ge25ldyBPYmplY3RbXSB7Im9yZy5lY2xpcHNlLmplbS50ZXN0cy5iZWFuaW5mby5UZXN0MUNsYXNzIiwgQm9vbGVhbi5GQUxTRX19KTsJCQotLy8JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5tb2RlbExpc3RlbmVycy5UZXN0TGlzdGVuZXJzI3NldHVwQWRkQ2xhc3MoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldHVwQWRkQ2xhc3MoKSB7Ci0JCXN1cGVyLnNldHVwQWRkQ2xhc3MoKTsKLQkJZmFjdG9yeS5zZXRUZXN0Q2FzZXMobmV3IGludFtdIHtUZXN0QmVhbmluZm9BZGFwdGVyRmFjdG9yeS5NQVJLX1NUQUxFX0lOVFJPU1BFQ1RJT05fUExVU19JTk5FUn0sIG5ldyBPYmplY3RbXSB7bmV3IE9iamVjdFtdIHsib3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvLk5ld0NsYXNzIiwgQm9vbGVhbi5UUlVFfX0pOwkJCQkKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnRlc3RzLm1vZGVsTGlzdGVuZXJzLlRlc3RMaXN0ZW5lcnMjc2V0dXBEZWxldGVDbGFzc1dpdGhXb3JraW5nQ29weSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0dXBEZWxldGVDbGFzc1dpdGhXb3JraW5nQ29weSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlzdXBlci5zZXR1cERlbGV0ZUNsYXNzV2l0aFdvcmtpbmdDb3B5KCk7Ci0JCWZhY3Rvcnkuc2V0VGVzdENhc2VzKG5ldyBpbnRbXSB7VGVzdEJlYW5pbmZvQWRhcHRlckZhY3RvcnkuTUFSS19TVEFMRV9JTlRST1NQRUNUSU9OX1BMVVNfSU5ORVIsIFRlc3RCZWFuaW5mb0FkYXB0ZXJGYWN0b3J5Lk1BUktfU1RBTEVfSU5UUk9TUEVDVElPTl9QTFVTX0lOTkVSfSwgbmV3IE9iamVjdFtdIHtuZXcgT2JqZWN0W10geyJvcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm8uTmV3Q2xhc3MiLCBCb29sZWFuLkZBTFNFfSwgbmV3IE9iamVjdFtdIHsib3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvLk5ld0NsYXNzIiwgQm9vbGVhbi5UUlVFfX0pOwkJCi0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5tb2RlbExpc3RlbmVycy5UZXN0TGlzdGVuZXJzI3NldFVwRGVsZXRlQ2xhc3NOb1dvcmtpbmdDb3B5KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcERlbGV0ZUNsYXNzTm9Xb3JraW5nQ29weSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcERlbGV0ZUNsYXNzTm9Xb3JraW5nQ29weSgpOwotCQlmYWN0b3J5LnNldFRlc3RDYXNlcyhuZXcgaW50W10ge1Rlc3RCZWFuaW5mb0FkYXB0ZXJGYWN0b3J5Lk1BUktfU1RBTEVfSU5UUk9TUEVDVElPTl9QTFVTX0lOTkVSfSwgbmV3IE9iamVjdFtdIHtuZXcgT2JqZWN0W10geyJvcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm8uTmV3Q2xhc3MiLCBCb29sZWFuLlRSVUV9fSk7CQkKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnRlc3RzLm1vZGVsTGlzdGVuZXJzLlRlc3RMaXN0ZW5lcnMjc2V0VXBBZGRQYWNrYWdlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcEFkZFBhY2thZ2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXBBZGRQYWNrYWdlKCk7Ci0JCWZhY3Rvcnkuc2V0VGVzdENhc2VzKG5ldyBpbnRbMF0sIG5ldyBPYmplY3RbMF0pOwkJCi0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5tb2RlbExpc3RlbmVycy5UZXN0TGlzdGVuZXJzI3NldFVwRGVsZXRlUGFja2FnZSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXBEZWxldGVQYWNrYWdlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwRGVsZXRlUGFja2FnZSgpOwotCQlmYWN0b3J5LnNldFRlc3RDYXNlcyhuZXcgaW50W10ge1Rlc3RCZWFuaW5mb0FkYXB0ZXJGYWN0b3J5Lk1BUktfQUxMX1NUQUxFfSwgbmV3IE9iamVjdFtdIHtudWxsfSk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3luYy5zdG9wU3luY2hyb25pemVyKHRydWUpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL21vZGVsTGlzdGVuZXJzL1Rlc3RCZWFuaW5mb0FkYXB0ZXJGYWN0b3J5LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9tb2RlbExpc3RlbmVycy9UZXN0QmVhbmluZm9BZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGQ4MDUzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL21vZGVsTGlzdGVuZXJzL1Rlc3RCZWFuaW5mb0FkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogVGVzdEJlYW5pbmZvQWRhcHRlckZhY3RvcnkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDo1ODo1NSAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5tb2RlbExpc3RlbmVyczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydGlvbkZhaWxlZEVycm9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmFkYXB0ZXJzLkJlYW5pbmZvQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvcmUuSUJlYW5pbmZvU3VwcGxpZXI7Ci0KLS8qKgotICogVGVzdCBmYWN0b3J5IHRvIGhhbmRsZSB0aGUgY2FsbHMgZnJvbSB0aGUgbGlzdGVuZXIgZHVyaW5nIG91ciB0ZXN0cy4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0QmVhbmluZm9BZGFwdGVyRmFjdG9yeSBleHRlbmRzIEJlYW5pbmZvQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBJTGlzdGVuZXJUZXN0ZXIgewotCi0JLyoqCi0JICogQHBhcmFtIHN1cHBsaWVyCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFRlc3RCZWFuaW5mb0FkYXB0ZXJGYWN0b3J5KElCZWFuaW5mb1N1cHBsaWVyIHN1cHBsaWVyKSB7Ci0JCXN1cGVyKHN1cHBsaWVyKTsKLQl9Ci0JCi0JaW50IGNhbGxJbmRleCA9IC0xOyAvLyBJbmRleCBvZiBjYWxscyBpbnRvIGNvbnRyb2wgbGlzdC4KLQotCUFzc2VydGlvbkZhaWxlZEVycm9yIGV4Y2VwdGlvbjsgLy8gU2V0IGlmIGV4Y2VwdGlvbiBvY2N1cmVkLgotCi0JcHJvdGVjdGVkIGludFtdIGNhbGxUeXBlczsgLy8gT3JkZXIgb2YgcGVybWl0dGVkIGNhbGx0eXBlcy4gSWYgYW55IGNvbWUgb3V0IG9mIG9yZGVyLCB0aGVuIGVycm9yLgotCi0JcHJvdGVjdGVkIE9iamVjdFtdIGNhbGxBcmdzOyAvLyBDb3JyZXNwb25kaW5nIGFyZ3MgZm9yIGVhY2ggY2FsbCB0eXBlcy4gRWFjaCB0eXBlIHNwZWNpZmljLgotCi0JcHVibGljIHZvaWQgc2V0VGVzdENhc2VzKGludFtdIGNhbGxUeXBlcywgT2JqZWN0W10gY2FsbEFyZ3MpIHsKLQkJdGhpcy5jYWxsVHlwZXMgPSBjYWxsVHlwZXM7Ci0JCXRoaXMuY2FsbEFyZ3MgPSBjYWxsQXJnczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpc0V4Y2VwdGlvbigpIHRocm93cyBBc3NlcnRpb25GYWlsZWRFcnJvciB7Ci0JCWlmIChleGNlcHRpb24gIT0gbnVsbCkKLQkJCXRocm93IGV4Y2VwdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpc0NvbXBsZXRlKCkgdGhyb3dzIEFzc2VydGlvbkZhaWxlZEVycm9yIHsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiRGlkIG5vdCBjb21wbGV0ZSBhbGwgbm90aWZjYXRpb25zLiAiLCBjYWxsVHlwZXMubGVuZ3RoLCBjYWxsSW5kZXggKyAxKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVJLX0FMTF9TVEFMRSA9IDAsIE1BUktfU1RBTEVfSU5UUk9TUEVDVElPTiA9IDEsIE1BUktfU1RBTEVfSU5UUk9TUEVDVElPTl9QTFVTX0lOTkVSID0gMjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGNhbGxUeXBlTmFtZXMgPSBuZXcgU3RyaW5nW10geyAiTUFSS19BTExfU1RBTEUiLCAiTUFSS19TVEFMRV9JTlRST1NQRUNUSU9OIiwgIk1BUktfU1RBTEVfSU5UUk9TUEVDVElPTl9QTFVTX0lOTkVSIiwKLQkJCSJVTlJFR0lTVEVSX0lOVFJPU1BFQ1RJT04iLCAiVU5SRUdJU1RFUl9JTlRST1NQRUNUSU9OX1BMVVNfSU5ORVIifTsKLQotCS8qCi0JICogVGVzdCB0aGUgbmV4dCBjYWxsIHR5cGUsIGlmIG5vdCB2YWxpZCwgcmV0dXJuIGZhbHNlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHRlc3RDYWxsVHlwZShpbnQgY2FsbFR5cGUpIHsKLQkJaWYgKGV4Y2VwdGlvbiAhPSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOyAvLyBBbHJlYWR5IGhhZCBhbiBlcnJvcgotCQl0cnkgewotCQkJaWYgKCsrY2FsbEluZGV4ID49IGNhbGxUeXBlcy5sZW5ndGgpCi0JCQkJQXNzZXJ0LmZhaWwoIkFuIGV4dHJhIG5vdGlmaWNhdGlvbiBvZiB0eXBlICIgKyBjYWxsVHlwZU5hbWVzW2NhbGxUeXBlXSArICIgcmVjZWl2ZWQuIik7Ci0JCQlpZiAoY2FsbFR5cGVzW2NhbGxJbmRleF0gIT0gY2FsbFR5cGUpCi0JCQkJQXNzZXJ0LmFzc2VydEVxdWFscyhjYWxsVHlwZU5hbWVzW2NhbGxUeXBlc1tjYWxsSW5kZXhdXSwgY2FsbFR5cGVOYW1lc1tjYWxsVHlwZV0pOwotCQl9IGNhdGNoIChBc3NlcnRpb25GYWlsZWRFcnJvciBlKSB7Ci0JCQlleGNlcHRpb24gPSBlOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmFkYXB0ZXJzLkJlYW5pbmZvQWRhcHRlckZhY3RvcnkjbWFya0FsbFN0YWxlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBtYXJrQWxsU3RhbGUoKSB7Ci0JCXRlc3RDYWxsVHlwZShNQVJLX0FMTF9TVEFMRSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uYWRhcHRlcnMuQmVhbmluZm9BZGFwdGVyRmFjdG9yeSNtYXJrU3RhbGVJbnRyb3NwZWN0aW9uKGphdmEubGFuZy5TdHJpbmcsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgbWFya1N0YWxlSW50cm9zcGVjdGlvbihTdHJpbmcgc291cmNlTmFtZSwgYm9vbGVhbiBjbGVhclJlc3VsdHMpIHsKLQkJaWYgKHRlc3RDYWxsVHlwZShNQVJLX1NUQUxFX0lOVFJPU1BFQ1RJT04pKSB7Ci0JCQl0cnkgewotCQkJCUFzc2VydC5hc3NlcnRFcXVhbHMoKFN0cmluZykgKChPYmplY3RbXSkgY2FsbEFyZ3NbY2FsbEluZGV4XSlbMF0sIHNvdXJjZU5hbWUpOwotCQkJCUFzc2VydC5hc3NlcnRFcXVhbHMoKChCb29sZWFuKSAoKE9iamVjdFtdKSBjYWxsQXJnc1tjYWxsSW5kZXhdKVsxXSkuYm9vbGVhblZhbHVlKCksIGNsZWFyUmVzdWx0cyk7IAotCQkJfSBjYXRjaCAoQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSkgewotCQkJCWV4Y2VwdGlvbiA9IGU7Ci0JCQl9CQkJCi0JCX0JCQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmFkYXB0ZXJzLkJlYW5pbmZvQWRhcHRlckZhY3RvcnkjbWFya1N0YWxlSW50cm9zcGVjdGlvblBsdXNJbm5lcihqYXZhLmxhbmcuU3RyaW5nLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIG1hcmtTdGFsZUludHJvc3BlY3Rpb25QbHVzSW5uZXIoU3RyaW5nIHNvdXJjZU5hbWUsIGJvb2xlYW4gY2xlYXJSZXN1bHRzKSB7Ci0JCWlmICh0ZXN0Q2FsbFR5cGUoTUFSS19TVEFMRV9JTlRST1NQRUNUSU9OX1BMVVNfSU5ORVIpKSB7Ci0JCQl0cnkgewotCQkJCUFzc2VydC5hc3NlcnRFcXVhbHMoKFN0cmluZykgKChPYmplY3RbXSkgY2FsbEFyZ3NbY2FsbEluZGV4XSlbMF0sIHNvdXJjZU5hbWUpOwotCQkJCUFzc2VydC5hc3NlcnRFcXVhbHMoKChCb29sZWFuKSAoKE9iamVjdFtdKSBjYWxsQXJnc1tjYWxsSW5kZXhdKVsxXSkuYm9vbGVhblZhbHVlKCksIGNsZWFyUmVzdWx0cyk7IAotCQkJfSBjYXRjaCAoQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSkgewotCQkJCWV4Y2VwdGlvbiA9IGU7Ci0JCQl9CQkJCi0JCX0JCQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL21vZGVsTGlzdGVuZXJzL1Rlc3RKRU0uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL21vZGVsTGlzdGVuZXJzL1Rlc3RKRU0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRkODQ2MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9tb2RlbExpc3RlbmVycy9UZXN0SkVNLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBUZXN0SkVNLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjcgJCAgJERhdGU6IDIwMDYvMDUvMTcgMjA6MTM6NTYgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMubW9kZWxMaXN0ZW5lcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYWRhcHRlcnMuamRvbS5KYXZhUmVmbGVjdGlvblN5bmNocm9uaXplcjsKLSAKLQotLyoqCi0gKiBUaGlzIGlzIGZvciB0ZXN0aW5nIHRoZSBKRU0gUmVmbGVjdGlvbiBsaXN0ZW5lcnMKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgVGVzdEpFTSBleHRlbmRzIFRlc3RMaXN0ZW5lcnMgewotCQotCUphdmFSZWZsZWN0aW9uU3luY2hyb25pemVyIHN5bmM7Ci0JVGVzdEphdmFKRE9NQWRhcHRlckZhY3RvcnkgZmFjdG9yeTsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZmFjdG9yeSA9IG5ldyBUZXN0SmF2YUpET01BZGFwdGVyRmFjdG9yeSgpOwkvLyBOZWVkcyB0byBiZSBzZXQgZmlyc3Qgc28gdGhhdCBzdXBlci5zZXRVUCgpIGNhbGxzIHRvIHNwZWNpYWwgc2V0dXBzIHdpbGwgaGF2ZSBhIGZhY3RvcnkuCi0JCXN1cGVyLnNldFVwKCk7CS8vIENhbGxlZCBmaXJzdCBzbyB0aGF0IGFueSBzZXR1cCB3b24ndCBmaXJlIG91ciBzeW5jaHJvbml6ZXIuCi0JCQotCQkvLyBCYXNpYyBmb3IgdGhpcyBpcyBhZGQgb3VyIHNwZWNpYWwgbGlzdGVuZXIuIChEb24ndCBuZWVkIGZ1bGwgSkVNIG1vZGVsIGNsdXR0ZXJpbmcgdGhpbmdzIHVwKS4JCQotCQlmYWN0b3J5LnNldEphdmFQcm9qZWN0KGpwKTsKLQkJc3luYyA9IGZhY3RvcnkuZ2V0U3luY2hyb25pemVyKCk7Ci0JCXNldFRlc3RlcihmYWN0b3J5KTsKLQl9Ci0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnRlc3RzLm1vZGVsTGlzdGVuZXJzLlRlc3RMaXN0ZW5lcnMjc2V0VXBDbG9zZSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXBDbG9zZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcENsb3NlKCk7Ci0JCWZhY3Rvcnkuc2V0VGVzdENhc2VzKG5ldyBpbnRbMF0sIG5ldyBPYmplY3RbMF0pOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMubW9kZWxMaXN0ZW5lcnMuVGVzdExpc3RlbmVycyNzZXRVcE9wZW4oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwT3BlbigpIHsKLQkJc3VwZXIuc2V0VXBPcGVuKCk7Ci0JCWZhY3Rvcnkuc2V0VGVzdENhc2VzKG5ldyBpbnRbMF0sIG5ldyBPYmplY3RbMF0pOwkJCi0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5tb2RlbExpc3RlbmVycy5UZXN0TGlzdGVuZXJzI3NldFVwQWRkTWV0aG9kSW5Xb3JraW5nQ29weSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXBBZGRNZXRob2RJbldvcmtpbmdDb3B5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwQWRkTWV0aG9kSW5Xb3JraW5nQ29weSgpOwotCQlmYWN0b3J5LnNldFRlc3RDYXNlcyhuZXcgaW50WzBdLCBuZXcgT2JqZWN0WzBdKTsJCQotCX0KLQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMubW9kZWxMaXN0ZW5lcnMuVGVzdExpc3RlbmVycyNzZXRVcFNhdmVGcm9tV29ya2luZ0NvcHkoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwU2F2ZUZyb21Xb3JraW5nQ29weSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcFNhdmVGcm9tV29ya2luZ0NvcHkoKTsKLQkJZmFjdG9yeS5zZXRUZXN0Q2FzZXMobmV3IGludFtdIHtUZXN0SmF2YUpET01BZGFwdGVyRmFjdG9yeS5GTFVTSF9SRUZMRUNUSU9OX1BMVVNfSU5ORVJfTk9fTk9USUZJQ0FUSU9OfSwgbmV3IE9iamVjdFtdIHsib3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvLlRlc3QxQ2xhc3MifSk7IAkJCi0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5tb2RlbExpc3RlbmVycy5UZXN0TGlzdGVuZXJzI3NldFVwUmV2ZXJ0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcFJldmVydCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcFJldmVydCgpOwotCQlmYWN0b3J5LnNldFRlc3RDYXNlcyhuZXcgaW50WzBdLCBuZXcgT2JqZWN0WzBdKTsJCQotCX0KLQkKLS8vCS8qIChub24tSmF2YWRvYykKLS8vCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnRlc3RzLm1vZGVsTGlzdGVuZXJzLlRlc3RMaXN0ZW5lcnMjc2V0dXBEZWxldGVNZXRob2ROb1dvcmtpbmdDb3B5KCkKLS8vCSAqLwotLy8JcHJvdGVjdGVkIHZvaWQgc2V0dXBEZWxldGVNZXRob2ROb1dvcmtpbmdDb3B5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0vLwkJc3VwZXIuc2V0dXBEZWxldGVNZXRob2ROb1dvcmtpbmdDb3B5KCk7Ci0vLwkJZmFjdG9yeS5zZXRUZXN0Q2FzZXMobmV3IGludFtdIHtUZXN0SmF2YUpET01BZGFwdGVyRmFjdG9yeS5GTFVTSF9SRUZMRUNUSU9OX05PX05PVElGSUNBVElPTiwgVGVzdEphdmFKRE9NQWRhcHRlckZhY3RvcnkuRkxVU0hfUkVGTEVDVElPTl9QTFVTX0lOTkVSX05PX05PVElGSUNBVElPTn0sIG5ldyBPYmplY3RbXSB7Im9yZy5lY2xpcHNlLmplbS50ZXN0cy5iZWFuaW5mby5UZXN0MUNsYXNzIiwgIm9yZy5lY2xpcHNlLmplbS50ZXN0cy5iZWFuaW5mby5UZXN0MUNsYXNzIn0pOwkJCi0vLwl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnRlc3RzLm1vZGVsTGlzdGVuZXJzLlRlc3RMaXN0ZW5lcnMjc2V0dXBBZGRDbGFzcygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0dXBBZGRDbGFzcygpIHsKLQkJc3VwZXIuc2V0dXBBZGRDbGFzcygpOwotCQlmYWN0b3J5LnNldFRlc3RDYXNlcyhuZXcgaW50W10ge1Rlc3RKYXZhSkRPTUFkYXB0ZXJGYWN0b3J5LkRJU0FTU09DSUFURV9TT1VSQ0VfUExVU19JTk5FUl9OT1RJRll9LCBuZXcgT2JqZWN0W10ge25ldyBPYmplY3RbXSB7Im9yZy5lY2xpcHNlLmplbS50ZXN0cy5iZWFuaW5mby5OZXdDbGFzcyIsIEJvb2xlYW4uRkFMU0V9fSk7CQkJCQotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMubW9kZWxMaXN0ZW5lcnMuVGVzdExpc3RlbmVycyNzZXR1cERlbGV0ZUNsYXNzV2l0aFdvcmtpbmdDb3B5KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cERlbGV0ZUNsYXNzV2l0aFdvcmtpbmdDb3B5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldHVwRGVsZXRlQ2xhc3NXaXRoV29ya2luZ0NvcHkoKTsKLQkJZmFjdG9yeS5zZXRUZXN0Q2FzZXMobmV3IGludFtdIHtUZXN0SmF2YUpET01BZGFwdGVyRmFjdG9yeS5GTFVTSF9SRUZMRUNUSU9OX1BMVVNfSU5ORVJfTk9fTk9USUZJQ0FUSU9OLCBUZXN0SmF2YUpET01BZGFwdGVyRmFjdG9yeS5ESVNBU1NPQ0lBVEVfU09VUkNFX1BMVVNfSU5ORVJfTk9USUZZfSwgbmV3IE9iamVjdFtdIHsib3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvLk5ld0NsYXNzIiwgbmV3IE9iamVjdFtdIHsib3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvLk5ld0NsYXNzIiwgQm9vbGVhbi5GQUxTRX19KTsJCQotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMubW9kZWxMaXN0ZW5lcnMuVGVzdExpc3RlbmVycyNzZXRVcERlbGV0ZUNsYXNzTm9Xb3JraW5nQ29weSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXBEZWxldGVDbGFzc05vV29ya2luZ0NvcHkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXBEZWxldGVDbGFzc05vV29ya2luZ0NvcHkoKTsKLQkJZmFjdG9yeS5zZXRUZXN0Q2FzZXMobmV3IGludFtdIHtUZXN0SmF2YUpET01BZGFwdGVyRmFjdG9yeS5ESVNBU1NPQ0lBVEVfU09VUkNFX1BMVVNfSU5ORVJfTk9USUZZfSwgbmV3IE9iamVjdFtdIHtuZXcgT2JqZWN0W10geyJvcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm8uTmV3Q2xhc3MiLCBCb29sZWFuLkZBTFNFfX0pOwkJCi0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5tb2RlbExpc3RlbmVycy5UZXN0TGlzdGVuZXJzI3NldFVwQWRkUGFja2FnZSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXBBZGRQYWNrYWdlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwQWRkUGFja2FnZSgpOwotCQlmYWN0b3J5LnNldFRlc3RDYXNlcyhuZXcgaW50W10ge1Rlc3RKYXZhSkRPTUFkYXB0ZXJGYWN0b3J5LkZMVVNIX1BBQ0tBR0VfTk9fTk9USUZJQ0FUSU9OfSwgbmV3IE9iamVjdFtdIHtuZXcgT2JqZWN0W10geyJ0ZXN0IiwgQm9vbGVhbi5UUlVFfX0pOwkJCi0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5tb2RlbExpc3RlbmVycy5UZXN0TGlzdGVuZXJzI3NldFVwRGVsZXRlUGFja2FnZSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXBEZWxldGVQYWNrYWdlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwRGVsZXRlUGFja2FnZSgpOwotCQlmYWN0b3J5LnNldFRlc3RDYXNlcyhuZXcgaW50W10ge1Rlc3RKYXZhSkRPTUFkYXB0ZXJGYWN0b3J5LkZMVVNIX1BBQ0tBR0V9LCBuZXcgT2JqZWN0W10ge25ldyBPYmplY3RbXSB7InRlc3QiLCBCb29sZWFuLkZBTFNFfX0pOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN5bmMuc3RvcFN5bmNocm9uaXplcigpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL21vZGVsTGlzdGVuZXJzL1Rlc3RKYXZhSkRPTUFkYXB0ZXJGYWN0b3J5LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9tb2RlbExpc3RlbmVycy9UZXN0SmF2YUpET01BZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODIyYjdhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL21vZGVsTGlzdGVuZXJzL1Rlc3RKYXZhSkRPTUFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogVGVzdEphdmFKRE9NQWRhcHRlckZhY3RvcnkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDo1ODo1NSAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5tb2RlbExpc3RlbmVyczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydGlvbkZhaWxlZEVycm9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYWRhcHRlcnMuamRvbS5KYXZhSkRPTUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5hZGFwdGVycy5qZG9tLkphdmFSZWZsZWN0aW9uU3luY2hyb25pemVyOwotIAotCi0vKioKLSAqIEEgdGVzdCB2ZXJzaW9uIG9mIHRoaXMgc28gdGhhdCBpdCB3b3JrcyB3aXRoIG91ciB0ZXN0IGNhc2VzIHdpdGhvdXQgaGF2aW5nIGZ1bGxibG93biBKRU0gbW9kZWwgdXAgYW5kIHJ1bm5pbmcuCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIFRlc3RKYXZhSkRPTUFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgSmF2YUpET01BZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIElMaXN0ZW5lclRlc3RlciB7Ci0JCi0JaW50IGNhbGxJbmRleCA9IC0xOwkvLyBJbmRleCBvZiBjYWxscyBpbnRvIGNvbnRyb2wgbGlzdC4KLQlBc3NlcnRpb25GYWlsZWRFcnJvciBleGNlcHRpb247IC8vIFNldCBpZiBleGNlcHRpb24gb2NjdXJlZC4KLQkKLQlwcm90ZWN0ZWQgaW50W10gY2FsbFR5cGVzOwkvLyBPcmRlciBvZiBwZXJtaXR0ZWQgY2FsbHR5cGVzLiBJZiBhbnkgY29tZSBvdXQgb2Ygb3JkZXIsIHRoZW4gZXJyb3IuCi0JcHJvdGVjdGVkIE9iamVjdFtdIGNhbGxBcmdzOwkvLyBDb3JyZXNwb25kaW5nIGFyZ3MgZm9yIGVhY2ggY2FsbCB0eXBlcy4gRWFjaCB0eXBlIHNwZWNpZmljLgotCQotCXB1YmxpYyB2b2lkIHNldFRlc3RDYXNlcyhpbnRbXSBjYWxsVHlwZXMsIE9iamVjdFtdIGNhbGxBcmdzKSB7Ci0JCXRoaXMuY2FsbFR5cGVzID0gY2FsbFR5cGVzOwotCQl0aGlzLmNhbGxBcmdzID0gY2FsbEFyZ3M7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGlzRXhjZXB0aW9uKCkgdGhyb3dzIEFzc2VydGlvbkZhaWxlZEVycm9yIHsKLQkJaWYgKGV4Y2VwdGlvbiAhPSBudWxsKQotCQkJdGhyb3cgZXhjZXB0aW9uOwotCX0KLQkJCi0JcHVibGljIHZvaWQgaXNDb21wbGV0ZSgpIHRocm93cyBBc3NlcnRpb25GYWlsZWRFcnJvciB7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIkRpZCBub3QgY29tcGxldGUgYWxsIG5vdGlmY2F0aW9ucy4gIiwgY2FsbFR5cGVzLmxlbmd0aCwgY2FsbEluZGV4KzEpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMVVNIX0FMTCA9IDAsIEZMVVNIX0FMTF9OT19OT1RJRklDQVRJT04gPSAxLCBGTFVTSF9QQUNLQUdFID0gMiwgRkxVU0hfUEFDS0FHRV9OT19OT1RJRklDQVRJT04gPSAzLCAKLQkJRkxVU0hfUkVGTEVDVElPTiA9IDQsIEZMVVNIX1JFRkxFQ1RJT05fTk9fTk9USUZJQ0FUSU9OID0gNSwgRkxVU0hfUkVGTEVDVElPTl9QTFVTX0lOTkVSX05PX05PVElGSUNBVElPTiA9IDYsIE5PVElGWV9DT05URU5UX0NIQU5HRUQgPSA3LAotCQlESVNBU1NPQ0lBVEVfU09VUkNFX05PVElGWSA9IDgsIERJU0FTU09DSUFURV9TT1VSQ0UgPSA5LCBESVNBU1NPQ0lBVEVfU09VUkNFX1BMVVNfSU5ORVJfTk9USUZZID0gMTAsIERJU0FTU09DSUFURV9TT1VSQ0VfUExVU19JTk5FUiA9IDExOyAKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBjYWxsVHlwZU5hbWVzID0gbmV3IFN0cmluZ1tdIHsiRkxVU0hfQUxMIiwgIkZMVVNIX0FMTF9OT19OT1RJRklDQVRJT04iLCAiRkxVU0hfUEFDS0FHRSIsICJGTFVTSF9QQUNLQUdFX05PX05PVElGSUNBVElPTiIsIAotCQkJIkZMVVNIX1JFRkxFQ1RJT04iLCAiRkxVU0hfUkVGTEVDVElPTl9OT19OT1RJRklDQVRJT04iLCAiRkxVU0hfUkVGTEVDVElPTl9QTFVTX0lOTkVSX05PX05PVElGSUNBVElPTiIsICJOT1RJRllfQ09OVEVOVF9DSEFOR0VEIiwKLQkJCSJESVNBU1NPQ0lBVEVfU09VUkNFX05PVElGWSIsICJESVNBU1NPQ0lBVEVfU09VUkNFIiwgIkRJU0FTU09DSUFURV9TT1VSQ0VfUExVU19JTk5FUl9OT1RJRlkiLCAiRElTQVNTT0NJQVRFX1NPVVJDRV9QTFVTX0lOTkVSIn07CQotCS8qCi0JICogVGVzdCB0aGUgbmV4dCBjYWxsIHR5cGUsIGlmIG5vdCB2YWxpZCwgcmV0dXJuIGZhbHNlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHRlc3RDYWxsVHlwZShpbnQgY2FsbFR5cGUpIHsKLQkJaWYgKGV4Y2VwdGlvbiAhPSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwkvLyBBbHJlYWR5IGhhZCBhbiBlcnJvcgotCQl0cnkgewotCQkJaWYgKCsrY2FsbEluZGV4ID49IGNhbGxUeXBlcy5sZW5ndGgpCi0JCQkJQXNzZXJ0LmZhaWwoIkFuIGV4dHJhIG5vdGlmaWNhdGlvbiBvZiB0eXBlICIgKyBjYWxsVHlwZU5hbWVzW2NhbGxUeXBlXSArICIgcmVjZWl2ZWQuIik7Ci0JCQlpZiAoY2FsbFR5cGVzW2NhbGxJbmRleF0gIT0gY2FsbFR5cGUpCi0JCQkJQXNzZXJ0LmFzc2VydEVxdWFscyhjYWxsVHlwZU5hbWVzW2NhbGxUeXBlc1tjYWxsSW5kZXhdXSwgY2FsbFR5cGVOYW1lc1tjYWxsVHlwZV0pOwotCQl9IGNhdGNoIChBc3NlcnRpb25GYWlsZWRFcnJvciBlKSB7Ci0JCQlleGNlcHRpb24gPSBlOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5KYXZhUmVmbGVjdGlvbkFkYXB0ZXJGYWN0b3J5I2ZsdXNoQWxsKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBmbHVzaEFsbCgpIHsKLQkJdGVzdENhbGxUeXBlKEZMVVNIX0FMTCk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5hZGFwdGVycy5qZG9tLkphdmFKRE9NQWRhcHRlckZhY3RvcnkjZmx1c2hBbGxOb05vdGlmaWNhdGlvbigpCi0JICovCi0JcHVibGljIExpc3QgZmx1c2hBbGxOb05vdGlmaWNhdGlvbigpIHsKLQkJdGVzdENhbGxUeXBlKEZMVVNIX0FMTF9OT19OT1RJRklDQVRJT04pOwotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmFkYXB0ZXJzLmpkb20uSmF2YUpET01BZGFwdGVyRmFjdG9yeSNmbHVzaFBhY2thZ2UoamF2YS5sYW5nLlN0cmluZywgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBmbHVzaFBhY2thZ2UoU3RyaW5nIHBhY2thZ2VOYW1lLCBib29sZWFuIG5vRmx1c2hJZlNvdXJjZUZvdW5kKSB7Ci0JCWlmICh0ZXN0Q2FsbFR5cGUoRkxVU0hfUEFDS0FHRSkpIHsKLQkJCXRyeSB7Ci0JCQkJQXNzZXJ0LmFzc2VydEVxdWFscygoU3RyaW5nKSAoKE9iamVjdFtdKSBjYWxsQXJnc1tjYWxsSW5kZXhdKVswXSwgcGFja2FnZU5hbWUpOwotCQkJCUFzc2VydC5hc3NlcnRFcXVhbHMoKChCb29sZWFuKSAoKE9iamVjdFtdKSBjYWxsQXJnc1tjYWxsSW5kZXhdKVsxXSkuYm9vbGVhblZhbHVlKCksIG5vRmx1c2hJZlNvdXJjZUZvdW5kKTsgCi0JCQl9IGNhdGNoIChBc3NlcnRpb25GYWlsZWRFcnJvciBlKSB7Ci0JCQkJZXhjZXB0aW9uID0gZTsKLQkJCX0JCQkKLQkJfQotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYWRhcHRlcnMuamRvbS5KYXZhSkRPTUFkYXB0ZXJGYWN0b3J5I2ZsdXNoUGFja2FnZU5vTm90aWZpY2F0aW9uKGphdmEubGFuZy5TdHJpbmcsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIExpc3QgZmx1c2hQYWNrYWdlTm9Ob3RpZmljYXRpb24oU3RyaW5nIHBhY2thZ2VOYW1lLCBib29sZWFuIG5vRmx1c2hJZlNvdXJjZUZvdW5kKSB7Ci0JCWlmICh0ZXN0Q2FsbFR5cGUoRkxVU0hfUEFDS0FHRV9OT19OT1RJRklDQVRJT04pKSB7Ci0JCQl0cnkgewotCQkJCUFzc2VydC5hc3NlcnRFcXVhbHMoKFN0cmluZykgKChPYmplY3RbXSkgY2FsbEFyZ3NbY2FsbEluZGV4XSlbMF0sIHBhY2thZ2VOYW1lKTsKLQkJCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCgoQm9vbGVhbikgKChPYmplY3RbXSkgY2FsbEFyZ3NbY2FsbEluZGV4XSlbMV0pLmJvb2xlYW5WYWx1ZSgpLCBub0ZsdXNoSWZTb3VyY2VGb3VuZCk7IAotCQkJfSBjYXRjaCAoQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSkgewotCQkJCWV4Y2VwdGlvbiA9IGU7Ci0JCQl9CQkJCi0JCX0JCQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSmF2YVJlZmxlY3Rpb25BZGFwdGVyRmFjdG9yeSNmbHVzaFJlZmxlY3Rpb24oamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBmbHVzaFJlZmxlY3Rpb24oU3RyaW5nIHNvdXJjZSkgewotCQlpZiAodGVzdENhbGxUeXBlKEZMVVNIX1JFRkxFQ1RJT04pKSB7Ci0JCQl0cnkgewotCQkJCUFzc2VydC5hc3NlcnRFcXVhbHMoKFN0cmluZykgY2FsbEFyZ3NbY2FsbEluZGV4XSwgc291cmNlKTsgCi0JCQl9IGNhdGNoIChBc3NlcnRpb25GYWlsZWRFcnJvciBlKSB7Ci0JCQkJZXhjZXB0aW9uID0gZTsKLQkJCX0JCQkKLQkJfQkJCi0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5hZGFwdGVycy5qZG9tLkphdmFKRE9NQWRhcHRlckZhY3RvcnkjZmx1c2hSZWZsZWN0aW9uTm9Ob3RpZmljYXRpb24oamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uIGZsdXNoUmVmbGVjdGlvbk5vTm90aWZpY2F0aW9uKFN0cmluZyBzb3VyY2UpIHsKLQkJaWYgKHRlc3RDYWxsVHlwZShGTFVTSF9SRUZMRUNUSU9OX05PX05PVElGSUNBVElPTikpIHsKLQkJCXRyeSB7Ci0JCQkJQXNzZXJ0LmFzc2VydEVxdWFscygoU3RyaW5nKSBjYWxsQXJnc1tjYWxsSW5kZXhdLCBzb3VyY2UpOyAKLQkJCX0gY2F0Y2ggKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpIHsKLQkJCQlleGNlcHRpb24gPSBlOwotCQkJfQkJCQotCQl9CQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYWRhcHRlcnMuamRvbS5KYXZhSkRPTUFkYXB0ZXJGYWN0b3J5I2ZsdXNoUmVmbGVjdGlvblBsdXNJbm5lck5vTm90aWZpY2F0aW9uKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbiBmbHVzaFJlZmxlY3Rpb25QbHVzSW5uZXJOb05vdGlmaWNhdGlvbihTdHJpbmcgc291cmNlKSB7Ci0JCWlmICh0ZXN0Q2FsbFR5cGUoRkxVU0hfUkVGTEVDVElPTl9QTFVTX0lOTkVSX05PX05PVElGSUNBVElPTikpIHsKLQkJCXRyeSB7Ci0JCQkJQXNzZXJ0LmFzc2VydEVxdWFscygoU3RyaW5nKSBjYWxsQXJnc1tjYWxsSW5kZXhdLCBzb3VyY2UpOyAKLQkJCX0gY2F0Y2ggKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpIHsKLQkJCQlleGNlcHRpb24gPSBlOwotCQkJfQkJCQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYWRhcHRlcnMuamRvbS5KYXZhSkRPTUFkYXB0ZXJGYWN0b3J5I25vdGlmeUNvbnRlbnRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQpCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q29udGVudENoYW5nZWQoSUNvbXBpbGF0aW9uVW5pdCB0YXJnZXRDVSkgewotCQlpZiAodGVzdENhbGxUeXBlKE5PVElGWV9DT05URU5UX0NIQU5HRUQpKSB7Ci0JCQl0cnkgewotCQkJCUFzc2VydC5hc3NlcnRFcXVhbHMoKFN0cmluZykgY2FsbEFyZ3NbY2FsbEluZGV4XSwgdGFyZ2V0Q1UuZ2V0RWxlbWVudE5hbWUoKSk7IAotCQkJfSBjYXRjaCAoQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSkgewotCQkJCWV4Y2VwdGlvbiA9IGU7Ci0JCQl9CQkJCi0JCX0JCQkKLQl9Ci0JCi0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSmF2YVJlZmxlY3Rpb25BZGFwdGVyRmFjdG9yeSNkaXNBc3NvY2lhdGVTb3VyY2UoamF2YS5sYW5nLlN0cmluZywgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uIGRpc0Fzc29jaWF0ZVNvdXJjZShTdHJpbmcgc291cmNlLCBib29sZWFuIGRvTm90aWZ5KSB7Ci0JCWlmICh0ZXN0Q2FsbFR5cGUoRElTQVNTT0NJQVRFX1NPVVJDRV9OT1RJRlkpKSB7Ci0JCQl0cnkgewotCQkJCUFzc2VydC5hc3NlcnRFcXVhbHMoKFN0cmluZykgKChPYmplY3RbXSkgY2FsbEFyZ3NbY2FsbEluZGV4XSlbMF0sIHNvdXJjZSk7Ci0JCQkJQXNzZXJ0LmFzc2VydEVxdWFscygoKEJvb2xlYW4pICgoT2JqZWN0W10pIGNhbGxBcmdzW2NhbGxJbmRleF0pWzFdKS5ib29sZWFuVmFsdWUoKSwgZG9Ob3RpZnkpOyAKLQkJCX0gY2F0Y2ggKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpIHsKLQkJCQlleGNlcHRpb24gPSBlOwotCQkJfQkJCQotCQl9CQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLkphdmFSZWZsZWN0aW9uQWRhcHRlckZhY3RvcnkjZGlzQXNzb2NpYXRlU291cmNlKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbiBkaXNBc3NvY2lhdGVTb3VyY2UoU3RyaW5nIHNvdXJjZSkgewotCQlpZiAodGVzdENhbGxUeXBlKERJU0FTU09DSUFURV9TT1VSQ0UpKSB7Ci0JCQl0cnkgewotCQkJCUFzc2VydC5hc3NlcnRFcXVhbHMoKFN0cmluZykgY2FsbEFyZ3NbY2FsbEluZGV4XSwgc291cmNlKTsgCi0JCQl9IGNhdGNoIChBc3NlcnRpb25GYWlsZWRFcnJvciBlKSB7Ci0JCQkJZXhjZXB0aW9uID0gZTsKLQkJCX0JCQkKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSmF2YVJlZmxlY3Rpb25BZGFwdGVyRmFjdG9yeSNkaXNBc3NvY2lhdGVTb3VyY2VQbHVzSW5uZXIoamF2YS5sYW5nLlN0cmluZywgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uIGRpc0Fzc29jaWF0ZVNvdXJjZVBsdXNJbm5lcihTdHJpbmcgc291cmNlLCBib29sZWFuIGRvTm90aWZ5KSB7Ci0JCWlmICh0ZXN0Q2FsbFR5cGUoRElTQVNTT0NJQVRFX1NPVVJDRV9QTFVTX0lOTkVSX05PVElGWSkpIHsKLQkJCXRyeSB7Ci0JCQkJQXNzZXJ0LmFzc2VydEVxdWFscygoU3RyaW5nKSAoKE9iamVjdFtdKSBjYWxsQXJnc1tjYWxsSW5kZXhdKVswXSwgc291cmNlKTsKLQkJCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCgoQm9vbGVhbikgKChPYmplY3RbXSkgY2FsbEFyZ3NbY2FsbEluZGV4XSlbMV0pLmJvb2xlYW5WYWx1ZSgpLCBkb05vdGlmeSk7IAotCQkJfSBjYXRjaCAoQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSkgewotCQkJCWV4Y2VwdGlvbiA9IGU7Ci0JCQl9CQkJCi0JCX0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSmF2YVJlZmxlY3Rpb25BZGFwdGVyRmFjdG9yeSNkaXNBc3NvY2lhdGVTb3VyY2VQbHVzSW5uZXIoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNBc3NvY2lhdGVTb3VyY2VQbHVzSW5uZXIoU3RyaW5nIHNvdXJjZSkgewotCQlpZiAodGVzdENhbGxUeXBlKERJU0FTU09DSUFURV9TT1VSQ0VfUExVU19JTk5FUikpIHsKLQkJCXRyeSB7Ci0JCQkJQXNzZXJ0LmFzc2VydEVxdWFscygoU3RyaW5nKSBjYWxsQXJnc1tjYWxsSW5kZXhdLCBzb3VyY2UpOyAKLQkJCX0gY2F0Y2ggKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpIHsKLQkJCQlleGNlcHRpb24gPSBlOwotCQkJfQkJCQotCQl9CQkKLQl9Ci0JCi0JcHVibGljIEphdmFSZWZsZWN0aW9uU3luY2hyb25pemVyIGdldFN5bmNocm9uaXplcigpIHsKLQkJcmV0dXJuIHN5bmNocm9uaXplcjsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9tb2RlbExpc3RlbmVycy9UZXN0TGlzdGVuZXJzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9tb2RlbExpc3RlbmVycy9UZXN0TGlzdGVuZXJzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0OTM1NTIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvbW9kZWxMaXN0ZW5lcnMvVGVzdExpc3RlbmVycy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogVGVzdExpc3RlbmVycy5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA2LzA1LzE3IDIwOjEzOjU2ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLm1vZGVsTGlzdGVuZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5KYXZhUHJvamVjdFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvLkFic3RyYWN0QmVhbkluZm9UZXN0Q2FzZTsKLSAKLQotLyoqCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVGVzdExpc3RlbmVycyBleHRlbmRzIFRlc3RDYXNlIHsKLQkKLQlwcm90ZWN0ZWQgSUphdmFQcm9qZWN0IGpwOwotCi0JLy8gVGhlIGluZGV4ZXMgb2YgdGhlc2UgbG9va3VwcyBhcmUgZm91bmQgaW4gdGhlIHNldHVwIGFuZCB0ZWFyZG93biBtZXRob2RzLiBUaGV5IG11c3QgYmUga2VwdCBpbiBzeW5jLgotCXByb3RlY3RlZCBMaXN0IHNldHVwU3BlY2lhbHMgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJ0ZXN0T3BlbiIsICJ0ZXN0Q2xvc2UiLCAidGVzdEFkZE1ldGhvZEluV29ya2NvcHkiLCAidGVzdFNhdmVGcm9tV29ya2luZ0NvcHkiLAotCQkJInRlc3RSZXZlcnQiLCAidGVzdERlbGV0ZU1ldGhvZE5vV29ya2luZ0NvcHktb2Jzb2xldGUsIHJlbW92ZWQiLCAidGVzdEFkZENsYXNzIiwgInRlc3REZWxldGVDbGFzc1dpdGhXb3JraW5nQ29weSIsCi0JCQkidGVzdERlbGV0ZUNsYXNzTm9Xb3JraW5nQ29weSIsICJ0ZXN0QWRkUGFja2FnZSIsICJ0ZXN0RGVsZXRlUGFja2FnZSJ9KTsKLQkKLQlwcm90ZWN0ZWQgSUxpc3RlbmVyVGVzdGVyIHRlc3RlcjsKLQkJCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlqcCA9IEphdmFDb3JlLmNyZWF0ZShKYXZhUHJvamVjdFV0aWwuZ2V0UHJvamVjdChBYnN0cmFjdEJlYW5JbmZvVGVzdENhc2UuVEVTVF9CRUFOSU5GT19QUk9KRUNUKSk7Ci0JCVN0cmluZyB0ZXN0bmFtZSA9IGdldE5hbWUoKTsKLQkJaW50IGluZGV4ID0gc2V0dXBTcGVjaWFscy5pbmRleE9mKHRlc3RuYW1lKTsKLQkJc3dpdGNoIChpbmRleCkgewotCQkJY2FzZSAwOgotCQkJCXNldFVwT3BlbigpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAxOgotCQkJCXNldFVwQ2xvc2UoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMjoKLQkJCQlzZXRVcEFkZE1ldGhvZEluV29ya2luZ0NvcHkoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMzoKLQkJCQlzZXRVcFNhdmVGcm9tV29ya2luZ0NvcHkoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgNDoKLQkJCQlzZXRVcFJldmVydCgpOwotCQkJCWJyZWFrOwotLy8JCQljYXNlIDU6Ci0vLwkJCQlzZXR1cERlbGV0ZU1ldGhvZE5vV29ya2luZ0NvcHkoKTsKLS8vCQkJCWJyZWFrOwotCQkJY2FzZSA2OgotCQkJCXNldHVwQWRkQ2xhc3MoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgNzoKLQkJCQlzZXR1cERlbGV0ZUNsYXNzV2l0aFdvcmtpbmdDb3B5KCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDg6Ci0JCQkJc2V0VXBEZWxldGVDbGFzc05vV29ya2luZ0NvcHkoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgOToKLQkJCQlzZXRVcEFkZFBhY2thZ2UoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMTA6Ci0JCQkJc2V0VXBEZWxldGVQYWNrYWdlKCk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgdGVzdG5hbWUgPSBnZXROYW1lKCk7Ci0JCWludCBpbmRleCA9IHNldHVwU3BlY2lhbHMuaW5kZXhPZih0ZXN0bmFtZSk7Ci0JCXN3aXRjaCAoaW5kZXgpIHsKLQkJCWNhc2UgMDoKLQkJCQl0ZWFyRG93bk9wZW4oKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMToKLQkJCQl0ZWFyRG93bkNsb3NlKCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDI6Ci0JCQkJdGVhckRvd25BZGRNZXRob2RJbldvcmtpbmdDb3B5KCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDM6Ci0JCQkJdGVhckRvd25TYXZlRnJvbVdvcmtpbmdDb3B5KCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDQ6Ci0JCQkJdGVhckRvd25SZXZlcnQoKTsKLQkJCQlicmVhazsKLS8vCQkJY2FzZSA1OgotLy8JCQkJdGVhckRvd25EZWxldGVNZXRob2ROb1dvcmtpbmdDb3B5KCk7Ci0vLwkJCQlicmVhazsKLQkJCWNhc2UgNjoKLQkJCQl0ZWFyRG93bkFkZENsYXNzKCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDc6Ci0JCQkJdGVhckRvd25EZWxldGVDbGFzc1dpdGhXb3JraW5nQ29weSgpOwotCQkJCWJyZWFrOwotCQkJY2FzZSA4OgotCQkJCXRlYXJEb3duRGVsZXRlQ2xhc3NOb1dvcmtpbmdDb3B5KCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDk6Ci0JCQkJdGVhckRvd25BZGRQYWNrYWdlKCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDEwOgotCQkJCXRlYXJEb3duRGVsZXRlUGFja2FnZSgpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlicmVhazsKLQkJfQkJCi0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQkKLQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VGVzdGVyKElMaXN0ZW5lclRlc3RlciB0ZXN0ZXIpIHsKLQkJdGhpcy50ZXN0ZXIgPSB0ZXN0ZXI7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFVwT3BlbigpIHsJCi0JfQkKLQlwdWJsaWMgdm9pZCB0ZXN0T3BlbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQkvLyBUZXN0IG9wZW4gYSB3b3JraW5nIGNvcHkuCi0JCXRlc3RDVSA9IChJQ29tcGlsYXRpb25Vbml0KSBqcC5maW5kRWxlbWVudChuZXcgUGF0aCgib3JnL2VjbGlwc2UvamVtL3Rlc3RzL2JlYW5pbmZvL1Rlc3QxQ2xhc3MuamF2YSIpKTsKLQkJdGVzdENVLmJlY29tZVdvcmtpbmdDb3B5KG51bGwsIG51bGwpOwotCQl0ZXN0ZXIuaXNFeGNlcHRpb24oKTsKLQkJdGVzdGVyLmlzQ29tcGxldGUoKTsJLy8gSXQgc2hvdWxkIG9mIGJlZW4gY29tcGxldGUuCi0JfQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duT3BlbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlpZiAodGVzdENVICE9IG51bGwpCi0JCQl0ZXN0Q1UuZGlzY2FyZFdvcmtpbmdDb3B5KCk7CQkKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIElDb21waWxhdGlvblVuaXQgdGVzdENVOwotCXByb3RlY3RlZCB2b2lkIHNldFVwQ2xvc2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJdGVzdENVID0gKElDb21waWxhdGlvblVuaXQpIGpwLmZpbmRFbGVtZW50KG5ldyBQYXRoKCJvcmcvZWNsaXBzZS9qZW0vdGVzdHMvYmVhbmluZm8vVGVzdDFDbGFzcy5qYXZhIikpOwotCQl0ZXN0Q1UuYmVjb21lV29ya2luZ0NvcHkobnVsbCwgbnVsbCk7CQkKLQl9CQotCXB1YmxpYyB2b2lkIHRlc3RDbG9zZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQkvLyBUZXN0IGNsb3NlIGEgd29ya2luZyBjb3B5LgotCQl0ZXN0Q1UuZGlzY2FyZFdvcmtpbmdDb3B5KCk7Ci0JCXRlc3Rlci5pc0V4Y2VwdGlvbigpOwotCQl0ZXN0ZXIuaXNDb21wbGV0ZSgpOwkvLyBJdCBzaG91bGQgb2YgYmVlbiBjb21wbGV0ZS4KLQl9Ci0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd25DbG9zZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlpZiAodGVzdENVICE9IG51bGwpCi0JCQl0ZXN0Q1UuZGlzY2FyZFdvcmtpbmdDb3B5KCk7Ci0JfQotCQotCQotCXByb3RlY3RlZCB2b2lkIHNldFVwQWRkTWV0aG9kSW5Xb3JraW5nQ29weSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQl0ZXN0Q1UgPSAoSUNvbXBpbGF0aW9uVW5pdCkganAuZmluZEVsZW1lbnQobmV3IFBhdGgoIm9yZy9lY2xpcHNlL2plbS90ZXN0cy9iZWFuaW5mby9UZXN0MUNsYXNzLmphdmEiKSk7Ci0JCXRlc3RDVS5iZWNvbWVXb3JraW5nQ29weShudWxsLCBudWxsKTsJCQotCX0JCi0JcHVibGljIHZvaWQgdGVzdEFkZE1ldGhvZEluV29ya2NvcHkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJdGVzdENVLmdldFR5cGVzKClbMF0uY3JlYXRlTWV0aG9kKCJwcml2YXRlIHZvaWQgZ2V0U29tZXRoaW5nKCkge30iLCBudWxsLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJdGVzdGVyLmlzRXhjZXB0aW9uKCk7Ci0JCXRlc3Rlci5pc0NvbXBsZXRlKCk7CS8vIEl0IHNob3VsZCBvZiBiZWVuIGNvbXBsZXRlLgotCX0KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bkFkZE1ldGhvZEluV29ya2luZ0NvcHkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJaWYgKHRlc3RDVSAhPSBudWxsKQotCQkJdGVzdENVLmRpc2NhcmRXb3JraW5nQ29weSgpOwkJCi0JfQkKLQkKLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcFNhdmVGcm9tV29ya2luZ0NvcHkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJdGVzdENVID0gKElDb21waWxhdGlvblVuaXQpIGpwLmZpbmRFbGVtZW50KG5ldyBQYXRoKCJvcmcvZWNsaXBzZS9qZW0vdGVzdHMvYmVhbmluZm8vVGVzdDFDbGFzcy5qYXZhIikpOwotCQl0ZXN0Q1UuYmVjb21lV29ya2luZ0NvcHkobnVsbCwgbnVsbCk7CQkKLQkJdGVzdENVLmdldFR5cGVzKClbMF0uY3JlYXRlTWV0aG9kKCJwcml2YXRlIHZvaWQgZ2V0U29tZXRoaW5nKCkge30iLCBudWxsLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsJCQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0U2F2ZUZyb21Xb3JraW5nQ29weSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQl0ZXN0Q1UuY29tbWl0V29ya2luZ0NvcHkodHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCXRlc3Rlci5pc0V4Y2VwdGlvbigpOwotCQl0ZXN0ZXIuaXNDb21wbGV0ZSgpOwkvLyBJdCBzaG91bGQgb2YgYmVlbiBjb21wbGV0ZS4JCQotCX0KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93blNhdmVGcm9tV29ya2luZ0NvcHkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJaWYgKHRlc3RDVSAhPSBudWxsKQotCQkJdGVzdENVLmRpc2NhcmRXb3JraW5nQ29weSgpOwkJCQkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXBSZXZlcnQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJdGVzdENVID0gKElDb21waWxhdGlvblVuaXQpIGpwLmZpbmRFbGVtZW50KG5ldyBQYXRoKCJvcmcvZWNsaXBzZS9qZW0vdGVzdHMvYmVhbmluZm8vVGVzdDFDbGFzcy5qYXZhIikpOwotCQl0ZXN0Q1UuYmVjb21lV29ya2luZ0NvcHkobnVsbCwgbnVsbCk7CQkKLQkJdGVzdENVLmdldFR5cGVzKClbMF0uY3JlYXRlTWV0aG9kKCJwcml2YXRlIHZvaWQgZ2V0U29tZXRoaW5nKCkge30iLCBudWxsLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsJCQkJCi0JfQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmV2ZXJ0KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCXRlc3RDVS5yZXN0b3JlKCk7Ci0JCXRlc3Rlci5pc0V4Y2VwdGlvbigpOwotCQl0ZXN0ZXIuaXNDb21wbGV0ZSgpOwkvLyBJdCBzaG91bGQgb2YgYmVlbiBjb21wbGV0ZS4JCQotCX0KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93blJldmVydCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlpZiAodGVzdENVICE9IG51bGwpCi0JCQl0ZXN0Q1UuZGlzY2FyZFdvcmtpbmdDb3B5KCk7CQkJCQotCX0KLQkKLS8vIFdpdGggMy4yTTYgZGVsZXRlIHdpdGggbm8gd29ya2luZyBjb3B5IGdvdCB3YXkgdG8gY29tcGxleC4gRG9pbmcgdGhpcyB0aHJvdWdoIHJlZmFjdG9yaW5nIGFuZCBvdGhlciBzdHVmZi4gSnVzdCB0b28gY29tcGxpY2F0ZWQKLS8vIHRvIGV2ZW4gdHJ5IHRvIGZpZ3VyZSBvdXQuIFNvIGp1c3QgcHVsbGluZyBpdCBvdXQuCi0JCi0vLwlwcm90ZWN0ZWQgdm9pZCBzZXR1cERlbGV0ZU1ldGhvZE5vV29ya2luZ0NvcHkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLS8vCQl0ZXN0Q1UgPSAoSUNvbXBpbGF0aW9uVW5pdCkganAuZmluZEVsZW1lbnQobmV3IFBhdGgoIm9yZy9lY2xpcHNlL2plbS90ZXN0cy9iZWFuaW5mby9UZXN0MUNsYXNzLmphdmEiKSk7Ci0vLwkJSU1ldGhvZCBtID0gdGVzdENVLmdldFR5cGVzKClbMF0uZ2V0TWV0aG9kKCJnZXRTb21ldGhpbmciLCBuZXcgU3RyaW5nWzBdKTsKLS8vCQlpZiAobS5leGlzdHMoKSkKLS8vCQkJbS5kZWxldGUodHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0vLwkJdGVzdENVLmdldFR5cGVzKClbMF0uY3JlYXRlTWV0aG9kKCJwcml2YXRlIHZvaWQgZ2V0U29tZXRoaW5nKCkge30iLCBudWxsLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsJCQkJCQkKLS8vCX0KLS8vCXB1YmxpYyB2b2lkIHRlc3REZWxldGVNZXRob2ROb1dvcmtpbmdDb3B5KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotLy8JCUphdmFDb3JlLnJ1bihuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotLy8JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0vLwkJCQkvLyBBY3R1YWxseSB0aGVyZSB3aWxsIGJlIGEgd29ya2luZyBjb3B5LiBUaGlzIGlzIHRvIHNpbXVsYXRlIHdoYXQgZGVsZXRlIG1ldGhvZCBmcm9tIG1lbWJlciBsaXN0Ci0vLwkJCQkvLyB3aXRoIG5vIG9wZW4gZWRpdG9yLiBUaGlzIGlzIGRvbmUgYnkgYmF0Y2hpbmcgZXZlcnl0aGluZyB1cCwgYnV0IHRoZXJlIGlzIGEgd29ya2luZyBjb3B5IGNyZWF0ZWQuCi0vLwkJCQkvLyBCdXQgaXQgY2hhbmdlcyB0aGUgZmlsZSBkaXJlY3RseSB0aGVuLiAoQ29uZnVzaW5nLCBubz8gQnV0IHRoYXQgaXMgdGhlIHdheSBpdCBkb2VzIGl0IGluIEpEVCkuCi0vLwkJCQl0ZXN0Q1UuYmVjb21lV29ya2luZ0NvcHkobnVsbCwgbnVsbCk7Ci0vLwkJCQlJTWV0aG9kIG1ldGhvZCA9IHRlc3RDVS5nZXRUeXBlcygpWzBdLmdldE1ldGhvZCgiZ2V0U29tZXRoaW5nIiwgbmV3IFN0cmluZ1tdIHt9KTsKLS8vCQkJCUlCdWZmZXIgY3VCdWZmZXIgPSB0ZXN0Q1UuZ2V0QnVmZmVyKCk7Ci0vLwkJCQlJU291cmNlUmFuZ2Ugc3IgPSBtZXRob2QuZ2V0U291cmNlUmFuZ2UoKTsKLS8vCQkJCWN1QnVmZmVyLnJlcGxhY2Uoc3IuZ2V0T2Zmc2V0KCksIHNyLmdldExlbmd0aCgpLCIiKTsKLS8vCQkJCWN1QnVmZmVyLnNhdmUobW9uaXRvciwgdHJ1ZSk7Ci0vLwkJCQl0ZXN0Q1UuZGlzY2FyZFdvcmtpbmdDb3B5KCk7Ci0vLwkJCX0KLS8vCQl9LCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLS8vCQl0ZXN0ZXIuaXNFeGNlcHRpb24oKTsKLS8vCQl0ZXN0ZXIuaXNDb21wbGV0ZSgpOwkvLyBJdCBzaG91bGQgb2YgYmVlbiBjb21wbGV0ZS4JCQkJCi0vLwl9Ci0vLwlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bkRlbGV0ZU1ldGhvZE5vV29ya2luZ0NvcHkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLS8vCQlpZiAodGVzdENVICE9IG51bGwpCi0vLwkJCXRlc3RDVS5kaXNjYXJkV29ya2luZ0NvcHkoKTsJCQkJCQkKLS8vCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cEFkZENsYXNzKCkgewotCQkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdEFkZENsYXNzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlQYWNrYWdlRnJhZ21lbnQgcGtnID0gKElQYWNrYWdlRnJhZ21lbnQpIGpwLmZpbmRFbGVtZW50KG5ldyBQYXRoKCJvcmcvZWNsaXBzZS9qZW0vdGVzdHMvYmVhbmluZm8iKSk7Ci0JCXRlc3RDVSA9IHBrZy5jcmVhdGVDb21waWxhdGlvblVuaXQoIk5ld0NsYXNzLmphdmEiLCAicHVibGljIGNsYXNzIE5ld0NsYXNzIHt9IiwgdHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCXRlc3Rlci5pc0V4Y2VwdGlvbigpOwotCQl0ZXN0ZXIuaXNDb21wbGV0ZSgpOwkvLyBJdCBzaG91bGQgb2YgYmVlbiBjb21wbGV0ZS4JCQkJCi0JfQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duQWRkQ2xhc3MoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJaWYgKHRlc3RDVSAhPSBudWxsKSB7Ci0JCQl0ZXN0Q1UuZGVsZXRlKHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldHVwRGVsZXRlQ2xhc3NXaXRoV29ya2luZ0NvcHkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSVBhY2thZ2VGcmFnbWVudCBwa2cgPSAoSVBhY2thZ2VGcmFnbWVudCkganAuZmluZEVsZW1lbnQobmV3IFBhdGgoIm9yZy9lY2xpcHNlL2plbS90ZXN0cy9iZWFuaW5mbyIpKTsKLQkJdGVzdENVID0gcGtnLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdCgiTmV3Q2xhc3MuamF2YSIsICJwdWJsaWMgY2xhc3MgTmV3Q2xhc3Mge30iLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJdGVzdENVLmJlY29tZVdvcmtpbmdDb3B5KG51bGwsIG51bGwpOwotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVsZXRlQ2xhc3NXaXRoV29ya2luZ0NvcHkoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5ydW4obmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCS8vIE5lZWQgdG8gcnVuIHRoaXMgd2F5IHRvIHNpbXVsYXRlIHdoYXQgaGFwcGVucyBmb3IgcmVhbC4KLQkJCQl0ZXN0Q1UuZGVsZXRlKHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5jaGVja3BvaW50KHRydWUpOwotCQkJCXRlc3RDVS5kaXNjYXJkV29ya2luZ0NvcHkoKTsKLQkJCX0KLQkJfSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCXRlc3Rlci5pc0V4Y2VwdGlvbigpOwotCQl0ZXN0ZXIuaXNDb21wbGV0ZSgpOwkvLyBJdCBzaG91bGQgb2YgYmVlbiBjb21wbGV0ZS4JCi0JCXRlc3RDVSA9IG51bGw7Ci0JfQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duRGVsZXRlQ2xhc3NXaXRoV29ya2luZ0NvcHkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJaWYgKHRlc3RDVSAhPSBudWxsICYmIHRlc3RDVS5leGlzdHMoKSkgewotCQkJdGVzdENVLmRlbGV0ZSh0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfQkJCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFVwRGVsZXRlQ2xhc3NOb1dvcmtpbmdDb3B5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlQYWNrYWdlRnJhZ21lbnQgcGtnID0gKElQYWNrYWdlRnJhZ21lbnQpIGpwLmZpbmRFbGVtZW50KG5ldyBQYXRoKCJvcmcvZWNsaXBzZS9qZW0vdGVzdHMvYmVhbmluZm8iKSk7Ci0JCXRlc3RDVSA9IHBrZy5jcmVhdGVDb21waWxhdGlvblVuaXQoIk5ld0NsYXNzLmphdmEiLCAicHVibGljIGNsYXNzIE5ld0NsYXNzIHt9IiwgdHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7CQkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdERlbGV0ZUNsYXNzTm9Xb3JraW5nQ29weSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQl0ZXN0Q1UuZGVsZXRlKHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl0ZXN0ZXIuaXNFeGNlcHRpb24oKTsKLQkJdGVzdGVyLmlzQ29tcGxldGUoKTsJLy8gSXQgc2hvdWxkIG9mIGJlZW4gY29tcGxldGUuCQotCQl0ZXN0Q1UgPSBudWxsOwkJCi0JfQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duRGVsZXRlQ2xhc3NOb1dvcmtpbmdDb3B5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCWlmICh0ZXN0Q1UgIT0gbnVsbCAmJiB0ZXN0Q1UuZXhpc3RzKCkpIHsKLQkJCXRlc3RDVS5kZWxldGUodHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCX0JCQkJCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFVwQWRkUGFja2FnZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJUGFja2FnZUZyYWdtZW50IHBrZyA9IChJUGFja2FnZUZyYWdtZW50KSBqcC5maW5kRWxlbWVudChuZXcgUGF0aCgidGVzdCIpKTsKLQkJaWYgKHBrZyAhPSBudWxsKQotCQkJcGtnLmRlbGV0ZSh0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdEFkZFBhY2thZ2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3RbXSByb290cyA9IGpwLmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcm9vdHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChyb290c1tpXS5nZXRLaW5kKCkgPT0gSVBhY2thZ2VGcmFnbWVudFJvb3QuS19TT1VSQ0UpIHsKLQkJCQlyb290c1tpXS5jcmVhdGVQYWNrYWdlRnJhZ21lbnQoInRlc3QiLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQl0ZXN0ZXIuaXNFeGNlcHRpb24oKTsKLQkJdGVzdGVyLmlzQ29tcGxldGUoKTsJLy8gSXQgc2hvdWxkIG9mIGJlZW4gY29tcGxldGUuCQkJCi0JfQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duQWRkUGFja2FnZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJUGFja2FnZUZyYWdtZW50IHBrZyA9IChJUGFja2FnZUZyYWdtZW50KSBqcC5maW5kRWxlbWVudChuZXcgUGF0aCgidGVzdCIpKTsKLQkJaWYgKHBrZyAhPSBudWxsKQotCQkJcGtnLmRlbGV0ZSh0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsJCQotCX0KLQkKLQlwcm90ZWN0ZWQgSVBhY2thZ2VGcmFnbWVudCB0ZXN0UGtnOwotCXByb3RlY3RlZCB2b2lkIHNldFVwRGVsZXRlUGFja2FnZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJUGFja2FnZUZyYWdtZW50Um9vdFtdIHJvb3RzID0ganAuZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByb290cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHJvb3RzW2ldLmdldEtpbmQoKSA9PSBJUGFja2FnZUZyYWdtZW50Um9vdC5LX1NPVVJDRSkgewotCQkJCXRlc3RQa2cgPSByb290c1tpXS5jcmVhdGVQYWNrYWdlRnJhZ21lbnQoInRlc3QiLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQkJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3REZWxldGVQYWNrYWdlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCXRlc3RQa2cuZGVsZXRlKHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl0ZXN0ZXIuaXNFeGNlcHRpb24oKTsKLQkJdGVzdGVyLmlzQ29tcGxldGUoKTsJLy8gSXQgc2hvdWxkIG9mIGJlZW4gY29tcGxldGUuCQkJCi0JCXRlc3RQa2cgPSBudWxsOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bkRlbGV0ZVBhY2thZ2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJaWYgKHRlc3RQa2cgIT0gbnVsbCAmJiB0ZXN0UGtnLmV4aXN0cygpKQotCQkJdGVzdFBrZy5kZWxldGUodHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvQWJzdHJhY3RUZXN0UHJveHkuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L0Fic3RyYWN0VGVzdFByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NDRiMjIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvQWJzdHJhY3RUZXN0UHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eTsKLS8qCi0gKiAgJFJDU2ZpbGU6IEFic3RyYWN0VGVzdFByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6NTg6NTQgJCAKLSAqLwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuUHJveHlGYWN0b3J5UmVnaXN0cnk7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBAYXV0aG9yIHJpY2hrdWxwCi0gKgotICogU3RhbmRhcmQgdHlwZSBvZiBQcm94eSBUZXN0cy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VGVzdFByb3h5IGV4dGVuZHMgVGVzdENhc2UgewotCQotCS8qKgotCSAqIEBhdXRob3IgcmljaGt1bHAKLQkgKgotCSAqIEludGVyZmFjZSBmb3IgcmVnaXN0cnkgaGFuZGxlci4gQWN0dWFsIGltcGxlbWVudGF0aW9ucyB3aWxsIHBsYWNlIHRoZWlyCi0JICogaGFuZGxlciBpbiB0aGUgZmllbGQgUkVHSVNUUllfSEFORExFUiB0byB0aGF0IHRoZSBwcm94eSB0ZXN0cyBjYW4gYWNjZXNzIGl0LiAKLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIFJlZ2lzdHJ5SGFuZGxlciB7Ci0JCQotCQkvKioKLQkJICogQHJldHVybiBpcyB0aGUgaGFuZGxlciB2YWxpZCBhbmQgc2V0dXAgY29ycmVjdGx5LgotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpOwotCQkKLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgY3VycmVudCByZWdpc3RyeSwgY3JlYXRpbmcgaXQgaWYgbmVjZXNzYXJ5LgotCQkgKiBAcmV0dXJuIFRoZSByZWdpc3RyeS4gCi0JCSAqLwotCQlwdWJsaWMgUHJveHlGYWN0b3J5UmVnaXN0cnkgZ2V0UmVnaXN0cnkoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQkJCi0JCS8qKgotCQkgKiBEZXN0cm95IHRoZSBjdXJyZW50IHJlZ2lzdHJ5LgotCQkgKi8KLQkJcHVibGljIHZvaWQgZGVzdHJveVJlZ2lzdHJ5KCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSB0aGUgcmVnaXN0cnkgaGFuZGxlciBmb3IgYWxsIEFic3RyYWN0VGVzdFByb3h5IHRlc3RzIGluIHRoZSAKLQkgKiBnaXZlbiBzdWl0ZS4KLQkgKiBAcGFyYW0gc3VpdGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdFJlZ2lzdHJ5SGFuZGxlcihUZXN0U3VpdGUgc3VpdGUsIFJlZ2lzdHJ5SGFuZGxlciByZWdpc3RyeUhhbmRsZXIpIHsKLQkJRW51bWVyYXRpb24gdGVzdHMgPSBzdWl0ZS50ZXN0cygpOwotCQl3aGlsZSAodGVzdHMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCVRlc3QgdGVzdCA9IChUZXN0KSB0ZXN0cy5uZXh0RWxlbWVudCgpOwotCQkJaWYgKHRlc3QgaW5zdGFuY2VvZiBBYnN0cmFjdFRlc3RQcm94eSkKLQkJCQkoKEFic3RyYWN0VGVzdFByb3h5KSB0ZXN0KS5zZXRSZWdpc3RyeUhhbmRsZXIocmVnaXN0cnlIYW5kbGVyKTsKLQkJCWVsc2UgaWYgKHRlc3QgaW5zdGFuY2VvZiBUZXN0U3VpdGUpCi0JCQkJaW5pdFJlZ2lzdHJ5SGFuZGxlcigoVGVzdFN1aXRlKSB0ZXN0LCByZWdpc3RyeUhhbmRsZXIpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBBYnN0cmFjdFRlc3RQcm94eSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQWJzdHJhY3RUZXN0UHJveHkoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByaXZhdGUgUmVnaXN0cnlIYW5kbGVyIHJlZ2lzdHJ5SGFuZGxlcjsKLQkKLQlwcm90ZWN0ZWQgUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnk7Ci0JcHJvdGVjdGVkIElTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5IHByb3h5VHlwZUZhY3Rvcnk7Ci0JcHJvdGVjdGVkIElTdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkgcHJveHlGYWN0b3J5OwotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlhc3NlcnROb3ROdWxsKGdldFJlZ2lzdHJ5SGFuZGxlcigpKTsKLQkJYXNzZXJ0VHJ1ZSgiU3VpdGUgbm90IHNldHVwIGNvcnJlY3RseS4iLCBnZXRSZWdpc3RyeUhhbmRsZXIoKS5pc1ZhbGlkKCkpOwotCQljcmVhdGVSZWdpc3RyeSgpOwotCX0KLQotCS8qCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVJlZ2lzdHJ5KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZWdpc3RyeSA9IGdldFJlZ2lzdHJ5SGFuZGxlcigpLmdldFJlZ2lzdHJ5KCk7Ci0JCWFzc2VydE5vdE51bGwocmVnaXN0cnkpOwotCQlwcm94eUZhY3RvcnkgPSByZWdpc3RyeS5nZXRCZWFuUHJveHlGYWN0b3J5KCk7Ci0JCXByb3h5VHlwZUZhY3RvcnkgPSByZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlZ2lzdHJ5SGFuZGxlcihSZWdpc3RyeUhhbmRsZXIgcmVnaXN0cnlIYW5kbGVyKSB7Ci0JCXRoaXMucmVnaXN0cnlIYW5kbGVyID0gcmVnaXN0cnlIYW5kbGVyOwotCX0KLQotCXB1YmxpYyBSZWdpc3RyeUhhbmRsZXIgZ2V0UmVnaXN0cnlIYW5kbGVyKCkgewotCQlyZXR1cm4gcmVnaXN0cnlIYW5kbGVyOwotCX0KLQkKLQkvKioKLQkgKiBSZWNyZWF0ZSB0aGUgcmVnaXN0cnkuIFRoaXMgaXMgdG8gbWFrZSBzdXJlIHdlIGhhdmUgYSBjbGVhbiBvbmUuIFNob3VsZCBiZSB1c2VkIHdpdGggY2F1dGlvbiBiZWNhdXNlIGV4cGVuc2l2ZS4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWNyZWF0ZVJlZ2lzdHJ5KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlnZXRSZWdpc3RyeUhhbmRsZXIoKS5kZXN0cm95UmVnaXN0cnkoKTsKLQkJY3JlYXRlUmVnaXN0cnkoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L0V4cHJlc3Npb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9FeHByZXNzaW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2VhZjFkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L0V4cHJlc3Npb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IEV4cHJlc3Npb25UZXN0LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjEzICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjU4OjU0ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLkFtYmlndW91c01ldGhvZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGUuSURFU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWUuKjsKLSAKLS8qKgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIEV4cHJlc3Npb25UZXN0IGV4dGVuZHMgQWJzdHJhY3RUZXN0UHJveHkgewotCi0JLyoqCi0JICogCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIEV4cHJlc3Npb25UZXN0KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIEV4cHJlc3Npb25UZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SVByb3h5QmVhblR5cGVQcm94eSgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCS8vIFRlc3QgdGhhdCBwcm94eSBiZWFuIHR5cGUgaXMgZmlyc3QgYW4gZXhwcmVzc2lvbiBwcm94eSBhbmQgYWZ0ZXIgZXhwcmVzc2lvbiBldmFsdWF0aW9uIGRvZXMgaXQgYmVjb21lIGEgcmVhbCBwcm94eS4gCi0JCS8vIENhbid0IHRlc3QgdGhhdCBpdCBkb2Vzbid0IGJlY29tZSBhIHJlYWwgcHJveHkgYmVmb3JlIGV2YWx1YXRpb24gYmVjYXVzZSBpdCBtYXkgYmVjb21lIHJlc29sdmVkIHVuZGVyIHRoZSBjb3ZlcnMuIEZvcgotCQkvLyBleGFtcGxlIElERSBleHByZXNzaW9uIGltbWVkaWF0ZWx5IHJlc29sdmVzIGl0LgotCQkvLwotCQkvLyBGaXJzdCB3ZSBtdXN0IG1ha2Ugc3VyZSB3ZSBoYXZlIGEgY2xlYW4gcmVnaXN0cnkgYmVjYXVzZSBpdCBjb3VsZCBvZiBiZWVuIHJlc29sdmVkIGZyb20gYSBwcmV2aW91cyB0ZXN0LgotCQlyZWNyZWF0ZVJlZ2lzdHJ5KCk7Ci0JCQotCQkvLyBOb3cgZG8gYW4gZXhwcmVzc2lvbiBhbmQgZ2V0IGEgcHJveHkuCi0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCUlQcm94eUJlYW5UeXBlIGJlYW5UeXBlUHJveHkgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoZXhwLCAidGVzdFBhY2thZ2UuVGVzdEFjY2VzcyIpOwotCQlhc3NlcnROb3ROdWxsKGJlYW5UeXBlUHJveHkpOwotCQlhc3NlcnRUcnVlKGJlYW5UeXBlUHJveHkuaXNFeHByZXNzaW9uUHJveHkoKSk7Ci0JCWZpbmFsIElCZWFuVHlwZVByb3h5W10gcmVzb2x1dGlvbiA9IG5ldyBJQmVhblR5cGVQcm94eVsxXTsKLQkJKChFeHByZXNzaW9uUHJveHkpIGJlYW5UeXBlUHJveHkpLmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJcmVzb2x1dGlvblswXSA9IChJQmVhblR5cGVQcm94eSkgZXZlbnQuZ2V0UHJveHkoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHByb3h5Vm9pZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJZmFpbCgiUHJveHkgc2hvdWxkIG5vdCBiZSB2b2lkLiIpOwotCQkJfQotCQkJcHVibGljIHZvaWQgcHJveHlOb3RSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJZmFpbCgiUHJveHkgc2hvdWxkIG9mIHJlc29sdmVkLiIpOwotCQkJfQotCQl9KTsKLQkJCi0JCWV4cC5pbnZva2VFeHByZXNzaW9uKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb2x1dGlvblswXSk7Ci0JCUlCZWFuVHlwZVByb3h5IGJlYW5UeXBlUHJveHkyID0gcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJ0ZXN0UGFja2FnZS5UZXN0QWNjZXNzIik7Ci0JCWFzc2VydE5vdE51bGwoYmVhblR5cGVQcm94eTIpOwotCQlhc3NlcnRUcnVlKGJlYW5UeXBlUHJveHkyLmlzQmVhblByb3h5KCkpOwotCQlhc3NlcnRUcnVlKGJlYW5UeXBlUHJveHkyLmlzVmFsaWQoKSk7Ci0JCWFzc2VydFNhbWUoYmVhblR5cGVQcm94eTIsIHJlc29sdXRpb25bMF0pOwkvLyBJbiBjYXNlIG9mIGJlYW50eXBlcyB3ZSB3aWxsIGdldCBpZGVudGljYWwgb25lcyBiYWNrIChpZGVudGl0eSBub3QganVzdCBlcXVhbHMpLgotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJUHJveHlNZXRob2RQcm94eSgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCS8vIFRlc3QgdGhhdCBwcm94eSBtZXRob2RlIGlzIGZpcnN0IGFuIGV4cHJlc3Npb24gcHJveHkgYW5kIGFmdGVyIGV4cHJlc3Npb24gZXZhbHVhdGlvbiBkb2VzIGl0IGJlY29tZSBhIHJlYWwgcHJveHkuIAotCQkvLyBDYW4ndCB0ZXN0IHRoYXQgaXQgZG9lc24ndCBiZWNvbWUgYSByZWFsIHByb3h5IGJlZm9yZSBldmFsdWF0aW9uIGJlY2F1c2UgaXQgbWF5IGJlY29tZSByZXNvbHZlZCB1bmRlciB0aGUgY292ZXJzLiBGb3IKLQkJLy8gZXhhbXBsZSBJREUgZXhwcmVzc2lvbiBpbW1lZGlhdGVseSByZXNvbHZlcyBpdC4KLQkJLy8KLQkJLy8gRmlyc3Qgd2UgbXVzdCBtYWtlIHN1cmUgd2UgaGF2ZSBhIGNsZWFuIHJlZ2lzdHJ5IGJlY2F1c2UgaXQgY291bGQgb2YgYmVlbiByZXNvbHZlZCBmcm9tIGEgcHJldmlvdXMgdGVzdC4KLQkJcmVjcmVhdGVSZWdpc3RyeSgpOwotCQkKLQkJLy8gTm93IGRvIGFuIGV4cHJlc3Npb24gYW5kIGdldCBhIHByb3h5LgotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlJUHJveHlCZWFuVHlwZSBiZWFuVHlwZVByb3h5ID0gcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KGV4cCwgInRlc3RQYWNrYWdlLlRlc3RBY2Nlc3MiKTsKLQkJSVByb3h5TWV0aG9kIG1ldGhvZFByb3h5ID0gYmVhblR5cGVQcm94eS5nZXRNZXRob2RQcm94eShleHAsICJ4eXoiKTsKLQkJYXNzZXJ0Tm90TnVsbChtZXRob2RQcm94eSk7Ci0JCWFzc2VydFRydWUobWV0aG9kUHJveHkuaXNFeHByZXNzaW9uUHJveHkoKSk7Ci0JCWZpbmFsIElNZXRob2RQcm94eVtdIHJlc29sdXRpb24gPSBuZXcgSU1ldGhvZFByb3h5WzFdOwotCQlmaW5hbCBib29sZWFuW10gd2FzVm9pZCA9IG5ldyBib29sZWFuWzFdOwotCQkoKEV4cHJlc3Npb25Qcm94eSkgbWV0aG9kUHJveHkpLmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJcmVzb2x1dGlvblswXSA9IChJTWV0aG9kUHJveHkpIGV2ZW50LmdldFByb3h5KCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBwcm94eVZvaWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCXdhc1ZvaWRbMF0gPSB0cnVlOwotCQkJfQotCQkJcHVibGljIHZvaWQgcHJveHlOb3RSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQl9Ci0JCX0pOwotCQlJUHJveHlNZXRob2QgbWV0aG9kUHJveHkyID0gYmVhblR5cGVQcm94eS5nZXRNZXRob2RQcm94eShleHAsICJ4eXoiKTsKLQkJYXNzZXJ0U2FtZShtZXRob2RQcm94eSwgbWV0aG9kUHJveHkyKTsJLy8gSXQgc2hvdWxkIHJldHVybiBzYW1lIGV4cHJlc3Npb24gcHJveHkgZWFjaCB0aW1lLgotCQkKLQkJZXhwLmNyZWF0ZU1ldGhvZEludm9jYXRpb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgbWV0aG9kUHJveHksIHRydWUsIDApOwotCQlleHAuY3JlYXRlQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKEZvckV4cHJlc3Npb24uTUVUSE9EX1JFQ0VJVkVSLCBiZWFuVHlwZVByb3h5LCAwKTsKLQkJZXhwLmludm9rZUV4cHJlc3Npb24oKTsKLQkJCi0JCWFzc2VydEZhbHNlKHdhc1ZvaWRbMF0pOwotCQlhc3NlcnROb3ROdWxsKHJlc29sdXRpb25bMF0pOwotCQlJTWV0aG9kUHJveHkgbWV0aG9kUHJveHkzID0gcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJ0ZXN0UGFja2FnZS5UZXN0QWNjZXNzIikuZ2V0TWV0aG9kUHJveHkoInh5eiIpOwotCQlhc3NlcnROb3ROdWxsKG1ldGhvZFByb3h5Myk7Ci0JCWFzc2VydFRydWUobWV0aG9kUHJveHkzLmlzQmVhblByb3h5KCkpOwotCQlhc3NlcnRUcnVlKG1ldGhvZFByb3h5My5pc1ZhbGlkKCkpOwotCQkvLyBDYW4ndCB0ZXN0IGlkZW50aXR5IG9mIG1ldGhvZHByb3hpZXMgYmVjYXVzZSBzb21lIHJlZ2lzdHJpZXMgKElERSBmb3IgZXhhbXBsZSkgY3JlYXRlIGEgbmV3IG1ldGhvZCBwcm94eSBlYWNoIHRpbWUuCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdElQcm94eUZpZWxkUHJveHkoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQkvLyBUZXN0IHRoYXQgcHJveHkgZmllbGQgaXMgZmlyc3QgYW4gZXhwcmVzc2lvbiBwcm94eSBhbmQgYWZ0ZXIgZXhwcmVzc2lvbiBldmFsdWF0aW9uIGRvZXMgaXQgYmVjb21lIGEgcmVhbCBwcm94eS4gCi0JCS8vIENhbid0IHRlc3QgdGhhdCBpdCBkb2Vzbid0IGJlY29tZSBhIHJlYWwgcHJveHkgYmVmb3JlIGV2YWx1YXRpb24gYmVjYXVzZSBpdCBtYXkgYmVjb21lIHJlc29sdmVkIHVuZGVyIHRoZSBjb3ZlcnMuIEZvcgotCQkvLyBleGFtcGxlIElERSBleHByZXNzaW9uIGltbWVkaWF0ZWx5IHJlc29sdmVzIGl0LgotCQkvLwotCQkvLyBGaXJzdCB3ZSBtdXN0IG1ha2Ugc3VyZSB3ZSBoYXZlIGEgY2xlYW4gcmVnaXN0cnkgYmVjYXVzZSBpdCBjb3VsZCBvZiBiZWVuIHJlc29sdmVkIGZyb20gYSBwcmV2aW91cyB0ZXN0LgotCQlyZWNyZWF0ZVJlZ2lzdHJ5KCk7Ci0JCQotCQkvLyBOb3cgZG8gYW4gZXhwcmVzc2lvbiBhbmQgZ2V0IGEgcHJveHkuCi0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCUlQcm94eUJlYW5UeXBlIGJlYW5UeXBlUHJveHkgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoZXhwLCAidGVzdFBhY2thZ2UuVGVzdEFjY2VzcyIpOwotCQlJUHJveHlGaWVsZCBmaWVsZFByb3h5ID0gYmVhblR5cGVQcm94eS5nZXRGaWVsZFByb3h5KGV4cCwgIlNUQVRJQ19GSUVMRCIpOwotCQlhc3NlcnROb3ROdWxsKGZpZWxkUHJveHkpOwotCQlhc3NlcnRUcnVlKGZpZWxkUHJveHkuaXNFeHByZXNzaW9uUHJveHkoKSk7Ci0JCWZpbmFsIElGaWVsZFByb3h5W10gcmVzb2x1dGlvbiA9IG5ldyBJRmllbGRQcm94eVsxXTsKLQkJZmluYWwgYm9vbGVhbltdIHdhc1ZvaWQgPSBuZXcgYm9vbGVhblsxXTsKLQkJKChFeHByZXNzaW9uUHJveHkpIGZpZWxkUHJveHkpLmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJcmVzb2x1dGlvblswXSA9IChJRmllbGRQcm94eSkgZXZlbnQuZ2V0UHJveHkoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHByb3h5Vm9pZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJd2FzVm9pZFswXSA9IHRydWU7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBwcm94eU5vdFJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCX0KLQkJfSk7Ci0JCQotCQlJUHJveHlGaWVsZCBmaWVsZFByb3h5MiA9IGJlYW5UeXBlUHJveHkuZ2V0RmllbGRQcm94eShleHAsICJTVEFUSUNfRklFTEQiKTsKLQkJYXNzZXJ0U2FtZShmaWVsZFByb3h5LCBmaWVsZFByb3h5Mik7CS8vIEl0IHNob3VsZCByZXR1cm4gc2FtZSBleHByZXNzaW9uIHByb3h5IGVhY2ggdGltZS4KLQkJCi0JCWV4cC5jcmVhdGVGaWVsZEFjY2VzcyhGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBmaWVsZFByb3h5LCB0cnVlKTsKLQkJZXhwLmNyZWF0ZUNsYXNzSW5zdGFuY2VDcmVhdGlvbihGb3JFeHByZXNzaW9uLkZJRUxEX1JFQ0VJVkVSLCBiZWFuVHlwZVByb3h5LCAwKTsKLQkJSUJlYW5Qcm94eSB2ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHYpOwotCQlhc3NlcnRFcXVhbHMoMywgKChJSW50ZWdlckJlYW5Qcm94eSkgdikuaW50VmFsdWUoKSk7Ci0JCQotCQlhc3NlcnRGYWxzZSh3YXNWb2lkWzBdKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvbHV0aW9uWzBdKTsKLQkJSUZpZWxkUHJveHkgZmllbGRQcm94eTMgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoInRlc3RQYWNrYWdlLlRlc3RBY2Nlc3MiKS5nZXRGaWVsZFByb3h5KCJTVEFUSUNfRklFTEQiKTsKLQkJYXNzZXJ0Tm90TnVsbChmaWVsZFByb3h5Myk7Ci0JCWFzc2VydFRydWUoZmllbGRQcm94eTMuaXNCZWFuUHJveHkoKSk7Ci0JCWFzc2VydFRydWUoZmllbGRQcm94eTMuaXNWYWxpZCgpKTsKLQkJLy8gQ2FuJ3QgdGVzdCBpZGVudGl0eSBvZiBtZXRob2Rwcm94aWVzIGJlY2F1c2Ugc29tZSByZWdpc3RyaWVzIChJREUgZm9yIGV4YW1wbGUpIGNyZWF0ZSBhIG5ldyBtZXRob2QgcHJveHkgZWFjaCB0aW1lLgotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDYXN0U3RyaW5nVHlwZSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVDYXN0RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCAic2hvcnQiKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5DQVNUX0VYUFJFU1NJT04sIDEwbCk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygic2hvcnQiLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygoc2hvcnQpIDEwLCAoKElOdW1iZXJCZWFuUHJveHkpIHJlc3VsdCkuc2hvcnRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENhc3RQcm94eVR5cGUoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlQ2FzdEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJzaG9ydCIpKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5DQVNUX0VYUFJFU1NJT04sICdhJyk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygic2hvcnQiLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygoc2hvcnQpICdhJywgKChJTnVtYmVyQmVhblByb3h5KSByZXN1bHQpLnNob3J0VmFsdWUoKSk7CQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2FzdEVycm9yKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUNhc3RFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgic2hvcnQiKSk7Ci0JCXRyeSB7Ci0JCQlleHAuY3JlYXRlUHJveHlFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQ0FTVF9FWFBSRVNTSU9OLCBwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChCb29sZWFuLlRSVUUpKTsKLQkJCWV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJCWZhaWwoIlNob3VsZCBvZiB0aHJvd24gQ2xhc3NDYXN0RXhjZXB0aW9uIik7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCWlmICghZS5nZXRUeXBlUHJveHkoKS5nZXRGb3JtYWxUeXBlTmFtZSgpLmVxdWFscygiamF2YS5sYW5nLkNsYXNzQ2FzdEV4Y2VwdGlvbiIpKQotCQkJCXRocm93IGU7CS8vIFNvbWUgb3RoZXIgZXhjZXB0aW9uLCByZXRocm93IGl0LgotCQl9Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2FzdEZhaWxlZCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVDYXN0RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoInNob3J0IikpOwotCQl0cnkgewotCQkJZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQkJZmFpbCgiU2hvdWxkIG9mIGdvdHRvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24iKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRnJvbSB0ZXN0Q2FzdEZhaWxlZCAoVGhpcyBpcyBzdWNjZXNzZnVsKTogIitlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCX0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnN0YW5jZW9mU3RyaW5nVHlwZSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJbnN0YW5jZW9mRXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCAiamF2YS5sYW5nLlN0cmluZyIpOwotCQlleHAuY3JlYXRlU3RyaW5nTGl0ZXJhbChGb3JFeHByZXNzaW9uLklOU1RBTkNFT0ZfVkFMVUUsICJhc2RmIik7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiYm9vbGVhbiIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsICgoSUJvb2xlYW5CZWFuUHJveHkpIHJlc3VsdCkuYm9vbGVhblZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SW5zdGFuY2VvZlByb3h5VHlwZSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJbnN0YW5jZW9mRXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5TdHJpbmciKSk7Ci0JCWV4cC5jcmVhdGVTdHJpbmdMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5TVEFOQ0VPRl9WQUxVRSwgImFzZGYiKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJib29sZWFuIiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgKChJQm9vbGVhbkJlYW5Qcm94eSkgcmVzdWx0KS5ib29sZWFuVmFsdWUoKSk7Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SW5zdGFuY2VvZkZhaWxlZCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJbnN0YW5jZW9mRXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5TdHJpbmciKSk7Ci0JCXRyeSB7Ci0JCQlleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCQlmYWlsKCJTaG91bGQgb2YgZ290dG9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiIpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJGcm9tIHRlc3RJbnN0YW5jZW9mRmFpbGVkIChUaGlzIGlzIHN1Y2Nlc3NmdWwpOiAiK2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJfQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RUeXBlTGl0ZXJhbCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVUeXBlTGl0ZXJhbChGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCAiamF2YS5sYW5nLlN0cmluZyIpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgYmVhbiB0eXBlIHByb3h5LiIsIHJlc3VsdCBpbnN0YW5jZW9mIElCZWFuVHlwZVByb3h5KTsKLQkJSUJlYW5UeXBlUHJveHkgdHlwZSA9IChJQmVhblR5cGVQcm94eSkgcmVzdWx0OwotCQlhc3NlcnRUcnVlKCJOb3QgdmFsaWQuIiwgdHlwZS5pc1ZhbGlkKCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCB0eXBlLmdldEZvcm1hbFR5cGVOYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUeXBlRmFpbHMoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQl0cnkgewotCQkJZXhwLmNyZWF0ZVR5cGVMaXRlcmFsKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sICJqYXZhLmxhbmcuU3RuZyIpOwotCQkJZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQkJZmFpbCgiU2hvdWxkIG5vdCBvZiBnb3R0b24gYSByZXN1bHQuIik7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCWFzc2VydEVxdWFscygiamF2YS5sYW5nLkNsYXNzTm90Rm91bmRFeGNlcHRpb24iLCBlLmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3ROZXN0aW5nKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUluc3RhbmNlb2ZFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sICJzaG9ydCIpOwotCQlleHAuY3JlYXRlQ2FzdEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5JTlNUQU5DRU9GX1ZBTFVFLCAic2hvcnQiKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5DQVNUX0VYUFJFU1NJT04sIChzaG9ydCkgMTApOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImJvb2xlYW4iLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCAoKElCb29sZWFuQmVhblByb3h5KSByZXN1bHQpLmJvb2xlYW5WYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFByZWZpeFBsdXMoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlUHJlZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBQcmVmaXhPcGVyYXRvci5QUkVfUExVUyk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uUFJFRklYX09QRVJBTkQsIDEwKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxMCwgKChJTnVtYmVyQmVhblByb3h5KSByZXN1bHQpLmludFZhbHVlKCkpOwotCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFByZWZpeE1pbnVzKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZVByZWZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgUHJlZml4T3BlcmF0b3IuUFJFX01JTlVTKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5QUkVGSVhfT1BFUkFORCwgMTApOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKC0xMCwgKChJTnVtYmVyQmVhblByb3h5KSByZXN1bHQpLmludFZhbHVlKCkpOwotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJlZml4TWludXNDaGFyKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZVByZWZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgUHJlZml4T3BlcmF0b3IuUFJFX01JTlVTKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5QUkVGSVhfT1BFUkFORCwgJ2EnKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygtJ2EnLCAoKElOdW1iZXJCZWFuUHJveHkpIHJlc3VsdCkuaW50VmFsdWUoKSk7Ci0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcmVmaXhDb21wbGVtZW50KCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZVByZWZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgUHJlZml4T3BlcmF0b3IuUFJFX0NPTVBMRU1FTlQpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLlBSRUZJWF9PUEVSQU5ELCAoc2hvcnQpIDEwKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh+MTAsICgoSU51bWJlckJlYW5Qcm94eSkgcmVzdWx0KS5pbnRWYWx1ZSgpKTsKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByZWZpeE5vdCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVQcmVmaXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIFByZWZpeE9wZXJhdG9yLlBSRV9OT1QpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLlBSRUZJWF9PUEVSQU5ELCB0cnVlKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJib29sZWFuIiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsICgoSUJvb2xlYW5CZWFuUHJveHkpIHJlc3VsdCkuYm9vbGVhblZhbHVlKCkpOwotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJlZml4RmFpbCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVQcmVmaXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIFByZWZpeE9wZXJhdG9yLlBSRV9OT1QpOwotCQl0cnkgewotCQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5QUkVGSVhfT1BFUkFORCwgMTApOwotCQkJZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQkJZmFpbCgiU2hvdWxkIG9mIGZhaWxlZC4iKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJUZXN0IHdhcyBzdWNjZXNzZnVsOiAiK2UuZ2V0UHJveHlMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQl9Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VGltZXMoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIEluZml4T3BlcmF0b3IuSU5fVElNRVMsIDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIDMpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCA0KTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzKjQsICgoSU51bWJlckJlYW5Qcm94eSkgcmVzdWx0KS5pbnRWYWx1ZSgpKTsKLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RUaW1lc0V4dGVuZGVkKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBJbmZpeE9wZXJhdG9yLklOX1RJTUVTLCAxKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAzKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgNCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfRVhURU5ERUQsIDVkKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJkb3VibGUiLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygoMyo0KjVkKSwgKChJTnVtYmVyQmVhblByb3h5KSByZXN1bHQpLmRvdWJsZVZhbHVlKCksIDApOwotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VGltZXNFeHRlbmRlZE5lc3RlZCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgSW5maXhPcGVyYXRvci5JTl9USU1FUywgMSk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCBJbmZpeE9wZXJhdG9yLklOX01JTlVTLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAxMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIDUpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCA0KTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9FWFRFTkRFRCwgNWQpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImRvdWJsZSIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCgoMTAtNSkqNCo1ZCksICgoSU51bWJlckJlYW5Qcm94eSkgcmVzdWx0KS5kb3VibGVWYWx1ZSgpLCAwKTsKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpdmlkZSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgSW5maXhPcGVyYXRvci5JTl9ESVZJREUsIDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIDQpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAyKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyg0LzIsICgoSU51bWJlckJlYW5Qcm94eSkgcmVzdWx0KS5pbnRWYWx1ZSgpKTsKLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REaXZpZGVFeHRlbmRlZCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgSW5maXhPcGVyYXRvci5JTl9ESVZJREUsIDEpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIDEyKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgMyk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfRVhURU5ERUQsIDJkKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJkb3VibGUiLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygoMTIvMy8yZCksICgoSU51bWJlckJlYW5Qcm94eSkgcmVzdWx0KS5kb3VibGVWYWx1ZSgpLCAwKTsKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbWFpbmRlcigpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgSW5maXhPcGVyYXRvci5JTl9SRU1BSU5ERVIsIDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIDQpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAzKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyg0JTMsICgoSU51bWJlckJlYW5Qcm94eSkgcmVzdWx0KS5pbnRWYWx1ZSgpKTsKLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1haW5kZXJFeHRlbmRlZCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgSW5maXhPcGVyYXRvci5JTl9SRU1BSU5ERVIsIDEpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIDEyKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgOSk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfRVhURU5ERUQsIDJkKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJkb3VibGUiLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygoMTIlOSUyZCksICgoSU51bWJlckJlYW5Qcm94eSkgcmVzdWx0KS5kb3VibGVWYWx1ZSgpLCAwKTsKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1pbnVzKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBJbmZpeE9wZXJhdG9yLklOX01JTlVTLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCA0KTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgMyk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoNC0zLCAoKElOdW1iZXJCZWFuUHJveHkpIHJlc3VsdCkuaW50VmFsdWUoKSk7Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWludXNFeHRlbmRlZCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgSW5maXhPcGVyYXRvci5JTl9NSU5VUywgMSk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgMTIpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCA5KTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9FWFRFTkRFRCwgMmQpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImRvdWJsZSIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCgxMi05LTJkKSwgKChJTnVtYmVyQmVhblByb3h5KSByZXN1bHQpLmRvdWJsZVZhbHVlKCksIDApOwotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGVmdFNoaWZ0KCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBJbmZpeE9wZXJhdG9yLklOX0xFRlRfU0hJRlQsIDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIDQpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAzKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyg0PDwzLCAoKElOdW1iZXJCZWFuUHJveHkpIHJlc3VsdCkuaW50VmFsdWUoKSk7Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TGVmdFNoaWZ0RXh0ZW5kZWQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIEluZml4T3BlcmF0b3IuSU5fTEVGVF9TSElGVCwgMSk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgMTIpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCA5KTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9FWFRFTkRFRCwgMik7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoKDEyPDw5PDwyKSwgKChJTnVtYmVyQmVhblByb3h5KSByZXN1bHQpLmludFZhbHVlKCksIDApOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSaWdodFNoaWZ0U2lnbmVkKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBJbmZpeE9wZXJhdG9yLklOX1JJR0hUX1NISUZUX1NJR05FRCwgMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgLTEwMDAwMDAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgMyk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoLTEwMDAwMDAwPj4zLCAoKElOdW1iZXJCZWFuUHJveHkpIHJlc3VsdCkuaW50VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSaWdodFNoaWZ0U2lnbmVkRXh0ZW5kZWQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIEluZml4T3BlcmF0b3IuSU5fUklHSFRfU0hJRlRfU0lHTkVELCAxKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAtMTAwMDAwMDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCA0KTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9FWFRFTkRFRCwgMik7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoKC0xMDAwMDAwMD4+ND4+MiksICgoSU51bWJlckJlYW5Qcm94eSkgcmVzdWx0KS5pbnRWYWx1ZSgpLCAwKTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFJpZ2h0U2hpZnRVblNpZ25lZCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgSW5maXhPcGVyYXRvci5JTl9SSUdIVF9TSElGVF9VTlNJR05FRCwgMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgLTEwMDAwMDAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgMyk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoLTEwMDAwMDAwPj4+MywgKChJTnVtYmVyQmVhblByb3h5KSByZXN1bHQpLmludFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmlnaHRTaGlmdFVuU2lnbmVkRXh0ZW5kZWQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIEluZml4T3BlcmF0b3IuSU5fUklHSFRfU0hJRlRfVU5TSUdORUQsIDEpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIC0xMDAwMDAwMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIDQpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0VYVEVOREVELCAyKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygoLTEwMDAwMDAwPj4+ND4+PjIpLCAoKElOdW1iZXJCZWFuUHJveHkpIHJlc3VsdCkuaW50VmFsdWUoKSwgMCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExlc3MoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIEluZml4T3BlcmF0b3IuSU5fTEVTUywgMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgLTEwMDAwMDAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgMyk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiYm9vbGVhbiIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKC0xMDAwMDAwMDwzLCAoKElCb29sZWFuQmVhblByb3h5KSByZXN1bHQpLmJvb2xlYW5WYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGVzc0VxdWFscygpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgSW5maXhPcGVyYXRvci5JTl9MRVNTX0VRVUFMUywgMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgMyk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIDMpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImJvb2xlYW4iLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzPD0zLCAoKElCb29sZWFuQmVhblByb3h5KSByZXN1bHQpLmJvb2xlYW5WYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R3JlYXRlcigpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgSW5maXhPcGVyYXRvci5JTl9HUkVBVEVSLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAtMTAwMDAwMDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAzKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJib29sZWFuIiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoLTEwMDAwMDAwPjMsICgoSUJvb2xlYW5CZWFuUHJveHkpIHJlc3VsdCkuYm9vbGVhblZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHcmVhdGVyRXF1YWxzKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBJbmZpeE9wZXJhdG9yLklOX0dSRUFURVJfRVFVQUxTLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAyKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgMyk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiYm9vbGVhbiIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI+PTMsICgoSUJvb2xlYW5CZWFuUHJveHkpIHJlc3VsdCkuYm9vbGVhblZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHNQcmltaXRpdmVzKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBJbmZpeE9wZXJhdG9yLklOX0VRVUFMUywgMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgM2QpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAzKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJib29sZWFuIiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoM2Q9PTMsICgoSUJvb2xlYW5CZWFuUHJveHkpIHJlc3VsdCkuYm9vbGVhblZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzT2JqZWN0cygpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgSW5maXhPcGVyYXRvci5JTl9FUVVBTFMsIDApOwotCQlleHAuY3JlYXRlVHlwZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAiamF2YS5sYW5nLlN0cmluZyIpOwotCQlleHAuY3JlYXRlVHlwZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgImphdmEubGFuZy5TdHJpbmciKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJib29sZWFuIiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoU3RyaW5nLmNsYXNzID09IFN0cmluZy5jbGFzcywgKChJQm9vbGVhbkJlYW5Qcm94eSkgcmVzdWx0KS5ib29sZWFuVmFsdWUoKSk7Ci0JfQkKLQotCXB1YmxpYyB2b2lkIHRlc3ROb3RFcXVhbHNQcmltaXRpdmVzKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBJbmZpeE9wZXJhdG9yLklOX05PVF9FUVVBTFMsIDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIDNkKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgMyk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiYm9vbGVhbiIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDNkIT0zLCAoKElCb29sZWFuQmVhblByb3h5KSByZXN1bHQpLmJvb2xlYW5WYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE5vdEVxdWFsc09iamVjdHMoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIEluZml4T3BlcmF0b3IuSU5fTk9UX0VRVUFMUywgMCk7Ci0JCWV4cC5jcmVhdGVUeXBlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsICJqYXZhLmxhbmcuU3RyaW5nIik7Ci0JCWV4cC5jcmVhdGVUeXBlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAiamF2YS5sYW5nLlN0cmluZyIpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImJvb2xlYW4iLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhTdHJpbmcuY2xhc3MgIT0gU3RyaW5nLmNsYXNzLCAoKElCb29sZWFuQmVhblByb3h5KSByZXN1bHQpLmJvb2xlYW5WYWx1ZSgpKTsKLQl9CQotCi0JcHVibGljIHZvaWQgdGVzdFhPUigpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgSW5maXhPcGVyYXRvci5JTl9YT1IsIDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIDUpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAzKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyg1XjMsICgoSU51bWJlckJlYW5Qcm94eSkgcmVzdWx0KS5pbnRWYWx1ZSgpKTsKLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RYT1JFeHRlbmRlZCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgSW5maXhPcGVyYXRvci5JTl9YT1IsIDEpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIDIzKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgOSk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfRVhURU5ERUQsIDIpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCgyM145XjIpLCAoKElOdW1iZXJCZWFuUHJveHkpIHJlc3VsdCkuaW50VmFsdWUoKSwgMCk7Ci0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbmQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIEluZml4T3BlcmF0b3IuSU5fQU5ELCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCA1KTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgMyk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoNSYzLCAoKElOdW1iZXJCZWFuUHJveHkpIHJlc3VsdCkuaW50VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBbmRFeHRlbmRlZCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgSW5maXhPcGVyYXRvci5JTl9BTkQsIDEpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIDEzKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgMTUpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0VYVEVOREVELCAxKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygoMTMmNSYxKSwgKChJTnVtYmVyQmVhblByb3h5KSByZXN1bHQpLmludFZhbHVlKCksIDApOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPcigpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgSW5maXhPcGVyYXRvci5JTl9PUiwgMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgNSk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIDIpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDV8MiwgKChJTnVtYmVyQmVhblByb3h5KSByZXN1bHQpLmludFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0T3JFeHRlbmRlZCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgSW5maXhPcGVyYXRvci5JTl9PUiwgMSk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgMTMpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCA2KTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9FWFRFTkRFRCwgMik7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoKDEzfDZ8MiksICgoSU51bWJlckJlYW5Qcm94eSkgcmVzdWx0KS5pbnRWYWx1ZSgpLCAwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGx1cygpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgSW5maXhPcGVyYXRvci5JTl9QTFVTLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCA1KTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgMik7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoNSsyLCAoKElOdW1iZXJCZWFuUHJveHkpIHJlc3VsdCkuaW50VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBsdXNFeHRlbmRlZCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgSW5maXhPcGVyYXRvci5JTl9QTFVTLCAxKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCA1KTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgMik7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfRVhURU5ERUQsIDJsKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJsb25nIiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoNSsyKzJsLCAoKElOdW1iZXJCZWFuUHJveHkpIHJlc3VsdCkuaW50VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBsdXNTdHJpbmdMZWZ0KCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBJbmZpeE9wZXJhdG9yLklOX1BMVVMsIDApOwotCQlleHAuY3JlYXRlUHJveHlFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgcHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoImFiYyIpKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgMik7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZyIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhYmMiKzIsICgoSVN0cmluZ0JlYW5Qcm94eSkgcmVzdWx0KS5zdHJpbmdWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGx1c1N0cmluZ1JpZ2h0KCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBJbmZpeE9wZXJhdG9yLklOX1BMVVMsIDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIDIpOwotCQlleHAuY3JlYXRlUHJveHlFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKCJhYmMiKSk7CQkKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMisiYWJjIiwgKChJU3RyaW5nQmVhblByb3h5KSByZXN1bHQpLnN0cmluZ1ZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UGx1c1N0cmluZ0xlZnROdWxsKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBJbmZpeE9wZXJhdG9yLklOX1BMVVMsIDApOwotCQlleHAuY3JlYXRlUHJveHlFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgcHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoImFiYyIpKTsKLQkJZXhwLmNyZWF0ZU51bGwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZyIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhYmMiK251bGwsICgoSVN0cmluZ0JlYW5Qcm94eSkgcmVzdWx0KS5zdHJpbmdWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFBsdXNTdHJpbmdSaWdodE51bGwoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIEluZml4T3BlcmF0b3IuSU5fUExVUywgMCk7Ci0JCWV4cC5jcmVhdGVOdWxsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCk7Ci0JCWV4cC5jcmVhdGVQcm94eUV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgcHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoImFiYyIpKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCsiYWJjIiwgKChJU3RyaW5nQmVhblByb3h5KSByZXN1bHQpLnN0cmluZ1ZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQbHVzU3RyaW5nTGVmdENoYXIoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIEluZml4T3BlcmF0b3IuSU5fUExVUywgMCk7Ci0JCWV4cC5jcmVhdGVQcm94eUV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCBwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCgiYWJjIikpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAnYScpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWJjIisnYScsICgoSVN0cmluZ0JlYW5Qcm94eSkgcmVzdWx0KS5zdHJpbmdWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGx1c1N0cmluZ1JpZ2h0Q2hhcigpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgSW5maXhPcGVyYXRvci5JTl9QTFVTLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAnYScpOwotCQlleHAuY3JlYXRlUHJveHlFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKCJhYmMiKSk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZyIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCdhJysiYWJjIiwgKChJU3RyaW5nQmVhblByb3h5KSByZXN1bHQpLnN0cmluZ1ZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb25kaXRpb25hbEFuZCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgSW5maXhPcGVyYXRvci5JTl9DT05ESVRJT05BTF9BTkQsIDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIHRydWUpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCB0cnVlKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJib29sZWFuIiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSAmJiB0cnVlLCAoKElCb29sZWFuQmVhblByb3h5KSByZXN1bHQpLmJvb2xlYW5WYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29uZGl0aW9uYWxBbmRFeHRlbmRlZCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgSW5maXhPcGVyYXRvci5JTl9DT05ESVRJT05BTF9BTkQsIDEpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIHRydWUpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCB0cnVlKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLklORklYX0VYVEVOREVELCBJbmZpeE9wZXJhdG9yLklOX0VRVUFMUywgMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgMyk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIDMpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImJvb2xlYW4iLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlICYmIHRydWUgJiYgKDMgPT0gMyksICgoSUJvb2xlYW5CZWFuUHJveHkpIHJlc3VsdCkuYm9vbGVhblZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb25kaXRpb25hbEFuZEZhbHNlTGFzdCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgSW5maXhPcGVyYXRvci5JTl9DT05ESVRJT05BTF9BTkQsIDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIHRydWUpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCBmYWxzZSk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiYm9vbGVhbiIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUgJiYgZmFsc2UsICgoSUJvb2xlYW5CZWFuUHJveHkpIHJlc3VsdCkuYm9vbGVhblZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb25kaXRpb25hbEFuZEZhbHNlRmlyc3QoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIEluZml4T3BlcmF0b3IuSU5fQ09ORElUSU9OQUxfQU5ELCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCBmYWxzZSk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIHRydWUpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImJvb2xlYW4iLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSAmJiB0cnVlLCAoKElCb29sZWFuQmVhblByb3h5KSByZXN1bHQpLmJvb2xlYW5WYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29uZGl0aW9uYWxBbmRFeHRlbmRlZEFuZEZhbHNlRmlyc3QoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIEluZml4T3BlcmF0b3IuSU5fQ09ORElUSU9OQUxfQU5ELCAxKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCBmYWxzZSk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIHRydWUpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uSU5GSVhfRVhURU5ERUQsIEluZml4T3BlcmF0b3IuSU5fRVFVQUxTLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAzKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgMyk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiYm9vbGVhbiIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlICYmIHRydWUgJiYgKDMgPT0gMyksICgoSUJvb2xlYW5CZWFuUHJveHkpIHJlc3VsdCkuYm9vbGVhblZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb25kaXRpb25hbE9yKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBJbmZpeE9wZXJhdG9yLklOX0NPTkRJVElPTkFMX09SLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCBmYWxzZSk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIHRydWUpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImJvb2xlYW4iLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSB8fCB0cnVlLCAoKElCb29sZWFuQmVhblByb3h5KSByZXN1bHQpLmJvb2xlYW5WYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29uZGl0aW9uYWxPckV4dGVuZGVkKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBJbmZpeE9wZXJhdG9yLklOX0NPTkRJVElPTkFMX09SLCAxKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCBmYWxzZSk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIGZhbHNlKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLklORklYX0VYVEVOREVELCBJbmZpeE9wZXJhdG9yLklOX0VRVUFMUywgMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgMyk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIDMpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImJvb2xlYW4iLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSB8fCBmYWxzZSB8fCAoMyA9PSAzKSwgKChJQm9vbGVhbkJlYW5Qcm94eSkgcmVzdWx0KS5ib29sZWFuVmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbmRpdGlvbmFsT3JUcnVlRmlyc3QoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIEluZml4T3BlcmF0b3IuSU5fQ09ORElUSU9OQUxfT1IsIDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIHRydWUpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCBmYWxzZSk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiYm9vbGVhbiIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUgfHwgZmFsc2UsICgoSUJvb2xlYW5CZWFuUHJveHkpIHJlc3VsdCkuYm9vbGVhblZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb25kaXRpb25hbE9yRXh0ZW5kZWRBbmRUcnVlTWlkZGxlKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBJbmZpeE9wZXJhdG9yLklOX0NPTkRJVElPTkFMX09SLCAxKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCBmYWxzZSk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIHRydWUpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uSU5GSVhfRVhURU5ERUQsIEluZml4T3BlcmF0b3IuSU5fRVFVQUxTLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAzKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgMyk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiYm9vbGVhbiIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlIHx8IHRydWUgfHwgKDMgPT0gMyksICgoSUJvb2xlYW5CZWFuUHJveHkpIHJlc3VsdCkuYm9vbGVhblZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheUFjY2VzcygpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlBcnJheUJlYW5Qcm94eSBhcnJheSA9IHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgic2hvcnQiKSwgMSk7Ci0JCWFycmF5LnNldChwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCgoc2hvcnQpIDMpLCAwKTsKLQkJCi0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVBcnJheUFjY2VzcyhGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCAxKTsKLQkJZXhwLmNyZWF0ZVByb3h5RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkFSUkFZQUNDRVNTX0FSUkFZLCBhcnJheSk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uQVJSQVlBQ0NFU1NfSU5ERVgsIDApOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoInNob3J0IiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoKChJTnVtYmVyQmVhblByb3h5KSByZXN1bHQpLnNob3J0VmFsdWUoKSwgKHNob3J0KSAzKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFycmF5QWNjZXNzU2V0KCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUFycmF5QmVhblByb3h5IGFycmF5ID0gcHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJzaG9ydCIpLCAxKTsKLQkJYXJyYXkuc2V0KHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKChzaG9ydCkgMyksIDApOwotCQkKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUFzc2lnbm1lbnRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04pOwotCQlleHAuY3JlYXRlQXJyYXlBY2Nlc3MoRm9yRXhwcmVzc2lvbi5BU1NJR05NRU5UX0xFRlQsIDEpOwotCQlleHAuY3JlYXRlUHJveHlFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQVJSQVlBQ0NFU1NfQVJSQVksIGFycmF5KTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5BUlJBWUFDQ0VTU19JTkRFWCwgMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uQVNTSUdOTUVOVF9SSUdIVCwgKHNob3J0KSAzMyk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygic2hvcnQiLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygoKElOdW1iZXJCZWFuUHJveHkpIHJlc3VsdCkuc2hvcnRWYWx1ZSgpLCAoc2hvcnQpIDMzKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdE11bHRpQXJyYXlBY2Nlc3MoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJQXJyYXlCZWFuUHJveHkgYXJyYXkgPSBwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoInNob3J0IiksIG5ldyBpbnRbXSB7MiwxfSk7Ci0JCWFycmF5LnNldChwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCgoc2hvcnQpIDMpLCBuZXcgaW50W117MSwwfSk7Ci0JCQotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlQXJyYXlBY2Nlc3MoRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgMSk7Ci0JCWV4cC5jcmVhdGVQcm94eUV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5BUlJBWUFDQ0VTU19BUlJBWSwgYXJyYXkpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLkFSUkFZQUNDRVNTX0lOREVYLCAxKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJzaG9ydFtdIiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNdWx0aUFycmF5QWNjZXNzU2V0KCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUFycmF5QmVhblByb3h5IGFycmF5ID0gcHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJzaG9ydCIpLCBuZXcgaW50W10gezIsMX0pOwotCQlhcnJheS5zZXQocHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoKHNob3J0KSAzKSwgbmV3IGludFtdezEsMH0pOwotCQkKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUFzc2lnbm1lbnRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04pOwotCQlleHAuY3JlYXRlQXJyYXlBY2Nlc3MoRm9yRXhwcmVzc2lvbi5BU1NJR05NRU5UX0xFRlQsIDEpOwotCQlleHAuY3JlYXRlUHJveHlFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQVJSQVlBQ0NFU1NfQVJSQVksIGFycmF5KTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5BUlJBWUFDQ0VTU19JTkRFWCwgMSk7Ci0JCUlBcnJheUJlYW5Qcm94eSBuZXdBcnJheSA9IHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgic2hvcnQiKSwgbmV3IGludFtdIHszfSk7Ci0JCWV4cC5jcmVhdGVQcm94eUV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5BU1NJR05NRU5UX1JJR0hULCBuZXdBcnJheSk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygic2hvcnRbXSIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRGb3JtYWxUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsICgoSUFycmF5QmVhblByb3h5KSByZXN1bHQpLmdldExlbmd0aCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TXVsdGlBcnJheUFjY2VzczEoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJQXJyYXlCZWFuUHJveHkgYXJyYXkgPSBwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoInNob3J0IiksIG5ldyBpbnRbXSB7MiwxfSk7Ci0JCWFycmF5LnNldChwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCgoc2hvcnQpIDMpLCBuZXcgaW50W117MSwwfSk7Ci0JCQotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlQXJyYXlBY2Nlc3MoRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgMik7Ci0JCWV4cC5jcmVhdGVQcm94eUV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5BUlJBWUFDQ0VTU19BUlJBWSwgYXJyYXkpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLkFSUkFZQUNDRVNTX0lOREVYLCAxKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5BUlJBWUFDQ0VTU19JTkRFWCwgMCk7CQkKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJzaG9ydCIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRGb3JtYWxUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKChzaG9ydCkgMywgKChJTnVtYmVyQmVhblByb3h5KSByZXN1bHQpLnNob3J0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheUNyZWF0aW9uKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlQXJyYXlDcmVhdGlvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCAiaW50W10iLCAxKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5BUlJBWUNSRUFUSU9OX0RJTUVOU0lPTiwgMik7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiaW50W10iLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0Rm9ybWFsVHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCAoKElBcnJheUJlYW5Qcm94eSkgcmVzdWx0KS5nZXRMZW5ndGgoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNdWx0aUFycmF5Q3JlYXRpb24oKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVBcnJheUNyZWF0aW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sICJpbnRbXVtdIiwgMik7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uQVJSQVlDUkVBVElPTl9ESU1FTlNJT04sIDIpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLkFSUkFZQ1JFQVRJT05fRElNRU5TSU9OLCA0KTsJCQotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImludFtdW10iLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0Rm9ybWFsVHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCAoKElBcnJheUJlYW5Qcm94eSkgcmVzdWx0KS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyg0LCAoKElBcnJheUJlYW5Qcm94eSkoKElBcnJheUJlYW5Qcm94eSkgcmVzdWx0KS5nZXQoMCkpLmdldExlbmd0aCgpKTsKLQl9CQotCi0JcHVibGljIHZvaWQgdGVzdE11bHRpUGFydGlhbEFycmF5Q3JlYXRpb24oKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVBcnJheUNyZWF0aW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sICJpbnRbXVtdW10iLCAyKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5BUlJBWUNSRUFUSU9OX0RJTUVOU0lPTiwgMik7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uQVJSQVlDUkVBVElPTl9ESU1FTlNJT04sIDQpOwkJCi0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiaW50W11bXVtdIiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgKChJQXJyYXlCZWFuUHJveHkpIHJlc3VsdCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoNCwgKChJQXJyYXlCZWFuUHJveHkpKChJQXJyYXlCZWFuUHJveHkpIHJlc3VsdCkuZ2V0KDApKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydE51bGwoKChJQXJyYXlCZWFuUHJveHkpKChJQXJyYXlCZWFuUHJveHkpIHJlc3VsdCkuZ2V0KDApKS5nZXQoMCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlJbml0aWFsaXplckVtcHR5KCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUFycmF5Q3JlYXRpb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgImludFtdIiwgMCk7Ci0JCWV4cC5jcmVhdGVBcnJheUluaXRpYWxpemVyKDApOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImludFtdIiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgKChJQXJyYXlCZWFuUHJveHkpIHJlc3VsdCkuZ2V0TGVuZ3RoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlJbml0aWFsaXplck9uZURpbSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVBcnJheUNyZWF0aW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sICJpbnRbXSIsIDApOwotCQlleHAuY3JlYXRlQXJyYXlJbml0aWFsaXplcigxKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5BUlJBWUlOSVRJQUxJWkVSX0VYUFJFU1NJT04sIDMpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImludFtdIiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgKChJQXJyYXlCZWFuUHJveHkpIHJlc3VsdCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgKChJTnVtYmVyQmVhblByb3h5KSAoKElBcnJheUJlYW5Qcm94eSkgcmVzdWx0KS5nZXQoMCkpLmludFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlJbml0aWFsaXplclR3b0RpbUVtcHR5KCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUFycmF5Q3JlYXRpb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgImludFtdW10iLCAwKTsKLQkJZXhwLmNyZWF0ZUFycmF5SW5pdGlhbGl6ZXIoMCk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiaW50W11bXSIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRGb3JtYWxUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsICgoSUFycmF5QmVhblByb3h5KSByZXN1bHQpLmdldExlbmd0aCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFycmF5SW5pdGlhbGl6ZXJUd29EaW0oKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlQXJyYXlDcmVhdGlvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCAiaW50W11bXSIsIDApOwotCQlleHAuY3JlYXRlQXJyYXlJbml0aWFsaXplcigxKTsKLQkJZXhwLmNyZWF0ZUFycmF5SW5pdGlhbGl6ZXIoMCk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiaW50W11bXSIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRGb3JtYWxUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsICgoSUFycmF5QmVhblByb3h5KSByZXN1bHQpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsICgoSUFycmF5QmVhblByb3h5KSAoKElBcnJheUJlYW5Qcm94eSkgcmVzdWx0KS5nZXQoMCkpLmdldExlbmd0aCgpKTsKLQl9CQotCi0JcHVibGljIHZvaWQgdGVzdEFycmF5SW5pdGlhbGl6ZXJUd29EaW1Ob3RFbXB0eSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVBcnJheUNyZWF0aW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sICJpbnRbXVtdIiwgMCk7Ci0JCWV4cC5jcmVhdGVBcnJheUluaXRpYWxpemVyKDIpOwotCQlleHAuY3JlYXRlTnVsbChGb3JFeHByZXNzaW9uLkFSUkFZSU5JVElBTElaRVJfRVhQUkVTU0lPTik7Ci0JCWV4cC5jcmVhdGVBcnJheUluaXRpYWxpemVyKDIpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLkFSUkFZSU5JVElBTElaRVJfRVhQUkVTU0lPTiwgMyk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uQVJSQVlJTklUSUFMSVpFUl9FWFBSRVNTSU9OLCA0KTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnRbXVtdIiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgKChJQXJyYXlCZWFuUHJveHkpIHJlc3VsdCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnROdWxsKCgoSUFycmF5QmVhblByb3h5KSByZXN1bHQpLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygyLCAoKElBcnJheUJlYW5Qcm94eSkgKChJQXJyYXlCZWFuUHJveHkpIHJlc3VsdCkuZ2V0KDEpKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyg0LCAoKElOdW1iZXJCZWFuUHJveHkpKChJQXJyYXlCZWFuUHJveHkpICgoSUFycmF5QmVhblByb3h5KSByZXN1bHQpLmdldCgxKSkuZ2V0KDEpKS5pbnRWYWx1ZSgpKTsJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlJbml0aWFsaXplclNob3J0SW50KCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUFycmF5Q3JlYXRpb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgInNob3J0W10iLCAwKTsKLQkJZXhwLmNyZWF0ZUFycmF5SW5pdGlhbGl6ZXIoMSk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uQVJSQVlJTklUSUFMSVpFUl9FWFBSRVNTSU9OLCAzKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJzaG9ydFtdIiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgKChJQXJyYXlCZWFuUHJveHkpIHJlc3VsdCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgKChJTnVtYmVyQmVhblByb3h5KSAoKElBcnJheUJlYW5Qcm94eSkgcmVzdWx0KS5nZXQoMCkpLmludFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2xhc3NJbnN0YW5jZUNyZWF0aW9uRGVmYXVsdCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVDbGFzc0luc3RhbmNlQ3JlYXRpb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgImphdmEubGFuZy5PYmplY3QiLCAwKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuT2JqZWN0IiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2xhc3NJbnN0YW5jZUNyZWF0aW9uRGVmYXVsdFdpdGhCZWFuVHlwZVByb3h5KCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUNsYXNzSW5zdGFuY2VDcmVhdGlvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5PYmplY3QiKSwgMCk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLk9iamVjdCIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRGb3JtYWxUeXBlTmFtZSgpKTsKLQl9CQotCQotCXB1YmxpYyB2b2lkIHRlc3RDbGFzc0luc3RhbmNlQ3JlYXRpb25PbmVBcmcoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sICJqYXZhLmxhbmcuSW50ZWdlciIsIDEpOwotCQlleHAuY3JlYXRlU3RyaW5nTGl0ZXJhbChGb3JFeHByZXNzaW9uLkNMQVNTSU5TVEFOQ0VDUkVBVElPTl9BUkdVTUVOVCwgIjMiKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuSW50ZWdlciIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRGb3JtYWxUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsICgoSU51bWJlckJlYW5Qcm94eSkgcmVzdWx0KS5pbnRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENsYXNzSW5zdGFuY2VDcmVhdGlvbk9uZUFyZ1dpdGhQcmltV2lkZW5pbmcoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sICJqYXZhLmxhbmcuU2hvcnQiLCAxKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5DTEFTU0lOU1RBTkNFQ1JFQVRJT05fQVJHVU1FTlQsIChieXRlKTMpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TaG9ydCIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRGb3JtYWxUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKChzaG9ydCkzLCAoKElOdW1iZXJCZWFuUHJveHkpIHJlc3VsdCkuc2hvcnRWYWx1ZSgpKTsKLQl9CQotCQotCXB1YmxpYyB2b2lkIHRlc3RDbGFzc0luc3RhbmNlQ3JlYXRpb25OdWxsQXJnKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUNsYXNzSW5zdGFuY2VDcmVhdGlvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCAidGVzdFBhY2thZ2UuVGVzdEN0b3JXaXRoTnVsbCIsIDEpOwotCQlleHAuY3JlYXRlTnVsbChGb3JFeHByZXNzaW9uLkNMQVNTSU5TVEFOQ0VDUkVBVElPTl9BUkdVTUVOVCk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygidGVzdFBhY2thZ2UuVGVzdEN0b3JXaXRoTnVsbCIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRGb3JtYWxUeXBlTmFtZSgpKTsKLQl9CQotCQotCXB1YmxpYyB2b2lkIHRlc3RDbGFzc0luc3RhbmNlQ3JlYXRpb25NaXNtYXRjaEFyZygpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVDbGFzc0luc3RhbmNlQ3JlYXRpb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgInRlc3RQYWNrYWdlLlRlc3RDdG9yV2l0aE51bGwiLCAxKTsKLQkJdHJ5IHsKLQkJCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uQ0xBU1NJTlNUQU5DRUNSRUFUSU9OX0FSR1VNRU5ULCAxKTsKLQkJCWV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBzaG91bGQgb2YgYmVlbiB0aHJvd24uIik7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCWFzc2VydEVxdWFscygiamF2YS5sYW5nLk5vU3VjaE1ldGhvZEV4Y2VwdGlvbiIsIGUuZ2V0VHlwZVByb3h5KCkuZ2V0Rm9ybWFsVHlwZU5hbWUoKSk7Ci0JCX0KLQl9CQotCQotCXB1YmxpYyB2b2lkIHRlc3RGaWVsZEFjY2Vzc1N0YXRpYygpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVGaWVsZEFjY2VzcyhGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCAiUkVEIiwgdHJ1ZSk7Ci0JCWV4cC5jcmVhdGVUeXBlUmVjZWl2ZXIoImphdmEuYXd0LkNvbG9yIik7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5hd3QuQ29sb3IiLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0Rm9ybWFsVHlwZU5hbWUoKSk7Ci0JCUlCZWFuVHlwZVByb3h5IGNvbG9yVHlwZSA9IHJlc3VsdC5nZXRUeXBlUHJveHkoKTsKLQkJSU1ldGhvZFByb3h5IHJlZCA9IGNvbG9yVHlwZS5nZXRNZXRob2RQcm94eSgiZ2V0UmVkIik7Ci0JCUlNZXRob2RQcm94eSBncmVlbiA9IGNvbG9yVHlwZS5nZXRNZXRob2RQcm94eSgiZ2V0R3JlZW4iKTsKLQkJSU1ldGhvZFByb3h5IGJsdWUgPSBjb2xvclR5cGUuZ2V0TWV0aG9kUHJveHkoImdldEJsdWUiKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgKChJTnVtYmVyQmVhblByb3h5KSByZWQuaW52b2tlKHJlc3VsdCkpLmludFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgKChJTnVtYmVyQmVhblByb3h5KSBncmVlbi5pbnZva2UocmVzdWx0KSkuaW50VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCAoKElOdW1iZXJCZWFuUHJveHkpIGJsdWUuaW52b2tlKHJlc3VsdCkpLmludFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RmllbGRBY2Nlc3NTZXRTdGF0aWMoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlQXNzaWdubWVudEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTik7Ci0JCWV4cC5jcmVhdGVGaWVsZEFjY2VzcyhGb3JFeHByZXNzaW9uLkFTU0lHTk1FTlRfTEVGVCwgIlNUQVRJQ19GSUVMRCIsIHRydWUpOwotCQlleHAuY3JlYXRlVHlwZVJlY2VpdmVyKCJ0ZXN0UGFja2FnZS5UZXN0QWNjZXNzIik7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uQVNTSUdOTUVOVF9SSUdIVCwgMjMpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRGb3JtYWxUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIzLCAoKElOdW1iZXJCZWFuUHJveHkpIHJlc3VsdCkuaW50VmFsdWUoKSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RGaWVsZEFjY2Vzc05vblN0YXRpYygpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVGaWVsZEFjY2VzcyhGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCAieCIsIHRydWUpOwotCQlleHAuY3JlYXRlQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKEZvckV4cHJlc3Npb24uRklFTERfUkVDRUlWRVIsICJqYXZhLmF3dC5Qb2ludCIsIDIpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLkNMQVNTSU5TVEFOQ0VDUkVBVElPTl9BUkdVTUVOVCwgMSk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uQ0xBU1NJTlNUQU5DRUNSRUFUSU9OX0FSR1VNRU5ULCAyKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0Rm9ybWFsVHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCAoKElOdW1iZXJCZWFuUHJveHkpIHJlc3VsdCkuaW50VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RGaWVsZEFjY2Vzc1NldE5vblN0YXRpYygpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVBc3NpZ25tZW50RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OKTsKLQkJZXhwLmNyZWF0ZUZpZWxkQWNjZXNzKEZvckV4cHJlc3Npb24uQVNTSUdOTUVOVF9MRUZULCAieCIsIHRydWUpOwotCQlleHAuY3JlYXRlQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKEZvckV4cHJlc3Npb24uRklFTERfUkVDRUlWRVIsICJqYXZhLmF3dC5Qb2ludCIsIDIpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLkNMQVNTSU5TVEFOQ0VDUkVBVElPTl9BUkdVTUVOVCwgMSk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uQ0xBU1NJTlNUQU5DRUNSRUFUSU9OX0FSR1VNRU5ULCAyKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5BU1NJR05NRU5UX1JJR0hULCAyMyk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMjMsICgoSU51bWJlckJlYW5Qcm94eSkgcmVzdWx0KS5pbnRWYWx1ZSgpKTsKLQl9CQotCi0JcHVibGljIHZvaWQgdGVzdEZpZWxkQWNjZXNzU2V0Tm9uU3RhdGljU2ltcGxlKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJLy8gRmlyc3QgY3JlYXRlIHVzaW5nIG5vcm1hbCBwcm94eSBzdHVmZiwgdGhlbiB0ZXN0IHRoZSBleHByZXNzaW9uIHByb2Nlc3Nvci4KLQkJSUJlYW5UeXBlUHJveHkgcG9pbnRUeXBlID0gcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmF3dC5Qb2ludCIpOwotCQlJRmllbGRQcm94eSB4RmllbGRQcm94eSA9IHBvaW50VHlwZS5nZXRGaWVsZFByb3h5KCJ4Iik7Ci0JCUlCZWFuUHJveHkgcG9pbnRQcm94eSA9IHBvaW50VHlwZS5nZXRDb25zdHJ1Y3RvclByb3h5KG5ldyBTdHJpbmdbXSB7ImludCIsICJpbnQifSkubmV3SW5zdGFuY2UobmV3IElCZWFuUHJveHlbXSB7cHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoMSksIHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKDIpfSk7Ci0JCQotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlFeHByZXNzaW9uUHJveHkgZXAgPSBleHAuY3JlYXRlU2ltcGxlRmllbGRTZXQoeEZpZWxkUHJveHksIHBvaW50UHJveHksIHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKDIzKSwgdHJ1ZSk7Ci0JCWVwLmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpIHsKLQotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlMaXN0ZW5lciNwcm94eVJlc29sdmVkKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlJQmVhblByb3h5IHJlc3VsdCA9IGV2ZW50LmdldFByb3h5KCk7Ci0JCQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQkJCWFzc2VydEVxdWFscygiaW50IiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkpOwotCQkJCWFzc2VydEVxdWFscygyMywgKChJTnVtYmVyQmVhblByb3h5KSByZXN1bHQpLmludFZhbHVlKCkpOwotCQkJfQotCQl9KTsKLQkJZXhwLmludm9rZUV4cHJlc3Npb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmllbGRBY2Nlc3NOb25TdGF0aWNTaW1wbGUoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQkvLyBGaXJzdCBjcmVhdGUgdXNpbmcgbm9ybWFsIHByb3h5IHN0dWZmLCB0aGVuIHRlc3QgdGhlIGV4cHJlc3Npb24gcHJvY2Vzc29yLgotCQlJQmVhblR5cGVQcm94eSBwb2ludFR5cGUgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEuYXd0LlBvaW50Iik7Ci0JCUlGaWVsZFByb3h5IHhGaWVsZFByb3h5ID0gcG9pbnRUeXBlLmdldEZpZWxkUHJveHkoIngiKTsKLQkJSUJlYW5Qcm94eSBwb2ludFByb3h5ID0gcG9pbnRUeXBlLmdldENvbnN0cnVjdG9yUHJveHkobmV3IFN0cmluZ1tdIHsiaW50IiwgImludCJ9KS5uZXdJbnN0YW5jZShuZXcgSUJlYW5Qcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCgxKSwgcHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoMil9KTsKLQkJCi0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCUV4cHJlc3Npb25Qcm94eSBlcCA9IGV4cC5jcmVhdGVTaW1wbGVGaWVsZEFjY2Vzcyh4RmllbGRQcm94eSwgcG9pbnRQcm94eSk7Ci0JCWVwLmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpIHsKLQotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlMaXN0ZW5lciNwcm94eVJlc29sdmVkKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlJQmVhblByb3h5IHJlc3VsdCA9IGV2ZW50LmdldFByb3h5KCk7Ci0JCQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQkJCWFzc2VydEVxdWFscygiaW50IiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkpOwotCQkJCWFzc2VydEVxdWFscygxLCAoKElOdW1iZXJCZWFuUHJveHkpIHJlc3VsdCkuaW50VmFsdWUoKSk7Ci0JCQl9Ci0JCX0pOwotCQlleHAuaW52b2tlRXhwcmVzc2lvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaWVsZEFjY2Vzc05vblN0YXRpY1dpdGhQcm94eSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlCZWFuVHlwZVByb3h5IHBvaW50VHlwZSA9IHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5hd3QuUG9pbnQiKTsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUZpZWxkQWNjZXNzKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIHBvaW50VHlwZS5nZXRGaWVsZFByb3h5KCJ4IiksIHRydWUpOwotCQlleHAuY3JlYXRlQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKEZvckV4cHJlc3Npb24uRklFTERfUkVDRUlWRVIsICJqYXZhLmF3dC5Qb2ludCIsIDIpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLkNMQVNTSU5TVEFOQ0VDUkVBVElPTl9BUkdVTUVOVCwgMSk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uQ0xBU1NJTlNUQU5DRUNSRUFUSU9OX0FSR1VNRU5ULCAyKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0Rm9ybWFsVHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCAoKElOdW1iZXJCZWFuUHJveHkpIHJlc3VsdCkuaW50VmFsdWUoKSk7Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RmllbGRBY2Nlc3NGYWlsV2l0aEV4cHJlc3Npb25Qcm94eSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUJlYW5UeXBlUHJveHkgcG9pbnRUeXBlID0gcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmF3dC5Qb2ludCIpOwotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQl0cnkgewotCQkJZXhwLmNyZWF0ZUZpZWxkQWNjZXNzKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIHBvaW50VHlwZS5nZXRGaWVsZFByb3h5KGV4cCwgInoiKSwgdHJ1ZSk7Ci0JCQlleHAuY3JlYXRlQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKEZvckV4cHJlc3Npb24uRklFTERfUkVDRUlWRVIsICJqYXZhLmF3dC5Qb2ludCIsIDIpOwotCQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5DTEFTU0lOU1RBTkNFQ1JFQVRJT05fQVJHVU1FTlQsIDEpOwotCQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5DTEFTU0lOU1RBTkNFQ1JFQVRJT05fQVJHVU1FTlQsIDIpOwotCQkJZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQkJZmFpbCgiU2hvdWxkIG9mIGhhZCBleGNlcHRpb24iKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuTm9TdWNoRmllbGRFeGNlcHRpb24iLCBlLmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1ldGhvZEludm9rZVN0YXRpYygpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVNZXRob2RJbnZvY2F0aW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sICJ2YWx1ZU9mIiwgdHJ1ZSwgMSk7Ci0JCWV4cC5jcmVhdGVUeXBlUmVjZWl2ZXIoImphdmEubGFuZy5TdHJpbmciKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5NRVRIT0RfQVJHVU1FTlQsIHRydWUpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0Rm9ybWFsVHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygidHJ1ZSIsICgoSVN0cmluZ0JlYW5Qcm94eSkgcmVzdWx0KS5zdHJpbmdWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1ldGhvZEludm9rZVByb3h5RmFpbCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJSUJlYW5UeXBlUHJveHkgaW50VHlwZSA9IHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkludGVnZXIiKTsKLQkJdHJ5IHsKLQkJCWV4cC5jcmVhdGVNZXRob2RJbnZvY2F0aW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIGludFR5cGUuZ2V0TWV0aG9kUHJveHkoZXhwLCAiZ29vYmxkeS1nb29rIiksIHRydWUsIDEpOwotCQkJZXhwLmNyZWF0ZUNsYXNzSW5zdGFuY2VDcmVhdGlvbihGb3JFeHByZXNzaW9uLk1FVEhPRF9SRUNFSVZFUiwgaW50VHlwZSwgMSk7Ci0JCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLkNMQVNTSU5TVEFOQ0VDUkVBVElPTl9BUkdVTUVOVCwgMyk7Ci0JCQlleHAuY3JlYXRlQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKEZvckV4cHJlc3Npb24uTUVUSE9EX0FSR1VNRU5ULCAiamF2YS5sYW5nLkludGVnZXIiLCAxKTsKLQkJCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uQ0xBU1NJTlNUQU5DRUNSRUFUSU9OX0FSR1VNRU5ULCA0KTsKLQkJCWV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJCWZhaWwoIlNob3VsZCBvZiBnb3R0ZW4gZXhjZXB0aW9uIik7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCWFzc2VydEVxdWFscygiamF2YS5sYW5nLk5vU3VjaE1ldGhvZEV4Y2VwdGlvbiIsIGUuZ2V0VHlwZVByb3h5KCkuZ2V0Rm9ybWFsVHlwZU5hbWUoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kSW52b2tlTm9uU3RhdGljKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZU1ldGhvZEludm9jYXRpb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgImNvbXBhcmVUbyIsIHRydWUsIDEpOwotCQlleHAuY3JlYXRlQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKEZvckV4cHJlc3Npb24uTUVUSE9EX1JFQ0VJVkVSLCAiamF2YS5sYW5nLkludGVnZXIiLCAxKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5DTEFTU0lOU1RBTkNFQ1JFQVRJT05fQVJHVU1FTlQsIDMpOwotCQlleHAuY3JlYXRlQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKEZvckV4cHJlc3Npb24uTUVUSE9EX0FSR1VNRU5ULCAiamF2YS5sYW5nLkludGVnZXIiLCAxKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5DTEFTU0lOU1RBTkNFQ1JFQVRJT05fQVJHVU1FTlQsIDQpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRGb3JtYWxUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZSgiQ29tcGFyZVRvIHdhc24ndCBsZXNzIHRoYW4gMC4iLCAoKElOdW1iZXJCZWFuUHJveHkpIHJlc3VsdCkuaW50VmFsdWUoKSA8IDApOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kSW52b2tlTm9uU3RhdGljV2l0aFByb3h5KCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUJlYW5UeXBlUHJveHkgaW50ZWdlclR5cGUgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5JbnRlZ2VyIik7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVNZXRob2RJbnZvY2F0aW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIGludGVnZXJUeXBlLmdldE1ldGhvZFByb3h5KCJjb21wYXJlVG8iLCBuZXcgSUJlYW5UeXBlUHJveHlbXSB7aW50ZWdlclR5cGV9KSwgdHJ1ZSwgMSk7Ci0JCWV4cC5jcmVhdGVDbGFzc0luc3RhbmNlQ3JlYXRpb24oRm9yRXhwcmVzc2lvbi5NRVRIT0RfUkVDRUlWRVIsICJqYXZhLmxhbmcuSW50ZWdlciIsIDEpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLkNMQVNTSU5TVEFOQ0VDUkVBVElPTl9BUkdVTUVOVCwgMyk7Ci0JCWV4cC5jcmVhdGVDbGFzc0luc3RhbmNlQ3JlYXRpb24oRm9yRXhwcmVzc2lvbi5NRVRIT0RfQVJHVU1FTlQsICJqYXZhLmxhbmcuSW50ZWdlciIsIDEpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLkNMQVNTSU5TVEFOQ0VDUkVBVElPTl9BUkdVTUVOVCwgNCk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkpOwotCQlhc3NlcnRUcnVlKCJDb21wYXJlVG8gd2Fzbid0IGxlc3MgdGhhbiAwLiIsICgoSU51bWJlckJlYW5Qcm94eSkgcmVzdWx0KS5pbnRWYWx1ZSgpIDwgMCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb25kaXRpb25hbFRydWUoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlQ29uZGl0aW9uYWxFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04pOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQ09ORElUSU9OQUxfQ09ORElUSU9OLCBJbmZpeE9wZXJhdG9yLklOX0VRVUFMUywgMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgKGJ5dGUpIDMpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAoc2hvcnQpIDMpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQ09ORElUSU9OQUxfVFJVRSwgSW5maXhPcGVyYXRvci5JTl9QTFVTLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAoYnl0ZSkgMyk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIChzaG9ydCkgMyk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5DT05ESVRJT05BTF9GQUxTRSwgSW5maXhPcGVyYXRvci5JTl9NSU5VUywgMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgKGJ5dGUpIDMpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAoc2hvcnQpIDMpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRGb3JtYWxUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsICgoSU51bWJlckJlYW5Qcm94eSkgcmVzdWx0KS5pbnRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvbmRpdGlvbmFsRmFsc2UoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlQ29uZGl0aW9uYWxFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04pOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQ09ORElUSU9OQUxfQ09ORElUSU9OLCBJbmZpeE9wZXJhdG9yLklOX0VRVUFMUywgMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgKGJ5dGUpIDQpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAoc2hvcnQpIDMpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQ09ORElUSU9OQUxfVFJVRSwgSW5maXhPcGVyYXRvci5JTl9QTFVTLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAoYnl0ZSkgMyk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIChzaG9ydCkgMyk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5DT05ESVRJT05BTF9GQUxTRSwgSW5maXhPcGVyYXRvci5JTl9NSU5VUywgMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgKGJ5dGUpIDMpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAoc2hvcnQpIDMpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRGb3JtYWxUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsICgoSU51bWJlckJlYW5Qcm94eSkgcmVzdWx0KS5pbnRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE5lc3RlZENvbmRpdGlvbmFsVHJ1ZVRydWUoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlQ29uZGl0aW9uYWxFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04pOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQ09ORElUSU9OQUxfQ09ORElUSU9OLCBJbmZpeE9wZXJhdG9yLklOX0VRVUFMUywgMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgKGJ5dGUpIDMpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAoc2hvcnQpIDMpOwotCQlleHAuY3JlYXRlQ29uZGl0aW9uYWxFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQ09ORElUSU9OQUxfVFJVRSk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5DT05ESVRJT05BTF9DT05ESVRJT04sIEluZml4T3BlcmF0b3IuSU5fRVFVQUxTLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAoYnl0ZSkgMyk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIChzaG9ydCkgMyk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5DT05ESVRJT05BTF9UUlVFLCBJbmZpeE9wZXJhdG9yLklOX1BMVVMsIDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIChieXRlKSA0KTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgKHNob3J0KSA0KTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkNPTkRJVElPTkFMX0ZBTFNFLCBJbmZpeE9wZXJhdG9yLklOX01JTlVTLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAoYnl0ZSkgNCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIChzaG9ydCkgMyk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5DT05ESVRJT05BTF9GQUxTRSwgSW5maXhPcGVyYXRvci5JTl9NSU5VUywgMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgKGJ5dGUpIDUpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAoc2hvcnQpIDMpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRGb3JtYWxUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDgsICgoSU51bWJlckJlYW5Qcm94eSkgcmVzdWx0KS5pbnRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE5lc3RlZENvbmRpdGlvbmFsRmFsc2VGYWxzZSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVDb25kaXRpb25hbEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTik7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5DT05ESVRJT05BTF9DT05ESVRJT04sIEluZml4T3BlcmF0b3IuSU5fRVFVQUxTLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAoYnl0ZSkgMyk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIChzaG9ydCkgMik7Ci0JCWV4cC5jcmVhdGVDb25kaXRpb25hbEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5DT05ESVRJT05BTF9UUlVFKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkNPTkRJVElPTkFMX0NPTkRJVElPTiwgSW5maXhPcGVyYXRvci5JTl9FUVVBTFMsIDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIChieXRlKSAyKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgKHNob3J0KSAzKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkNPTkRJVElPTkFMX1RSVUUsIEluZml4T3BlcmF0b3IuSU5fUExVUywgMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgKGJ5dGUpIDQpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAoc2hvcnQpIDQpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQ09ORElUSU9OQUxfRkFMU0UsIEluZml4T3BlcmF0b3IuSU5fTUlOVVMsIDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIChieXRlKSA0KTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgKHNob3J0KSAzKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkNPTkRJVElPTkFMX0ZBTFNFLCBJbmZpeE9wZXJhdG9yLklOX01JTlVTLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAoYnl0ZSkgNSk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIChzaG9ydCkgMyk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgKChJTnVtYmVyQmVhblByb3h5KSByZXN1bHQpLmludFZhbHVlKCkpOwotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFZvaWRSZXR1cm5UeXBlKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHkgewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQl0cnkgewotCQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBJbmZpeE9wZXJhdG9yLklOX1BMVVMsIDApOwotCQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAzKTsKLQkJCWV4cC5jcmVhdGVNZXRob2RJbnZvY2F0aW9uKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsICJnYyIsIHRydWUsIDApOwotCQkJZXhwLmNyZWF0ZVR5cGVSZWNlaXZlcigiamF2YS5sYW5nLlN5c3RlbSIpOwotCQkJZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQkJZmFpbCgiU2hvdWxkIG9mIHJlY2VpdmVkIG5vIGV4cHJlc3Npb24gdmFsdWUgZXhjZXB0aW9uLiIpOwotCQl9IGNhdGNoIChOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkgIT0gbnVsbCkKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRlc3Qgd2FzIHN1Y2Nlc3NmdWw6ICIrZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RXcm9uZ1JldHVyblR5cGUoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHksIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQl0cnkgewotCQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBJbmZpeE9wZXJhdG9yLklOX1BMVVMsIDApOwotCQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAzKTsKLQkJCWV4cC5jcmVhdGVNZXRob2RJbnZvY2F0aW9uKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsICJnZXRTZWN1cml0eU1hbmFnZXIiLCB0cnVlLCAwKTsKLQkJCWV4cC5jcmVhdGVUeXBlUmVjZWl2ZXIoImphdmEubGFuZy5TeXN0ZW0iKTsKLQkJCWV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJCWZhaWwoIlNob3VsZCBvZiByZWNlaXZlZCBjbGFzcyBjYXN0IHByb3h5IGV4Y2VwdGlvbi4iKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJaWYgKCFlLmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkuZXF1YWxzKCJqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIikpCi0JCQkJdGhyb3cgZTsJLy8gU29tZSBvdGhlciBleGNlcHRpb24sIHJldGhyb3cgaXQuCi0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEludm9rZSgpIHRocm93cyBUaHJvd2FibGVQcm94eSwgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVNZXRob2RJbnZvY2F0aW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sICJnZXRTZWN1cml0eU1hbmFnZXIiLCB0cnVlLCAwKTsKLQkJZXhwLmNyZWF0ZVR5cGVSZWNlaXZlcigiamF2YS5sYW5nLlN5c3RlbSIpOwotCQlleHAuaW52b2tlRXhwcmVzc2lvbigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SW52b2tlRmFpbCgpIHRocm93cyBUaHJvd2FibGVQcm94eSwgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCXRyeSB7Ci0JCQlleHAuY3JlYXRlTWV0aG9kSW52b2NhdGlvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCAiZ2V0ZW52IiwgdHJ1ZSwgMSk7Ci0JCQlleHAuY3JlYXRlVHlwZVJlY2VpdmVyKCJqYXZhLmxhbmcuU3lzdGVtIik7Ci0JCQlleHAuY3JlYXRlU3RyaW5nTGl0ZXJhbChGb3JFeHByZXNzaW9uLk1FVEhPRF9BUkdVTUVOVCwgInh5eiIpOwotCQkJZXhwLmludm9rZUV4cHJlc3Npb24oKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJaWYgKCFlLmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkuZXF1YWxzKCJqYXZhLmxhbmcuRXJyb3IiKSkKLQkJCQl0aHJvdyBlOwkvLyBTb21lIG90aGVyIGV4Y2VwdGlvbiwgcmV0aHJvdyBpdC4KLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXNzaWdubWVudCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCUV4cHJlc3Npb25Qcm94eSBlcCA9IGV4cC5jcmVhdGVQcm94eUFzc2lnbm1lbnRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04pOwotCQlmaW5hbCBsb25nW10gdGltZSA9IG5ldyBsb25nWzFdOwotCQllcC5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uUmVzb2x2ZWQoKSB7Ci0JCQkKLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5QWRhcHRlciNwcm94eVJlc29sdmVkKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQl0aW1lWzBdID0gKChJTnVtYmVyQmVhblByb3h5KSBldmVudC5nZXRQcm94eSgpKS5sb25nVmFsdWUoKTsKLQkJCX0KLQkJfSk7Ci0JCWV4cC5jcmVhdGVNZXRob2RJbnZvY2F0aW9uKEZvckV4cHJlc3Npb24uQVNTSUdOTUVOVF9SSUdIVCwgImN1cnJlbnRUaW1lTWlsbGlzIiwgdHJ1ZSwgMCk7Ci0JCWV4cC5jcmVhdGVUeXBlUmVjZWl2ZXIoImphdmEubGFuZy5TeXN0ZW0iKTsKLQkJZXhwLmludm9rZUV4cHJlc3Npb24oKTsKLQkJYXNzZXJ0VHJ1ZSgwTCAhPSB0aW1lWzBdKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlYXNzaWdubWVudCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCUV4cHJlc3Npb25Qcm94eSBlcCA9IGV4cC5jcmVhdGVQcm94eUFzc2lnbm1lbnRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04pOwotCQlmaW5hbCBsb25nW10gdGltZSA9IG5ldyBsb25nWzFdOwotCQllcC5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uUmVzb2x2ZWQoKSB7Ci0JCQkKLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5QWRhcHRlciNwcm94eVJlc29sdmVkKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQl0aW1lWzBdID0gKChJTnVtYmVyQmVhblByb3h5KSBldmVudC5nZXRQcm94eSgpKS5sb25nVmFsdWUoKTsKLQkJCX0KLQkJfSk7Ci0JCWV4cC5jcmVhdGVNZXRob2RJbnZvY2F0aW9uKEZvckV4cHJlc3Npb24uQVNTSUdOTUVOVF9SSUdIVCwgImN1cnJlbnRUaW1lTWlsbGlzIiwgdHJ1ZSwgMCk7Ci0JCWV4cC5jcmVhdGVUeXBlUmVjZWl2ZXIoImphdmEubGFuZy5TeXN0ZW0iKTsKLQkJZXhwLmNyZWF0ZVByb3h5UmVhc3NpZ25tZW50RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBlcCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uQVNTSUdOTUVOVF9SSUdIVCwgLTIzTCk7Ci0JCWV4cC5pbnZva2VFeHByZXNzaW9uKCk7Ci0JCWFzc2VydEVxdWFscygtMjNMLCB0aW1lWzBdKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFzc2lnbm1lbnRWb2lkKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJRXhwcmVzc2lvblByb3h5IGVwID0gZXhwLmNyZWF0ZVByb3h5QXNzaWdubWVudEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTik7Ci0JCUV4cHJlc3Npb25Wb2lkIGVwbCA9IG5ldyBFeHByZXNzaW9uVm9pZCgpOwotCQllcC5hZGRQcm94eUxpc3RlbmVyKGVwbCk7Ci0JCWV4cC5jcmVhdGVNZXRob2RJbnZvY2F0aW9uKEZvckV4cHJlc3Npb24uQVNTSUdOTUVOVF9SSUdIVCwgInRlc3RWb2lkIiwgdHJ1ZSwgMCk7Ci0JCWV4cC5jcmVhdGVUeXBlUmVjZWl2ZXIoInRlc3RQYWNrYWdlLlRlc3RBY2Nlc3MiKTsKLQkJZXhwLmludm9rZUV4cHJlc3Npb24oKTsKLQkJYXNzZXJ0VHJ1ZShlcGwudm9pZENhbGxlZCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBc3NpZ25tZW50Tm90KCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUNvbmRpdGlvbmFsRXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5DT05ESVRJT05BTF9DT05ESVRJT04sIHRydWUpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLkNPTkRJVElPTkFMX1RSVUUsIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgZXAgPSBleHAuY3JlYXRlUHJveHlBc3NpZ25tZW50RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkNPTkRJVElPTkFMX0ZBTFNFKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5BU1NJR05NRU5UX1JJR0hULCBmYWxzZSk7Ci0JCUV4cHJlc3Npb25Ob3RSZXNvbHZlZCBlcGwgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCk7Ci0JCWVwLmFkZFByb3h5TGlzdGVuZXIoZXBsKTsKLQkJZXhwLmludm9rZUV4cHJlc3Npb24oKTsKLQkJYXNzZXJ0VHJ1ZShlcGwubm90UmVzb2x2ZWRDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBc3NpZ25tZW50TGF0ZXJVc2FnZSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCS8vIGVwYXJnID0gMzsKLQkJLy8gZXBJbnRlZ2VyID0gbmV3IEludGVnZXIoZXBhcmcrMSk7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCUV4cHJlc3Npb25Qcm94eSBlcEFyZyA9IGV4cC5jcmVhdGVQcm94eUFzc2lnbm1lbnRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04pOyAKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5BU1NJR05NRU5UX1JJR0hULCAzKTsKLQkJRXhwcmVzc2lvblByb3h5IGVwSW50ZWdlciA9IGV4cC5jcmVhdGVQcm94eUFzc2lnbm1lbnRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04pOwotCQlleHAuY3JlYXRlQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKEZvckV4cHJlc3Npb24uQVNTSUdOTUVOVF9SSUdIVCwgcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuSW50ZWdlciIpLCAxKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkNMQVNTSU5TVEFOQ0VDUkVBVElPTl9BUkdVTUVOVCwgSW5maXhPcGVyYXRvci5JTl9QTFVTLCAwKTsKLQkJZXhwLmNyZWF0ZVByb3h5RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIGVwQXJnKTsJLy8gVXNlIGxpdGVyYWwgMysxIGFzIHRoZSBhcmd1bWVudCB0byB0aGlzLgotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAxKTsgCi0JCWVwSW50ZWdlci5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uUmVzb2x2ZWQoKSB7Ci0JCQkKLQkJCQotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlBZGFwdGVyI3Byb3h5UmVzb2x2ZWQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCWFzc2VydEVxdWFscygoKElOdW1iZXJCZWFuUHJveHkpIGV2ZW50LmdldFByb3h5KCkpLmludFZhbHVlKCksIDQpOwotCQkJfQkJCQotCQl9KTsKLQkJZXhwLmludm9rZUV4cHJlc3Npb24oKTsKLQl9Ci0JCi0JLy8gVE9ETyAtIGZvciBzb21lIHVua25vd24gcmVhc29uIHRoaXMgdGVzdCBjb250aW51ZXMgdG8gZmFpbCBpbiB0aGUgYnVpbGQgb24gdGhlIGp2ZWxpbnV4IG1hY2hpbmUuIEl0IHNlZW1zIHRvIGhhdmUKLQkvLyB2ZXJ5IHZlcnkgcG9vciBwZXJmb3JtYW5jZSBvbiBqdmVsaW51eC4KLQkvLyBJZiB3ZSBjYW4gZ2V0IGl0IHdvcmtpbmcsIHB1dCAidGVzdCIgb24gdGhlIGZyb250IG9mIHRoZSBtZXRob2QgbmFtZSBhZ2FpbiB0byBnZXQgaXQgcnVubmluZyBhcyBhIHRlc3QuCi0JcHVibGljIHZvaWQgRXhwcmVzc2lvblBlcmZvcm1hbmNlU21hbGwoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIEFtYmlndW91c01ldGhvZEV4Y2VwdGlvbiwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJLy8gU21hbGwgcGVyZm9ybWFuY2UgdGVzdC4gV2UgYXJlIHRlc3RpbmcgYSBzbWFsbCBiYXRjaCBvZiBleHByZXNzaW9ucyBvbiBlYWNoIHJ1bi4gV2UgdGhlbiBhdmcuIHRoZSBydW5zLiBUaGlzIHRlc3RzIG1hbnkgc21hbGwKLQkJLy8gZXhwcmVzc2lvbiBwcm9jZXNzaW5nIHBlcmZvcm1hbmNlLgotCQkgCi0JCS8vIFByaW1lIHRoZSBwcm94aWVzIHNvIHRoZXkgZG9uJ3QgYmVjb21lIHBhcnQgb2YgdGhlIHRpbWluZ3MuCi0JCUlCZWFuVHlwZVByb3h5IHBvaW50VHlwZSA9IHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5hd3QuUG9pbnQiKTsKLQkJSU1ldGhvZFByb3h5IHNldExvY2F0aW9uID0gcG9pbnRUeXBlLmdldE1ldGhvZFByb3h5KCJzZXRMb2NhdGlvbiIsIG5ldyBTdHJpbmdbXSB7ImludCIsICJpbnQifSk7Ci0JCUlNZXRob2RQcm94eSBnZXRMb2NhdGlvbiA9IHBvaW50VHlwZS5nZXRNZXRob2RQcm94eSgiZ2V0TG9jYXRpb24iKTsKLQkJLy8KLQkJLy8gTm93IGZvciBqdXN0IGEgc2ltcGxlIG9uZSBtZXRob2QgaW52b2NhdGlvbiB1c2luZyBtZXRob2QgcHJveGllcyAoYW5kIG5vdCBtZXRob2QgbG9va3VwIGVhY2ggdGltZSkgdGhlIHN0YW5kYXJkIHByb3h5IGNhbGxzCi0JCS8vIHdpbGwgYmVhdCBvdXQgZXhwcmVzc2lvbiBwcm9jZXNzaW5nIGZvciBSZW1vdGUuIE5vdGUgdGhhdCBpcyBub3QgdHJ1ZSBvZiBJREUgdm0uIEluIHRoYXQgY2FzZSB0aGUgc3RhbmRhcmQgcHJveHkgY2FsbHMKLQkJLy8gd2lsbCBBTFdBWVMgb3V0IHBlcmZvcm0gZ3JlYXRseSB0aGUgZXhwcmVzc2lvbiBwcm9jZXNzZXIgYmVjYXVzZSB0aGVyZSBpcyBubyBsYXRlbmN5IGluIHRoZSBjb21tdW5pY2F0aW9ucy4gSXQgaXMgYmFzaWNhbGx5Ci0JCS8vIHN0cmFpZ2h0IGRpcmVjdCBjYWxscy4gV2hpbGUgZXhwcmVzc2lvbiBwcm9jZXNzaW5nIGlzIGFsc28gZGlyZWN0IGNhbGxzLCB0aGUgY2FsbCBwYXRoIGlzIG11Y2ggbGFyZ2VyIGJlY2F1c2UgaXQgbmVlZHMgdG8gCi0JCS8vIGJ1aWxkL21haW50YWluL2V4ZWN1dGUgdGhlIHByb2Nlc3Npbmcgc3RhY2ssIHJhdGhlciB0aGFuIGp1c3QgZXhlY3V0ZSB0aGUgY29tbWFuZC4gCi0JCS8vCi0JCQotCQkvLyBUcnkgdG8gcHJpbWUgdGhlIGNvbW11bmljYXRpb24gcHVtcC4gVGhpcyBzZW5kcyBhYm91dCAzNiwwMDAgYnl0ZXMgb2YgZGF0YS4KLQkJLy8gRG9pbmcgaXQgaGVyZSBtZWFucyBsYXRlciB3aGVuIG5lZWRlZCB0aGUgY29tbXVuaWNhdGlvbnMgY29zdHMgYXJlIGRyYXN0aWNhbGx5IHJlZHVjZWQuCi0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWludCBpID0xMDAwOwotCQl3aGlsZSAoaS0tPjApIHsKLQkJCWV4cC5jcmVhdGVBcnJheUNyZWF0aW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIHJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkKLQkJCQkJLmdldEJlYW5UeXBlUHJveHkoZXhwLCAiamF2YS5sYW5nLk9iamVjdCIsIDEpLCAwKTsKLQkJCWV4cC5jcmVhdGVBcnJheUluaXRpYWxpemVyKDApOwotCQl9Ci0JCWV4cC5pbnZva2VFeHByZXNzaW9uKCk7Ci0JCQotCQlpbnQgdGltZXMgPSAxMDA7CS8vIE51bWJlciBvZiB0aW1lcyB0byBydW4gdGhlIHRlc3QuCi0JCWludCBiYXRjaFNpemUgPSAxMDsJLy8gU2l6ZSBvZiBiYXRjaCBmb3IgZWFjaCB0ZXN0LgkJCi0JCS8vIE5vdyBkbyB0aGUgYWN0dWFsIHRlc3QuCi0JCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJaSA9IHRpbWVzOwotCQl3aGlsZShpLS0+MCkgewotCQkJZXhwcmVzc2lvblNldHRpbmcocG9pbnRUeXBlLCBzZXRMb2NhdGlvbiwgZ2V0TG9jYXRpb24sIGJhdGNoU2l6ZSk7Ci0JCX0KLQkJCi0JCWxvbmcgZXhwcmVzc2lvblRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKS1zdGFydDsKLQkJbG9uZyBzdGFydE5vcm1hbCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQlpID0gdGltZXM7Ci0JCXdoaWxlKGktLT4wKSB7Ci0JCQlub3JtYWxTZXR0aW5nKHBvaW50VHlwZSwgc2V0TG9jYXRpb24sIGdldExvY2F0aW9uLCBiYXRjaFNpemUpOwotCQl9Ci0JCWxvbmcgbm9ybWFsVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLXN0YXJ0Tm9ybWFsOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNtYWxsIEJhdGNoIHJlc3VsdHM6IEJhdGNoIHNpemU9IitiYXRjaFNpemUrIiBOdW1iZXIgb2YgcnVucz0iK3RpbWVzKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJFeHByZXNzaW9uIFRpbWU6ICIgKyBleHByZXNzaW9uVGltZSArICIgQXZnOiAiICsgKGV4cHJlc3Npb25UaW1lLygoZG91YmxlKSB0aW1lcykpKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJOb3JtYWwgVGltZTogIiArIG5vcm1hbFRpbWUrICIgQXZnOiAiICsgKG5vcm1hbFRpbWUvKChkb3VibGUpIHRpbWVzKSkpOwotCQlpZiAobm9ybWFsVGltZSA9PSAwKQotCQkJbm9ybWFsVGltZSA9IDE7CS8vIFNvIG5vIGRpdmlkZSBieSB6ZXJvLgotCQlpbnQgaW1wcm92ZW1lbnQgPSAoaW50KSAoKDEtKChkb3VibGUpIGV4cHJlc3Npb25UaW1lKS9ub3JtYWxUaW1lKSoxMDApOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkltcHJvdmVtZW50IG9mIGV4cHJlc3Npb24gb3ZlciBub3JtYWwgdGltZTogIitpbXByb3ZlbWVudCsnJScpOwotCQkvLyBOb3RlIHRoYXQgdGhpcyB0ZXN0IGlzIG5vdCB2YWxpZCBmb3IgSURFIGJlY2F1c2UgdGhlIElERSB3aWxsIGFsd2F5cyBiZSBvdGhlciB3YXkgYXJvdW5kIGJlY2F1c2UKLQkJLy8gdGhlcmUgaXMgbm8gbGF0ZW5jeSBkZWxheSB0aGVyZS4KLQotCQlpZiAoIShwcm94eUZhY3RvcnkgaW5zdGFuY2VvZiBJREVTdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkpKQotCQkJYXNzZXJ0VHJ1ZSgiTGVzcyB0aGFuIDMwJSBpbXByb3ZlbWVudDogIitpbXByb3ZlbWVudCsnJScsIGltcHJvdmVtZW50Pj0zMCk7CS8vIFdlIGxpa2UgdGhpcyAlLgotCX0KLQotCS8vIFRPRE8gLSBmb3Igc29tZSB1bmtub3duIHJlYXNvbiB0aGlzIHRlc3QgY29udGludWVzIHRvIGZhaWwgaW4gdGhlIGJ1aWxkIG9uIHRoZSBqdmVsaW51eCBtYWNoaW5lLiBJdCBzZWVtcyB0byBoYXZlCi0JLy8gdmVyeSB2ZXJ5IHBvb3IgcGVyZm9ybWFuY2Ugb24ganZlbGludXguCi0JLy8gSWYgd2UgY2FuIGdldCBpdCB3b3JraW5nLCBwdXQgInRlc3QiIG9uIHRoZSBmcm9udCBvZiB0aGUgbWV0aG9kIG5hbWUgYWdhaW4gdG8gZ2V0IGl0IHJ1bm5pbmcgYXMgYSB0ZXN0LgotCXB1YmxpYyB2b2lkIEV4cHJlc3Npb25QZXJmb3JtYW5jZUxhcmdlKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBBbWJpZ3VvdXNNZXRob2RFeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCS8vIFNtYWxsIHBlcmZvcm1hbmNlIHRlc3QuIFdlIGFyZSB0ZXN0aW5nIGEgbGFyZ2UgYmF0Y2ggb2YgZXhwcmVzc2lvbnMgb24gZWFjaCBydW4uIFdlIHRoZW4gYXZnLiB0aGUgcnVucy4gVGhpcyB0ZXN0cyBtYW55IGxhcmdlCi0JCS8vIGV4cHJlc3Npb24gcHJvY2Vzc2luZyBwZXJmb3JtYW5jZS4KLQkJIAotCQkvLyBQcmltZSB0aGUgcHJveGllcyBzbyB0aGV5IGRvbid0IGJlY29tZSBwYXJ0IG9mIHRoZSB0aW1pbmdzLgotCQlJQmVhblR5cGVQcm94eSBwb2ludFR5cGUgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEuYXd0LlBvaW50Iik7Ci0JCUlNZXRob2RQcm94eSBzZXRMb2NhdGlvbiA9IHBvaW50VHlwZS5nZXRNZXRob2RQcm94eSgic2V0TG9jYXRpb24iLCBuZXcgU3RyaW5nW10geyJpbnQiLCAiaW50In0pOwotCQlJTWV0aG9kUHJveHkgZ2V0TG9jYXRpb24gPSBwb2ludFR5cGUuZ2V0TWV0aG9kUHJveHkoImdldExvY2F0aW9uIik7Ci0JCS8vCi0JCS8vIE5vdyBmb3IganVzdCBhIHNpbXBsZSBvbmUgbWV0aG9kIGludm9jYXRpb24gdXNpbmcgbWV0aG9kIHByb3hpZXMgKGFuZCBub3QgbWV0aG9kIGxvb2t1cCBlYWNoIHRpbWUpIHRoZSBzdGFuZGFyZCBwcm94eSBjYWxscwotCQkvLyB3aWxsIGJlYXQgb3V0IGV4cHJlc3Npb24gcHJvY2Vzc2luZyBmb3IgUmVtb3RlLiBOb3RlIHRoYXQgaXMgbm90IHRydWUgb2YgSURFIHZtLiBJbiB0aGF0IGNhc2UgdGhlIHN0YW5kYXJkIHByb3h5IGNhbGxzCi0JCS8vIHdpbGwgQUxXQVlTIG91dCBwZXJmb3JtIGdyZWF0bHkgdGhlIGV4cHJlc3Npb24gcHJvY2Vzc2VyIGJlY2F1c2UgdGhlcmUgaXMgbm8gbGF0ZW5jeSBpbiB0aGUgY29tbXVuaWNhdGlvbnMuIEl0IGlzIGJhc2ljYWxseQotCQkvLyBzdHJhaWdodCBkaXJlY3QgY2FsbHMuIFdoaWxlIGV4cHJlc3Npb24gcHJvY2Vzc2luZyBpcyBhbHNvIGRpcmVjdCBjYWxscywgdGhlIGNhbGwgcGF0aCBpcyBtdWNoIGxhcmdlciBiZWNhdXNlIGl0IG5lZWRzIHRvIAotCQkvLyBidWlsZC9tYWludGFpbi9leGVjdXRlIHRoZSBwcm9jZXNzaW5nIHN0YWNrLCByYXRoZXIgdGhhbiBqdXN0IGV4ZWN1dGUgdGhlIGNvbW1hbmQuIAotCQkvLwotCQkKLQkJLy8gVHJ5IHRvIHByaW1lIHRoZSBjb21tdW5pY2F0aW9uIHB1bXAuIFRoaXMgc2VuZHMgYWJvdXQgMzYsMDAwIGJ5dGVzIG9mIGRhdGEuCi0JCS8vIERvaW5nIGl0IGhlcmUgbWVhbnMgbGF0ZXIgd2hlbiBuZWVkZWQgdGhlIGNvbW11bmljYXRpb25zIGNvc3RzIGFyZSBkcmFzdGljYWxseSByZWR1Y2VkLgotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlpbnQgaSA9MTAwMDsKLQkJd2hpbGUgKGktLT4wKSB7Ci0JCQlleHAuY3JlYXRlQXJyYXlDcmVhdGlvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCByZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpCi0JCQkJCS5nZXRCZWFuVHlwZVByb3h5KGV4cCwgImphdmEubGFuZy5PYmplY3QiLCAxKSwgMCk7Ci0JCQlleHAuY3JlYXRlQXJyYXlJbml0aWFsaXplcigwKTsKLQkJfQotCQlleHAuaW52b2tlRXhwcmVzc2lvbigpOwotCQkKLQkJaW50IHRpbWVzID0gMjU7CS8vIE51bWJlciBvZiB0aW1lcyB0byBydW4gdGhlIHRlc3QuCi0JCWludCBiYXRjaFNpemUgPSAxMDA7CS8vIFNpemUgb2YgYmF0Y2ggZm9yIGVhY2ggdGVzdC4KLQkJCi0JCS8vIE5vdyBkbyB0aGUgYWN0dWFsIHRlc3QuCi0JCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJaSA9IHRpbWVzOwotCQl3aGlsZShpLS0+MCkgewotCQkJZXhwcmVzc2lvblNldHRpbmcocG9pbnRUeXBlLCBzZXRMb2NhdGlvbiwgZ2V0TG9jYXRpb24sIGJhdGNoU2l6ZSk7Ci0JCX0KLQkJbG9uZyBleHByZXNzaW9uVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLXN0YXJ0OwotCQlsb25nIHN0YXJ0Tm9ybWFsID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCWkgPSB0aW1lczsKLQkJd2hpbGUoaS0tPjApIHsKLQkJCW5vcm1hbFNldHRpbmcocG9pbnRUeXBlLCBzZXRMb2NhdGlvbiwgZ2V0TG9jYXRpb24sIGJhdGNoU2l6ZSk7Ci0JCX0KLQkJbG9uZyBub3JtYWxUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCktc3RhcnROb3JtYWw7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiTGFyZ2UgQmF0Y2ggcmVzdWx0czogQmF0Y2ggc2l6ZT0iK2JhdGNoU2l6ZSsiIE51bWJlciBvZiBydW5zPSIrdGltZXMpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkV4cHJlc3Npb24gVGltZTogIiArIGV4cHJlc3Npb25UaW1lICsgIiBBdmc6ICIgKyAoZXhwcmVzc2lvblRpbWUvKChkb3VibGUpIHRpbWVzKSkpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vcm1hbCBUaW1lOiAiICsgbm9ybWFsVGltZSsgIiBBdmc6ICIgKyAobm9ybWFsVGltZS8oKGRvdWJsZSkgdGltZXMpKSk7Ci0JCWlmIChub3JtYWxUaW1lID09IDApCi0JCQlub3JtYWxUaW1lID0gMTsJLy8gU28gbm8gZGl2aWRlIGJ5IHplcm8uCi0JCWludCBpbXByb3ZlbWVudCA9IChpbnQpICgoMS0oKGRvdWJsZSkgZXhwcmVzc2lvblRpbWUpL25vcm1hbFRpbWUpKjEwMCk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiSW1wcm92ZW1lbnQgb2YgZXhwcmVzc2lvbiBvdmVyIG5vcm1hbCB0aW1lOiAiK2ltcHJvdmVtZW50KyclJyk7Ci0JCS8vIE5vdGUgdGhhdCB0aGlzIHRlc3QgaXMgbm90IHZhbGlkIGZvciBJREUgYmVjYXVzZSB0aGUgSURFIHdpbGwgYWx3YXlzIGJlIG90aGVyIHdheSBhcm91bmQgYmVjYXVzZQotCQkvLyB0aGVyZSBpcyBubyBsYXRlbmN5IGRlbGF5IHRoZXJlLgotCQlpZiAoIShwcm94eUZhY3RvcnkgaW5zdGFuY2VvZiBJREVTdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkpKQotCQkJYXNzZXJ0VHJ1ZSgiTGVzcyB0aGFuIDc1JSBpbXByb3ZlbWVudDogIitpbXByb3ZlbWVudCsnJScsIGltcHJvdmVtZW50Pj03NSk7CS8vIFdlIGxpa2UgdGhpcyAlLgotCX0KLQkKLQlwcml2YXRlIHZvaWQgZXhwcmVzc2lvblNldHRpbmcoSUJlYW5UeXBlUHJveHkgcG9pbnRUeXBlLCBJTWV0aG9kUHJveHkgc2V0TG9jYXRpb24sIElNZXRob2RQcm94eSBnZXRMb2NhdGlvbiwgaW50IHRpbWVzKSB0aHJvd3MgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJLy8gVGhpcyBpcyB0aGUgc2FtZSBhcyBleHByZXNzaW9uU2V0dGluZyBleGNlcHQgaXQgdXNlcyByZWd1bGFyIHByb3h5IGFjY2VzcyBpbnN0ZWFkIG9mIGV4cHJlc3Npb25zLiBJdCBzaG91bGQgYmUKLQkJLy8gc2xvd2VyIGJlY2F1c2UgaXQgcmVxdWlyZXMgYSByb3VuZCB0cmlwIGZvciBlYWNoIGFjY2Vzcy4gRm9yIHJlbW90ZSBvbmx5LgotCQkvLyBUbyBmYWN0b3Igb3V0IHRoZSBvdmVyaGVhZCBvZiB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGV4cHJlc3Npb24gcHJvY2Vzc2luZywgd2Ugd2lsbCBkbyB0aGUgY3JlYXRlL3NldC9nZXQgMTAgdGltZXMuCi0JCS8vIFBvaW50IHAgPSBuZXcgUG9pbnQoKTsKLQkJLy8gcC5zZXRMb2NhdGlvbigzLDQpOwotCQkvLyBwLmdldExvY2F0aW9uKCk7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGltZXM7IGkrKykgewotCQkJRXhwcmVzc2lvblByb3h5IGVwUG9pbnQgPSBleHAuY3JlYXRlUHJveHlBc3NpZ25tZW50RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OKTsKLQkJCWV4cC5jcmVhdGVDbGFzc0luc3RhbmNlQ3JlYXRpb24oRm9yRXhwcmVzc2lvbi5BU1NJR05NRU5UX1JJR0hULCBwb2ludFR5cGUsIDApOwotCQkJZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShzZXRMb2NhdGlvbiwgZXBQb2ludCwgbmV3IElQcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCgzKSwgcHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoNCl9LCBmYWxzZSk7Ci0JCQlFeHByZXNzaW9uUHJveHkgZXBMb2MgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKGdldExvY2F0aW9uLCBlcFBvaW50LCBudWxsLCB0cnVlKTsKLQkJCWVwTG9jLmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25Qcm94eS5Qcm94eUFkYXB0ZXIoKSk7IC8vIEp1c3QgaGF2ZSBhIGxpc3RlbmVyLCB3ZSB3YW50IHRoZSBjYWxsYmFjayBvdmVyaGVhZCBhZGRlZCBpbi4KLQkJfQotCQlleHAuaW52b2tlRXhwcmVzc2lvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBub3JtYWxTZXR0aW5nKElCZWFuVHlwZVByb3h5IHBvaW50VHlwZSwgSU1ldGhvZFByb3h5IHNldExvY2F0aW9uLCBJTWV0aG9kUHJveHkgZ2V0TG9jYXRpb24sIGludCB0aW1lcykgdGhyb3dzIFRocm93YWJsZVByb3h5LCBBbWJpZ3VvdXNNZXRob2RFeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCS8vIFRoaXMgaXMgdGhlIHNhbWUgYXMgZXhwcmVzc2lvblNldHRpbmcgZXhjZXB0IGl0IHVzZXMgcmVndWxhciBwcm94eSBhY2Nlc3MgaW5zdGVhZCBvZiBleHByZXNzaW9ucy4gSXQgc2hvdWxkIGJlCi0JCS8vIHNsb3dlciBiZWNhdXNlIGl0IHJlcXVpcmVzIGEgcm91bmQgdHJpcCBmb3IgZWFjaCBhY2Nlc3MuCi0JCS8vIFRvIGZhY3RvciBvdXQgdGhlIG92ZXJoZWFkIG9mIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgZXhwcmVzc2lvbiBwcm9jZXNzaW5nLCB3ZSB3aWxsIGRvIHRoZSBjcmVhdGUvc2V0L2dldCAxMCB0aW1lcy4gVGhpcyBoZXJlIG1hdGNoZXMgdGhhdC4KLQkJLy8gUG9pbnQgcCA9IG5ldyBQb2ludCgpOwotCQkvLyBwLnNldExvY2F0aW9uKDMsNCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGltZXM7IGkrKykgewotCQkJSUJlYW5Qcm94eSBlcFBvaW50ID0gcG9pbnRUeXBlLm5ld0luc3RhbmNlKCk7Ci0JCQlzZXRMb2NhdGlvbi5pbnZva2VDYXRjaFRocm93YWJsZUV4Y2VwdGlvbnMoZXBQb2ludCwJbmV3IElCZWFuUHJveHlbXSB7cHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoMyksIHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKDQpfSk7Ci0JCQlnZXRMb2NhdGlvbi5pbnZva2VDYXRjaFRocm93YWJsZUV4Y2VwdGlvbnMoZXBQb2ludCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEJsb2NrKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJaW50IGJsb2NrbnVtID0gZXhwLmNyZWF0ZUJsb2NrQmVnaW4oKTsKLQkJRXhwcmVzc2lvblByb3h5IGVwQXJnID0gZXhwLmNyZWF0ZVByb3h5QXNzaWdubWVudEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTik7IAotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLkFTU0lHTk1FTlRfUklHSFQsIHRydWUpOwotCQlleHAuY3JlYXRlQmxvY2tCcmVhayhibG9ja251bSk7Ci0JCUV4cHJlc3Npb25Qcm94eSBlcEJvb2xlYW4gPSBleHAuY3JlYXRlUHJveHlBc3NpZ25tZW50RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OKTsKLQkJZXhwLmNyZWF0ZUNsYXNzSW5zdGFuY2VDcmVhdGlvbihGb3JFeHByZXNzaW9uLkFTU0lHTk1FTlRfUklHSFQsIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKSwgMSk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5DTEFTU0lOU1RBTkNFQ1JFQVRJT05fQVJHVU1FTlQsIEluZml4T3BlcmF0b3IuSU5fQ09ORElUSU9OQUxfQU5ELCAwKTsKLQkJZXhwLmNyZWF0ZVByb3h5RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIGVwQXJnKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgdHJ1ZSk7Ci0JCWV4cC5jcmVhdGVCbG9ja0VuZCgpOwotCQlFeHByZXNzaW9uTm90UmVzb2x2ZWQgZXBCb29sZWFubCA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKTsKLQkJZXBCb29sZWFuLmFkZFByb3h5TGlzdGVuZXIoZXBCb29sZWFubCk7Ci0JCWV4cC5pbnZva2VFeHByZXNzaW9uKCk7Ci0JCWFzc2VydFRydWUoZXBCb29sZWFubC5ub3RSZXNvbHZlZENhbGxlZCk7Ci0JfQotCi0JLyoKLQkgKiBBIHByb3h5IGxpc3RlbmVyIGNsYXNzIGZvciB0ZXN0IHB1cnBvc2VzIHRoYXQgcmVxdWlyZXMgcmVzb2x2ZWQgYnV0Ci0JICogd29uJ3QgYWxsb3cgbm90IHJlc29sdmVkIG9yIHZvaWQgcmVzb2x1dGlvbi4gSW1wbGltZW50IHRoZSByZXNvbHZlZAotCSAqIG1ldGhvZCB0byB0ZXN0IGZvciB2YWxpZCB2YWx1ZXMuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IGNsYXNzIEV4cHJlc3Npb25SZXNvbHZlZCBpbXBsZW1lbnRzIEV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyIHsKLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlMaXN0ZW5lciNwcm94eU5vdFJlc29sdmVkKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgcHJveHlOb3RSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQlmYWlsKCJQcm94eSBtdXN0IG5vdCBiZSB1bnJlc29sdmVkLiIpOwotCQl9Ci0JCQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyI3Byb3h5Vm9pZChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHByb3h5Vm9pZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQlmYWlsKCJQcm94eSBtdXN0IG5vdCBiZSB2b2lkIGFzc2lnbm1lbnQuIik7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGNsYXNzIEV4cHJlc3Npb25Ob3RSZXNvbHZlZCBpbXBsZW1lbnRzIEV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyIHsKLQkJcHVibGljIGJvb2xlYW4gbm90UmVzb2x2ZWRDYWxsZWQgPSBmYWxzZTsKLQkJCi0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5TGlzdGVuZXIjcHJveHlOb3RSZXNvbHZlZChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHByb3h5Tm90UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJbm90UmVzb2x2ZWRDYWxsZWQgPSB0cnVlOwotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5TGlzdGVuZXIjcHJveHlSZXNvbHZlZChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJZmFpbCgiUHJveHkgc2hvdWxkIG5vdCBvZiBiZWVuIHJlc29sdmVkLiBJdCBzaG91bGQgYmUgdW5yZXNvbHZlZC4iKTsKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyI3Byb3h5Vm9pZChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHByb3h5Vm9pZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQlmYWlsKCJQcm94eSBtdXN0IG5vdCBiZSB2b2lkIGFzc2lnbm1lbnQuIEl0IHNob3VsZCBiZSB1bnJlc29sdmVkLiIpOwotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBjbGFzcyBFeHByZXNzaW9uVm9pZCBpbXBsZW1lbnRzIEV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyIHsKLQkJcHVibGljIGJvb2xlYW4gdm9pZENhbGxlZCA9IGZhbHNlOwotCQkKLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlMaXN0ZW5lciNwcm94eU5vdFJlc29sdmVkKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgcHJveHlOb3RSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQlmYWlsKCJQcm94eSBzaG91bGQgb2YgYmVlbiB2b2lkIGFuZCBub3QgdW5yZXNvbHZlZC4iKTsKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyI3Byb3h5UmVzb2x2ZWQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCWZhaWwoIlByb3h5IHNob3VsZCBub3Qgb2YgYmVlbiByZXNvbHZlZCwgaXQgc2hvdWxkIG9mIGJlZW4gdm9pZC4uIik7Ci0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlMaXN0ZW5lciNwcm94eVZvaWQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwcm94eVZvaWQoUHJveHlFdmVudCBldmVudCkgewotCQkJdm9pZENhbGxlZCA9IHRydWU7Ci0JCX0KLQl9OwotCi0JcHVibGljIHZvaWQgdGVzdFRyeUNhdGNoTm9UaHJvdygpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCS8qCi0JCSAqIHRyeSB7Ci0JCSAqICAgeCA9IEJvb2xlYW4udmFsdWVPZih0cnVlKTsKLQkJICogfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCSAqICAgeSA9IEJvb2xlYW4udmFsdWVPZihmYWxzZSk7Ci0JCSAqIH0KLQkJICovCi0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVUcnkoKTsKLQkJRXhwcmVzc2lvblByb3h5IHhQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJ2YWx1ZU9mIiwgbmV3IFN0cmluZ1tdIHsiYm9vbGVhbiJ9KSwgbnVsbCwgbmV3IElQcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCh0cnVlKX0sIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgcnVudGltZUNhdGNoRXhjZXB0aW9uUHJveHkgPSBleHAuY3JlYXRlVHJ5Q2F0Y2hDbGF1c2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbiIpLCB0cnVlKTsKLQkJRXhwcmVzc2lvblByb3h5IHlQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJ2YWx1ZU9mIiwgbmV3IFN0cmluZ1tdIHsiYm9vbGVhbiJ9KSwgbnVsbCwgbmV3IElQcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChmYWxzZSl9LCB0cnVlKTsKLQkJZXhwLmNyZWF0ZVRyeUVuZCgpOwotCQl4UHJveHkuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblJlc29sdmVkKCkgewotCi0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyI3Byb3h5UmVzb2x2ZWQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCUlCZWFuUHJveHkgcHJveHkgPSBldmVudC5nZXRQcm94eSgpOwotCQkJCWFzc2VydEVxdWFscygiTm90IGEgQm9vbGVhbiBwcm94eToiK3Byb3h5LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCksIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKSwgcHJveHkuZ2V0VHlwZVByb3h5KCkpOwotCQkJCWFzc2VydFRydWUoKChJQm9vbGVhbkJlYW5Qcm94eSkgZXZlbnQuZ2V0UHJveHkoKSkuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9KTsKLQotCQlFeHByZXNzaW9uTm90UmVzb2x2ZWQgeVByb3h5UmVzb2x2ZXIgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCk7Ci0JCXlQcm94eS5hZGRQcm94eUxpc3RlbmVyKHlQcm94eVJlc29sdmVyKTsKLQkJRXhwcmVzc2lvbk5vdFJlc29sdmVkIHJ1bnRpbWVDYXRjaEV4Y2VwdGlvblByb3h5UmVzb2x2ZXIgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCk7Ci0JCXJ1bnRpbWVDYXRjaEV4Y2VwdGlvblByb3h5LmFkZFByb3h5TGlzdGVuZXIocnVudGltZUNhdGNoRXhjZXB0aW9uUHJveHlSZXNvbHZlcik7Ci0JCWV4cC5pbnZva2VFeHByZXNzaW9uKCk7Ci0JCQotCQlhc3NlcnRUcnVlKHlQcm94eVJlc29sdmVyLm5vdFJlc29sdmVkQ2FsbGVkKTsKLQkJYXNzZXJ0VHJ1ZShydW50aW1lQ2F0Y2hFeGNlcHRpb25Qcm94eVJlc29sdmVyLm5vdFJlc29sdmVkQ2FsbGVkKTsKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRyeTJDYXRjaE5vVGhyb3coKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQkvKgotCQkgKiB0cnkgewotCQkgKiAgIHRyeSB7Ci0JCSAqICAgICB4ID0gQm9vbGVhbi52YWx1ZU9mKHRydWUpOwotCQkgKiAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkgKiAgICAgeSA9IEJvb2xlYW4udmFsdWVPZihmYWxzZSk7Ci0JCSAqICAgfQotCQkgKiB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJICogICB6ID0gQm9vbGVhbi52YWx1ZU9mKGZhbHNlKTsKLQkJICogfQotCQkgKi8KLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZVRyeSgpOwotCQlleHAuY3JlYXRlVHJ5KCk7Ci0JCUV4cHJlc3Npb25Qcm94eSB4UHJveHkgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKS5nZXRNZXRob2RQcm94eSgidmFsdWVPZiIsIG5ldyBTdHJpbmdbXSB7ImJvb2xlYW4ifSksIG51bGwsIG5ldyBJUHJveHlbXSB7cHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgodHJ1ZSl9LCB0cnVlKTsKLQkJRXhwcmVzc2lvblByb3h5IHJ1bnRpbWVDYXRjaEV4Y2VwdGlvblByb3h5ID0gZXhwLmNyZWF0ZVRyeUNhdGNoQ2xhdXNlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24iKSwgdHJ1ZSk7Ci0JCUV4cHJlc3Npb25Qcm94eSB5UHJveHkgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKS5nZXRNZXRob2RQcm94eSgidmFsdWVPZiIsIG5ldyBTdHJpbmdbXSB7ImJvb2xlYW4ifSksIG51bGwsIG5ldyBJUHJveHlbXSB7cHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoZmFsc2UpfSwgdHJ1ZSk7Ci0JCWV4cC5jcmVhdGVUcnlFbmQoKTsKLQkJRXhwcmVzc2lvblByb3h5IHJ1bnRpbWVDYXRjaEV4Y2VwdGlvblByb3h5MiA9IGV4cC5jcmVhdGVUcnlDYXRjaENsYXVzZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uIiksIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgelByb3h5ID0gZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIikuZ2V0TWV0aG9kUHJveHkoInZhbHVlT2YiLCBuZXcgU3RyaW5nW10geyJib29sZWFuIn0pLCBudWxsLCBuZXcgSVByb3h5W10ge3Byb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGZhbHNlKX0sIHRydWUpOwotCQlleHAuY3JlYXRlVHJ5RW5kKCk7Ci0KLQkJeFByb3h5LmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpIHsKLQotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlMaXN0ZW5lciNwcm94eVJlc29sdmVkKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlJQmVhblByb3h5IHByb3h5ID0gZXZlbnQuZ2V0UHJveHkoKTsKLQkJCQlhc3NlcnRFcXVhbHMoIk5vdCBhIEJvb2xlYW4gcHJveHk6Iitwcm94eS5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpLCBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIiksIHByb3h5LmdldFR5cGVQcm94eSgpKTsKLQkJCQlhc3NlcnRUcnVlKCgoSUJvb2xlYW5CZWFuUHJveHkpIGV2ZW50LmdldFByb3h5KCkpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQkJfSk7Ci0KLQkJRXhwcmVzc2lvbk5vdFJlc29sdmVkIHlQcm94eVJlc29sdmVyID0gbmV3IEV4cHJlc3Npb25Ob3RSZXNvbHZlZCgpOwotCQl5UHJveHkuYWRkUHJveHlMaXN0ZW5lcih5UHJveHlSZXNvbHZlcik7Ci0JCUV4cHJlc3Npb25Ob3RSZXNvbHZlZCBydW50aW1lQ2F0Y2hFeGNlcHRpb25Qcm94eVJlc29sdmVyID0gbmV3IEV4cHJlc3Npb25Ob3RSZXNvbHZlZCgpOwotCQlydW50aW1lQ2F0Y2hFeGNlcHRpb25Qcm94eS5hZGRQcm94eUxpc3RlbmVyKHJ1bnRpbWVDYXRjaEV4Y2VwdGlvblByb3h5UmVzb2x2ZXIpOwotCQlFeHByZXNzaW9uTm90UmVzb2x2ZWQgelByb3h5UmVzb2x2ZXIgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCk7Ci0JCXpQcm94eS5hZGRQcm94eUxpc3RlbmVyKHpQcm94eVJlc29sdmVyKTsKLQkJRXhwcmVzc2lvbk5vdFJlc29sdmVkIHJ1bnRpbWVDYXRjaEV4Y2VwdGlvblByb3h5UmVzb2x2ZXIyID0gbmV3IEV4cHJlc3Npb25Ob3RSZXNvbHZlZCgpOwotCQlydW50aW1lQ2F0Y2hFeGNlcHRpb25Qcm94eTIuYWRkUHJveHlMaXN0ZW5lcihydW50aW1lQ2F0Y2hFeGNlcHRpb25Qcm94eVJlc29sdmVyMik7Ci0JCQotCQlleHAuaW52b2tlRXhwcmVzc2lvbigpOwotCQkKLQkJYXNzZXJ0VHJ1ZSh5UHJveHlSZXNvbHZlci5ub3RSZXNvbHZlZENhbGxlZCk7Ci0JCWFzc2VydFRydWUocnVudGltZUNhdGNoRXhjZXB0aW9uUHJveHlSZXNvbHZlci5ub3RSZXNvbHZlZENhbGxlZCk7Ci0JCWFzc2VydFRydWUoelByb3h5UmVzb2x2ZXIubm90UmVzb2x2ZWRDYWxsZWQpOwotCQlhc3NlcnRUcnVlKHJ1bnRpbWVDYXRjaEV4Y2VwdGlvblByb3h5UmVzb2x2ZXIyLm5vdFJlc29sdmVkQ2FsbGVkKTsKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRyeTJDYXRjaFRocm93VHJ5MSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCS8qCi0JCSAqIHRyeSB7Ci0JCSAqICAgdyA9IChudWxsKS5ib29sZWFuVmFsdWUoKTsKLQkJICogICB0cnkgewotCQkgKiAgICAgeCA9IEJvb2xlYW4udmFsdWVPZih0cnVlKTsKLQkJICogICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJICogICAgIHkgPSBCb29sZWFuLnZhbHVlT2YoZmFsc2UpOwotCQkgKiAgIH0KLQkJICogfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCSAqICAgeiA9IEJvb2xlYW4udmFsdWVPZihmYWxzZSk7Ci0JCSAqIH0KLQkJICovCi0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVUcnkoKTsKLQkJRXhwcmVzc2lvblByb3h5IHdQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJib29sZWFuVmFsdWUiKSwgbnVsbCwgbnVsbCwgdHJ1ZSk7CQkKLQkJZXhwLmNyZWF0ZVRyeSgpOwotCQlFeHByZXNzaW9uUHJveHkgeFByb3h5ID0gZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIikuZ2V0TWV0aG9kUHJveHkoInZhbHVlT2YiLCBuZXcgU3RyaW5nW10geyJib29sZWFuIn0pLCBudWxsLCBuZXcgSVByb3h5W10ge3Byb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKHRydWUpfSwgdHJ1ZSk7Ci0JCUV4cHJlc3Npb25Qcm94eSBydW50aW1lQ2F0Y2hFeGNlcHRpb25Qcm94eSA9IGV4cC5jcmVhdGVUcnlDYXRjaENsYXVzZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uIiksIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgeVByb3h5ID0gZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIikuZ2V0TWV0aG9kUHJveHkoInZhbHVlT2YiLCBuZXcgU3RyaW5nW10geyJib29sZWFuIn0pLCBudWxsLCBuZXcgSVByb3h5W10ge3Byb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGZhbHNlKX0sIHRydWUpOwotCQlleHAuY3JlYXRlVHJ5RW5kKCk7Ci0JCUV4cHJlc3Npb25Qcm94eSBydW50aW1lQ2F0Y2hFeGNlcHRpb25Qcm94eTIgPSBleHAuY3JlYXRlVHJ5Q2F0Y2hDbGF1c2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbiIpLCB0cnVlKTsKLQkJRXhwcmVzc2lvblByb3h5IHpQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJ2YWx1ZU9mIiwgbmV3IFN0cmluZ1tdIHsiYm9vbGVhbiJ9KSwgbnVsbCwgbmV3IElQcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChmYWxzZSl9LCB0cnVlKTsKLQkJZXhwLmNyZWF0ZVRyeUVuZCgpOwotCi0JCUV4cHJlc3Npb25Ob3RSZXNvbHZlZCB3UHJveHlSZXNvbHZlciA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKTsKLQkJd1Byb3h5LmFkZFByb3h5TGlzdGVuZXIod1Byb3h5UmVzb2x2ZXIpOwotCi0JCUV4cHJlc3Npb25Ob3RSZXNvbHZlZCB4UHJveHlSZXNvbHZlciA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKTsKLQkJeFByb3h5LmFkZFByb3h5TGlzdGVuZXIoeFByb3h5UmVzb2x2ZXIpOwotCi0JCUV4cHJlc3Npb25Ob3RSZXNvbHZlZCB5UHJveHlSZXNvbHZlciA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKTsKLQkJeVByb3h5LmFkZFByb3h5TGlzdGVuZXIoeVByb3h5UmVzb2x2ZXIpOwotCQlFeHByZXNzaW9uTm90UmVzb2x2ZWQgcnVudGltZUNhdGNoRXhjZXB0aW9uUHJveHlSZXNvbHZlciA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKTsKLQkJcnVudGltZUNhdGNoRXhjZXB0aW9uUHJveHkuYWRkUHJveHlMaXN0ZW5lcihydW50aW1lQ2F0Y2hFeGNlcHRpb25Qcm94eVJlc29sdmVyKTsKLQkJelByb3h5LmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpIHsKLQotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlMaXN0ZW5lciNwcm94eVJlc29sdmVkKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlJQmVhblByb3h5IHByb3h5ID0gZXZlbnQuZ2V0UHJveHkoKTsKLQkJCQlhc3NlcnRFcXVhbHMoIk5vdCBhIEJvb2xlYW4gcHJveHk6Iitwcm94eS5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpLCBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIiksIHByb3h5LmdldFR5cGVQcm94eSgpKTsKLQkJCQlhc3NlcnRGYWxzZSgoKElCb29sZWFuQmVhblByb3h5KSBldmVudC5nZXRQcm94eSgpKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX0pOwotCQlydW50aW1lQ2F0Y2hFeGNlcHRpb25Qcm94eTIuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblJlc29sdmVkKCkgewotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlMaXN0ZW5lciNwcm94eVJlc29sdmVkKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbiIsIGV2ZW50LmdldFByb3h5KCkuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJZXhwLmludm9rZUV4cHJlc3Npb24oKTsKLQkJCi0JCWFzc2VydFRydWUod1Byb3h5UmVzb2x2ZXIubm90UmVzb2x2ZWRDYWxsZWQpOwotCQlhc3NlcnRUcnVlKHhQcm94eVJlc29sdmVyLm5vdFJlc29sdmVkQ2FsbGVkKTsKLQkJYXNzZXJ0VHJ1ZSh5UHJveHlSZXNvbHZlci5ub3RSZXNvbHZlZENhbGxlZCk7Ci0JCWFzc2VydFRydWUocnVudGltZUNhdGNoRXhjZXB0aW9uUHJveHlSZXNvbHZlci5ub3RSZXNvbHZlZENhbGxlZCk7Ci0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUcnkyQ2F0Y2hUaHJvd1RyeTJDYXRjaCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCS8qCi0JCSAqIHRyeSB7Ci0JCSAqICAgdHJ5IHsKLQkJICogICAgIHggPSAobnVsbCkuYm9vbGVhblZhbHVlKCk7Ci0JCSAqICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCSAqICAgICB5ID0gQm9vbGVhbi52YWx1ZU9mKGZhbHNlKTsKLQkJICogICB9Ci0JCSAqICAgdyA9IEJvb2xlYW4udmFsdWVPZih0cnVlKTsKLQkJICogfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCSAqICAgeiA9IEJvb2xlYW4udmFsdWVPZihmYWxzZSk7Ci0JCSAqIH0KLQkJICovCi0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVUcnkoKTsKLQkJZXhwLmNyZWF0ZVRyeSgpOwotCQlFeHByZXNzaW9uUHJveHkgeFByb3h5ID0gZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIikuZ2V0TWV0aG9kUHJveHkoImJvb2xlYW5WYWx1ZSIpLCBudWxsLCBudWxsLCB0cnVlKTsKLQkJRXhwcmVzc2lvblByb3h5IHJ1bnRpbWVDYXRjaEV4Y2VwdGlvblByb3h5ID0gZXhwLmNyZWF0ZVRyeUNhdGNoQ2xhdXNlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24iKSwgdHJ1ZSk7Ci0JCUV4cHJlc3Npb25Qcm94eSB5UHJveHkgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKS5nZXRNZXRob2RQcm94eSgidmFsdWVPZiIsIG5ldyBTdHJpbmdbXSB7ImJvb2xlYW4ifSksIG51bGwsIG5ldyBJUHJveHlbXSB7cHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoZmFsc2UpfSwgdHJ1ZSk7Ci0JCWV4cC5jcmVhdGVUcnlFbmQoKTsKLQkJRXhwcmVzc2lvblByb3h5IHdQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJ2YWx1ZU9mIiwgbmV3IFN0cmluZ1tdIHsiYm9vbGVhbiJ9KSwgbnVsbCwgbmV3IElQcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCh0cnVlKX0sIHRydWUpOwkJCi0JCUV4cHJlc3Npb25Qcm94eSBydW50aW1lQ2F0Y2hFeGNlcHRpb25Qcm94eTIgPSBleHAuY3JlYXRlVHJ5Q2F0Y2hDbGF1c2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbiIpLCB0cnVlKTsKLQkJRXhwcmVzc2lvblByb3h5IHpQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJ2YWx1ZU9mIiwgbmV3IFN0cmluZ1tdIHsiYm9vbGVhbiJ9KSwgbnVsbCwgbmV3IElQcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChmYWxzZSl9LCB0cnVlKTsKLQkJZXhwLmNyZWF0ZVRyeUVuZCgpOwotCi0JCUV4cHJlc3Npb25Ob3RSZXNvbHZlZCB4UHJveHlSZXNvbHZlciA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKTsKLQkJeFByb3h5LmFkZFByb3h5TGlzdGVuZXIoeFByb3h5UmVzb2x2ZXIpOwotCQlydW50aW1lQ2F0Y2hFeGNlcHRpb25Qcm94eS5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uUmVzb2x2ZWQoKSB7Ci0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyI3Byb3h5UmVzb2x2ZWQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCWFzc2VydEVxdWFscygiamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uIiwgZXZlbnQuZ2V0UHJveHkoKS5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJCX0KLQkJfSk7Ci0KLQkJeVByb3h5LmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpIHsKLQotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlMaXN0ZW5lciNwcm94eVJlc29sdmVkKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlJQmVhblByb3h5IHByb3h5ID0gZXZlbnQuZ2V0UHJveHkoKTsKLQkJCQlhc3NlcnRFcXVhbHMoIk5vdCBhIEJvb2xlYW4gcHJveHk6Iitwcm94eS5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpLCBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIiksIHByb3h5LmdldFR5cGVQcm94eSgpKTsKLQkJCQlhc3NlcnRGYWxzZSgoKElCb29sZWFuQmVhblByb3h5KSBldmVudC5nZXRQcm94eSgpKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX0pOwkJCi0JCXdQcm94eS5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uUmVzb2x2ZWQoKSB7Ci0KLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5TGlzdGVuZXIjcHJveHlSZXNvbHZlZChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlFdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJSUJlYW5Qcm94eSBwcm94eSA9IGV2ZW50LmdldFByb3h5KCk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJOb3QgYSBCb29sZWFuIHByb3h5OiIrcHJveHkuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSwgcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLCBwcm94eS5nZXRUeXBlUHJveHkoKSk7Ci0JCQkJYXNzZXJ0VHJ1ZSgoKElCb29sZWFuQmVhblByb3h5KSBldmVudC5nZXRQcm94eSgpKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJRXhwcmVzc2lvbk5vdFJlc29sdmVkIHJ1bnRpbWVDYXRjaEV4Y2VwdGlvblByb3h5UmVzb2x2ZXIyID0gbmV3IEV4cHJlc3Npb25Ob3RSZXNvbHZlZCgpOwotCQlydW50aW1lQ2F0Y2hFeGNlcHRpb25Qcm94eTIuYWRkUHJveHlMaXN0ZW5lcihydW50aW1lQ2F0Y2hFeGNlcHRpb25Qcm94eVJlc29sdmVyMik7Ci0JCUV4cHJlc3Npb25Ob3RSZXNvbHZlZCB6UHJveHlSZXNvbHZlciA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKTsKLQkJelByb3h5LmFkZFByb3h5TGlzdGVuZXIoelByb3h5UmVzb2x2ZXIpOwotCQkKLQkJZXhwLmludm9rZUV4cHJlc3Npb24oKTsKLQkJCi0JCWFzc2VydFRydWUoeFByb3h5UmVzb2x2ZXIubm90UmVzb2x2ZWRDYWxsZWQpOwotCQlhc3NlcnRUcnVlKHJ1bnRpbWVDYXRjaEV4Y2VwdGlvblByb3h5UmVzb2x2ZXIyLm5vdFJlc29sdmVkQ2FsbGVkKTsKLQkJYXNzZXJ0VHJ1ZSh6UHJveHlSZXNvbHZlci5ub3RSZXNvbHZlZENhbGxlZCk7Ci0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUcnkyQ2F0Y2hUaHJvd1RyeTJDYXRjaDEoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQkvKgotCQkgKiB0cnkgewotCQkgKiAgIHRyeSB7Ci0JCSAqICAgICB4ID0gKG51bGwpLmJvb2xlYW5WYWx1ZSgpOwotCQkgKiAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCSAqICAgICB5ID0gQm9vbGVhbi52YWx1ZU9mKGZhbHNlKTsKLQkJICogICB9Ci0JCSAqICAgdyA9IEJvb2xlYW4udmFsdWVPZih0cnVlKTsKLQkJICogfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCSAqICAgeiA9IEJvb2xlYW4udmFsdWVPZihmYWxzZSk7Ci0JCSAqIH0KLQkJICovCi0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVUcnkoKTsKLQkJZXhwLmNyZWF0ZVRyeSgpOwotCQlFeHByZXNzaW9uUHJveHkgeFByb3h5ID0gZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIikuZ2V0TWV0aG9kUHJveHkoImJvb2xlYW5WYWx1ZSIpLCBudWxsLCBudWxsLCB0cnVlKTsKLQkJRXhwcmVzc2lvblByb3h5IGlsbGVnYWxBcmd1bWVudENhdGNoRXhjZXB0aW9uUHJveHkgPSBleHAuY3JlYXRlVHJ5Q2F0Y2hDbGF1c2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIiksIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgeVByb3h5ID0gZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIikuZ2V0TWV0aG9kUHJveHkoInZhbHVlT2YiLCBuZXcgU3RyaW5nW10geyJib29sZWFuIn0pLCBudWxsLCBuZXcgSVByb3h5W10ge3Byb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGZhbHNlKX0sIHRydWUpOwotCQlleHAuY3JlYXRlVHJ5RW5kKCk7Ci0JCUV4cHJlc3Npb25Qcm94eSB3UHJveHkgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKS5nZXRNZXRob2RQcm94eSgidmFsdWVPZiIsIG5ldyBTdHJpbmdbXSB7ImJvb2xlYW4ifSksIG51bGwsIG5ldyBJUHJveHlbXSB7cHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgodHJ1ZSl9LCB0cnVlKTsJCQotCQlFeHByZXNzaW9uUHJveHkgcnVudGltZUNhdGNoRXhjZXB0aW9uUHJveHkyID0gZXhwLmNyZWF0ZVRyeUNhdGNoQ2xhdXNlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24iKSwgdHJ1ZSk7Ci0JCUV4cHJlc3Npb25Qcm94eSB6UHJveHkgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKS5nZXRNZXRob2RQcm94eSgidmFsdWVPZiIsIG5ldyBTdHJpbmdbXSB7ImJvb2xlYW4ifSksIG51bGwsIG5ldyBJUHJveHlbXSB7cHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoZmFsc2UpfSwgdHJ1ZSk7Ci0JCWV4cC5jcmVhdGVUcnlFbmQoKTsKLQotCQlFeHByZXNzaW9uTm90UmVzb2x2ZWQgeFByb3h5UmVzb2x2ZXIgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCk7Ci0JCXhQcm94eS5hZGRQcm94eUxpc3RlbmVyKHhQcm94eVJlc29sdmVyKTsKLQkJRXhwcmVzc2lvbk5vdFJlc29sdmVkIGlsbGVnYWxBcmd1bWVudENhdGNoUHJveHlSZXNvbHZlciA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKTsKLQkJaWxsZWdhbEFyZ3VtZW50Q2F0Y2hFeGNlcHRpb25Qcm94eS5hZGRQcm94eUxpc3RlbmVyKGlsbGVnYWxBcmd1bWVudENhdGNoUHJveHlSZXNvbHZlcik7Ci0KLQkJRXhwcmVzc2lvbk5vdFJlc29sdmVkIHlQcm94eVJlc29sdmVyID0gbmV3IEV4cHJlc3Npb25Ob3RSZXNvbHZlZCgpOwotCQl5UHJveHkuYWRkUHJveHlMaXN0ZW5lcih5UHJveHlSZXNvbHZlcik7Ci0JCUV4cHJlc3Npb25Ob3RSZXNvbHZlZCB3UHJveHlSZXNvbHZlciA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKTsKLQkJd1Byb3h5LmFkZFByb3h5TGlzdGVuZXIod1Byb3h5UmVzb2x2ZXIpOwotCQkKLQkJcnVudGltZUNhdGNoRXhjZXB0aW9uUHJveHkyLmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpIHsKLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5TGlzdGVuZXIjcHJveHlSZXNvbHZlZChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlFdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24iLCBldmVudC5nZXRQcm94eSgpLmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQkJfQotCQl9KTsKLQkJelByb3h5LmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpIHsKLQotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlMaXN0ZW5lciNwcm94eVJlc29sdmVkKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlJQmVhblByb3h5IHByb3h5ID0gZXZlbnQuZ2V0UHJveHkoKTsKLQkJCQlhc3NlcnRFcXVhbHMoIk5vdCBhIEJvb2xlYW4gcHJveHk6Iitwcm94eS5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpLCBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIiksIHByb3h5LmdldFR5cGVQcm94eSgpKTsKLQkJCQlhc3NlcnRGYWxzZSgoKElCb29sZWFuQmVhblByb3h5KSBldmVudC5nZXRQcm94eSgpKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJZXhwLmludm9rZUV4cHJlc3Npb24oKTsKLQkJCi0JCWFzc2VydFRydWUoeFByb3h5UmVzb2x2ZXIubm90UmVzb2x2ZWRDYWxsZWQpOwotCQlhc3NlcnRUcnVlKGlsbGVnYWxBcmd1bWVudENhdGNoUHJveHlSZXNvbHZlci5ub3RSZXNvbHZlZENhbGxlZCk7Ci0JCWFzc2VydFRydWUoeVByb3h5UmVzb2x2ZXIubm90UmVzb2x2ZWRDYWxsZWQpOwotCQlhc3NlcnRUcnVlKHdQcm94eVJlc29sdmVyLm5vdFJlc29sdmVkQ2FsbGVkKTsKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRyeTJDYXRjaFRocm93VHJ5MkZpbmFsbHkyQ2F0Y2gxKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJLyoKLQkJICogdHJ5IHsKLQkJICogICB0cnkgewotCQkgKiAgICAgeCA9IChudWxsKS5ib29sZWFuVmFsdWUoKTsKLQkJICogICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkgKiAgICAgeSA9IEJvb2xlYW4udmFsdWVPZihmYWxzZSk7Ci0JCSAqICAgfSBmaW5hbGx5IHsKLQkJICogICAgIHYgPSBCb29sZWFuLnZhbHVlT2YoZmFsc2UpOwotCQkgKiAgIH0KLQkJICogICB3ID0gQm9vbGVhbi52YWx1ZU9mKHRydWUpOwotCQkgKiB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJICogICB6ID0gQm9vbGVhbi52YWx1ZU9mKGZhbHNlKTsKLQkJICogfQotCQkgKi8KLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZVRyeSgpOwotCQlleHAuY3JlYXRlVHJ5KCk7Ci0JCUV4cHJlc3Npb25Qcm94eSB4UHJveHkgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKS5nZXRNZXRob2RQcm94eSgiYm9vbGVhblZhbHVlIiksIG51bGwsIG51bGwsIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgaWxsZWdhbEFyZ3VtZW50Q2F0Y2hFeGNlcHRpb25Qcm94eSA9IGV4cC5jcmVhdGVUcnlDYXRjaENsYXVzZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iKSwgdHJ1ZSk7Ci0JCUV4cHJlc3Npb25Qcm94eSB5UHJveHkgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKS5nZXRNZXRob2RQcm94eSgidmFsdWVPZiIsIG5ldyBTdHJpbmdbXSB7ImJvb2xlYW4ifSksIG51bGwsIG5ldyBJUHJveHlbXSB7cHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoZmFsc2UpfSwgdHJ1ZSk7Ci0JCWV4cC5jcmVhdGVUcnlGaW5hbGx5Q2xhdXNlKCk7Ci0JCUV4cHJlc3Npb25Qcm94eSB2UHJveHkgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKS5nZXRNZXRob2RQcm94eSgidmFsdWVPZiIsIG5ldyBTdHJpbmdbXSB7ImJvb2xlYW4ifSksIG51bGwsIG5ldyBJUHJveHlbXSB7cHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoZmFsc2UpfSwgdHJ1ZSk7Ci0JCWV4cC5jcmVhdGVUcnlFbmQoKTsKLQkJRXhwcmVzc2lvblByb3h5IHdQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJ2YWx1ZU9mIiwgbmV3IFN0cmluZ1tdIHsiYm9vbGVhbiJ9KSwgbnVsbCwgbmV3IElQcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCh0cnVlKX0sIHRydWUpOwkJCi0JCUV4cHJlc3Npb25Qcm94eSBydW50aW1lQ2F0Y2hFeGNlcHRpb25Qcm94eTIgPSBleHAuY3JlYXRlVHJ5Q2F0Y2hDbGF1c2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbiIpLCB0cnVlKTsKLQkJRXhwcmVzc2lvblByb3h5IHpQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJ2YWx1ZU9mIiwgbmV3IFN0cmluZ1tdIHsiYm9vbGVhbiJ9KSwgbnVsbCwgbmV3IElQcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChmYWxzZSl9LCB0cnVlKTsKLQkJZXhwLmNyZWF0ZVRyeUVuZCgpOwotCi0JCUV4cHJlc3Npb25Ob3RSZXNvbHZlZCB4UHJveHlSZXNvbHZlciA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKTsKLQkJeFByb3h5LmFkZFByb3h5TGlzdGVuZXIoeFByb3h5UmVzb2x2ZXIpOwotCQlFeHByZXNzaW9uTm90UmVzb2x2ZWQgaWxsZWdhbEFyZ3VtZW50Q2F0Y2hQcm94eVJlc29sdmVyID0gbmV3IEV4cHJlc3Npb25Ob3RSZXNvbHZlZCgpOwotCQlpbGxlZ2FsQXJndW1lbnRDYXRjaEV4Y2VwdGlvblByb3h5LmFkZFByb3h5TGlzdGVuZXIoaWxsZWdhbEFyZ3VtZW50Q2F0Y2hQcm94eVJlc29sdmVyKTsKLQotCQlFeHByZXNzaW9uTm90UmVzb2x2ZWQgeVByb3h5UmVzb2x2ZXIgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCk7Ci0JCXlQcm94eS5hZGRQcm94eUxpc3RlbmVyKHlQcm94eVJlc29sdmVyKTsKLQkJdlByb3h5LmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpIHsKLQotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlMaXN0ZW5lciNwcm94eVJlc29sdmVkKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlJQmVhblByb3h5IHByb3h5ID0gZXZlbnQuZ2V0UHJveHkoKTsKLQkJCQlhc3NlcnRFcXVhbHMoIk5vdCBhIEJvb2xlYW4gcHJveHk6Iitwcm94eS5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpLCBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIiksIHByb3h5LmdldFR5cGVQcm94eSgpKTsKLQkJCQlhc3NlcnRGYWxzZSgoKElCb29sZWFuQmVhblByb3h5KSBldmVudC5nZXRQcm94eSgpKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCUV4cHJlc3Npb25Ob3RSZXNvbHZlZCB3UHJveHlSZXNvbHZlciA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKTsKLQkJd1Byb3h5LmFkZFByb3h5TGlzdGVuZXIod1Byb3h5UmVzb2x2ZXIpOwotCQkKLQkJcnVudGltZUNhdGNoRXhjZXB0aW9uUHJveHkyLmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpIHsKLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5TGlzdGVuZXIjcHJveHlSZXNvbHZlZChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlFdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24iLCBldmVudC5nZXRQcm94eSgpLmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQkJfQotCQl9KTsKLQkJelByb3h5LmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpIHsKLQotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlMaXN0ZW5lciNwcm94eVJlc29sdmVkKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlJQmVhblByb3h5IHByb3h5ID0gZXZlbnQuZ2V0UHJveHkoKTsKLQkJCQlhc3NlcnRFcXVhbHMoIk5vdCBhIEJvb2xlYW4gcHJveHk6Iitwcm94eS5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpLCBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIiksIHByb3h5LmdldFR5cGVQcm94eSgpKTsKLQkJCQlhc3NlcnRGYWxzZSgoKElCb29sZWFuQmVhblByb3h5KSBldmVudC5nZXRQcm94eSgpKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJZXhwLmludm9rZUV4cHJlc3Npb24oKTsKLQkJCi0JCWFzc2VydFRydWUoeFByb3h5UmVzb2x2ZXIubm90UmVzb2x2ZWRDYWxsZWQpOwotCQlhc3NlcnRUcnVlKGlsbGVnYWxBcmd1bWVudENhdGNoUHJveHlSZXNvbHZlci5ub3RSZXNvbHZlZENhbGxlZCk7Ci0JCWFzc2VydFRydWUoeVByb3h5UmVzb2x2ZXIubm90UmVzb2x2ZWRDYWxsZWQpOwotCQlhc3NlcnRUcnVlKHdQcm94eVJlc29sdmVyLm5vdFJlc29sdmVkQ2FsbGVkKTsKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRyeTJDYXRjaFRocm93VHJ5MkZpbmFsbHkyTm9DYXRjaCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCS8qCi0JCSAqIHRyeSB7Ci0JCSAqICAgdHJ5IHsKLQkJICogICAgIHggPSAobnVsbCkuYm9vbGVhblZhbHVlKCk7Ci0JCSAqICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJICogICAgIHkgPSBCb29sZWFuLnZhbHVlT2YoZmFsc2UpOwotCQkgKiAgIH0gZmluYWxseSB7Ci0JCSAqICAgICB2ID0gQm9vbGVhbi52YWx1ZU9mKGZhbHNlKTsKLQkJICogICB9Ci0JCSAqICAgdyA9IEJvb2xlYW4udmFsdWVPZih0cnVlKTsKLQkJICogfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJICogICB6ID0gQm9vbGVhbi52YWx1ZU9mKGZhbHNlKTsKLQkJICogfQotCQkgKi8KLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZVRyeSgpOwotCQlleHAuY3JlYXRlVHJ5KCk7Ci0JCUV4cHJlc3Npb25Qcm94eSB4UHJveHkgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKS5nZXRNZXRob2RQcm94eSgiYm9vbGVhblZhbHVlIiksIG51bGwsIG51bGwsIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgaWxsZWdhbEFyZ3VtZW50Q2F0Y2hFeGNlcHRpb25Qcm94eSA9IGV4cC5jcmVhdGVUcnlDYXRjaENsYXVzZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iKSwgdHJ1ZSk7Ci0JCUV4cHJlc3Npb25Qcm94eSB5UHJveHkgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKS5nZXRNZXRob2RQcm94eSgidmFsdWVPZiIsIG5ldyBTdHJpbmdbXSB7ImJvb2xlYW4ifSksIG51bGwsIG5ldyBJUHJveHlbXSB7cHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoZmFsc2UpfSwgdHJ1ZSk7Ci0JCWV4cC5jcmVhdGVUcnlGaW5hbGx5Q2xhdXNlKCk7Ci0JCUV4cHJlc3Npb25Qcm94eSB2UHJveHkgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKS5nZXRNZXRob2RQcm94eSgidmFsdWVPZiIsIG5ldyBTdHJpbmdbXSB7ImJvb2xlYW4ifSksIG51bGwsIG5ldyBJUHJveHlbXSB7cHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoZmFsc2UpfSwgdHJ1ZSk7Ci0JCWV4cC5jcmVhdGVUcnlFbmQoKTsKLQkJRXhwcmVzc2lvblByb3h5IHdQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJ2YWx1ZU9mIiwgbmV3IFN0cmluZ1tdIHsiYm9vbGVhbiJ9KSwgbnVsbCwgbmV3IElQcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCh0cnVlKX0sIHRydWUpOwkJCi0JCUV4cHJlc3Npb25Qcm94eSBpbGxlZ2FsQXJndW1lbnRDYXRjaEV4Y2VwdGlvblByb3h5MiA9IGV4cC5jcmVhdGVUcnlDYXRjaENsYXVzZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iKSwgdHJ1ZSk7Ci0JCUV4cHJlc3Npb25Qcm94eSB6UHJveHkgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKS5nZXRNZXRob2RQcm94eSgidmFsdWVPZiIsIG5ldyBTdHJpbmdbXSB7ImJvb2xlYW4ifSksIG51bGwsIG5ldyBJUHJveHlbXSB7cHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoZmFsc2UpfSwgdHJ1ZSk7Ci0JCWV4cC5jcmVhdGVUcnlFbmQoKTsKLQotCQlFeHByZXNzaW9uTm90UmVzb2x2ZWQgeFByb3h5UmVzb2x2ZXIgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCk7Ci0JCXhQcm94eS5hZGRQcm94eUxpc3RlbmVyKHhQcm94eVJlc29sdmVyKTsKLQkJRXhwcmVzc2lvbk5vdFJlc29sdmVkIGlsbGVnYWxBcmd1bWVudENhdGNoUHJveHlSZXNvbHZlciA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKTsKLQkJaWxsZWdhbEFyZ3VtZW50Q2F0Y2hFeGNlcHRpb25Qcm94eS5hZGRQcm94eUxpc3RlbmVyKGlsbGVnYWxBcmd1bWVudENhdGNoUHJveHlSZXNvbHZlcik7Ci0KLQkJRXhwcmVzc2lvbk5vdFJlc29sdmVkIHlQcm94eVJlc29sdmVyID0gbmV3IEV4cHJlc3Npb25Ob3RSZXNvbHZlZCgpOwotCQl5UHJveHkuYWRkUHJveHlMaXN0ZW5lcih5UHJveHlSZXNvbHZlcik7Ci0JCXZQcm94eS5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uUmVzb2x2ZWQoKSB7Ci0KLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5TGlzdGVuZXIjcHJveHlSZXNvbHZlZChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlFdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJSUJlYW5Qcm94eSBwcm94eSA9IGV2ZW50LmdldFByb3h5KCk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJOb3QgYSBCb29sZWFuIHByb3h5OiIrcHJveHkuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSwgcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLCBwcm94eS5nZXRUeXBlUHJveHkoKSk7Ci0JCQkJYXNzZXJ0RmFsc2UoKChJQm9vbGVhbkJlYW5Qcm94eSkgZXZlbnQuZ2V0UHJveHkoKSkuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9KTsKLQotCQlFeHByZXNzaW9uTm90UmVzb2x2ZWQgd1Byb3h5UmVzb2x2ZXIgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCk7Ci0JCXdQcm94eS5hZGRQcm94eUxpc3RlbmVyKHdQcm94eVJlc29sdmVyKTsKLQkJCi0JCUV4cHJlc3Npb25Ob3RSZXNvbHZlZCBpbGxlZ2FsQXJndW1lbnRDYXRjaEV4Y2VwdGlvblByb3h5UmVzb2x2ZXIyID0gbmV3IEV4cHJlc3Npb25Ob3RSZXNvbHZlZCgpOwotCQlpbGxlZ2FsQXJndW1lbnRDYXRjaEV4Y2VwdGlvblByb3h5Mi5hZGRQcm94eUxpc3RlbmVyKGlsbGVnYWxBcmd1bWVudENhdGNoRXhjZXB0aW9uUHJveHlSZXNvbHZlcjIpOwotCQlFeHByZXNzaW9uTm90UmVzb2x2ZWQgelByb3h5UmVzb2x2ZXIgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCk7Ci0JCXpQcm94eS5hZGRQcm94eUxpc3RlbmVyKHpQcm94eVJlc29sdmVyKTsKLQkJCi0JCWJvb2xlYW4gZGlkaXQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWV4cC5pbnZva2VFeHByZXNzaW9uKCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCWFzc2VydEVxdWFscyhwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbiIpLCBlLmdldFR5cGVQcm94eSgpKTsKLQkJCWRpZGl0ID0gdHJ1ZTsKLQkJfQotCQkKLQkJYXNzZXJ0VHJ1ZShkaWRpdCk7Ci0JCWFzc2VydFRydWUoeFByb3h5UmVzb2x2ZXIubm90UmVzb2x2ZWRDYWxsZWQpOwotCQlhc3NlcnRUcnVlKGlsbGVnYWxBcmd1bWVudENhdGNoUHJveHlSZXNvbHZlci5ub3RSZXNvbHZlZENhbGxlZCk7Ci0JCWFzc2VydFRydWUoeVByb3h5UmVzb2x2ZXIubm90UmVzb2x2ZWRDYWxsZWQpOwotCQlhc3NlcnRUcnVlKHdQcm94eVJlc29sdmVyLm5vdFJlc29sdmVkQ2FsbGVkKTsKLQkJYXNzZXJ0VHJ1ZShpbGxlZ2FsQXJndW1lbnRDYXRjaEV4Y2VwdGlvblByb3h5UmVzb2x2ZXIyLm5vdFJlc29sdmVkQ2FsbGVkKTsKLQkJYXNzZXJ0VHJ1ZSh6UHJveHlSZXNvbHZlci5ub3RSZXNvbHZlZENhbGxlZCk7Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VHJ5Q2F0Y2hUaHJvdygpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCS8qCi0JCSAqIHRyeSB7Ci0JCSAqICAgeCA9IChudWxsKS5ib29sZWFuVmFsdWUoKTsKLQkJICogfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkgKiAgIHkgPSBCb29sZWFuLnZhbHVlT2YoZmFsc2UpOwotCQkgKiB9Ci0JCSAqLwotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlVHJ5KCk7Ci0JCUV4cHJlc3Npb25Qcm94eSB4UHJveHkgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKS5nZXRNZXRob2RQcm94eSgiYm9vbGVhblZhbHVlIiksIG51bGwsIG51bGwsIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgbnVsbENhdGNoRXhjZXB0aW9uUHJveHkgPSBleHAuY3JlYXRlVHJ5Q2F0Y2hDbGF1c2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbiIpLCB0cnVlKTsKLQkJRXhwcmVzc2lvblByb3h5IHlQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJ2YWx1ZU9mIiwgbmV3IFN0cmluZ1tdIHsiYm9vbGVhbiJ9KSwgbnVsbCwgbmV3IElQcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChmYWxzZSl9LCB0cnVlKTsKLQkJZXhwLmNyZWF0ZVRyeUVuZCgpOwotCQlFeHByZXNzaW9uTm90UmVzb2x2ZWQgeFByb3h5UmVzb2x2ZXIgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCk7Ci0JCXhQcm94eS5hZGRQcm94eUxpc3RlbmVyKHhQcm94eVJlc29sdmVyKTsJCQotCQl5UHJveHkuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblJlc29sdmVkKCkgewotCi0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyI3Byb3h5UmVzb2x2ZWQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCUlCZWFuUHJveHkgcHJveHkgPSBldmVudC5nZXRQcm94eSgpOwotCQkJCWFzc2VydEVxdWFscygiTm90IGEgQm9vbGVhbiBwcm94eToiK3Byb3h5LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCksIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKSwgcHJveHkuZ2V0VHlwZVByb3h5KCkpOwotCQkJCWFzc2VydEZhbHNlKCgoSUJvb2xlYW5CZWFuUHJveHkpIGV2ZW50LmdldFByb3h5KCkpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQkJfSk7Ci0KLQkJbnVsbENhdGNoRXhjZXB0aW9uUHJveHkuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblJlc29sdmVkKCkgewotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlMaXN0ZW5lciNwcm94eVJlc29sdmVkKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbiIsIGV2ZW50LmdldFByb3h5KCkuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCQl9Ci0JCX0pOwotCQlleHAuaW52b2tlRXhwcmVzc2lvbigpOwotCQlhc3NlcnRUcnVlKHhQcm94eVJlc29sdmVyLm5vdFJlc29sdmVkQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHJ5Q2F0Y2hSZXRocm93KCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJLyoKLQkJICogdHJ5IHsKLQkJICogICB4ID0gKG51bGwpLmJvb2xlYW5WYWx1ZSgpOwotCQkgKiB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCSAqICAgeSA9IEJvb2xlYW4udmFsdWVPZihmYWxzZSk7Ci0JCSAqICAgdGhyb3cgZTsgLy8gQXMgYSByZXRocm93LgotCQkgKiB9Ci0JCSAqLwotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlVHJ5KCk7Ci0JCUV4cHJlc3Npb25Qcm94eSB4UHJveHkgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKS5nZXRNZXRob2RQcm94eSgiYm9vbGVhblZhbHVlIiksIG51bGwsIG51bGwsIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgbnVsbENhdGNoRXhjZXB0aW9uUHJveHkgPSBleHAuY3JlYXRlVHJ5Q2F0Y2hDbGF1c2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbiIpLCB0cnVlKTsKLQkJRXhwcmVzc2lvblByb3h5IHlQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJ2YWx1ZU9mIiwgbmV3IFN0cmluZ1tdIHsiYm9vbGVhbiJ9KSwgbnVsbCwgbmV3IElQcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChmYWxzZSl9LCB0cnVlKTsKLQkJZXhwLmNyZWF0ZVJldGhyb3coKTsKLQkJZXhwLmNyZWF0ZVRyeUVuZCgpOwotCQlFeHByZXNzaW9uTm90UmVzb2x2ZWQgeFByb3h5UmVzb2x2ZXIgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCk7Ci0JCXhQcm94eS5hZGRQcm94eUxpc3RlbmVyKHhQcm94eVJlc29sdmVyKTsJCQotCQl5UHJveHkuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblJlc29sdmVkKCkgewotCi0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyI3Byb3h5UmVzb2x2ZWQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCUlCZWFuUHJveHkgcHJveHkgPSBldmVudC5nZXRQcm94eSgpOwotCQkJCWFzc2VydEVxdWFscygiTm90IGEgQm9vbGVhbiBwcm94eToiK3Byb3h5LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCksIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKSwgcHJveHkuZ2V0VHlwZVByb3h5KCkpOwotCQkJCWFzc2VydEZhbHNlKCgoSUJvb2xlYW5CZWFuUHJveHkpIGV2ZW50LmdldFByb3h5KCkpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQkJfSk7Ci0KLQkJbnVsbENhdGNoRXhjZXB0aW9uUHJveHkuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblJlc29sdmVkKCkgewotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlMaXN0ZW5lciNwcm94eVJlc29sdmVkKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbiIsIGV2ZW50LmdldFByb3h5KCkuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCQl9Ci0JCX0pOwotCQl0cnkgewotCQkJZXhwLmludm9rZUV4cHJlc3Npb24oKTsKLQkJCWZhaWwoIlNob3VsZCBvZiB0aHJvd24gTlBFLiIpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbiIsIGUuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSh4UHJveHlSZXNvbHZlci5ub3RSZXNvbHZlZENhbGxlZCk7Ci0JfQotCi0JCi0JcHVibGljIHZvaWQgdGVzdFRyeUNhdGNoRXhwbGljaXRUaHJvdygpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCS8qCi0JCSAqIHRyeSB7Ci0JCSAqICAgeCA9IEJvb2xlYW4udmFsdWVPZih0cnVlKTsKLQkJICogICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJICogICB5ID0gQm9vbGVhbi52YWx1ZU9mKGZhbHNlKTsKLQkJICogfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkgKiAgIHogPSBCb29sZWFuLnZhbHVlT2YoZmFsc2UpOwotCQkgKiB9Ci0JCSAqLwotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlVHJ5KCk7Ci0JCUV4cHJlc3Npb25Qcm94eSB4UHJveHkgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKS5nZXRNZXRob2RQcm94eSgidmFsdWVPZiIsIG5ldyBTdHJpbmdbXSB7ImJvb2xlYW4ifSksIG51bGwsIG5ldyBJUHJveHlbXSB7cHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgodHJ1ZSl9LCB0cnVlKTsKLQkJZXhwLmNyZWF0ZVRocm93KCk7Ci0JCWV4cC5jcmVhdGVDbGFzc0luc3RhbmNlQ3JlYXRpb24oRm9yRXhwcmVzc2lvbi5USFJPV19PUEVSQU5ELCBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbiIpLCAwKTsKLQkJRXhwcmVzc2lvblByb3h5IHlQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJ2YWx1ZU9mIiwgbmV3IFN0cmluZ1tdIHsiYm9vbGVhbiJ9KSwgbnVsbCwgbmV3IElQcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChmYWxzZSl9LCB0cnVlKTsKLQkJRXhwcmVzc2lvblByb3h5IG51bGxDYXRjaEV4Y2VwdGlvblByb3h5ID0gZXhwLmNyZWF0ZVRyeUNhdGNoQ2xhdXNlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uIiksIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgelByb3h5ID0gZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIikuZ2V0TWV0aG9kUHJveHkoInZhbHVlT2YiLCBuZXcgU3RyaW5nW10geyJib29sZWFuIn0pLCBudWxsLCBuZXcgSVByb3h5W10ge3Byb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGZhbHNlKX0sIHRydWUpOwotCQlleHAuY3JlYXRlVHJ5RW5kKCk7Ci0JCXhQcm94eS5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uUmVzb2x2ZWQoKSB7Ci0KLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5TGlzdGVuZXIjcHJveHlSZXNvbHZlZChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlFdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJSUJlYW5Qcm94eSBwcm94eSA9IGV2ZW50LmdldFByb3h5KCk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJOb3QgYSBCb29sZWFuIHByb3h5OiIrcHJveHkuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSwgcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLCBwcm94eS5nZXRUeXBlUHJveHkoKSk7Ci0JCQkJYXNzZXJ0VHJ1ZSgoKElCb29sZWFuQmVhblByb3h5KSBldmVudC5nZXRQcm94eSgpKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX0pOwotCQlFeHByZXNzaW9uTm90UmVzb2x2ZWQgeVByb3h5UmVzb2x2ZXIgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCk7Ci0JCXlQcm94eS5hZGRQcm94eUxpc3RlbmVyKHlQcm94eVJlc29sdmVyKTsKLQotCQl6UHJveHkuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblJlc29sdmVkKCkgewotCi0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyI3Byb3h5UmVzb2x2ZWQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCUlCZWFuUHJveHkgcHJveHkgPSBldmVudC5nZXRQcm94eSgpOwotCQkJCWFzc2VydEVxdWFscygiTm90IGEgQm9vbGVhbiBwcm94eToiK3Byb3h5LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCksIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKSwgcHJveHkuZ2V0VHlwZVByb3h5KCkpOwotCQkJCWFzc2VydEZhbHNlKCgoSUJvb2xlYW5CZWFuUHJveHkpIGV2ZW50LmdldFByb3h5KCkpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQkJfSk7Ci0KLQkJbnVsbENhdGNoRXhjZXB0aW9uUHJveHkuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblJlc29sdmVkKCkgewotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlMaXN0ZW5lciNwcm94eVJlc29sdmVkKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbiIsIGV2ZW50LmdldFByb3h5KCkuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCQl9Ci0JCX0pOwotCQlleHAuaW52b2tlRXhwcmVzc2lvbigpOwotCQlhc3NlcnRUcnVlKHlQcm94eVJlc29sdmVyLm5vdFJlc29sdmVkQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHJ5Q2F0Y2gyTm9UaHJvdygpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCS8qCi0JCSAqIHRyeSB7Ci0JCSAqICAgeCA9IEJvb2xlYW4udmFsdWVPZih0cnVlKTsKLQkJICogfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJICogICB5ID0gQm9vbGVhbi52YWx1ZU9mKGZhbHNlKTsKLQkJICogfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCSAqICAgeiA9IEJvb2xlYW4udmFsdWVPZihmYWxzZSk7Ci0JCSAqIH0KLQkJICovCi0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVUcnkoKTsKLQkJRXhwcmVzc2lvblByb3h5IHhQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJ2YWx1ZU9mIiwgbmV3IFN0cmluZ1tdIHsiYm9vbGVhbiJ9KSwgbnVsbCwgbmV3IElQcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCh0cnVlKX0sIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgaWxsZWdhbENhdGNoRXhjZXB0aW9uUHJveHkgPSBleHAuY3JlYXRlVHJ5Q2F0Y2hDbGF1c2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIiksIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgeVByb3h5ID0gZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIikuZ2V0TWV0aG9kUHJveHkoInZhbHVlT2YiLCBuZXcgU3RyaW5nW10geyJib29sZWFuIn0pLCBudWxsLCBuZXcgSVByb3h5W10ge3Byb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGZhbHNlKX0sIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgcnVudGltZUNhdGNoRXhjZXB0aW9uUHJveHkgPSBleHAuY3JlYXRlVHJ5Q2F0Y2hDbGF1c2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbiIpLCB0cnVlKTsKLQkJRXhwcmVzc2lvblByb3h5IHpQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJ2YWx1ZU9mIiwgbmV3IFN0cmluZ1tdIHsiYm9vbGVhbiJ9KSwgbnVsbCwgbmV3IElQcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChmYWxzZSl9LCB0cnVlKTsJCQotCQlleHAuY3JlYXRlVHJ5RW5kKCk7Ci0JCXhQcm94eS5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uUmVzb2x2ZWQoKSB7Ci0KLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5TGlzdGVuZXIjcHJveHlSZXNvbHZlZChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlFdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJSUJlYW5Qcm94eSBwcm94eSA9IGV2ZW50LmdldFByb3h5KCk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJOb3QgYSBCb29sZWFuIHByb3h5OiIrcHJveHkuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSwgcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLCBwcm94eS5nZXRUeXBlUHJveHkoKSk7Ci0JCQkJYXNzZXJ0VHJ1ZSgoKElCb29sZWFuQmVhblByb3h5KSBldmVudC5nZXRQcm94eSgpKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCUV4cHJlc3Npb25Ob3RSZXNvbHZlZCB5UHJveHlSZXNvbHZlciA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKTsKLQkJeVByb3h5LmFkZFByb3h5TGlzdGVuZXIoeVByb3h5UmVzb2x2ZXIpOwotCQlFeHByZXNzaW9uTm90UmVzb2x2ZWQgaWxsZWdhbENhdGNoRXhjZXB0aW9uUHJveHlSZXNvbHZlciA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKTsKLQkJaWxsZWdhbENhdGNoRXhjZXB0aW9uUHJveHkuYWRkUHJveHlMaXN0ZW5lcihpbGxlZ2FsQ2F0Y2hFeGNlcHRpb25Qcm94eVJlc29sdmVyKTsKLQkJRXhwcmVzc2lvbk5vdFJlc29sdmVkIHJ1bnRpbWVDYXRjaEV4Y2VwdGlvblByb3h5UmVzb2x2ZXIgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCk7Ci0JCXJ1bnRpbWVDYXRjaEV4Y2VwdGlvblByb3h5LmFkZFByb3h5TGlzdGVuZXIocnVudGltZUNhdGNoRXhjZXB0aW9uUHJveHlSZXNvbHZlcik7Ci0JCUV4cHJlc3Npb25Ob3RSZXNvbHZlZCB6UHJveHlSZXNvbHZlciA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKTsKLQkJelByb3h5LmFkZFByb3h5TGlzdGVuZXIoelByb3h5UmVzb2x2ZXIpOwotCQkKLQkJZXhwLmludm9rZUV4cHJlc3Npb24oKTsKLQkJCi0JCWFzc2VydFRydWUoeVByb3h5UmVzb2x2ZXIubm90UmVzb2x2ZWRDYWxsZWQpOwotCQlhc3NlcnRUcnVlKGlsbGVnYWxDYXRjaEV4Y2VwdGlvblByb3h5UmVzb2x2ZXIubm90UmVzb2x2ZWRDYWxsZWQpOwotCQlhc3NlcnRUcnVlKHpQcm94eVJlc29sdmVyLm5vdFJlc29sdmVkQ2FsbGVkKTsKLQkJYXNzZXJ0VHJ1ZShydW50aW1lQ2F0Y2hFeGNlcHRpb25Qcm94eVJlc29sdmVyLm5vdFJlc29sdmVkQ2FsbGVkKTsKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRyeUNhdGNoMlRocm93MSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCS8qCi0JCSAqIHRyeSB7Ci0JCSAqICAgeCA9IChudWxsKS5ib29sZWFuVmFsdWUoKTsKLQkJICogfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkgKiAgIHkgPSBCb29sZWFuLnZhbHVlT2YoZmFsc2UpOwotCQkgKiB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJICogICB6ID0gQm9vbGVhbi52YWx1ZU9mKGZhbHNlKTsKLQkJICogfQotCQkgKi8KLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZVRyeSgpOwotCQlFeHByZXNzaW9uUHJveHkgeFByb3h5ID0gZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIikuZ2V0TWV0aG9kUHJveHkoImJvb2xlYW5WYWx1ZSIpLCBudWxsLCBudWxsLCB0cnVlKTsKLQkJRXhwcmVzc2lvblByb3h5IG51bGxDYXRjaEV4Y2VwdGlvblByb3h5ID0gZXhwLmNyZWF0ZVRyeUNhdGNoQ2xhdXNlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uIiksIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgeVByb3h5ID0gZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIikuZ2V0TWV0aG9kUHJveHkoInZhbHVlT2YiLCBuZXcgU3RyaW5nW10geyJib29sZWFuIn0pLCBudWxsLCBuZXcgSVByb3h5W10ge3Byb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGZhbHNlKX0sIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgcnVudGltZUNhdGNoRXhjZXB0aW9uUHJveHkgPSBleHAuY3JlYXRlVHJ5Q2F0Y2hDbGF1c2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbiIpLCB0cnVlKTsKLQkJRXhwcmVzc2lvblByb3h5IHpQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJ2YWx1ZU9mIiwgbmV3IFN0cmluZ1tdIHsiYm9vbGVhbiJ9KSwgbnVsbCwgbmV3IElQcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChmYWxzZSl9LCB0cnVlKTsJCQotCQlleHAuY3JlYXRlVHJ5RW5kKCk7Ci0JCUV4cHJlc3Npb25Ob3RSZXNvbHZlZCB4UHJveHlSZXNvbHZlciA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKTsKLQkJeFByb3h5LmFkZFByb3h5TGlzdGVuZXIoeFByb3h5UmVzb2x2ZXIpOwkJCi0KLQkJeVByb3h5LmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpIHsKLQotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlMaXN0ZW5lciNwcm94eVJlc29sdmVkKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlJQmVhblByb3h5IHByb3h5ID0gZXZlbnQuZ2V0UHJveHkoKTsKLQkJCQlhc3NlcnRFcXVhbHMoIk5vdCBhIEJvb2xlYW4gcHJveHk6Iitwcm94eS5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpLCBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIiksIHByb3h5LmdldFR5cGVQcm94eSgpKTsKLQkJCQlhc3NlcnRGYWxzZSgoKElCb29sZWFuQmVhblByb3h5KSBldmVudC5nZXRQcm94eSgpKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX0pOwotCQludWxsQ2F0Y2hFeGNlcHRpb25Qcm94eS5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uUmVzb2x2ZWQoKSB7Ci0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyI3Byb3h5UmVzb2x2ZWQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCWFzc2VydEVxdWFscygiamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uIiwgZXZlbnQuZ2V0UHJveHkoKS5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJCX0KLQkJfSk7Ci0JCUV4cHJlc3Npb25Ob3RSZXNvbHZlZCBydW50aW1lQ2F0Y2hFeGNlcHRpb25Qcm94eVJlc29sdmVyID0gbmV3IEV4cHJlc3Npb25Ob3RSZXNvbHZlZCgpOwotCQlydW50aW1lQ2F0Y2hFeGNlcHRpb25Qcm94eS5hZGRQcm94eUxpc3RlbmVyKHJ1bnRpbWVDYXRjaEV4Y2VwdGlvblByb3h5UmVzb2x2ZXIpOwotCQlFeHByZXNzaW9uTm90UmVzb2x2ZWQgelByb3h5UmVzb2x2ZXIgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCk7Ci0JCXpQcm94eS5hZGRQcm94eUxpc3RlbmVyKHpQcm94eVJlc29sdmVyKTsKLQkJCi0JCWV4cC5pbnZva2VFeHByZXNzaW9uKCk7Ci0JCQotCQlhc3NlcnRUcnVlKHhQcm94eVJlc29sdmVyLm5vdFJlc29sdmVkQ2FsbGVkKTsKLQkJYXNzZXJ0VHJ1ZSh6UHJveHlSZXNvbHZlci5ub3RSZXNvbHZlZENhbGxlZCk7Ci0JCWFzc2VydFRydWUocnVudGltZUNhdGNoRXhjZXB0aW9uUHJveHlSZXNvbHZlci5ub3RSZXNvbHZlZENhbGxlZCk7Ci0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUcnlDYXRjaDJUaHJvdzIoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQkvKgotCQkgKiB0cnkgewotCQkgKiAgIHggPSAobnVsbCkuYm9vbGVhblZhbHVlKCk7Ci0JCSAqIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCSAqICAgeSA9IEJvb2xlYW4udmFsdWVPZihmYWxzZSk7Ci0JCSAqIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJICogICB6ID0gQm9vbGVhbi52YWx1ZU9mKGZhbHNlKTsKLQkJICogfQotCQkgKi8KLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZVRyeSgpOwotCQlFeHByZXNzaW9uUHJveHkgeFByb3h5ID0gZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIikuZ2V0TWV0aG9kUHJveHkoImJvb2xlYW5WYWx1ZSIpLCBudWxsLCBudWxsLCB0cnVlKTsKLQkJRXhwcmVzc2lvblByb3h5IGlsbGVnYWxDYXRjaEV4Y2VwdGlvblByb3h5ID0gZXhwLmNyZWF0ZVRyeUNhdGNoQ2xhdXNlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIpLCB0cnVlKTsKLQkJRXhwcmVzc2lvblByb3h5IHlQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJ2YWx1ZU9mIiwgbmV3IFN0cmluZ1tdIHsiYm9vbGVhbiJ9KSwgbnVsbCwgbmV3IElQcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChmYWxzZSl9LCB0cnVlKTsKLQkJRXhwcmVzc2lvblByb3h5IG51bGxDYXRjaEV4Y2VwdGlvblByb3h5ID0gZXhwLmNyZWF0ZVRyeUNhdGNoQ2xhdXNlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uIiksIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgelByb3h5ID0gZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIikuZ2V0TWV0aG9kUHJveHkoInZhbHVlT2YiLCBuZXcgU3RyaW5nW10geyJib29sZWFuIn0pLCBudWxsLCBuZXcgSVByb3h5W10ge3Byb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGZhbHNlKX0sIHRydWUpOwkJCi0JCWV4cC5jcmVhdGVUcnlFbmQoKTsKLQkJRXhwcmVzc2lvbk5vdFJlc29sdmVkIHhQcm94eVJlc29sdmVyID0gbmV3IEV4cHJlc3Npb25Ob3RSZXNvbHZlZCgpOwotCQl4UHJveHkuYWRkUHJveHlMaXN0ZW5lcih4UHJveHlSZXNvbHZlcik7CQkKLQkJRXhwcmVzc2lvbk5vdFJlc29sdmVkIGlsbGVnYWxDYXRjaEV4Y2VwdGlvblByb3h5UmVzb2x2ZXIgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCk7Ci0JCWlsbGVnYWxDYXRjaEV4Y2VwdGlvblByb3h5LmFkZFByb3h5TGlzdGVuZXIoaWxsZWdhbENhdGNoRXhjZXB0aW9uUHJveHlSZXNvbHZlcik7Ci0JCUV4cHJlc3Npb25Ob3RSZXNvbHZlZCB5UHJveHlSZXNvbHZlciA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKTsKLQkJeVByb3h5LmFkZFByb3h5TGlzdGVuZXIoeVByb3h5UmVzb2x2ZXIpOwotCi0JCXpQcm94eS5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uUmVzb2x2ZWQoKSB7IAotCi0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyI3Byb3h5UmVzb2x2ZWQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCUlCZWFuUHJveHkgcHJveHkgPSBldmVudC5nZXRQcm94eSgpOwotCQkJCWFzc2VydEVxdWFscygiTm90IGEgQm9vbGVhbiBwcm94eToiK3Byb3h5LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCksIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKSwgcHJveHkuZ2V0VHlwZVByb3h5KCkpOwotCQkJCWFzc2VydEZhbHNlKCgoSUJvb2xlYW5CZWFuUHJveHkpIGV2ZW50LmdldFByb3h5KCkpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQkJfSk7Ci0JCW51bGxDYXRjaEV4Y2VwdGlvblByb3h5LmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpIHsKLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5TGlzdGVuZXIjcHJveHlSZXNvbHZlZChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlFdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24iLCBldmVudC5nZXRQcm94eSgpLmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQkJfQotCQl9KTsJCQotCQlleHAuaW52b2tlRXhwcmVzc2lvbigpOwotCQkKLQkJYXNzZXJ0VHJ1ZSh4UHJveHlSZXNvbHZlci5ub3RSZXNvbHZlZENhbGxlZCk7Ci0JCWFzc2VydFRydWUoeVByb3h5UmVzb2x2ZXIubm90UmVzb2x2ZWRDYWxsZWQpOwotCQlhc3NlcnRUcnVlKGlsbGVnYWxDYXRjaEV4Y2VwdGlvblByb3h5UmVzb2x2ZXIubm90UmVzb2x2ZWRDYWxsZWQpOwotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHJ5Q2F0Y2hUaHJvd0ZpbmFsbHkoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQkvKgotCQkgKiB0cnkgewotCQkgKiAgIHggPSAobnVsbCkuYm9vbGVhblZhbHVlKCk7Ci0JCSAqIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJICogICB5ID0gQm9vbGVhbi52YWx1ZU9mKGZhbHNlKTsKLQkJICogfSBmaW5hbGx5IHsKLQkJICogICBmID0gQm9vbGVhbi52YWx1ZU9mKGZhbHNlKTsKLQkJICogfQotCQkgKi8KLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZVRyeSgpOwotCQlFeHByZXNzaW9uUHJveHkgeFByb3h5ID0gZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIikuZ2V0TWV0aG9kUHJveHkoImJvb2xlYW5WYWx1ZSIpLCBudWxsLCBudWxsLCB0cnVlKTsKLQkJRXhwcmVzc2lvblByb3h5IG51bGxDYXRjaEV4Y2VwdGlvblByb3h5ID0gZXhwLmNyZWF0ZVRyeUNhdGNoQ2xhdXNlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24iKSwgdHJ1ZSk7Ci0JCUV4cHJlc3Npb25Qcm94eSB5UHJveHkgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKS5nZXRNZXRob2RQcm94eSgidmFsdWVPZiIsIG5ldyBTdHJpbmdbXSB7ImJvb2xlYW4ifSksIG51bGwsIG5ldyBJUHJveHlbXSB7cHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoZmFsc2UpfSwgdHJ1ZSk7Ci0JCWV4cC5jcmVhdGVUcnlGaW5hbGx5Q2xhdXNlKCk7Ci0JCUV4cHJlc3Npb25Qcm94eSBmUHJveHkgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKS5nZXRNZXRob2RQcm94eSgidmFsdWVPZiIsIG5ldyBTdHJpbmdbXSB7ImJvb2xlYW4ifSksIG51bGwsIG5ldyBJUHJveHlbXSB7cHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoZmFsc2UpfSwgdHJ1ZSk7CQkKLQkJCi0JCWV4cC5jcmVhdGVUcnlFbmQoKTsKLQkJRXhwcmVzc2lvbk5vdFJlc29sdmVkIHhQcm94eVJlc29sdmVyID0gbmV3IEV4cHJlc3Npb25Ob3RSZXNvbHZlZCgpOwotCQl4UHJveHkuYWRkUHJveHlMaXN0ZW5lcih4UHJveHlSZXNvbHZlcik7CQkKLQkJeVByb3h5LmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpIHsKLQotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlMaXN0ZW5lciNwcm94eVJlc29sdmVkKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlJQmVhblByb3h5IHByb3h5ID0gZXZlbnQuZ2V0UHJveHkoKTsKLQkJCQlhc3NlcnRFcXVhbHMoIk5vdCBhIEJvb2xlYW4gcHJveHk6Iitwcm94eS5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpLCBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIiksIHByb3h5LmdldFR5cGVQcm94eSgpKTsKLQkJCQlhc3NlcnRGYWxzZSgoKElCb29sZWFuQmVhblByb3h5KSBldmVudC5nZXRQcm94eSgpKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCW51bGxDYXRjaEV4Y2VwdGlvblByb3h5LmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpIHsKLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5TGlzdGVuZXIjcHJveHlSZXNvbHZlZChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlFdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24iLCBldmVudC5nZXRQcm94eSgpLmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQkJfQotCQl9KTsKLQkJCi0JCWZQcm94eS5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uUmVzb2x2ZWQoKSB7Ci0KLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5TGlzdGVuZXIjcHJveHlSZXNvbHZlZChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlFdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJSUJlYW5Qcm94eSBwcm94eSA9IGV2ZW50LmdldFByb3h5KCk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJOb3QgYSBCb29sZWFuIHByb3h5OiIrcHJveHkuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSwgcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLCBwcm94eS5nZXRUeXBlUHJveHkoKSk7Ci0JCQkJYXNzZXJ0RmFsc2UoKChJQm9vbGVhbkJlYW5Qcm94eSkgZXZlbnQuZ2V0UHJveHkoKSkuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9KTsKLQkJCi0JCWV4cC5pbnZva2VFeHByZXNzaW9uKCk7Ci0JCWFzc2VydFRydWUoeFByb3h5UmVzb2x2ZXIubm90UmVzb2x2ZWRDYWxsZWQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VHJ5Q2F0Y2gyVGhyb3cxRmluYWxseSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCS8qCi0JCSAqIHRyeSB7Ci0JCSAqICAgeCA9IChudWxsKS5ib29sZWFuVmFsdWUoKTsKLQkJICogfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkgKiAgIHkgPSBCb29sZWFuLnZhbHVlT2YoZmFsc2UpOwotCQkgKiB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJICogICB6ID0gQm9vbGVhbi52YWx1ZU9mKGZhbHNlKTsKLQkJICogfSBmaW5hbGx5IHsKLQkJICogICBmID0gQm9vbGVhbi52YWx1ZU9mKGZhbHNlKTsKLQkJICogfQotCQkgKi8KLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZVRyeSgpOwotCQlFeHByZXNzaW9uUHJveHkgeFByb3h5ID0gZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIikuZ2V0TWV0aG9kUHJveHkoImJvb2xlYW5WYWx1ZSIpLCBudWxsLCBudWxsLCB0cnVlKTsKLQkJRXhwcmVzc2lvblByb3h5IG51bGxDYXRjaEV4Y2VwdGlvblByb3h5ID0gZXhwLmNyZWF0ZVRyeUNhdGNoQ2xhdXNlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uIiksIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgeVByb3h5ID0gZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIikuZ2V0TWV0aG9kUHJveHkoInZhbHVlT2YiLCBuZXcgU3RyaW5nW10geyJib29sZWFuIn0pLCBudWxsLCBuZXcgSVByb3h5W10ge3Byb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGZhbHNlKX0sIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgcnVudGltZUNhdGNoRXhjZXB0aW9uUHJveHkgPSBleHAuY3JlYXRlVHJ5Q2F0Y2hDbGF1c2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbiIpLCB0cnVlKTsKLQkJRXhwcmVzc2lvblByb3h5IHpQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJ2YWx1ZU9mIiwgbmV3IFN0cmluZ1tdIHsiYm9vbGVhbiJ9KSwgbnVsbCwgbmV3IElQcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChmYWxzZSl9LCB0cnVlKTsJCQotCQlleHAuY3JlYXRlVHJ5RmluYWxseUNsYXVzZSgpOwotCQlFeHByZXNzaW9uUHJveHkgZlByb3h5ID0gZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIikuZ2V0TWV0aG9kUHJveHkoInZhbHVlT2YiLCBuZXcgU3RyaW5nW10geyJib29sZWFuIn0pLCBudWxsLCBuZXcgSVByb3h5W10ge3Byb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGZhbHNlKX0sIHRydWUpOwkJCi0JCWV4cC5jcmVhdGVUcnlFbmQoKTsKLQkJRXhwcmVzc2lvbk5vdFJlc29sdmVkIHhQcm94eVJlc29sdmVyID0gbmV3IEV4cHJlc3Npb25Ob3RSZXNvbHZlZCgpOwotCQl4UHJveHkuYWRkUHJveHlMaXN0ZW5lcih4UHJveHlSZXNvbHZlcik7CQkKLQotCQl5UHJveHkuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblJlc29sdmVkKCkgewotCi0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyI3Byb3h5UmVzb2x2ZWQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCUlCZWFuUHJveHkgcHJveHkgPSBldmVudC5nZXRQcm94eSgpOwotCQkJCWFzc2VydEVxdWFscygiTm90IGEgQm9vbGVhbiBwcm94eToiK3Byb3h5LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCksIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKSwgcHJveHkuZ2V0VHlwZVByb3h5KCkpOwotCQkJCWFzc2VydEZhbHNlKCgoSUJvb2xlYW5CZWFuUHJveHkpIGV2ZW50LmdldFByb3h5KCkpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQkJfSk7Ci0JCW51bGxDYXRjaEV4Y2VwdGlvblByb3h5LmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpIHsKLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5TGlzdGVuZXIjcHJveHlSZXNvbHZlZChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlFdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24iLCBldmVudC5nZXRQcm94eSgpLmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQkJfQotCQl9KTsKLQkJRXhwcmVzc2lvbk5vdFJlc29sdmVkIHJ1bnRpbWVDYXRjaEV4Y2VwdGlvblByb3h5UmVzb2x2ZXIgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCk7Ci0JCXJ1bnRpbWVDYXRjaEV4Y2VwdGlvblByb3h5LmFkZFByb3h5TGlzdGVuZXIocnVudGltZUNhdGNoRXhjZXB0aW9uUHJveHlSZXNvbHZlcik7Ci0JCUV4cHJlc3Npb25Ob3RSZXNvbHZlZCB6UHJveHlSZXNvbHZlciA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKTsKLQkJelByb3h5LmFkZFByb3h5TGlzdGVuZXIoelByb3h5UmVzb2x2ZXIpOwotCQlmUHJveHkuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblJlc29sdmVkKCkgewotCi0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyI3Byb3h5UmVzb2x2ZWQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCUlCZWFuUHJveHkgcHJveHkgPSBldmVudC5nZXRQcm94eSgpOwotCQkJCWFzc2VydEVxdWFscygiTm90IGEgQm9vbGVhbiBwcm94eToiK3Byb3h5LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCksIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKSwgcHJveHkuZ2V0VHlwZVByb3h5KCkpOwotCQkJCWFzc2VydEZhbHNlKCgoSUJvb2xlYW5CZWFuUHJveHkpIGV2ZW50LmdldFByb3h5KCkpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQkJfSk7Ci0KLQkJZXhwLmludm9rZUV4cHJlc3Npb24oKTsKLQkJCi0JCQotCQlhc3NlcnRUcnVlKHhQcm94eVJlc29sdmVyLm5vdFJlc29sdmVkQ2FsbGVkKTsKLQkJYXNzZXJ0VHJ1ZSh6UHJveHlSZXNvbHZlci5ub3RSZXNvbHZlZENhbGxlZCk7Ci0JCWFzc2VydFRydWUocnVudGltZUNhdGNoRXhjZXB0aW9uUHJveHlSZXNvbHZlci5ub3RSZXNvbHZlZENhbGxlZCk7Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VHJ5Q2F0Y2gyVGhyb3cyRmluYWxseSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCS8qCi0JCSAqIHRyeSB7Ci0JCSAqICAgeCA9IChudWxsKS5ib29sZWFuVmFsdWUoKTsKLQkJICogfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJICogICB5ID0gQm9vbGVhbi52YWx1ZU9mKGZhbHNlKTsKLQkJICogfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkgKiAgIHogPSBCb29sZWFuLnZhbHVlT2YoZmFsc2UpOwotCQkgKiB9ICBmaW5hbGx5IHsKLQkJICogICBmID0gQm9vbGVhbi52YWx1ZU9mKGZhbHNlKTsKLQkJICogfQotCQkgKi8KLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZVRyeSgpOwotCQlFeHByZXNzaW9uUHJveHkgeFByb3h5ID0gZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIikuZ2V0TWV0aG9kUHJveHkoImJvb2xlYW5WYWx1ZSIpLCBudWxsLCBudWxsLCB0cnVlKTsKLQkJRXhwcmVzc2lvblByb3h5IGlsbGVnYWxDYXRjaEV4Y2VwdGlvblByb3h5ID0gZXhwLmNyZWF0ZVRyeUNhdGNoQ2xhdXNlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIpLCB0cnVlKTsKLQkJRXhwcmVzc2lvblByb3h5IHlQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJ2YWx1ZU9mIiwgbmV3IFN0cmluZ1tdIHsiYm9vbGVhbiJ9KSwgbnVsbCwgbmV3IElQcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChmYWxzZSl9LCB0cnVlKTsKLQkJRXhwcmVzc2lvblByb3h5IG51bGxDYXRjaEV4Y2VwdGlvblByb3h5ID0gZXhwLmNyZWF0ZVRyeUNhdGNoQ2xhdXNlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uIiksIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgelByb3h5ID0gZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIikuZ2V0TWV0aG9kUHJveHkoInZhbHVlT2YiLCBuZXcgU3RyaW5nW10geyJib29sZWFuIn0pLCBudWxsLCBuZXcgSVByb3h5W10ge3Byb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGZhbHNlKX0sIHRydWUpOwkJCi0JCWV4cC5jcmVhdGVUcnlGaW5hbGx5Q2xhdXNlKCk7Ci0JCUV4cHJlc3Npb25Qcm94eSBmUHJveHkgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKS5nZXRNZXRob2RQcm94eSgidmFsdWVPZiIsIG5ldyBTdHJpbmdbXSB7ImJvb2xlYW4ifSksIG51bGwsIG5ldyBJUHJveHlbXSB7cHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoZmFsc2UpfSwgdHJ1ZSk7CQkKLQkJZXhwLmNyZWF0ZVRyeUVuZCgpOwotCQlFeHByZXNzaW9uTm90UmVzb2x2ZWQgeFByb3h5UmVzb2x2ZXIgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCk7Ci0JCXhQcm94eS5hZGRQcm94eUxpc3RlbmVyKHhQcm94eVJlc29sdmVyKTsJCQotCQlFeHByZXNzaW9uTm90UmVzb2x2ZWQgaWxsZWdhbENhdGNoRXhjZXB0aW9uUHJveHlSZXNvbHZlciA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKTsKLQkJaWxsZWdhbENhdGNoRXhjZXB0aW9uUHJveHkuYWRkUHJveHlMaXN0ZW5lcihpbGxlZ2FsQ2F0Y2hFeGNlcHRpb25Qcm94eVJlc29sdmVyKTsKLQkJRXhwcmVzc2lvbk5vdFJlc29sdmVkIHlQcm94eVJlc29sdmVyID0gbmV3IEV4cHJlc3Npb25Ob3RSZXNvbHZlZCgpOwotCQl5UHJveHkuYWRkUHJveHlMaXN0ZW5lcih5UHJveHlSZXNvbHZlcik7Ci0KLQkJelByb3h5LmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpIHsgCi0KLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5TGlzdGVuZXIjcHJveHlSZXNvbHZlZChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlFdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJSUJlYW5Qcm94eSBwcm94eSA9IGV2ZW50LmdldFByb3h5KCk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJOb3QgYSBCb29sZWFuIHByb3h5OiIrcHJveHkuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSwgcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLCBwcm94eS5nZXRUeXBlUHJveHkoKSk7Ci0JCQkJYXNzZXJ0RmFsc2UoKChJQm9vbGVhbkJlYW5Qcm94eSkgZXZlbnQuZ2V0UHJveHkoKSkuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9KTsKLQkJbnVsbENhdGNoRXhjZXB0aW9uUHJveHkuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblJlc29sdmVkKCkgewotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlMaXN0ZW5lciNwcm94eVJlc29sdmVkKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbiIsIGV2ZW50LmdldFByb3h5KCkuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCQl9Ci0JCX0pOwkKLQkJCi0JCWZQcm94eS5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uUmVzb2x2ZWQoKSB7Ci0KLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5TGlzdGVuZXIjcHJveHlSZXNvbHZlZChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlFdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJSUJlYW5Qcm94eSBwcm94eSA9IGV2ZW50LmdldFByb3h5KCk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJOb3QgYSBCb29sZWFuIHByb3h5OiIrcHJveHkuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSwgcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLCBwcm94eS5nZXRUeXBlUHJveHkoKSk7Ci0JCQkJYXNzZXJ0RmFsc2UoKChJQm9vbGVhbkJlYW5Qcm94eSkgZXZlbnQuZ2V0UHJveHkoKSkuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9KTsJCQotCQlleHAuaW52b2tlRXhwcmVzc2lvbigpOwotCQkKLQkJYXNzZXJ0VHJ1ZSh4UHJveHlSZXNvbHZlci5ub3RSZXNvbHZlZENhbGxlZCk7Ci0JCWFzc2VydFRydWUoeVByb3h5UmVzb2x2ZXIubm90UmVzb2x2ZWRDYWxsZWQpOwotCQlhc3NlcnRUcnVlKGlsbGVnYWxDYXRjaEV4Y2VwdGlvblByb3h5UmVzb2x2ZXIubm90UmVzb2x2ZWRDYWxsZWQpOwotCQkKLQl9Ci0JCi0KLQlwdWJsaWMgdm9pZCB0ZXN0VHJ5Q2F0Y2hOb1Rocm93RmluYWxseSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCS8qCi0JCSAqIHRyeSB7Ci0JCSAqICAgeCA9IEJvb2xlYW4udmFsdWVPZih0cnVlKTsKLQkJICogfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCSAqICAgeSA9IEJvb2xlYW4udmFsdWVPZihmYWxzZSk7Ci0JCSAqIH0gZmluYWxseSB7Ci0JCSAqICAgZiA9IEJvb2xlYW4udmFsdWVPZihmYWxzZSk7Ci0JCSAqIH0KLQkJICovCi0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVUcnkoKTsKLQkJRXhwcmVzc2lvblByb3h5IHhQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJ2YWx1ZU9mIiwgbmV3IFN0cmluZ1tdIHsiYm9vbGVhbiJ9KSwgbnVsbCwgbmV3IElQcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCh0cnVlKX0sIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgcnVudGltZUNhdGNoRXhjZXB0aW9uUHJveHkgPSBleHAuY3JlYXRlVHJ5Q2F0Y2hDbGF1c2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbiIpLCB0cnVlKTsKLQkJRXhwcmVzc2lvblByb3h5IHlQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJ2YWx1ZU9mIiwgbmV3IFN0cmluZ1tdIHsiYm9vbGVhbiJ9KSwgbnVsbCwgbmV3IElQcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChmYWxzZSl9LCB0cnVlKTsKLQkJZXhwLmNyZWF0ZVRyeUZpbmFsbHlDbGF1c2UoKTsKLQkJRXhwcmVzc2lvblByb3h5IGZQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJ2YWx1ZU9mIiwgbmV3IFN0cmluZ1tdIHsiYm9vbGVhbiJ9KSwgbnVsbCwgbmV3IElQcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChmYWxzZSl9LCB0cnVlKTsKLQkJZXhwLmNyZWF0ZVRyeUVuZCgpOwotCQl4UHJveHkuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblJlc29sdmVkKCkgewotCi0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyI3Byb3h5UmVzb2x2ZWQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCUlCZWFuUHJveHkgcHJveHkgPSBldmVudC5nZXRQcm94eSgpOwotCQkJCWFzc2VydEVxdWFscygiTm90IGEgQm9vbGVhbiBwcm94eToiK3Byb3h5LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCksIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKSwgcHJveHkuZ2V0VHlwZVByb3h5KCkpOwotCQkJCWFzc2VydFRydWUoKChJQm9vbGVhbkJlYW5Qcm94eSkgZXZlbnQuZ2V0UHJveHkoKSkuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9KTsKLQotCQlFeHByZXNzaW9uTm90UmVzb2x2ZWQgeVByb3h5UmVzb2x2ZXIgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCk7Ci0JCXlQcm94eS5hZGRQcm94eUxpc3RlbmVyKHlQcm94eVJlc29sdmVyKTsKLQkJRXhwcmVzc2lvbk5vdFJlc29sdmVkIHJ1bnRpbWVDYXRjaEV4Y2VwdGlvblByb3h5UmVzb2x2ZXIgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCk7Ci0JCXJ1bnRpbWVDYXRjaEV4Y2VwdGlvblByb3h5LmFkZFByb3h5TGlzdGVuZXIocnVudGltZUNhdGNoRXhjZXB0aW9uUHJveHlSZXNvbHZlcik7Ci0JCWZQcm94eS5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uUmVzb2x2ZWQoKSB7Ci0KLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5TGlzdGVuZXIjcHJveHlSZXNvbHZlZChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlFdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJSUJlYW5Qcm94eSBwcm94eSA9IGV2ZW50LmdldFByb3h5KCk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJOb3QgYSBCb29sZWFuIHByb3h5OiIrcHJveHkuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSwgcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLCBwcm94eS5nZXRUeXBlUHJveHkoKSk7Ci0JCQkJYXNzZXJ0RmFsc2UoKChJQm9vbGVhbkJlYW5Qcm94eSkgZXZlbnQuZ2V0UHJveHkoKSkuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9KTsKLQkJCi0JCWV4cC5pbnZva2VFeHByZXNzaW9uKCk7Ci0JCQotCQlhc3NlcnRUcnVlKHlQcm94eVJlc29sdmVyLm5vdFJlc29sdmVkQ2FsbGVkKTsKLQkJYXNzZXJ0VHJ1ZShydW50aW1lQ2F0Y2hFeGNlcHRpb25Qcm94eVJlc29sdmVyLm5vdFJlc29sdmVkQ2FsbGVkKTsKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRyeUNhdGNoMk5vVGhyb3dGaW5hbGx5KCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJLyoKLQkJICogdHJ5IHsKLQkJICogICB4ID0gQm9vbGVhbi52YWx1ZU9mKHRydWUpOwotCQkgKiB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkgKiAgIHkgPSBCb29sZWFuLnZhbHVlT2YoZmFsc2UpOwotCQkgKiB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJICogICB6ID0gQm9vbGVhbi52YWx1ZU9mKGZhbHNlKTsKLQkJICogfSBmaW5hbGx5IHsKLQkJICogICBmID0gQm9vbGVhbi52YWx1ZU9mKGZhbHNlKTsKLQkJICogfQotCQkgKi8KLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZVRyeSgpOwotCQlFeHByZXNzaW9uUHJveHkgeFByb3h5ID0gZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIikuZ2V0TWV0aG9kUHJveHkoInZhbHVlT2YiLCBuZXcgU3RyaW5nW10geyJib29sZWFuIn0pLCBudWxsLCBuZXcgSVByb3h5W10ge3Byb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKHRydWUpfSwgdHJ1ZSk7Ci0JCUV4cHJlc3Npb25Qcm94eSBpbGxlZ2FsQ2F0Y2hFeGNlcHRpb25Qcm94eSA9IGV4cC5jcmVhdGVUcnlDYXRjaENsYXVzZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iKSwgdHJ1ZSk7Ci0JCUV4cHJlc3Npb25Qcm94eSB5UHJveHkgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKS5nZXRNZXRob2RQcm94eSgidmFsdWVPZiIsIG5ldyBTdHJpbmdbXSB7ImJvb2xlYW4ifSksIG51bGwsIG5ldyBJUHJveHlbXSB7cHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoZmFsc2UpfSwgdHJ1ZSk7Ci0JCUV4cHJlc3Npb25Qcm94eSBydW50aW1lQ2F0Y2hFeGNlcHRpb25Qcm94eSA9IGV4cC5jcmVhdGVUcnlDYXRjaENsYXVzZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uIiksIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgelByb3h5ID0gZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIikuZ2V0TWV0aG9kUHJveHkoInZhbHVlT2YiLCBuZXcgU3RyaW5nW10geyJib29sZWFuIn0pLCBudWxsLCBuZXcgSVByb3h5W10ge3Byb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGZhbHNlKX0sIHRydWUpOwkJCi0JCWV4cC5jcmVhdGVUcnlGaW5hbGx5Q2xhdXNlKCk7Ci0JCUV4cHJlc3Npb25Qcm94eSBmUHJveHkgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKS5nZXRNZXRob2RQcm94eSgidmFsdWVPZiIsIG5ldyBTdHJpbmdbXSB7ImJvb2xlYW4ifSksIG51bGwsIG5ldyBJUHJveHlbXSB7cHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoZmFsc2UpfSwgdHJ1ZSk7CQkKLQkJZXhwLmNyZWF0ZVRyeUVuZCgpOwotCQl4UHJveHkuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblJlc29sdmVkKCkgewotCi0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyI3Byb3h5UmVzb2x2ZWQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCUlCZWFuUHJveHkgcHJveHkgPSBldmVudC5nZXRQcm94eSgpOwotCQkJCWFzc2VydEVxdWFscygiTm90IGEgQm9vbGVhbiBwcm94eToiK3Byb3h5LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCksIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKSwgcHJveHkuZ2V0VHlwZVByb3h5KCkpOwotCQkJCWFzc2VydFRydWUoKChJQm9vbGVhbkJlYW5Qcm94eSkgZXZlbnQuZ2V0UHJveHkoKSkuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9KTsKLQotCQlFeHByZXNzaW9uTm90UmVzb2x2ZWQgeVByb3h5UmVzb2x2ZXIgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCk7Ci0JCXlQcm94eS5hZGRQcm94eUxpc3RlbmVyKHlQcm94eVJlc29sdmVyKTsKLQkJRXhwcmVzc2lvbk5vdFJlc29sdmVkIGlsbGVnYWxDYXRjaEV4Y2VwdGlvblByb3h5UmVzb2x2ZXIgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCk7Ci0JCWlsbGVnYWxDYXRjaEV4Y2VwdGlvblByb3h5LmFkZFByb3h5TGlzdGVuZXIoaWxsZWdhbENhdGNoRXhjZXB0aW9uUHJveHlSZXNvbHZlcik7Ci0JCUV4cHJlc3Npb25Ob3RSZXNvbHZlZCBydW50aW1lQ2F0Y2hFeGNlcHRpb25Qcm94eVJlc29sdmVyID0gbmV3IEV4cHJlc3Npb25Ob3RSZXNvbHZlZCgpOwotCQlydW50aW1lQ2F0Y2hFeGNlcHRpb25Qcm94eS5hZGRQcm94eUxpc3RlbmVyKHJ1bnRpbWVDYXRjaEV4Y2VwdGlvblByb3h5UmVzb2x2ZXIpOwotCQlFeHByZXNzaW9uTm90UmVzb2x2ZWQgelByb3h5UmVzb2x2ZXIgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCk7Ci0JCXpQcm94eS5hZGRQcm94eUxpc3RlbmVyKHpQcm94eVJlc29sdmVyKTsKLQkJZlByb3h5LmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpIHsKLQotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlMaXN0ZW5lciNwcm94eVJlc29sdmVkKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlJQmVhblByb3h5IHByb3h5ID0gZXZlbnQuZ2V0UHJveHkoKTsKLQkJCQlhc3NlcnRFcXVhbHMoIk5vdCBhIEJvb2xlYW4gcHJveHk6Iitwcm94eS5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpLCBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIiksIHByb3h5LmdldFR5cGVQcm94eSgpKTsKLQkJCQlhc3NlcnRGYWxzZSgoKElCb29sZWFuQmVhblByb3h5KSBldmVudC5nZXRQcm94eSgpKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWV4cC5pbnZva2VFeHByZXNzaW9uKCk7Ci0JCQotCQlhc3NlcnRUcnVlKHlQcm94eVJlc29sdmVyLm5vdFJlc29sdmVkQ2FsbGVkKTsKLQkJYXNzZXJ0VHJ1ZShpbGxlZ2FsQ2F0Y2hFeGNlcHRpb25Qcm94eVJlc29sdmVyLm5vdFJlc29sdmVkQ2FsbGVkKTsKLQkJYXNzZXJ0VHJ1ZSh6UHJveHlSZXNvbHZlci5ub3RSZXNvbHZlZENhbGxlZCk7Ci0JCWFzc2VydFRydWUocnVudGltZUNhdGNoRXhjZXB0aW9uUHJveHlSZXNvbHZlci5ub3RSZXNvbHZlZENhbGxlZCk7Ci0JCQotCX0KLQkKLQotCXB1YmxpYyB2b2lkIHRlc3RJZkVsc2VUcnVlV2l0aEVsc2UoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlSWZFbHNlKHRydWUpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uSUZfQ09ORElUSU9OLCBJbmZpeE9wZXJhdG9yLklOX0VRVUFMUywgMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgKGJ5dGUpIDMpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAoc2hvcnQpIDMpOwotCQlFeHByZXNzaW9uUHJveHkgdHJ1ZVByb3h5ID0gZXhwLmNyZWF0ZVByb3h5QXNzaWdubWVudEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5JRl9UUlVFKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkFTU0lHTk1FTlRfUklHSFQsIEluZml4T3BlcmF0b3IuSU5fUExVUywgMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgKGJ5dGUpIDMpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAoc2hvcnQpIDMpOwotCQlFeHByZXNzaW9uUHJveHkgZmFsc2VQcm94eSA9IGV4cC5jcmVhdGVQcm94eUFzc2lnbm1lbnRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uSUZfRUxTRSk7CQkKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkFTU0lHTk1FTlRfUklHSFQsIEluZml4T3BlcmF0b3IuSU5fTUlOVVMsIDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIChieXRlKSAzKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgKHNob3J0KSAzKTsKLQkJCi0JCXRydWVQcm94eS5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uUmVzb2x2ZWQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlJQmVhblByb3h5IHZhbHVlID0gZXZlbnQuZ2V0UHJveHkoKTsKLQkJCQlhc3NlcnROb3ROdWxsKHZhbHVlKTsKLQkJCQlhc3NlcnRFcXVhbHMoImludCIsIHZhbHVlLmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkpOwotCQkJCWFzc2VydEVxdWFscyg2LCAoKElOdW1iZXJCZWFuUHJveHkpIHZhbHVlKS5pbnRWYWx1ZSgpKTsKLQkJCX0KLQkJfSk7Ci0KLQkJZmFsc2VQcm94eS5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKSk7Ci0JCWV4cC5pbnZva2VFeHByZXNzaW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElmRWxzZUZhbHNlV2l0aEVsc2UoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlSWZFbHNlKHRydWUpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uSUZfQ09ORElUSU9OLCBJbmZpeE9wZXJhdG9yLklOX0VRVUFMUywgMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgKGJ5dGUpIDQpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAoc2hvcnQpIDMpOwotCQlFeHByZXNzaW9uUHJveHkgdHJ1ZVByb3h5ID0gZXhwLmNyZWF0ZVByb3h5QXNzaWdubWVudEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5JRl9UUlVFKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkFTU0lHTk1FTlRfUklHSFQsIEluZml4T3BlcmF0b3IuSU5fUExVUywgMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgKGJ5dGUpIDMpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAoc2hvcnQpIDMpOwotCQlFeHByZXNzaW9uUHJveHkgZmFsc2VQcm94eSA9IGV4cC5jcmVhdGVQcm94eUFzc2lnbm1lbnRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uSUZfRUxTRSk7CQkKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkFTU0lHTk1FTlRfUklHSFQsIEluZml4T3BlcmF0b3IuSU5fTUlOVVMsIDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIChieXRlKSAzKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgKHNob3J0KSAzKTsKLQotCQl0cnVlUHJveHkuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCkpOwotCQkKLQkJZmFsc2VQcm94eS5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uUmVzb2x2ZWQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlJQmVhblByb3h5IHZhbHVlID0gZXZlbnQuZ2V0UHJveHkoKTsKLQkJCQlhc3NlcnROb3ROdWxsKHZhbHVlKTsKLQkJCQlhc3NlcnRFcXVhbHMoImludCIsIHZhbHVlLmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkpOwotCQkJCWFzc2VydEVxdWFscygwLCAoKElOdW1iZXJCZWFuUHJveHkpIHZhbHVlKS5pbnRWYWx1ZSgpKTsKLQkJCX0KLQkJfSk7Ci0KLQkJZXhwLmludm9rZUV4cHJlc3Npb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SWZFbHNlVHJ1ZVdpdGhvdXRFbHNlKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUlmRWxzZShmYWxzZSk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5JRl9DT05ESVRJT04sIEluZml4T3BlcmF0b3IuSU5fRVFVQUxTLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAoYnl0ZSkgMyk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIChzaG9ydCkgMyk7Ci0JCUV4cHJlc3Npb25Qcm94eSB0cnVlUHJveHkgPSBleHAuY3JlYXRlUHJveHlBc3NpZ25tZW50RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLklGX1RSVUUpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQVNTSUdOTUVOVF9SSUdIVCwgSW5maXhPcGVyYXRvci5JTl9QTFVTLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAoYnl0ZSkgMyk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIChzaG9ydCkgMyk7Ci0JCQotCQl0cnVlUHJveHkuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblJlc29sdmVkKCkgewotCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJSUJlYW5Qcm94eSB2YWx1ZSA9IGV2ZW50LmdldFByb3h5KCk7Ci0JCQkJYXNzZXJ0Tm90TnVsbCh2YWx1ZSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCB2YWx1ZS5nZXRUeXBlUHJveHkoKS5nZXRGb3JtYWxUeXBlTmFtZSgpKTsKLQkJCQlhc3NlcnRFcXVhbHMoNiwgKChJTnVtYmVyQmVhblByb3h5KSB2YWx1ZSkuaW50VmFsdWUoKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWV4cC5pbnZva2VFeHByZXNzaW9uKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJZkVsc2VGYWxzZVdpdGhvdXRFbHNlKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUlmRWxzZShmYWxzZSk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5JRl9DT05ESVRJT04sIEluZml4T3BlcmF0b3IuSU5fRVFVQUxTLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAoYnl0ZSkgNCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIChzaG9ydCkgMyk7Ci0JCUV4cHJlc3Npb25Qcm94eSB0cnVlUHJveHkgPSBleHAuY3JlYXRlUHJveHlBc3NpZ25tZW50RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLklGX1RSVUUpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQVNTSUdOTUVOVF9SSUdIVCwgSW5maXhPcGVyYXRvci5JTl9QTFVTLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAoYnl0ZSkgMyk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIChzaG9ydCkgMyk7Ci0JCQotCQl0cnVlUHJveHkuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCkpOwotCi0JCWV4cC5pbnZva2VFeHByZXNzaW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElmRWxzZUJsb2Nrc1RydWVXaXRoRWxzZSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJZkVsc2UodHJ1ZSk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5JRl9DT05ESVRJT04sIEluZml4T3BlcmF0b3IuSU5fRVFVQUxTLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAoYnl0ZSkgMyk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIChzaG9ydCkgMyk7Ci0JCWV4cC5jcmVhdGVCbG9ja0JlZ2luKCk7Ci0JCQlFeHByZXNzaW9uUHJveHkgdHJ1ZVByb3h5ID0gZXhwLmNyZWF0ZVByb3h5QXNzaWdubWVudEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTik7Ci0JCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQVNTSUdOTUVOVF9SSUdIVCwgSW5maXhPcGVyYXRvci5JTl9QTFVTLCAwKTsKLQkJCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgKGJ5dGUpIDMpOwotCQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgKHNob3J0KSAzKTsKLQkJZXhwLmNyZWF0ZUJsb2NrRW5kKCk7Ci0JCWV4cC5jcmVhdGVCbG9ja0JlZ2luKCk7Ci0JCQlFeHByZXNzaW9uUHJveHkgZmFsc2VQcm94eSA9IGV4cC5jcmVhdGVQcm94eUFzc2lnbm1lbnRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04pOwkJCi0JCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQVNTSUdOTUVOVF9SSUdIVCwgSW5maXhPcGVyYXRvci5JTl9NSU5VUywgMCk7Ci0JCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIChieXRlKSAzKTsKLQkJCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIChzaG9ydCkgMyk7Ci0JCWV4cC5jcmVhdGVCbG9ja0VuZCgpOwotCQkKLQkJdHJ1ZVByb3h5LmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCUlCZWFuUHJveHkgdmFsdWUgPSBldmVudC5nZXRQcm94eSgpOwotCQkJCWFzc2VydE5vdE51bGwodmFsdWUpOwotCQkJCWFzc2VydEVxdWFscygiaW50IiwgdmFsdWUuZ2V0VHlwZVByb3h5KCkuZ2V0Rm9ybWFsVHlwZU5hbWUoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKDYsICgoSU51bWJlckJlYW5Qcm94eSkgdmFsdWUpLmludFZhbHVlKCkpOwotCQkJfQotCQl9KTsKLQotCQlmYWxzZVByb3h5LmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25Ob3RSZXNvbHZlZCgpKTsKLQkJZXhwLmludm9rZUV4cHJlc3Npb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SWZFbHNlQmxvY2tzRmFsc2VXaXRoRWxzZSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJZkVsc2UodHJ1ZSk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5JRl9DT05ESVRJT04sIEluZml4T3BlcmF0b3IuSU5fRVFVQUxTLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAoYnl0ZSkgNCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIChzaG9ydCkgMyk7Ci0JCWV4cC5jcmVhdGVCbG9ja0JlZ2luKCk7Ci0JCQlFeHByZXNzaW9uUHJveHkgdHJ1ZVByb3h5ID0gZXhwLmNyZWF0ZVByb3h5QXNzaWdubWVudEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTik7Ci0JCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQVNTSUdOTUVOVF9SSUdIVCwgSW5maXhPcGVyYXRvci5JTl9QTFVTLCAwKTsKLQkJCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgKGJ5dGUpIDMpOwotCQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgKHNob3J0KSAzKTsKLQkJZXhwLmNyZWF0ZUJsb2NrRW5kKCk7Ci0JCWV4cC5jcmVhdGVCbG9ja0JlZ2luKCk7Ci0JCQlFeHByZXNzaW9uUHJveHkgZmFsc2VQcm94eSA9IGV4cC5jcmVhdGVQcm94eUFzc2lnbm1lbnRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04pOwkJCi0JCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQVNTSUdOTUVOVF9SSUdIVCwgSW5maXhPcGVyYXRvci5JTl9NSU5VUywgMCk7Ci0JCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIChieXRlKSAzKTsKLQkJCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIChzaG9ydCkgMyk7Ci0JCWV4cC5jcmVhdGVCbG9ja0VuZCgpOwotCi0JCXRydWVQcm94eS5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKSk7Ci0JCQotCQlmYWxzZVByb3h5LmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCUlCZWFuUHJveHkgdmFsdWUgPSBldmVudC5nZXRQcm94eSgpOwotCQkJCWFzc2VydE5vdE51bGwodmFsdWUpOwotCQkJCWFzc2VydEVxdWFscygiaW50IiwgdmFsdWUuZ2V0VHlwZVByb3h5KCkuZ2V0Rm9ybWFsVHlwZU5hbWUoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKDAsICgoSU51bWJlckJlYW5Qcm94eSkgdmFsdWUpLmludFZhbHVlKCkpOwotCQkJfQotCQl9KTsKLQotCQlleHAuaW52b2tlRXhwcmVzc2lvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJZkVsc2VCbG9ja1RydWVXaXRob3V0RWxzZSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJZkVsc2UoZmFsc2UpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uSUZfQ09ORElUSU9OLCBJbmZpeE9wZXJhdG9yLklOX0VRVUFMUywgMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgKGJ5dGUpIDMpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAoc2hvcnQpIDMpOwotCQlleHAuY3JlYXRlQmxvY2tCZWdpbigpOwotCQkJRXhwcmVzc2lvblByb3h5IHRydWVQcm94eSA9IGV4cC5jcmVhdGVQcm94eUFzc2lnbm1lbnRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04pOwotCQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkFTU0lHTk1FTlRfUklHSFQsIEluZml4T3BlcmF0b3IuSU5fUExVUywgMCk7Ci0JCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIChieXRlKSAzKTsKLQkJCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIChzaG9ydCkgMyk7Ci0JCWV4cC5jcmVhdGVCbG9ja0VuZCgpOwotCQkKLQkJdHJ1ZVByb3h5LmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCUlCZWFuUHJveHkgdmFsdWUgPSBldmVudC5nZXRQcm94eSgpOwotCQkJCWFzc2VydE5vdE51bGwodmFsdWUpOwotCQkJCWFzc2VydEVxdWFscygiaW50IiwgdmFsdWUuZ2V0VHlwZVByb3h5KCkuZ2V0Rm9ybWFsVHlwZU5hbWUoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKDYsICgoSU51bWJlckJlYW5Qcm94eSkgdmFsdWUpLmludFZhbHVlKCkpOwotCQkJfQotCQl9KTsKLQotCQlleHAuaW52b2tlRXhwcmVzc2lvbigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SWZFbHNlQmxvY2tGYWxzZVdpdGhvdXRFbHNlKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUlmRWxzZShmYWxzZSk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5JRl9DT05ESVRJT04sIEluZml4T3BlcmF0b3IuSU5fRVFVQUxTLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAoYnl0ZSkgNCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIChzaG9ydCkgMyk7Ci0JCWV4cC5jcmVhdGVCbG9ja0JlZ2luKCk7Ci0JCQlFeHByZXNzaW9uUHJveHkgdHJ1ZVByb3h5ID0gZXhwLmNyZWF0ZVByb3h5QXNzaWdubWVudEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTik7Ci0JCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQVNTSUdOTUVOVF9SSUdIVCwgSW5maXhPcGVyYXRvci5JTl9QTFVTLCAwKTsKLQkJCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgKGJ5dGUpIDMpOwotCQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgKHNob3J0KSAzKTsKLQkJZXhwLmNyZWF0ZUJsb2NrRW5kKCk7Ci0JCQotCQl0cnVlUHJveHkuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCkpOwotCi0JCWV4cC5pbnZva2VFeHByZXNzaW9uKCk7Ci0JfQkKLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdJbml0U3RyaW5nUHJpbWl0aXZlKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJLy8gVXNlIGludGVybmFsIGV4cHJlc3Npb24gY2xhc3Mgc28gd2UgY2FuIHRlc3QgdGhlIHNwZWNpYWwgbWV0aG9kLgotCQlFeHByZXNzaW9uIGV4cCA9IChFeHByZXNzaW9uKSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlFeHByZXNzaW9uUHJveHkgcmVzdWx0ID0gZXhwLmNyZWF0ZVByb3h5QXNzaWdubWVudEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTik7Ci0JCWV4cC5jcmVhdGVOZXdJbnN0YW5jZShGb3JFeHByZXNzaW9uLkFTU0lHTk1FTlRfUklHSFQsICJmYWxzZSIsIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiYm9vbGVhbiIpKTsKLQkJcmVzdWx0LmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpewotCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJSUJlYW5Qcm94eSB2YWx1ZSA9IGV2ZW50LmdldFByb3h5KCk7Ci0JCQkJYXNzZXJ0Tm90TnVsbCh2YWx1ZSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJib29sZWFuIiwgdmFsdWUuZ2V0VHlwZVByb3h5KCkuZ2V0Rm9ybWFsVHlwZU5hbWUoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCAoKElCb29sZWFuQmVhblByb3h5KSB2YWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQkJCi0JCX0pOwotCQkKLQkJZXhwLmludm9rZUV4cHJlc3Npb24oKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1hcmsoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQkvLyBKdXN0IHRlc3QgaGF2aW5nIGEgbWFyayBhbmQgbm8gZXJyb3JzLgotCQlFeHByZXNzaW9uIGV4cCA9IChFeHByZXNzaW9uKSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlpbnQgbWFyayA9IGV4cC5tYXJrKCk7Ci0JCXRyeSB7Ci0JCQlFeHByZXNzaW9uUHJveHkgcmVzdWx0ID0gZXhwLmNyZWF0ZVByb3h5QXNzaWdubWVudEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTik7Ci0JCQlleHAuY3JlYXRlTmV3SW5zdGFuY2UoRm9yRXhwcmVzc2lvbi5BU1NJR05NRU5UX1JJR0hULCAiZmFsc2UiLCBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImJvb2xlYW4iKSk7Ci0JCQlyZXN1bHQuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblJlc29sdmVkKCl7Ci0JCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJCUlCZWFuUHJveHkgdmFsdWUgPSBldmVudC5nZXRQcm94eSgpOwotCQkJCQlhc3NlcnROb3ROdWxsKHZhbHVlKTsKLQkJCQkJYXNzZXJ0RXF1YWxzKCJib29sZWFuIiwgdmFsdWUuZ2V0VHlwZVByb3h5KCkuZ2V0Rm9ybWFsVHlwZU5hbWUoKSk7Ci0JCQkJCWFzc2VydEVxdWFscyhmYWxzZSwgKChJQm9vbGVhbkJlYW5Qcm94eSkgdmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQl9Ci0JCQkJCi0JCQl9KTsJCQkKLQkJfSBmaW5hbGx5IHsKLQkJCWV4cC5lbmRNYXJrKG1hcmspOwotCQl9Ci0JCWV4cC5pbnZva2VFeHByZXNzaW9uKCk7Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFyazIoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQkvLyBKdXN0IHRlc3QgaGF2aW5nIGEgbWFyayBlcnJvcnMsIGJ1dCBleHByZXNzaW9ucyBiZWZvcmUgdGhlIG1hcmsgYW5kIGFmdGVyIHRoZSBtYXJrIGFyZSBzdWNjZXNzZnVsLgotCQlFeHByZXNzaW9uIGV4cCA9IChFeHByZXNzaW9uKSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlpbnQgbWFyazAgPSBleHAubWFyaygpOwotCQlmaW5hbCBib29sZWFuW10gcmVzdWx0UmVzb2x2ZWQgPSBuZXcgYm9vbGVhblsxXTsKLQkJRXhwcmVzc2lvbk5vdFJlc29sdmVkIGVwMSA9IG51bGw7Ci0JCWZpbmFsIGJvb2xlYW5bXSByZXN1bHRSZXNvbHZlZDIgPSBuZXcgYm9vbGVhblsxXTsKLQkJdHJ5IHsKLQkJCUV4cHJlc3Npb25Qcm94eSByZXN1bHQgPSBleHAuY3JlYXRlUHJveHlBc3NpZ25tZW50RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OKTsKLQkJCXJlc3VsdC5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uUmVzb2x2ZWQoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQkJSUJlYW5Qcm94eSB2YWx1ZSA9IGV2ZW50LmdldFByb3h5KCk7Ci0JCQkJCWFzc2VydE5vdE51bGwodmFsdWUpOwotCQkJCQlhc3NlcnRFcXVhbHMoImJvb2xlYW4iLCB2YWx1ZS5nZXRUeXBlUHJveHkoKS5nZXRGb3JtYWxUeXBlTmFtZSgpKTsKLQkJCQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCAoKElCb29sZWFuQmVhblByb3h5KSB2YWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCQlyZXN1bHRSZXNvbHZlZFswXSA9IHRydWU7Ci0JCQkJfQotCi0JCQl9KTsKLQkJCWV4cC5jcmVhdGVOZXdJbnN0YW5jZShGb3JFeHByZXNzaW9uLkFTU0lHTk1FTlRfUklHSFQsICJmYWxzZSIsIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiYm9vbGVhbiIpKTsKLQkJCWV4cC5jcmVhdGVUcnkoKTsKLQkJCWludCBtYXJrID0gZXhwLm1hcmsoKTsKLQkJCXRyeSB7Ci0JCQkJRXhwcmVzc2lvblByb3h5IHJlc3VsdDEgPSBleHAuY3JlYXRlUHJveHlBc3NpZ25tZW50RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OKTsKLQkJCQlyZXN1bHQxLmFkZFByb3h5TGlzdGVuZXIoZXAxID0gbmV3IEV4cHJlc3Npb25Ob3RSZXNvbHZlZCgpKTsKLQkJCQlleHAuY3JlYXRlTmV3SW5zdGFuY2UoRm9yRXhwcmVzc2lvbi5BU1NJR05NRU5UX0xFRlQsICJmYWxzZSIsIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiYm9vbGVhbiIpKTsKLQkJCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gVGhpcyBpcyBvaywgc2hvdWxkIG9mIGdvdCB0aGlzLgotCQkJfSBmaW5hbGx5IHsKLQkJCQlleHAuZW5kTWFyayhtYXJrKTsKLQkJCX0KLQkJCWV4cC5jcmVhdGVUcnlFbmQoKTsKLQkJCUV4cHJlc3Npb25Qcm94eSByZXN1bHQyID0gZXhwLmNyZWF0ZVByb3h5QXNzaWdubWVudEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTik7Ci0JCQlyZXN1bHQyLmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCQlJQmVhblByb3h5IHZhbHVlID0gZXZlbnQuZ2V0UHJveHkoKTsKLQkJCQkJYXNzZXJ0Tm90TnVsbCh2YWx1ZSk7Ci0JCQkJCWFzc2VydEVxdWFscygiYm9vbGVhbiIsIHZhbHVlLmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkpOwotCQkJCQlhc3NlcnRFcXVhbHMoZmFsc2UsICgoSUJvb2xlYW5CZWFuUHJveHkpIHZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJCXJlc3VsdFJlc29sdmVkMlswXSA9IHRydWU7Ci0JCQkJfQotCi0JCQl9KTsKLQkJCWV4cC5jcmVhdGVOZXdJbnN0YW5jZShGb3JFeHByZXNzaW9uLkFTU0lHTk1FTlRfUklHSFQsICJmYWxzZSIsIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiYm9vbGVhbiIpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWV4cC5lbmRNYXJrKG1hcmswKTsKLQkJfQotCQkKLQkJZXhwLmludm9rZUV4cHJlc3Npb24oKTsKLQkJCi0JCWFzc2VydE5vdE51bGwoZXAxKTsKLQkJYXNzZXJ0VHJ1ZShlcDEubm90UmVzb2x2ZWRDYWxsZWQpOwotCQlhc3NlcnRUcnVlKHJlc3VsdFJlc29sdmVkWzBdKTsKLQkJYXNzZXJ0VHJ1ZShyZXN1bHRSZXNvbHZlZDJbMF0pOwotCQkKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdE1hcmtFcnJvcigpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCS8vIFRlc3Qgd2l0aCBvbmUgZXJyb3IgYW5kIHNlZSBpZiBpdCByZXN0b3JlcyBjb3JyZWN0bHkuCi0JCUV4cHJlc3Npb24gZXhwID0gKEV4cHJlc3Npb24pIHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWludCBtYXJrID0gZXhwLm1hcmsoKTsKLQkJRXhwcmVzc2lvbk5vdFJlc29sdmVkIGVwbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlFeHByZXNzaW9uUHJveHkgcmVzdWx0ID0gZXhwLmNyZWF0ZVByb3h5QXNzaWdubWVudEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTik7Ci0JCQlyZXN1bHQuYWRkUHJveHlMaXN0ZW5lcihlcGwgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCkpOwotCQkJZXhwLmNyZWF0ZU5ld0luc3RhbmNlKEZvckV4cHJlc3Npb24uQVNTSUdOTUVOVF9MRUZULCAiZmFsc2UiLCBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImJvb2xlYW4iKSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUaGlzIGlzIGdvb2QuIFdlIHNob3VsZCBnZXQgaGVyZS4KLQkJfSBmaW5hbGx5IHsKLQkJCWV4cC5lbmRNYXJrKG1hcmspOwotCQl9Ci0JCQotCQkvLyBOb3cgd2Ugc2hvdWxkIGJlIGFibGUgdG8gY29udGludWUgYW5kIGdldCBnb29kIGFuc3dlci4KLQkJRXhwcmVzc2lvblByb3h5IHJlc3VsdCA9IGV4cC5jcmVhdGVQcm94eUFzc2lnbm1lbnRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04pOwotCQlleHAuY3JlYXRlTmV3SW5zdGFuY2UoRm9yRXhwcmVzc2lvbi5BU1NJR05NRU5UX1JJR0hULCAiZmFsc2UiLCBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImJvb2xlYW4iKSk7Ci0JCXJlc3VsdC5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uUmVzb2x2ZWQoKXsKLQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCUlCZWFuUHJveHkgdmFsdWUgPSBldmVudC5nZXRQcm94eSgpOwotCQkJCWFzc2VydE5vdE51bGwodmFsdWUpOwotCQkJCWFzc2VydEVxdWFscygiYm9vbGVhbiIsIHZhbHVlLmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkpOwotCQkJCWFzc2VydEVxdWFscyhmYWxzZSwgKChJQm9vbGVhbkJlYW5Qcm94eSkgdmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQkJCQotCQl9KTsKLQkJCi0JCWV4cC5pbnZva2VFeHByZXNzaW9uKCk7Ci0JCWFzc2VydE5vdE51bGwoZXBsKTsKLQkJYXNzZXJ0VHJ1ZShlcGwubm90UmVzb2x2ZWRDYWxsZWQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFya05lc3RFcnJvcigpIHsKLQkJLy8gVGVzdCBtYXJrIG5lc3QgZXJyb3IuCi0JCS8vIG1hcmsKLQkJLy8gdHJ5IHsKLQkJLy8gICBlbmRtYXJrCi0JCS8vIH0gZmluYWxseSA8LS0gdGhpcyBzaG91bGQgY2F1c2UgYW4gZXhjZXB0aW9uLgotCQlFeHByZXNzaW9uIGV4cCA9IChFeHByZXNzaW9uKSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlpbnQgbWFyayA9IGV4cC5tYXJrKCk7Ci0JCUV4cHJlc3Npb25Ob3RSZXNvbHZlZCBlcGwgPSBudWxsOwotCQl0cnkgewotCQkJZXhwLmNyZWF0ZVRyeSgpOwotCQkJRXhwcmVzc2lvblByb3h5IHJlc3VsdCA9IGV4cC5jcmVhdGVQcm94eUFzc2lnbm1lbnRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04pOwotCQkJcmVzdWx0LmFkZFByb3h5TGlzdGVuZXIoZXBsID0gbmV3IEV4cHJlc3Npb25Ob3RSZXNvbHZlZCgpKTsKLQkJCWV4cC5jcmVhdGVOZXdJbnN0YW5jZShGb3JFeHByZXNzaW9uLkFTU0lHTk1FTlRfUklHSFQsICJmYWxzZSIsIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiYm9vbGVhbiIpKTsKLQkJCWV4cC5lbmRNYXJrKG1hcmspOwotCQkJZXhwLmNyZWF0ZVRyeUZpbmFsbHlDbGF1c2UoKTsKLQkJCWV4cC5jcmVhdGVUcnlFbmQoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRoaXMgaXMgZ29vZC4gV2Ugc2hvdWxkIGdldCBoZXJlLgotCQkJZXhwLmNsb3NlKCk7Ci0JCQlhc3NlcnROb3ROdWxsKGVwbCk7Ci0JCQlhc3NlcnRUcnVlKGVwbC5ub3RSZXNvbHZlZENhbGxlZCk7CQkJCi0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWV4cC5jbG9zZSgpOwotCQlmYWlsKCJTaG91bGQgbm90IG9mIGdvdHRlbiBoZXJlLiIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFya05lc3RFcnJvcjIoKSB7Ci0JCS8vIFRlc3QgbWFyayBuZXN0IGVycm9yLgotCQkvLyB0cnkgewotCQkvLyAgIG1hcmsKLQkJLy8gfSBmaW5hbGx5IDwtLSB0aGlzIHNob3VsZCBjYXVzZSBhbiBleGNlcHRpb24uCi0JCS8vIGVuZG1hcmsKLQkJRXhwcmVzc2lvbiBleHAgPSAoRXhwcmVzc2lvbikgcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJRXhwcmVzc2lvbk5vdFJlc29sdmVkIGVwbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlleHAuY3JlYXRlVHJ5KCk7Ci0JCQlpbnQgbWFyayA9IGV4cC5tYXJrKCk7Ci0JCQlFeHByZXNzaW9uUHJveHkgcmVzdWx0ID0gZXhwLmNyZWF0ZVByb3h5QXNzaWdubWVudEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTik7Ci0JCQlyZXN1bHQuYWRkUHJveHlMaXN0ZW5lcihlcGwgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCkpOwotCQkJZXhwLmNyZWF0ZU5ld0luc3RhbmNlKEZvckV4cHJlc3Npb24uQVNTSUdOTUVOVF9SSUdIVCwgImZhbHNlIiwgcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJib29sZWFuIikpOwotCQkJZXhwLmNyZWF0ZVRyeUZpbmFsbHlDbGF1c2UoKTsKLQkJCWV4cC5jcmVhdGVUcnlFbmQoKTsKLQkJCWV4cC5lbmRNYXJrKG1hcmspOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkJLy8gVGhpcyBpcyBnb29kLiBXZSBzaG91bGQgZ2V0IGhlcmUuCi0JCQlleHAuY2xvc2UoKTsKLQkJCWFzc2VydE5vdE51bGwoZXBsKTsKLQkJCWFzc2VydFRydWUoZXBsLm5vdFJlc29sdmVkQ2FsbGVkKTsJCQkKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJZXhwLmNsb3NlKCk7Ci0JCWZhaWwoIlNob3VsZCBub3Qgb2YgZ290dGVuIGhlcmUuIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV4cHJlc3Npb25UcmFuc2ZlcigpIHRocm93cyBUaHJvd2FibGUgewotCQkvLyBUZXN0IHRoYXQgdGhyZWFkIHRyYW5zZmVyIHdvcmtzLiBXZSB3aWxsIGRvIHBhcnQgb2YgdGhlIGV4cHJlc3Npb24gaW4gb25lIHRocmVhZCwgbW9yZSBpbiB0aGUgbmV4dCwgYW5kCi0JCS8vIHRoZW4gY29tZSBiYWNrIGFuZCBjb21wbGV0ZSBpdC4KLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJRXhwcmVzc2lvblByb3h5IGVwSW5maXggPSBleHAuY3JlYXRlUHJveHlBc3NpZ25tZW50RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkFTU0lHTk1FTlRfUklHSFQsIEluZml4T3BlcmF0b3IuSU5fTEVTUywgMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgLTEwMDAwMDAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgMyk7Ci0JCQotCQkvLyBOb3cgdHJhbnNmZXIgdG8gYW5vdGhlciB0aHJlYWQuCi0JCUV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IChFeHByZXNzaW9uKSBleHA7Ci0JCWV4cHJlc3Npb24uYmVnaW5UcmFuc2ZlclRocmVhZCgpOwkvLyBCZWdpbiB0aGUgdHJhbnNmZXIuCi0JCQotCQlJQmVhblR5cGVQcm94eSBjYWxsYmFja1R5cGUgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoIm9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS52bS5UZXN0RXhwcmVzc2lvblRocmVhZFRyYW5zZmVyIik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbChjYWxsYmFja1R5cGUpOwotCQlJQmVhblByb3h5IGNhbGxiYWNrUHJveHkgPSBjYWxsYmFja1R5cGUubmV3SW5zdGFuY2UoKTsKLQkJCi0JCUV4cHJlc3Npb25UaHJlYWRUcmFuc2ZlckNhbGxCYWNrIGNiID0gbmV3IEV4cHJlc3Npb25UaHJlYWRUcmFuc2ZlckNhbGxCYWNrKGV4cHJlc3Npb24pOwotCQlyZWdpc3RyeS5nZXRDYWxsYmFja1JlZ2lzdHJ5KCkucmVnaXN0ZXJDYWxsYmFjayhjYWxsYmFja1Byb3h5LCBjYik7Ci0JCUlJbnZva2FibGUgc3RhcnQgPSBjYWxsYmFja1R5cGUuZ2V0SW52b2thYmxlKCJzdGFydCIpOwkvLyROT04tTkxTLTEkCi0JCXN0YXJ0Lmludm9rZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucyhjYWxsYmFja1Byb3h5KTsJLy8gU3RhcnQgdGhlIHRocmVhZCBvbiB0aGUgcmVtb3RlIHZtIGFuZCB3YWl0IGZvciBpdCB0byBmaW5pc2guCi0JCQotCQllcEluZml4LmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlJQmVhblByb3h5IHJlc3VsdCA9IGV2ZW50LmdldFByb3h5KCk7Ci0JCQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQkJCWFzc2VydEVxdWFscygiYm9vbGVhbiIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJCQlhc3NlcnRFcXVhbHMoLTEwMDAwMDAwPDMsICgoSUJvb2xlYW5CZWFuUHJveHkpIHJlc3VsdCkuYm9vbGVhblZhbHVlKCkpOwkJCi0JCQl9Ci0JCX0pOwotCQkKLQkJaWYgKGNiLmVycm9yICE9IG51bGwpIHsKLQkJCXRocm93IGNiLmVycm9yOwotCQl9Ci0JCQotCQljYi5lcC5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uUmVzb2x2ZWQoKXsKLQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlJQmVhblByb3h5IHJlc3VsdCA9IGV2ZW50LmdldFByb3h5KCk7Ci0JCQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQkJCWFzc2VydEVxdWFscygiYm9vbGVhbiIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJCQlhc3NlcnRFcXVhbHMoU3RyaW5nLmNsYXNzID09IFN0cmluZy5jbGFzcywgKChJQm9vbGVhbkJlYW5Qcm94eSkgcmVzdWx0KS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWV4cHJlc3Npb24udHJhbnNmZXJUaHJlYWQoKTsKLQkJZXhwLmludm9rZUV4cHJlc3Npb24oKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFN1YmV4cHJlc3Npb24oKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVBcnJheUNyZWF0aW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sICJpbnRbXVtdW10iLCAyKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5BUlJBWUNSRUFUSU9OX0RJTUVOU0lPTiwgMik7Ci0JCUV4cHJlc3Npb25Qcm94eSBzZWNvbmREaW1lbnNpb25Qcm94eSA9IG51bGw7Ci0JCS8vIFRoaXMgdGVzdHMgdGhhdCB3ZSBjYW4gcHV0IGFuIGV4cHJlc3Npb24gcmlnaHQgaW4gdGhlIG1pZGRsZSBvZiBhbm90aGVyIGV4cHJlc3Npb24gYW5kIAotCQkvLyBwaWNrIGl0IHdoZXJlIGl0IGxlZnQgb2ZmLgotCQlleHAuY3JlYXRlU3ViZXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlVHJ5KCk7Ci0JCXNlY29uZERpbWVuc2lvblByb3h5ID0gZXhwLmNyZWF0ZVByb3h5QXNzaWdubWVudEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTik7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uQVNTSUdOTUVOVF9SSUdIVCwgNCk7Ci0JCWV4cC5jcmVhdGVUcnlFbmQoKTsKLQkJZXhwLmNyZWF0ZVN1YmV4cHJlc3Npb25FbmQoKTsKLQkJZXhwLmNyZWF0ZVByb3h5RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkFSUkFZQ1JFQVRJT05fRElNRU5TSU9OLCBzZWNvbmREaW1lbnNpb25Qcm94eSk7CQkKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnRbXVtdW10iLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0Rm9ybWFsVHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCAoKElBcnJheUJlYW5Qcm94eSkgcmVzdWx0KS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyg0LCAoKElBcnJheUJlYW5Qcm94eSkoKElBcnJheUJlYW5Qcm94eSkgcmVzdWx0KS5nZXQoMCkpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0TnVsbCgoKElBcnJheUJlYW5Qcm94eSkoKElBcnJheUJlYW5Qcm94eSkgcmVzdWx0KS5nZXQoMCkpLmdldCgwKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvRXhwcmVzc2lvblRocmVhZFRyYW5zZmVyQ2FsbEJhY2suamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L0V4cHJlc3Npb25UaHJlYWRUcmFuc2ZlckNhbGxCYWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MTA0OGIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvRXhwcmVzc2lvblRocmVhZFRyYW5zZmVyQ2FsbEJhY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5OwotLyoKLSAqICAkUkNTZmlsZTogRXhwcmVzc2lvblRocmVhZFRyYW5zZmVyQ2FsbEJhY2suamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMiAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDo1ODo1NCAkIAotICovCi0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci50cmVlLkZvckV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZS5JbmZpeE9wZXJhdG9yOwotLyoqCi0gKiBUaGlzIGlzIHRoZSBjYWxsYmFjayBmb3IgdGhlIGV4cHJlc3Npb24gdGVzdCB0aHJlYWQgdHJhbnNmZXIuIFRoaXMgcnVucyBvbiB0aGUgSURFIHNpZGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHByZXNzaW9uVGhyZWFkVHJhbnNmZXJDYWxsQmFjayBpbXBsZW1lbnRzIElDYWxsYmFjayB7Ci0JCi0JRXhwcmVzc2lvbiBleHByZXNzaW9uOwotCXB1YmxpYyBUaHJvd2FibGUgZXJyb3I7Ci0JcHVibGljIEV4cHJlc3Npb25Qcm94eSBlcDsKLQkJCi0JcHVibGljIEV4cHJlc3Npb25UaHJlYWRUcmFuc2ZlckNhbGxCYWNrKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewotCQl0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGNhbGxlZEJhY2soaW50IG1zZ0lELCBJQmVhblByb3h5IHBhcm0pewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCBjYWxsZWRCYWNrKGludCBtc2dJRCwgT2JqZWN0IHBhcm0pIHsKLQkJdHJ5IHsKLQkJCWV4cHJlc3Npb24udHJhbnNmZXJUaHJlYWQoKTsKLQkJCS8vIFRoZSB0ZXN0IGhlcmUgaXMgZm9yIGVxdWFsaXR5LgotCQkJCi0JCQllcCA9IGV4cHJlc3Npb24uY3JlYXRlUHJveHlBc3NpZ25tZW50RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OKTsKLQkJCWV4cHJlc3Npb24uY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQVNTSUdOTUVOVF9SSUdIVCwgSW5maXhPcGVyYXRvci5JTl9FUVVBTFMsIDApOwotCQkJZXhwcmVzc2lvbi5jcmVhdGVUeXBlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsICJqYXZhLmxhbmcuU3RyaW5nIik7Ci0JCQlleHByZXNzaW9uLmNyZWF0ZVR5cGVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsICJqYXZhLmxhbmcuU3RyaW5nIik7Ci0JCQkKLQkJCQotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCWVycm9yID0gZTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChleHByZXNzaW9uLmlzVmFsaWQoKSkKLQkJCQl0cnkgewotCQkJCQlleHByZXNzaW9uLmJlZ2luVHJhbnNmZXJUaHJlYWQoKTsJLy8gU2V0IHRvIHJldHVybiBleHByZXNzaW9uIHRvIG90aGVyIHRocmVhZC4KLQkJCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkJCQllcnJvciA9IGU7Ci0JCQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJCQllcnJvciA9IGU7Ci0JCQkJfQkKLQkJfQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGNhbGxlZEJhY2soaW50IG1zZ0lELCBPYmplY3RbXSBwYXJtcyl7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBjYWxsZWRCYWNrU3RyZWFtKGludCBtc2dJRCwgSW5wdXRTdHJlYW0gaW4pewotCX0JCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9Qcm94eVN1aXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9Qcm94eVN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMTNkZDIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvUHJveHlTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHk7Ci0vKgotICogICRSQ1NmaWxlOiBQcm94eVN1aXRlLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjkgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6NTg6NTQgJCAKLSAqLwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnRlc3RzLkphdmFUZXN0c1BsdWdpbjsKLQotLyoqCi0gKiBAYXV0aG9yIHJpY2hrdWxwCi0gKiAKLSAqIFRoaXMgc3VpdGUgaXMgZm9yIHRlc3Rpbmcgc3RyYWlnaHQgUHJveHkgaW5kZXBlbmRlbnQgb2YgdGhlIHR5cGUgb2YgcHJveHkgKGUuZy4gUmVtb3RlIG9yIElERSkuCi0gKiBJdCBjYW4ndCBydW4gYnkgaXRzZWxmLiBJdCBuZWVkcyB0byBoYXZlIHRoZSByZWdpc3RyeSBjcmVhdGVyIG9iamVjdCBzdG9yZWQgaW4gaXQgc28gdGhhdAotICogdGhlIGFwcHJvcHJpYXRlIHJlZ2lzdHJ5IGNhbiBiZSBjcmVhdGVkIGFuZCByZWNyZWF0ZWQgYXMgbmVjZXNzYXJ5IGJ5IHRoZSB0ZXN0LgotICogCi0gKiBJZiB0aGUgdGVzdHMgaW5oZXJpdCBmcm9tIEFic3RyYWN0VGVzdFByb3h5IHRoZSBzZXRSZWdpc3RyeUhhbmRsZXIgd2lsbCBiZSBjYWxsZWQgb24gaXQuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm94eVN1aXRlIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQotCi0JLy8gVGVzdCBjYXNlcyB0byBiZSBpbmNsdWRlIGluIHRoZSBzdWl0ZQotCXByaXZhdGUgc3RhdGljIENsYXNzIHRlc3RzTGlzdFtdID0gewotCQlUZXN0U3RhbmRhcmQuY2xhc3MsCi0JCVRlc3RBV1RQcm94eS5jbGFzcywKLQkJRXhwcmVzc2lvblRlc3QuY2xhc3MsCi0JCQkJCQkJCQkgICB9IDsKLQkJCQkJCQkJCSAgIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBrZ05hbWUgPSAib3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5IiA7Ci0JICAgIAotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBQYWNrYWdlU3VpdGUuCi0JICovCi0JcHVibGljIFByb3h5U3VpdGUoKSB7Ci0JCXN1cGVyKCk7Ci0JCXBvcHVsYXRlU3VpdGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgUGFja2FnZVN1aXRlLgotCSAqIEBwYXJhbSB0aGVDbGFzcwotCSAqLwotCXB1YmxpYyBQcm94eVN1aXRlKENsYXNzIHRoZUNsYXNzKSB7Ci0JCXN1cGVyKHRoZUNsYXNzKTsJCQotCQlwb3B1bGF0ZVN1aXRlKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFBhY2thZ2VTdWl0ZS4KLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBQcm94eVN1aXRlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwkJCi0JCXBvcHVsYXRlU3VpdGUoKSA7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlU3VpdGUgKCkgewotCQlmb3IgKGludCBpPTA7IGk8dGVzdHNMaXN0Lmxlbmd0aDsgaSsrKQotCQkgIGFkZFRlc3RTdWl0ZSh0ZXN0c0xpc3RbaV0pIDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgY29udHJpYnV0b3IgdG8gYmUgdXNlZCB3aGVuIHN0YXJ0aW5nIHRlc3RzIHNvIHRoYXQgUHJveHlTdWl0ZSBjYW4gY29udHJpYnV0ZSB0byBpdC4KLQkgKiBAcmV0dXJuIEEgY29udHJpYnV0b3IgZm9yIFByb3h5IFN1aXRlIHRlc3RzCi0JICovCi0JcHVibGljIHN0YXRpYyBJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yIGdldFByb3h5U3VpdGVDb250cmlidXRvcigpIHsKLQkJcmV0dXJuIG5ldyBDb25maWd1cmF0aW9uQ29udHJpYnV0b3JBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgY29udHJpYnV0ZUNsYXNzcGF0aHMoSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25Db250cm9sbGVyIGNvbnRyb2xsZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQljb250cm9sbGVyLmNvbnRyaWJ1dGVDbGFzc3BhdGgoSmF2YVRlc3RzUGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLCAidm0vdGVzdHMuamFyIiwgSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25Db250cm9sbGVyLkFQUEVORF9VU0VSX0NMQVNTUEFUSCwgZmFsc2UpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L1Rlc3RBV1RQcm94eS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvVGVzdEFXVFByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwYzE4YjguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvVGVzdEFXVFByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHk7Ci0vKgotICogICRSQ1NmaWxlOiBUZXN0QVdUUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDo1ODo1NCAkIAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmF3dC5JU3RhbmRhcmRBd3RCZWFuUHJveHlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5hd3QuSmF2YVN0YW5kYXJkQXd0QmVhbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotCi0vKioKLSAqIEBhdXRob3IgcmljaGt1bHAKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgVGVzdEFXVFByb3h5IGV4dGVuZHMgQWJzdHJhY3RUZXN0UHJveHkgewotCi0JcHVibGljIFRlc3RBV1RQcm94eSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgVGVzdEFXVFByb3h5KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIEphdmFTdGFuZGFyZEF3dEJlYW5Db25zdGFudHMgY29uc3RhbnRzOwkvLyBJZiB0aGlzIGlzIG51bGwgdGhlbiBkb24ndCBkbyB0ZXN0cy4KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCQotCQljb25zdGFudHMgPSBKYXZhU3RhbmRhcmRBd3RCZWFuQ29uc3RhbnRzLmdldENvbnN0YW50cyhyZWdpc3RyeSk7Ci0JCWFzc2VydE5vdE51bGwoY29uc3RhbnRzKTsKLQkJaWYgKCFjb25zdGFudHMuaXNBV1RBdmFpbGFibGUoKSkgewotCQkJLy8gdGhpcyBpcyBub3QgYW4gZXJyb3IuIEl0IGp1c3QgbWVhbnMgd2UgZG9uJ3QgYW55dGhpbmcuIFRoaXMgaXMgc2lnbmlmaWVkIGJ5IGNvbnN0YW50cyBiZWluZyBudWxsLgotCQkJY29uc3RhbnRzID0gbnVsbDsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QVdUQ29sb3IoKSB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7Ci0JCWlmIChjb25zdGFudHMgPT0gbnVsbCkKLQkJCXJldHVybjsJLy8gTm8gQVdULCBzbyB0ZXN0IGlzbid0IGRvbmUsIGJ1dCBzdGlsbCBjb25zaWRlcmVkIGdvb2QuCi0JCQkKLQkJLy8gQVdUIENvbG9yIHRlc3RzCi0JCUlCZWFuVHlwZVByb3h5IGNvbG9yVHlwZSA9IHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5hd3QuQ29sb3IiKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKGNvbG9yVHlwZSk7Ci0JCUlCZWFuUHJveHkgY29sb3JQcm94eSA9IGNvbG9yVHlwZS5uZXdJbnN0YW5jZSgiamF2YS5hd3QuQ29sb3IuY3lhbiIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoY29sb3JQcm94eSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5hd3QuQ29sb3Jbcj0wLGc9MjU1LGI9MjU1XSIsIGNvbG9yUHJveHkudG9CZWFuU3RyaW5nKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QVdUUHJveHlGYWN0b3J5KCkgewotCQlpZiAoY29uc3RhbnRzID09IG51bGwpCi0JCQlyZXR1cm47CS8vIE5vIEFXVCwgc28gdGVzdCBpc24ndCBkb25lLCBidXQgc3RpbGwgY29uc2lkZXJlZCBnb29kLgotCQkJCi0JCUlTdGFuZGFyZEF3dEJlYW5Qcm94eUZhY3RvcnkgYXd0UHJveHlGYWN0b3J5ID0gKElTdGFuZGFyZEF3dEJlYW5Qcm94eUZhY3RvcnkpIHJlZ2lzdHJ5LmdldEJlYW5Qcm94eUZhY3RvcnlFeHRlbnNpb24oSVN0YW5kYXJkQXd0QmVhblByb3h5RmFjdG9yeS5SRUdJU1RSWV9LRVkpOwotCQlhc3NlcnROb3ROdWxsKGF3dFByb3h5RmFjdG9yeSk7Ci0JCQotCQkvLyBUZXN0IHRoZSBjcmVhdGlvbiB0aHJvdWdoIHRoZSBoZWxwZXJzLCBwbHVzIHRlc3Qgc3BlY2lhbCBtZXRob2RzIAotCQlJRGltZW5zaW9uQmVhblByb3h5IGRpbUJlYW4gPSBhd3RQcm94eUZhY3RvcnkuY3JlYXRlRGltZW5zaW9uQmVhblByb3h5V2l0aCg1LDYpOwotCQlhc3NlcnROb3ROdWxsKGRpbUJlYW4pOwotCQlhc3NlcnRFcXVhbHMoImphdmEuYXd0LkRpbWVuc2lvblt3aWR0aD01LGhlaWdodD02XSIsIGRpbUJlYW4udG9CZWFuU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscyg1LCBkaW1CZWFuLmdldFdpZHRoKCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgZGltQmVhbi5nZXRIZWlnaHQoKSk7CQkKLQkJCi0JCUlQb2ludEJlYW5Qcm94eSBwb2ludEJlYW4gPSBhd3RQcm94eUZhY3RvcnkuY3JlYXRlUG9pbnRCZWFuUHJveHlXaXRoKDUsNik7Ci0JCWFzc2VydE5vdE51bGwocG9pbnRCZWFuKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmF3dC5Qb2ludFt4PTUseT02XSIsIHBvaW50QmVhbi50b0JlYW5TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKDUsIHBvaW50QmVhbi5nZXRYKCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgcG9pbnRCZWFuLmdldFkoKSk7CQkKLQkJCi0JCUlSZWN0YW5nbGVCZWFuUHJveHkgcmVjdEJlYW4gPSBhd3RQcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCg1LDYsNyw4KTsKLQkJYXNzZXJ0Tm90TnVsbChyZWN0QmVhbik7Ci0JCWFzc2VydEVxdWFscygiamF2YS5hd3QuUmVjdGFuZ2xlW3g9NSx5PTYsd2lkdGg9NyxoZWlnaHQ9OF0iLCByZWN0QmVhbi50b0JlYW5TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKDUsIHJlY3RCZWFuLmdldFgoKSk7Ci0JCWFzc2VydEVxdWFscyg2LCByZWN0QmVhbi5nZXRZKCkpOwkJCi0JCWFzc2VydEVxdWFscyg3LCByZWN0QmVhbi5nZXRXaWR0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDgsIHJlY3RCZWFuLmdldEhlaWdodCgpKTsJCQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBV1RTcGVjaWFsc0luaXRTdHJpbmcoKSB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7Ci0JCWlmIChjb25zdGFudHMgPT0gbnVsbCkKLQkJCXJldHVybjsJLy8gTm8gQVdULCBzbyB0ZXN0IGlzbid0IGRvbmUsIGJ1dCBzdGlsbCBjb25zaWRlcmVkIGdvb2QuCi0JCQkKLQkJCi0JCS8vIFRlc3QgdGhlIGNyZWF0aW9uIHRocm91Z2ggaW5pdCBzdHJpbmdzCi0JCUlCZWFuVHlwZVByb3h5IGRpbVR5cGUgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEuYXd0LkRpbWVuc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoZGltVHlwZSk7CQkKLQkJSURpbWVuc2lvbkJlYW5Qcm94eSBkaW1CZWFuID0gKElEaW1lbnNpb25CZWFuUHJveHkpIGRpbVR5cGUubmV3SW5zdGFuY2UoIm5ldyBqYXZhLmF3dC5EaW1lbnNpb24oNyw4KSIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoZGltQmVhbik7Ci0JCWFzc2VydEVxdWFscygiamF2YS5hd3QuRGltZW5zaW9uW3dpZHRoPTcsaGVpZ2h0PThdIiwgZGltQmVhbi50b0JlYW5TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUlCZWFuVHlwZVByb3h5IHBvaW50VHlwZSA9IHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5hd3QuUG9pbnQiKTsgLy8kTk9OLU5MUy0xJAotCQlJUG9pbnRCZWFuUHJveHkgcG9pbnRCZWFuID0gKElQb2ludEJlYW5Qcm94eSkgcG9pbnRUeXBlLm5ld0luc3RhbmNlKCJuZXcgamF2YS5hd3QuUG9pbnQoNSw2KSIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwocG9pbnRCZWFuKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmF3dC5Qb2ludFt4PTUseT02XSIsIHBvaW50QmVhbi50b0JlYW5TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUlCZWFuVHlwZVByb3h5IHJlY3RUeXBlID0gcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmF3dC5SZWN0YW5nbGUiKTsgLy8kTk9OLU5MUy0xJAotCQlJUmVjdGFuZ2xlQmVhblByb3h5IHJlY3RCZWFuID0gKElSZWN0YW5nbGVCZWFuUHJveHkpIHJlY3RUeXBlLm5ld0luc3RhbmNlKCJuZXcgamF2YS5hd3QuUmVjdGFuZ2xlKDUsNiw3LDgpIik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbChyZWN0QmVhbik7Ci0JCWFzc2VydEVxdWFscygiamF2YS5hd3QuUmVjdGFuZ2xlW3g9NSx5PTYsd2lkdGg9NyxoZWlnaHQ9OF0iLCByZWN0QmVhbi50b0JlYW5TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L1Rlc3RDYWxsYmFjay5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvVGVzdENhbGxiYWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3OTMzNGEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvVGVzdENhbGxiYWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHk7Ci0vKgotICogICRSQ1NmaWxlOiBUZXN0Q2FsbGJhY2suamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDo1ODo1NCAkIAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0vKioKLSAqIFRoaXMgaXMgdGhlIGNhbGxiYWNrIGZvciB0aGUgdGVzdCBjYXNlLiBUaGlzIHJ1bnMgb24gdGhlIElERSBzaWRlLgotICovCi1wdWJsaWMgY2xhc3MgVGVzdENhbGxiYWNrIGltcGxlbWVudHMgSUNhbGxiYWNrIHsKLQkKLQlPYmplY3QgdGVzdGVyOwotCVByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5OwotCQotCWludCBjb3VudGVyID0gMDsKLQkKLQkvKioKLQkgKiBUaGlzIHdpbGwgZG8gYXNzZXJ0IHRlc3RzIHRvIG1ha2Ugc3VyZSB0ZXN0IGNvbXBsZXRlZCBjb3JyZWN0bHkuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdENvbXBsZXRlZCgpIHsKLQkJaWYgKGJhZFBhcm1UeXBlICE9IG51bGwpCi0JCQlUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoSUludGVnZXJCZWFuUHJveHkuY2xhc3MsIGJhZFBhcm1UeXBlKTsKLQkJaWYgKGJhZFBhcm1WYWx1ZSAhPSAwKQotCQkJVGVzdENhc2UuYXNzZXJ0RXF1YWxzKGdvb2RQYXJtVmFsdWUsIGJhZFBhcm1WYWx1ZSk7Ci0JCWlmIChiYWRNc2cgIT0gbnVsbCkKLQkJCVRlc3RDYXNlLmZhaWwoYmFkTXNnKTsKLQkJVGVzdENhc2UuYXNzZXJ0RXF1YWxzKDIsIGNvdW50ZXIpOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gc3RvcHBlZFRlc3Q7Ci0JcHJpdmF0ZSBDbGFzcyBiYWRQYXJtVHlwZSA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgYmFkUGFybVZhbHVlLCBnb29kUGFybVZhbHVlOwotCXByaXZhdGUgU3RyaW5nIGJhZE1zZzsKLQkKLQkvLyBOb3JtYWxseSB0aGUgY2FsbGJhY2sgZG9lc24ndCBkZXRlcm1pbmUgd2hlbiB0byBzdG9wIAotCS8vIHRoZSBjYWxsYmFjayBwcm94eS4gQnV0IGZvciB0aGlzIHRlc3QgaXQgZG9lcy4KLQlwdWJsaWMgVGVzdENhbGxiYWNrKE9iamVjdCB0LCBQcm94eUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSkgewotCQl0ZXN0ZXIgPSB0OwotCQl0aGlzLnJlZ2lzdHJ5ID0gcmVnaXN0cnk7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgY2FsbGVkQmFjayhpbnQgbXNnSUQsIElCZWFuUHJveHkgcGFybSl7Ci0JCXN5bmNocm9uaXplZCh0ZXN0ZXIpIHsKLQkJCWlmIChzdG9wcGVkVGVzdCkKLQkJCQlyZXR1cm4gbnVsbDsJLy8gV2UndmUgYWxyZWFkeSBzdG9wcGVkLCBkb24ndCBkbyBhbnltb3JlLgotCQl9Ci0JCQotCQlpZiAobXNnSUQgIT0gMCkgewotCQkJYmFkTXNnID0gIk1zZ2lkICIgKyBtc2dJRCArICIgaXMgaW5jb3JyZWN0LiBJdCBzaG91bGQgYmUgemVyby4iOwotCQkJc3RvcFRlc3QoKTsKLQkJfSBlbHNlIGlmIChwYXJtIGluc3RhbmNlb2YgSUludGVnZXJCZWFuUHJveHkpIHsKLQkJCWludCBwdiA9ICgoSUludGVnZXJCZWFuUHJveHkpIHBhcm0pLmludFZhbHVlKCk7Ci0JCQlpZiAoKytjb3VudGVyICE9IHB2KSB7Ci0JCQkJYmFkUGFybVZhbHVlID0gcHY7Ci0JCQkJZ29vZFBhcm1WYWx1ZSA9IGNvdW50ZXI7Ci0JCQkJc3RvcFRlc3QoKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCWlmIChjb3VudGVyID09IDIpIHsKLQkJCQlzdG9wVGVzdCgpOwotCQkJfQotCQl9IGVsc2UgewotCQkJLy8gQmFkIHBhcm0gdHlwZS4KLQkJCWJhZFBhcm1UeXBlID0gcGFybS5nZXRDbGFzcygpOwotCQkJc3RvcFRlc3QoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCBjYWxsZWRCYWNrKGludCBtc2dJRCwgT2JqZWN0IHBhcm0pIHsKLQkJaWYgKG1zZ0lEICE9IDEpIHsKLQkJCWJhZE1zZyA9ICJNc2dpZCAiICsgbXNnSUQgKyAiIGlzIGluY29ycmVjdC4gSXQgc2hvdWxkIGJlIG9uZS4iOwotCQkJc3RvcFRlc3QoKTsKLQkJfSBlbHNlIGlmIChwYXJtIGluc3RhbmNlb2YgSW50ZWdlcil7Ci0JCQkvLyBXZSBhcmUgZ29pbmcgdG8gdXNlIHRoZSByZWdpc3RyeSB0byBzZWUgd2hhdCB0aHJlYWQgaWQgaXMgcnVubmluZyB3aGVuIHdlIGNhbGwgaW50byBpdC4KLQkJCUlNZXRob2RQcm94eSBjdXJyZW50VGhyZWFkTWV0aG9kID0gcmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkuZ2V0TWV0aG9kUHJveHkoImphdmEubGFuZy5UaHJlYWQiLCAiY3VycmVudFRocmVhZCIsIG51bGwpOwotCQkJSUJlYW5Qcm94eSB0aHJlYWQgPSBjdXJyZW50VGhyZWFkTWV0aG9kLmludm9rZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucyhudWxsKTsKLQkJCUlNZXRob2RQcm94eSBoYXNoY29kZU1ldGhvZCA9IHJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJqYXZhLmxhbmcuT2JqZWN0IiwgImhhc2hDb2RlIiwgbnVsbCk7Ci0JCQlJQmVhblByb3h5IHRocmVhZElEID0gaGFzaGNvZGVNZXRob2QuaW52b2tlQ2F0Y2hUaHJvd2FibGVFeGNlcHRpb25zKHRocmVhZCk7Ci0JCQlpZiAodGhyZWFkSUQgaW5zdGFuY2VvZiBJTnVtYmVyQmVhblByb3h5KSB7Ci0JCQkJaWYgKCFwYXJtLmVxdWFscygoKElOdW1iZXJCZWFuUHJveHkpIHRocmVhZElEKS5udW1iZXJWYWx1ZSgpKSkgewotCQkJCQliYWRNc2cgPSAiVGhyZWFkSUQgcmV0dXJuZWQgZnJvbSBjYWxsIG5vdCBtYXRjaCBwYXJtIHNlbnQgaXQuIE1lYW5zIGNhbGxiYWNrIG5vdCBvbiBzYW1lIHRocmVhZC4iOwotCQkJCQlzdG9wVGVzdCgpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJYmFkTXNnID0gIlRocmVhZElEIHJldHVybmVkIGZyb20gY2FsbCBpcyBub3QgdmFsaWQuIjsKLQkJCQlzdG9wVGVzdCgpOwotCQkJfQotCQl9IGVsc2UgewotCQkJYmFkTXNnID0gIlBhcm0gaXMgaW52YWxpZCBmb3IgY2FsbGVkQmFjayB3aXRoIE9iamVjdCI7Ci0JCQlzdG9wVGVzdCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGNhbGxlZEJhY2soaW50IG1zZ0lELCBPYmplY3RbXSBwYXJtcyl7Ci0JCWJhZE1zZyA9ICJGYWlsZWQgQ2FsbGJhY2sgVGVzdC4gU2hvdWxkbid0IGhhdmUgZ290dG9uIHRvIG11bHRpLXBhcm1zIjsgLy8kTk9OLU5MUy0xJAotCQlzdG9wVGVzdCgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY2FsbGVkQmFja1N0cmVhbShpbnQgbXNnSUQsIElucHV0U3RyZWFtIGluKXsKLQkJYmFkTXNnID0gIkZhaWxlZCBDYWxsYmFjayBUZXN0LiBTaG91bGRuJ3QgaGF2ZSBnb3R0b24gdG8gaW5wdXQgc3RyZWFtIjsgLy8kTk9OLU5MUy0xJAotCQlzdG9wVGVzdCgpOwotCX0JCi0JCi0Jdm9pZCBzdG9wVGVzdCgpIHsKLQkJc3luY2hyb25pemVkKHRlc3RlcikgewotCQkJc3RvcHBlZFRlc3QgPSB0cnVlOwotCQkJdGVzdGVyLm5vdGlmeSgpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9UZXN0Q2FsbGJhY2tTdHJlYW0uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L1Rlc3RDYWxsYmFja1N0cmVhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2RjMjc0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L1Rlc3RDYWxsYmFja1N0cmVhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5OwotLyoKLSAqICAkUkNTZmlsZTogVGVzdENhbGxiYWNrU3RyZWFtLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6NTg6NTQgJCAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0vKioKLSAqIFRoaXMgaXMgdGhlIGNhbGxiYWNrIGZvciB0aGUgdGVzdCBjYXNlIG9mIHRoZSBzdHJlYW0uIFRoaXMgcnVucyBvbiB0aGUgSURFIHNpZGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0Q2FsbGJhY2tTdHJlYW0gaW1wbGVtZW50cyBJQ2FsbGJhY2sgewotCi0JT2JqZWN0IHRlc3RlcjsJLy8gTm90aWZpZWQgd2hlbiB0aGUgdGVzdCBpcyBmaW5pc2hlZC4KLQkKLQlwcml2YXRlIGJvb2xlYW4gdGVzdFN0b3BwZWQ7Ci0JcHJpdmF0ZSBTdHJpbmcgYmFkTXNnOwotCXByaXZhdGUgSU9FeGNlcHRpb24gZXhwOwotCXByaXZhdGUgYm9vbGVhbiB0ZXN0U3VjY2VzZnVsOwotCQotCXB1YmxpYyBUZXN0Q2FsbGJhY2tTdHJlYW0oT2JqZWN0IG8pIHsKLQkJdGVzdGVyID0gbzsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvbXBsZXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGJhZE1zZyAhPSBudWxsKQotCQkJVGVzdENhc2UuZmFpbChiYWRNc2cpOwotCQlpZiAoZXhwICE9IG51bGwpCi0JCQl0aHJvdyBleHA7Ci0JCVRlc3RDYXNlLmFzc2VydFRydWUodGVzdFN1Y2Nlc2Z1bCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBjYWxsZWRCYWNrKGludCBtc2dJRCwgT2JqZWN0ICBwYXJtKXsKLQkJYmFkTXNnID0gIkZhaWxlZCBDYWxsYmFjayBUZXN0LiBTaG91bGRuJ3QgaGF2ZSBnb3R0b24gdG8gb2JqZWN0IHBhcm0iOyAvLyROT04tTkxTLTEkCi0JCXN0b3BUZXN0KCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgT2JqZWN0IGNhbGxlZEJhY2soaW50IG1zZ0lELCBJQmVhblByb3h5IHBhcm0pewotCQliYWRNc2cgPSAiRmFpbGVkIENhbGxiYWNrIFRlc3QuIFNob3VsZG4ndCBoYXZlIGdvdHRvbiB0byBwYXJtIjsgLy8kTk9OLU5MUy0xJAotCQlzdG9wVGVzdCgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIE9iamVjdCBjYWxsZWRCYWNrKGludCBtc2dJRCwgT2JqZWN0W10gcGFybXMpewotCQliYWRNc2cgPSAiRmFpbGVkIENhbGxiYWNrIFRlc3QuIFNob3VsZG4ndCBoYXZlIGdvdHRvbiB0byBtdWx0aS1wYXJtcyI7IC8vJE5PTi1OTFMtMSQKLQkJc3RvcFRlc3QoKTsJCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIHZvaWQgY2FsbGVkQmFja1N0cmVhbShpbnQgbXNnSUQsIElucHV0U3RyZWFtIGluKXsKLQkJLy8gUmVhZCBmcm9tIHRoZSBzdHJlYW0gZm9yIDMwMDAwIGJ5dGVzLiBWZXJpZnkgdGhhdAotCQkvLyB3ZSBnZXQgYW4gaW5jcmVtZW50aW5nIHN0cmVhbSwgaS5lLiAwLCAxLCAuLi4sIDEyNywgLTEyNywgLi4uCi0JCQotCQlzeW5jaHJvbml6ZWQgKHRlc3RlcikgewotCQkJaWYgKHRlc3RTdG9wcGVkKQotCQkJCXJldHVybjsKLQkJfQotCQlmb3IgKGludCBpPTA7IGk8MzAwMDA7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlpbnQgbmV4dCA9IGluLnJlYWQoKTsKLQkJCQlpZiAobmV4dCA9PSAtMSkgewotCQkJCQliYWRNc2cgPSAiRmFpbGVkIENhbGxiYWNrIFN0cmVhbSB0ZXN0LiBTdHJlYW0gZW5kZWQgdG9vIHNvb24uIE9uIGNvdW50ZXI9IitTdHJpbmcudmFsdWVPZihpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlzdG9wVGVzdCgpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCQotCQkJCWlmICgoKGJ5dGUpIG5leHQpICE9ICgoYnl0ZSkgaSkpIHsKLQkJCQkJYmFkTXNnID0gIkZhaWxlZCBDYWxsYmFjayBTdHJlYW0gdGVzdC4gRGlkIG5vdCBnZXQgY29ycmVjdCBuZXh0IGJ5dGUgYXQ6IiArIGk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJc3RvcFRlc3QoKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlleHAgPSBlOwotCQkJCXN0b3BUZXN0KCk7CQkJCQotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQkKLQkJdHJ5IHsKLQkJCWlmIChpbi5yZWFkKCkgIT0gLTEpIHsKLQkJCQliYWRNc2cgPSAiRmFpbGVkIENhbGxiYWNrIFN0cmVhbSB0ZXN0LiBUb28gbXVjaCBkYXRhIHNlbnQuIjsgLy8kTk9OLU5MUy0xJAotCQkJCXN0b3BUZXN0KCk7CQkJCQotCQkJCXJldHVybjsKLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZXhwID0gZTsKLQkJfQotCQkKLQkJdGVzdFN1Y2Nlc2Z1bCA9IHRydWU7Ci0JCXN0b3BUZXN0KCk7Ci0JfQotCQotCXZvaWQgc3RvcFRlc3QoKSB7Ci0JCXN5bmNocm9uaXplZCh0ZXN0ZXIpIHsKLQkJCXRlc3RTdG9wcGVkID0gdHJ1ZTsKLQkJCXRlc3Rlci5ub3RpZnkoKTsKLQkJfQotCX0KLQkJCi0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L1Rlc3RTdGFuZGFyZC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvVGVzdFN0YW5kYXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMTYwZDUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvVGVzdFN0YW5kYXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5BbWJpZ3VvdXNNZXRob2RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLQotLyoqCi0gKiBAYXV0aG9yIHJpY2hrdWxwCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFRlc3RTdGFuZGFyZCBleHRlbmRzIEFic3RyYWN0VGVzdFByb3h5IHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBUZXN0U3RhbmRhcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgVGVzdFN0YW5kYXJkKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPYmplY3QoKSB7Ci0JCUlCZWFuVHlwZVByb3h5IG9iamVjdFR5cGUgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5PYmplY3QiKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKG9iamVjdFR5cGUpOwotCQlhc3NlcnRGYWxzZShvYmplY3RUeXBlLmlzQXJyYXkoKSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLk9iamVjdCIsIG9iamVjdFR5cGUuZ2V0VHlwZU5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RUeXBlT2YoKSB7Ci0JCUlCZWFuVHlwZVByb3h5IG9iamVjdFR5cGUgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5PYmplY3QiKTsgLy8kTk9OLU5MUy0xJAkJCi0JCUlCZWFuVHlwZVByb3h5IGludGVnZXJUeXBlID0gcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuSW50ZWdlciIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoaW50ZWdlclR5cGUpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5JbnRlZ2VyIiwgaW50ZWdlclR5cGUuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydFRydWUoaW50ZWdlclR5cGUuaXNLaW5kT2Yob2JqZWN0VHlwZSkpOwkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNZXRob2RJbnZva2UoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewkJCi0JCUlCZWFuVHlwZVByb3h5IGludGVnZXJUeXBlID0gcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuSW50ZWdlciIpOyAvLyROT04tTkxTLTEkCQkKLQkJSU1ldGhvZFByb3h5IG10aGQgPSBpbnRlZ2VyVHlwZS5nZXRNZXRob2RQcm94eSgidmFsdWVPZiIsICJqYXZhLmxhbmcuU3RyaW5nIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhc3NlcnROb3ROdWxsKG10aGQpOwotCQkvLyBTZWUgaWYgd2UgY2FuIGludm9rZSBtZXRob2RzLgotCQlJSW50ZWdlckJlYW5Qcm94eSBhbkludCA9IChJSW50ZWdlckJlYW5Qcm94eSkgbXRoZC5pbnZva2UobnVsbCwgcHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoIjUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbChhbkludCk7Ci0JCWFzc2VydEVxdWFscyg1LCBhbkludC5pbnRWYWx1ZSgpKTsKLQkJLy8gU2VlIGlmIGludm9rZSB3aXRoIGJhZCB0eXBlIHRocm93cyB0aGUgRXhjZXB0aW9uUHJveHkuCi0JCXRyeSB7Ci0JCQltdGhkLmludm9rZShudWxsLCBwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCg1KSk7Ci0JCQlmYWlsKCJFeGNlcHRpb24gbm90IHRocm93biBsaWtlIGl0IHNob3VsZCBvZiBiZWVuLiIpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQkvLyBXZSBzaG91bGQgb2YgZ290dG9uIHRoZSBleGNlcHRpb24uIFNlZSBpZiBpdCBpcyBvZiB0aGUgY29ycmVjdCB0eXBlLgotCQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIiwgZS5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9CQkJCQkJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludm9rZSgpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCS8vIFRlY2huaWNhbGx5IGludm9rYWJsZXMgc2hvdWxkIGJlIHVzZWQgZm9yIG9uZS1zaG90IHVzYWdlLCBidXQgaGVyZSB0byB0ZXN0IHRoZSBpbnZva2UgY29ycmVjdGx5Ci0JCS8vIGl0IHdpbGwgYmUgdXNlZCB0d2ljZS4gVGhpcyBpcyBub3QgYW4gZXJyb3IsIGp1c3Qgb3ZlcmhlYWQuCi0JCUlCZWFuVHlwZVByb3h5IGludGVnZXJUeXBlID0gcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuSW50ZWdlciIpOyAvLyROT04tTkxTLTEkCQkKLQkJSUludm9rYWJsZSBpbnZva2FibGUgPSBpbnRlZ2VyVHlwZS5nZXRJbnZva2FibGUoInZhbHVlT2YiLCAiamF2YS5sYW5nLlN0cmluZyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0Tm90TnVsbChpbnZva2FibGUpOwotCQkvLyBTZWUgaWYgd2UgY2FuIGludm9rZSBtZXRob2RzLgotCQlJSW50ZWdlckJlYW5Qcm94eSBhbkludCA9IChJSW50ZWdlckJlYW5Qcm94eSkgaW52b2thYmxlLmludm9rZShudWxsLCBwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCgiNSIpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKGFuSW50KTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGFuSW50LmludFZhbHVlKCkpOwotCQkvLyBTZWUgaWYgaW52b2tlIHdpdGggYmFkIHR5cGUgdGhyb3dzIHRoZSBFeGNlcHRpb25Qcm94eS4KLQkJdHJ5IHsKLQkJCWludm9rYWJsZS5pbnZva2UobnVsbCwgcHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoNSkpOwotCQkJZmFpbCgiRXhjZXB0aW9uIG5vdCB0aHJvd24gbGlrZSBpdCBzaG91bGQgb2YgYmVlbi4iKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJLy8gV2Ugc2hvdWxkIG9mIGdvdHRvbiB0aGUgZXhjZXB0aW9uLiBTZWUgaWYgaXQgaXMgb2YgdGhlIGNvcnJlY3QgdHlwZS4KLQkJCWFzc2VydEVxdWFscygiamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIsIGUuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQkJCQkJCQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaW1wbGVJbml0U3RyaW5nKCkgdGhyb3dzIFRocm93YWJsZVByb3h5LCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKLQkJSUJlYW5UeXBlUHJveHkgaW50ZWdlclR5cGUgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5JbnRlZ2VyIik7IC8vJE5PTi1OTFMtMSQJCQkJCi0JCS8vIFNlZSBpZiB3ZSBjYW4gY3JlYXRlIGl0IGZyb20gYW4gaW5pdGlhbGl6YXRpb24gc3RyaW5nLgotCQlJSW50ZWdlckJlYW5Qcm94eSBhbkludCA9IChJSW50ZWdlckJlYW5Qcm94eSkgaW50ZWdlclR5cGUubmV3SW5zdGFuY2UoIm5ldyBqYXZhLmxhbmcuSW50ZWdlcig2KSIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoYW5JbnQpOwotCQlhc3NlcnRFcXVhbHMoNiwgYW5JbnQuaW50VmFsdWUoKSk7Ci0KLQkJLy8gU2VlIGlmIHN0cmluZyBpbml0aWFsaXphdGlvbiB3b3Jrcy4KLQkJSVN0cmluZ0JlYW5Qcm94eSBhU3RyaW5nID0gKElTdHJpbmdCZWFuUHJveHkpIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLlN0cmluZyIpLm5ld0luc3RhbmNlKCJcImFiY2RcIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0Tm90TnVsbChhU3RyaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJhYmNkIiwgYVN0cmluZy5zdHJpbmdWYWx1ZSgpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29uc3RydWN0b3JzKCkgewotCQlJQmVhblR5cGVQcm94eSBzdHJpbmdUeXBlID0gcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuU3RyaW5nIik7IC8vJE5PTi1OTFMtMSQJCQkJCi0JCQotCQkvLyBHZXQgYWxsIGNvbnN0cnVjdG9ycy4KLQkJSUNvbnN0cnVjdG9yUHJveHlbXSBjdG9ycyA9IHN0cmluZ1R5cGUuZ2V0Q29uc3RydWN0b3JzKCk7Ci0JCWFzc2VydE5vdE51bGwoY3RvcnMpOwotCQlpbnQgZXhwZWN0ZWRDdG9ycyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS52ZXJzaW9uIiwiIikuc3RhcnRzV2l0aCgiMS41IikgPyAxMyA6IDExOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRDdG9ycywgY3RvcnMubGVuZ3RoKTsJCQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWNsYXJlZENvbnN0cnVjdG9ycygpIHsKLQkJSUJlYW5UeXBlUHJveHkgdGVzdEFjY2Vzc1R5cGUgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoInRlc3RQYWNrYWdlLlRlc3RBY2Nlc3MiKTsgLy8kTk9OLU5MUy0xJAkJCQkKLQkJCi0JCS8vIEdldCBhbGwgY29uc3RydWN0b3JzLgotCQlJQ29uc3RydWN0b3JQcm94eVtdIGN0b3JzID0gdGVzdEFjY2Vzc1R5cGUuZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcnMoKTsKLQkJYXNzZXJ0Tm90TnVsbChjdG9ycyk7Ci0JCWFzc2VydEVxdWFscyg0LCBjdG9ycy5sZW5ndGgpOwkJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpbXBsZUNvbnN0cnVjdG9yKCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJSUJlYW5UeXBlUHJveHkgaW50ZWdlclR5cGUgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5JbnRlZ2VyIik7IC8vJE5PTi1OTFMtMSQJCQkJCi0JCQotCQkvLyBTZWUgaWYgd2UgY2FuIGNyZWF0ZSBpdCBmcm9tIGEgY29uc3RydWN0b3IuCi0JCUlDb25zdHJ1Y3RvclByb3h5IGN0b3IgPSBpbnRlZ2VyVHlwZS5nZXRDb25zdHJ1Y3RvclByb3h5KG5ldyBTdHJpbmdbXSB7ImphdmEubGFuZy5TdHJpbmcifSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbChjdG9yKTsKLQkJSUludGVnZXJCZWFuUHJveHkgYW5JbnQgPSAoSUludGVnZXJCZWFuUHJveHkpIGN0b3IubmV3SW5zdGFuY2UobmV3IElCZWFuUHJveHlbXSB7cHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoIjAiKX0pOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygwLCBhbkludC5pbnRWYWx1ZSgpKTsKLQkJCQkJCQotCQkvLyBaZXJvIGlzIGNhY2hlZCwgbGV0J3Mgc2VlIGlmIHRoYXQgaXMgd2hhdCB3ZSBnb3QgYWJvdmUuCi0JCUlJbnRlZ2VyQmVhblByb3h5IGFaZXJvID0gcHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgobmV3IEludGVnZXIoMCkpOwotCQlhc3NlcnRTYW1lKGFuSW50LCBhWmVybyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpbXBsZURlY2xhcmVkQ29uc3RydWN0b3IoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlJQmVhblR5cGVQcm94eSB0ZXN0QWNjZXNzVHlwZSA9IHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgidGVzdFBhY2thZ2UuVGVzdEFjY2VzcyIpOyAvLyROT04tTkxTLTEkCQkJCQotCQkKLQkJLy8gU2VlIGlmIHdlIGNhbiBnZXQgYSBwcml2YXRlIGNvbnN0cnVjdG9yLgotCQlJQ29uc3RydWN0b3JQcm94eSBjdG9yID0gdGVzdEFjY2Vzc1R5cGUuZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvclByb3h5KG5ldyBTdHJpbmdbXSB7ImphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uIn0pOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoY3Rvcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByaW1pdGl2ZVJldHVybigpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCUlCZWFuVHlwZVByb3h5IGludGVnZXJUeXBlID0gcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuSW50ZWdlciIpOyAvLyROT04tTkxTLTEkCQkJCQotCQkKLQkJLy8gU2VlIHRoYXQgd2UgZ2V0IGEgcHJpbWl0aXZlIGJhY2sgd2hlbiB0aGUgbWV0aG9kIHJldHVybiB0eXBlIGlzIGEgcHJpbWl0aXZlLgotCQlJTWV0aG9kUHJveHkgbXRoZFByaW0gPSBpbnRlZ2VyVHlwZS5nZXRNZXRob2RQcm94eSgiaW50VmFsdWUiKTsgLy8kTk9OLU5MUy0xJAotCQlJSW50ZWdlckJlYW5Qcm94eSBhbkludCA9IChJSW50ZWdlckJlYW5Qcm94eSkgbXRoZFByaW0uaW52b2tlKHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKDUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCBhbkludC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoNSwgYW5JbnQuaW50VmFsdWUoKSk7Ci0JCQotCQkvLyBTZWUgdGhhdCB3ZSBnZXQgYSBwcmltaXRpdmUgYmFjayB3aGVuIHRoZSBmaWVsZCBpcyBhIHByaW1pdGl2ZS4KLQkJSUZpZWxkUHJveHkgZmllbGRQcmltID0gaW50ZWdlclR5cGUuZ2V0RmllbGRQcm94eSgiTUlOX1ZBTFVFIik7IC8vJE5PTi1OTFMtMSQKLQkJYW5JbnQgPSAoSUludGVnZXJCZWFuUHJveHkpIGZpZWxkUHJpbS5nZXQobnVsbCk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgYW5JbnQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIuTUlOX1ZBTFVFLCBhbkludC5pbnRWYWx1ZSgpKTsJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RQcmltaXRpdmVBcnJheVR5cGUoKSB7Ci0JCS8vIFRlc3QgUHJpbWl0aXZlIGFycmF5cy4KLQkJSUFycmF5QmVhblR5cGVQcm94eSBhcnJheVR5cGUgPSAoSUFycmF5QmVhblR5cGVQcm94eSkgcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJbSSIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoYXJyYXlUeXBlKTsKLQkJYXNzZXJ0VHJ1ZShhcnJheVR5cGUuaXNBcnJheSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJbSSIsIGFycmF5VHlwZS5nZXRUeXBlTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJpbnQiKSwgYXJyYXlUeXBlLmdldENvbXBvbmVudFR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE9iamVjdEFycmF5VHlwZSgpIHsKLQkJLy8gVGVzdCBzaW1wbGUgb2JqZWN0IHR5cGUgYXJyYXkKLQkJSUFycmF5QmVhblR5cGVQcm94eSBhcnJheVR5cGUgPSAoSUFycmF5QmVhblR5cGVQcm94eSkgcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJbTGphdmEubGFuZy5JbnRlZ2VyOyIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoYXJyYXlUeXBlKTsKLQkJYXNzZXJ0VHJ1ZShhcnJheVR5cGUuaXNBcnJheSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJbTGphdmEubGFuZy5JbnRlZ2VyOyIsIGFycmF5VHlwZS5nZXRUeXBlTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuSW50ZWdlciIpLCBhcnJheVR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpKTsgLy8kTk9OLU5MUy0xJAkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RQcmltaXRpdmUyREFycmF5VHlwZSgpIHsKLQkJLy8gVGVzdCB0d28gZGltZW5zaW9uIHByaW1pdGl2ZSBhcnJheQotCQlJQXJyYXlCZWFuVHlwZVByb3h5IGFycmF5VHlwZSA9IChJQXJyYXlCZWFuVHlwZVByb3h5KSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoIltbSSIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoYXJyYXlUeXBlKTsKLQkJYXNzZXJ0VHJ1ZShhcnJheVR5cGUuaXNBcnJheSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJbW0kiLCBhcnJheVR5cGUuZ2V0VHlwZU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiW0kiKSwgYXJyYXlUeXBlLmdldENvbXBvbmVudFR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCS8vIFRlc3QgY29uc3RydWN0aW9uIHVzaW5nIGFjY2Vzc29yLgotCQlhcnJheVR5cGUgPSAoSUFycmF5QmVhblR5cGVQcm94eSkgcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJpbnQiLCAyKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKGFycmF5VHlwZSk7Ci0JCWFzc2VydFRydWUoYXJyYXlUeXBlLmlzQXJyYXkoKSk7Ci0JCWFzc2VydEVxdWFscygiW1tJIiwgYXJyYXlUeXBlLmdldFR5cGVOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RPYmplY3QyREFycmF5VHlwZSgpIHsKLQkJLy8gVGVzdCB0d28gZGltZW5zaW9uIG9iamVjdCB0eXBlIGFycmF5Ci0JCUlBcnJheUJlYW5UeXBlUHJveHkgYXJyYXlUeXBlID0gKElBcnJheUJlYW5UeXBlUHJveHkpIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiW1tMamF2YS5sYW5nLkludGVnZXI7Iik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbChhcnJheVR5cGUpOwotCQlhc3NlcnRUcnVlKGFycmF5VHlwZS5pc0FycmF5KCkpOwotCQlhc3NlcnRFcXVhbHMoIltbTGphdmEubGFuZy5JbnRlZ2VyOyIsIGFycmF5VHlwZS5nZXRUeXBlTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJbTGphdmEubGFuZy5JbnRlZ2VyOyIpLCBhcnJheVR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJLy8gVGVzdCBnZXQgdHlwZSB1c2luZyBhY2Nlc3Nvci4KLQkJYXJyYXlUeXBlID0gKElBcnJheUJlYW5UeXBlUHJveHkpIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkludGVnZXIiLCAyKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKGFycmF5VHlwZSk7Ci0JCWFzc2VydFRydWUoYXJyYXlUeXBlLmlzQXJyYXkoKSk7Ci0JCWFzc2VydEVxdWFscygiW1tMamF2YS5sYW5nLkludGVnZXI7IiwgYXJyYXlUeXBlLmdldFR5cGVOYW1lKCkpOyAvLyROT04tTkxTLTEkCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFycmF5VHlwZUZyb21BcnJheVR5cGUoKSB7Ci0JCS8vIFRlc3QgY3JlYXRpbmcgYW4gYXJyYXkgdHlwZSBmcm9tIGFuIGFycmF5IHR5cGUsIGkuZS4gYWRkaW5nIGRpbWVuc2lvbnMuCi0JCUlBcnJheUJlYW5UeXBlUHJveHkgYXJyYXlUeXBlID0gKElBcnJheUJlYW5UeXBlUHJveHkpIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiW0xqYXZhLmxhbmcuSW50ZWdlcjsiLCAyKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKGFycmF5VHlwZSk7Ci0JCWFzc2VydFRydWUoYXJyYXlUeXBlLmlzQXJyYXkoKSk7Ci0JCWFzc2VydEVxdWFscygiW1tbTGphdmEubGFuZy5JbnRlZ2VyOyIsIGFycmF5VHlwZS5nZXRUeXBlTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlGcm9tQWNjZXNzb3JTaW1wbGVUeXBlKCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJSUJlYW5UeXBlUHJveHkgaW50ZWdlclR5cGUgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5JbnRlZ2VyIik7IC8vJE5PTi1OTFMtMSQJCQkJCi0JCQotCQkvLyBUZXN0IGNyZWF0aW5nIGFuIGFycmF5IHdpdGggYWNjZXNzb3Igb2YgbW9yZSB0aGFuIG9uZSBkaW1lbnNpb24gd2l0aCBjb21wb25lbnQgdHlwZSBub3QgYW4gYXJyYXkuCi0JCUlBcnJheUJlYW5Qcm94eSBhcnJheVByb3h5ID0gcHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoaW50ZWdlclR5cGUsIG5ldyBpbnRbXSB7MywgNH0pOwotCQlhc3NlcnROb3ROdWxsKGFycmF5UHJveHkpOwotCQlhc3NlcnRFcXVhbHMoIltbTGphdmEubGFuZy5JbnRlZ2VyOyIsIGFycmF5UHJveHkuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKDMsIGFycmF5UHJveHkuZ2V0TGVuZ3RoKCkpOwotCQkKLQkJLy8gZ2V0KDApIHNob3VsZCBiZSBhbiBJbnRlZ2VyWzRdLgotCQlhcnJheVByb3h5ID0gKElBcnJheUJlYW5Qcm94eSkgYXJyYXlQcm94eS5nZXQoMCk7Ci0JCWFzc2VydE5vdE51bGwoYXJyYXlQcm94eSk7Ci0JCWFzc2VydEVxdWFscyg0LCBhcnJheVByb3h5LmdldExlbmd0aCgpKTsJCQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheUZyb21BY2Nlc3NvckFycmF5VHlwZSgpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCUlBcnJheUJlYW5UeXBlUHJveHkgYXJyYXlUeXBlID0gKElBcnJheUJlYW5UeXBlUHJveHkpIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkludGVnZXIiLCAxKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJLy8gVGVzdCBjcmVhdGluZyBhbiBhcnJheSB3aXRoIGFjY2Vzc29yIGJ1dCBjb21wb25lbnQgdHlwZSBpcyBhbiBhcnJheS4JCQotCQlJQXJyYXlCZWFuUHJveHkgYXJyYXlQcm94eSA9IHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGFycmF5VHlwZSwgbmV3IGludFtdIHsxfSk7Ci0JCWFzc2VydE5vdE51bGwoYXJyYXlQcm94eSk7Ci0JCWFzc2VydEVxdWFscygiW0xqYXZhLmxhbmcuSW50ZWdlcjsiLCBhcnJheVByb3h5LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygxLCBhcnJheVByb3h5LmdldExlbmd0aCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFycmF5RnJvbUFjY2Vzc29yQXJyYXlUeXBlTXVsdGlEaW0oKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlJQXJyYXlCZWFuVHlwZVByb3h5IGFycmF5VHlwZSA9IChJQXJyYXlCZWFuVHlwZVByb3h5KSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5JbnRlZ2VyIiwgMSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBUZXN0IGNyZWF0aW5nIGFuIGFycmF5IHdpdGggYWNjZXNzb3IgYnV0IGNvbXBvbmVudCB0eXBlIGlzIGFuIGFycmF5LCBidXQgZXh0ZW5kIGFuZCBhZGQgYSBkaW1lbnNpb24uCQkKLQkJSUFycmF5QmVhblByb3h5IGFycmF5UHJveHkgPSBwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChhcnJheVR5cGUsIG5ldyBpbnRbXSB7MiAsM30pOwotCQlhc3NlcnROb3ROdWxsKGFycmF5UHJveHkpOwotCQlhc3NlcnRFcXVhbHMoIltbTGphdmEubGFuZy5JbnRlZ2VyOyIsIGFycmF5UHJveHkuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKDIsIGFycmF5UHJveHkuZ2V0TGVuZ3RoKCkpOwotCi0JCS8vIFRlc3QgZmlyc3QgZW50cnkgaXMgYW4gSW50ZWdlclszXQkJCi0JCUlBcnJheUJlYW5Qcm94eSBpZHgxID0gKElBcnJheUJlYW5Qcm94eSkgYXJyYXlQcm94eS5nZXQoMCk7Ci0JCWFzc2VydE5vdE51bGwoaWR4MSk7Ci0JCWFzc2VydEVxdWFscygzLCBpZHgxLmdldExlbmd0aCgpKTsKLQkJCi0JCS8vIFRlc3QgWzFdWzJdIGlzIG51bGwuCi0JCUlCZWFuUHJveHkgaWR4MiA9IGFycmF5UHJveHkuZ2V0KG5ldyBpbnQgW10gezEsMn0pOwotCQlhc3NlcnROdWxsKGlkeDIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlTZXQoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlJQmVhblByb3h5IGFuSW50ID0gcHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgobmV3IGphdmEubGFuZy5JbnRlZ2VyKDIzKSk7Ci0JCUlBcnJheUJlYW5UeXBlUHJveHkgYXJyYXlUeXBlID0gKElBcnJheUJlYW5UeXBlUHJveHkpIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkludGVnZXIiLCAxKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJSUFycmF5QmVhblByb3h5IGFycmF5UHJveHkgPSBwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChhcnJheVR5cGUsIG5ldyBpbnRbXSB7MiAsM30pOwotCQlhc3NlcnROb3ROdWxsKGFycmF5UHJveHkpOwotCQlhc3NlcnRFcXVhbHMoIltbTGphdmEubGFuZy5JbnRlZ2VyOyIsIGFycmF5UHJveHkuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKDIsIGFycmF5UHJveHkuZ2V0TGVuZ3RoKCkpOwotCi0JCS8vIFRlc3QgZmlyc3QgZW50cnkgaXMgYW4gSW50ZWdlclszXQkJCi0JCUlBcnJheUJlYW5Qcm94eSBpZHgxID0gKElBcnJheUJlYW5Qcm94eSkgYXJyYXlQcm94eS5nZXQoMCk7Ci0JCQotCQkvLyBUZXN0IHNldCBpbnRvIGFycmF5IGlkeDEsIGJ1dCByZXRyaWV2ZSBmcm9tIGFycmF5UHJveHkuIFRlc3RzCi0JCS8vICAgMSkgU2V0IHdpdGggb25lIGluZGV4IGludG8gYXJyYXkgZnJvbSBvdXRlciBhcnJheVswXQotCQkvLyAgIDIpIEdldCB3aXRoIG11bHRpIGluZGV4IGZyb20gb3V0ZXIgYXJyYXkKLQkJLy8gICAzKSBBbmQgdGhhdCB0aGUgc2FtZSBhcnJheSBpcyBzZXQgdGhhdCBleGlzdHMgd2l0aGluIHRoZSBmaXJzdCBhcnJheS4KLQkJaWR4MS5zZXQoYW5JbnQsIDIpOwotCQlJQmVhblByb3h5IGlkeDMgPSBhcnJheVByb3h5LmdldChuZXcgaW50W10gezAsIDJ9KTsKLQkJYXNzZXJ0Tm90TnVsbChpZHgzKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuSW50ZWdlciIsIGlkeDMuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKGFuSW50LCBpZHgzKTsKLQkJCi0JCS8vIEludmVyc2UgdGVzdCBvZiBhYm92ZSwgbXVsdGkgc2V0LCBzaW5nbGUgZ2V0IG9mIHNhbWUgYXJyYXkuCi0JCWFycmF5UHJveHkuc2V0KGFuSW50LCBuZXcgaW50W10gezAsMX0pOwotCQlhc3NlcnRFcXVhbHMoYW5JbnQsIGlkeDEuZ2V0KDEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlTbmFwc2hvdDJEaW1BcnJheSgpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCUlBcnJheUJlYW5UeXBlUHJveHkgYXJyYXlUeXBlID0gKElBcnJheUJlYW5UeXBlUHJveHkpIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkludGVnZXIiLCAyKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJSUFycmF5QmVhblByb3h5IGFycmF5UHJveHkgPSBwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChhcnJheVR5cGUsIG5ldyBpbnRbXSB7MiwgM30pOwotCQlhc3NlcnROb3ROdWxsKGFycmF5UHJveHkpOwotCi0JCS8vIEdldCB0aGUgdHdvIGVudHJpZXMgd2hpY2ggYXJlIEludGVnZXJbM10JCQotCQlJQXJyYXlCZWFuUHJveHkgaWR4MCA9IChJQXJyYXlCZWFuUHJveHkpIGFycmF5UHJveHkuZ2V0KDApOwotCQlJQXJyYXlCZWFuUHJveHkgaWR4MSA9IChJQXJyYXlCZWFuUHJveHkpIGFycmF5UHJveHkuZ2V0KDEpOwotCQkKLQkJLy8gTm93IGdldCB0aGUgc25hcHNob3QgYW5kIHNlZSBpZiB0aGUgZW50cmllcyBhcmUgaWR4MCBhbmQgaWR4MS4KLQkJSUJlYW5Qcm94eVtdIHNuYXBzaG90ID0gYXJyYXlQcm94eS5nZXRTbmFwc2hvdCgpOwotCQlhc3NlcnRFcXVhbHMoaWR4MCwgc25hcHNob3RbMF0pOwotCQlhc3NlcnRFcXVhbHMoaWR4MSwgc25hcHNob3RbMV0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheVNuYXBzaG90UHJpbWl0aXZlQXJyYXkoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlJQXJyYXlCZWFuVHlwZVByb3h5IGFycmF5VHlwZSA9IChJQXJyYXlCZWFuVHlwZVByb3h5KSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImludCIsIDEpOyAvLyROT04tTkxTLTEkCi0JCQotCQlJQXJyYXlCZWFuUHJveHkgYXJyYXlQcm94eSA9IHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGFycmF5VHlwZSwgbmV3IGludFtdIHsyfSk7Ci0JCWFzc2VydE5vdE51bGwoYXJyYXlQcm94eSk7Ci0KLQkJLy8gU2V0IHRoZSB0d28gZW50cmllcyB0byBpbnQgdmFsdWVzLgotCQlhcnJheVByb3h5LnNldChwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCgyKSwgMCk7Ci0JCWFycmF5UHJveHkuc2V0KHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKDMpLCAxKTsKLQkJSUludGVnZXJCZWFuUHJveHkgaWR4MCA9IChJSW50ZWdlckJlYW5Qcm94eSkgYXJyYXlQcm94eS5nZXQoMCk7Ci0JCUlJbnRlZ2VyQmVhblByb3h5IGlkeDEgPSAoSUludGVnZXJCZWFuUHJveHkpIGFycmF5UHJveHkuZ2V0KDEpOwotCQlhc3NlcnRFcXVhbHMoMiwgaWR4MC5pbnRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGlkeDEuaW50VmFsdWUoKSk7Ci0JCQotCQkvLyBOb3cgZ2V0IHRoZSBzbmFwc2hvdCBhbmQgc2VlIGlmIHRoZSBlbnRyaWVzIGFyZSBpZHgwIGFuZCBpZHgxLgotCQlJQmVhblByb3h5W10gc25hcHNob3QgPSBhcnJheVByb3h5LmdldFNuYXBzaG90KCk7Ci0JCWFzc2VydEVxdWFscyhpZHgwLCBzbmFwc2hvdFswXSk7Ci0JCWFzc2VydEVxdWFscyhpZHgxLCBzbmFwc2hvdFsxXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5QXJyYXkoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlJQXJyYXlCZWFuVHlwZVByb3h5IGFycmF5VHlwZSA9IChJQXJyYXlCZWFuVHlwZVByb3h5KSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5JbnRlZ2VyIiwgMSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBDcmVhdGUgYW4gZW1wdHkgb25lIGRpbWVuc2lvbmFsIGFycmF5CQkKLQkJSUFycmF5QmVhblByb3h5IGFycmF5UHJveHkgPSBwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChhcnJheVR5cGUsIG51bGwpOwotCQlhc3NlcnROb3ROdWxsKGFycmF5UHJveHkpOwotCQlhc3NlcnRFcXVhbHMoIltMamF2YS5sYW5nLkludGVnZXI7IiwgYXJyYXlQcm94eS5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoMCwgYXJyYXlQcm94eS5nZXRMZW5ndGgoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eTJEQXJyYXkoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQkvLyBDcmVhdGUgYW4gZW10cHkgdHdvIGRpbWVuc2lvbmFsIGFycmF5CQkKLQkJSUFycmF5QmVhblByb3h5IGFycmF5UHJveHkgPSBwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5JbnRlZ2VyIiwgMiksIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoYXJyYXlQcm94eSk7Ci0JCWFzc2VydEVxdWFscygiW1tMamF2YS5sYW5nLkludGVnZXI7IiwgYXJyYXlQcm94eS5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoMCwgYXJyYXlQcm94eS5nZXRMZW5ndGgoKSk7CQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdDJEQXJyYXkoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQkvLyBDcmVhdGUgYSAyRCBhcnJheSB3aXRoIHRocmVlIGVtcHR5IGVudHJpZXMgaW4gZGltIDAuIAotCQlJQXJyYXlCZWFuUHJveHkgYXJyYXlQcm94eSA9IHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkludGVnZXIiLCAyKSwgMyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbChhcnJheVByb3h5KTsKLQkJYXNzZXJ0RXF1YWxzKCJbW0xqYXZhLmxhbmcuSW50ZWdlcjsiLCBhcnJheVByb3h5LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygzLCBhcnJheVByb3h5LmdldExlbmd0aCgpKTsKLQkJLy8gQXJyYXkgZW50cnkgc2hvdWxkIGJlIGVtcHR5LgotCQlJQXJyYXlCZWFuUHJveHkgaWR4MSA9IChJQXJyYXlCZWFuUHJveHkpIGFycmF5UHJveHkuZ2V0KDApOwotCQlhc3NlcnROdWxsKGlkeDEpOwkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RQcmltaXRpdmVBcnJheSgpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCS8vIE1ha2Ugc3VyZSB0aGF0IGlmIHRoZSBmaW5hbCBjb21wb25lbnQgdHlwZSBpcyBhbgotCQkvLyBpbnQgKHByaW1pdGl2ZSkgdGhhdCB3ZSBnZXQgYSBwcmltaXRpdmUgcHJveHkgYmFjayBhbmQgbm90IGFuIEludGVnZXIgb2JqZWN0LgkJCi0JCUlBcnJheUJlYW5UeXBlUHJveHkgYXJyYXlUeXBlID0gKElBcnJheUJlYW5UeXBlUHJveHkpIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiaW50IiwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJSUFycmF5QmVhblByb3h5IGFycmF5UHJveHkgPSBwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChhcnJheVR5cGUsIDMpOwotCQlhcnJheVByb3h5LnNldChwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCg0NCksIDEpOwotCQlJQmVhblByb3h5IGlkeDEgPSBhcnJheVByb3h5LmdldCgxKTsKLQkJYXNzZXJ0Tm90TnVsbChpZHgxKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCBpZHgxLmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscyg0NCwgKChJSW50ZWdlckJlYW5Qcm94eSkgaWR4MSkuaW50VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9ucygpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCUlCZWFuVHlwZVByb3h5IHZlY3RvclR5cGUgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEudXRpbC5WZWN0b3IiKTsgLy8kTk9OLU5MUy0xJAotCQlJQmVhblByb3h5IHZlY3RvclByb3h5ID0gdmVjdG9yVHlwZS5uZXdJbnN0YW5jZSgpOwotCQlDb2xsZWN0aW9uQmVhblByb3h5V3JhcHBlciBjb2wgPSBuZXcgQ29sbGVjdGlvbkJlYW5Qcm94eVdyYXBwZXIodmVjdG9yUHJveHkpOwotCQkKLQkJLy8gVGVzdCBhZGRpbmcKLQkJYXNzZXJ0VHJ1ZShjb2wuYWRkKHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKDMzKSkpOwotCQlhc3NlcnRFcXVhbHMoMSwgY29sLnNpemUoKSk7Ci0JCQkKLQkJLy8gVGVzdCB0b0FycmF5LCBmaXJzdCBlbnRyeSBzaG91bGQgYmUgMzMgYW5kIGxlbmd0aCBzaG91bGQgYmUgMS4KLQkJSUFycmF5QmVhblByb3h5IGFycmF5T3V0ID0gY29sLnRvQXJyYXkoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGFycmF5T3V0LmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMzLCAoKElJbnRlZ2VyQmVhblByb3h5KSBhcnJheU91dC5nZXQoMCkpLmludFZhbHVlKCkpOwotCQkKLQkJLy8gVGVzdCB0b0FycmF5KGFycmF5KS4KLQkJSUFycmF5QmVhblByb3h5IGFycmF5SW50byA9IHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGFycmF5T3V0LmdldFR5cGVQcm94eSgpLCBhcnJheU91dC5nZXRMZW5ndGgoKSk7IC8vJE5PTi1OTFMtMSQKLQkJSUFycmF5QmVhblByb3h5IGFycmF5T3V0MiA9IGNvbC50b0FycmF5KGFycmF5SW50byk7Ci0JCS8vIEl0IHNob3VsZCBvZiBiZWVuIHRoZSBleGFjdCBzYW1lIGFycmF5IChhcnJheUludG8gPT0gYXJyYXlPdXQyIHVuZGVyIHRoZSBwcm94aWVzKS4KLQkJYXNzZXJ0VHJ1ZShhcnJheUludG8uc2FtZUFzKGFycmF5T3V0MikpOwotCQlhc3NlcnRFcXVhbHMoMzMsICgoSUludGVnZXJCZWFuUHJveHkpIGFycmF5T3V0LmdldCgwKSkuaW50VmFsdWUoKSk7Ci0JCQotCQkvLyBUZXN0IHNldHRpbmcgd2l0aCB3cm9uZyB0eXBlIHRocm93cyBleGNlcHRpb24uCi0JCXRyeSB7Ci0JCQkvLyBUZXN0IHRoZSBzZXR0aW5nIHdpdGggd3JvbmcgdHlwZSB0aHJvd3MgYW4gZXhjZXB0aW9uCi0JCQljb2wgPSBuZXcgQ29sbGVjdGlvbkJlYW5Qcm94eVdyYXBwZXIoYXJyYXlPdXQpOwotCQkJZmFpbCgiQ2xhc3NDYXN0RXhjZXB0aW9uIHNob3VsZCBvZiBiZWVuIHRocm93bi4iKTsKLQkJfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLQkJCS8vIElmIGhlcmUsIHRoZW4gdGhlIHRlc3Qgd2FzIHBhc3NlZAotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCUlCZWFuVHlwZVByb3h5IHZlY3RvclR5cGUgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEudXRpbC5WZWN0b3IiKTsgLy8kTk9OLU5MUy0xJAotCQlJQmVhblByb3h5IHZlY3RvclByb3h5ID0gdmVjdG9yVHlwZS5uZXdJbnN0YW5jZSgpOwotCQlDb2xsZWN0aW9uQmVhblByb3h5V3JhcHBlciBjb2wgPSBuZXcgQ29sbGVjdGlvbkJlYW5Qcm94eVdyYXBwZXIodmVjdG9yUHJveHkpOwotCQljb2wuYWRkKHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKDMzKSk7CQkKLQkJCi0JCS8vIFNlZSBpZiB0aGUgaXRlcmF0b3IgaW50ZXJmYWNlIHdvcmtzLgotCQlJdGVyYXRvckJlYW5Qcm94eVdyYXBwZXIgaXRyUHJveHkgPSBjb2wuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0Tm90TnVsbChpdHJQcm94eSk7Ci0JCWludCBpdGVyYXRpb25zID0gMDsKLQkJd2hpbGUgKGl0clByb3h5Lmhhc05leHQoKSkgewotCQkJaXRlcmF0aW9ucysrOwotCQkJYXNzZXJ0VHJ1ZShpdGVyYXRpb25zIDwgMik7Ci0JCQlJQmVhblByb3h5IGl0clZhbHVlID0gaXRyUHJveHkubmV4dCgpOwotCQkJYXNzZXJ0RXF1YWxzKDMzLCAoKElJbnRlZ2VyQmVhblByb3h5KSBpdHJWYWx1ZSkuaW50VmFsdWUoKSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdExpc3RJbnRlcmZhY2UoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlJQmVhblR5cGVQcm94eSB2ZWN0b3JUeXBlID0gcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLnV0aWwuVmVjdG9yIik7IC8vJE5PTi1OTFMtMSQKLQkJSUJlYW5Qcm94eSB2ZWN0b3JQcm94eSA9IHZlY3RvclR5cGUubmV3SW5zdGFuY2UoKTsKLQkJCi0JCS8vIFNlZSBpZiB0aGUgbGlzdCBpbnRlZmFjZSB3b3Jrcy4KLQkJTGlzdEJlYW5Qcm94eVdyYXBwZXIgbGlzdCA9IG5ldyBMaXN0QmVhblByb3h5V3JhcHBlcih2ZWN0b3JQcm94eSk7Ci0JCWFzc2VydFRydWUobGlzdC5hZGQocHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoMzMpKSk7CS8vIEZpcnN0IGVudHJ5LgotCQlsaXN0LmFkZCgwLCBwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCh0cnVlKSk7CS8vIE5vdyBiZWNvbWVzIGZpcnN0IGVudHJ5LgotCQlhc3NlcnRFcXVhbHMoMiwgbGlzdC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgKChJQm9vbGVhbkJlYW5Qcm94eSkgbGlzdC5nZXQoMCkpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMzLCAoKElJbnRlZ2VyQmVhblByb3h5KSBsaXN0LmdldCgxKSkuaW50VmFsdWUoKSk7CS8vIFN3YXBwZWQgdG8gc2Vjb25kIGVudHJ5IGR1ZSB0byBhZGQoMCwuLi4pCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdExpc3RJdGVyYXRvcigpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCUlCZWFuVHlwZVByb3h5IHZlY3RvclR5cGUgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEudXRpbC5WZWN0b3IiKTsgLy8kTk9OLU5MUy0xJAotCQlJQmVhblByb3h5IHZlY3RvclByb3h5ID0gdmVjdG9yVHlwZS5uZXdJbnN0YW5jZSgpOwotCQlMaXN0QmVhblByb3h5V3JhcHBlciBsaXN0ID0gbmV3IExpc3RCZWFuUHJveHlXcmFwcGVyKHZlY3RvclByb3h5KTsKLQkJbGlzdC5hZGQocHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoMzMpKTsJLy8gRmlyc3QgZW50cnkuCi0JCWxpc3QuYWRkKDAsIHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKHRydWUpKTsJLy8gTm93IGJlY29tZXMgZmlyc3QgZW50cnkuCi0KLQkJLy8gU2VlIGlmIHRoZSBMaXN0SXRlcmF0b3IgaW50ZXJmYWNlIHdvcmtzCi0JCUxpc3RJdGVyYXRvckJlYW5Qcm94eVdyYXBwZXIgbEl0clByb3h5ID0gbGlzdC5saXN0SXRlcmF0b3IoKTsKLQkJYXNzZXJ0Tm90TnVsbChsSXRyUHJveHkpOwotCQlhc3NlcnRUcnVlKGxJdHJQcm94eS5oYXNOZXh0KCkpOwotCQlJQm9vbGVhbkJlYW5Qcm94eSBib29sMSA9IChJQm9vbGVhbkJlYW5Qcm94eSkgbEl0clByb3h5Lm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGJvb2wxLmJvb2xlYW5WYWx1ZSgpKTsKLQkJSUludGVnZXJCZWFuUHJveHkgaW50MSA9IChJSW50ZWdlckJlYW5Qcm94eSkgbEl0clByb3h5Lm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKDMzLCBpbnQxLmludFZhbHVlKCkpOwkvLyBPbGQgZmlyc3QgZW50cnkgbW92ZWQgdG8gc2Vjb25kIGVudHJ5IGJ5IGFkZCgwLC4uLikgYWJvdmUuCi0JCWFzc2VydEZhbHNlKGxJdHJQcm94eS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgbEl0clByb3h5LnByZXZpb3VzSW5kZXgoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNZXRob2RBY2Nlc3NvcnMoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlJQmVhblR5cGVQcm94eSBpbnRlZ2VyVHlwZSA9IHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkludGVnZXIiKTsgLy8kTk9OLU5MUy0xJAkJCQkKLQkJCi0JCS8vIFRlc3QgYWJsZSB0byBhY2Nlc3MgYmVhbnR5cGUgcHJveHkgYW5kIGludm9rZSBtZXRob2RzIG9uIGl0LiBUaGlzIGlzbid0Ci0JCS8vIHRoZSBhcHByb3ZlZCB3YXkgb2YgZ2V0dGluZyBtZXRob2RzLCBidXQgaXQgdGVzdHMgdGhhdCBtZXRob2QgcHJveGllcwotCQkvLyBhcmUgY3JlYXRlZCBjb3JyZWN0bHkgaWYgcmV0dXJuZWQgZnJvbSBhbiBpbnZva2UgbWV0aG9kLgotCQlJQmVhblR5cGVQcm94eSBjbGFzc1R5cGVQcm94eSA9IHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJSU1ldGhvZFByb3h5IGdldE1ldGhvZE1ldGhvZCA9IGNsYXNzVHlwZVByb3h5LmdldE1ldGhvZFByb3h5KCJnZXRNZXRob2QiLCBuZXcgU3RyaW5nW10geyJqYXZhLmxhbmcuU3RyaW5nIiwgIltMamF2YS5sYW5nLkNsYXNzOyJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJLy8gR2V0IHRoZSBJbnRlZ2VyLmJ5dGVWYWx1ZSgpIG1ldGhvZCB0aHJvdWdoIGFuIGludm9rZSBpbnN0ZWFkIG9mIGEgbWV0aG9kIGZhY3Rvcnkgb3IgYmVhbiB0eXBlLgotCQlJQmVhblByb3h5IG1ldGhvZCA9IGdldE1ldGhvZE1ldGhvZC5pbnZva2UoaW50ZWdlclR5cGUsIG5ldyBJQmVhblByb3h5W10gewotCQkJcHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoImJ5dGVWYWx1ZSIpLCBudWxsfSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbChtZXRob2QpOwotCQlhc3NlcnRUcnVlKG1ldGhvZCBpbnN0YW5jZW9mIElNZXRob2RQcm94eSk7Ci0JCQotCQkvLyBOb3cgaW52b2tlIGl0IHRvIHNlZSBpZiBjb3JyZWN0IGFuc3dlciBjb21lcyBiYWNrLgotCQlJQmVhblByb3h5IGJ5dGVWYWx1ZSA9ICgoSU1ldGhvZFByb3h5KSBtZXRob2QpLmludm9rZShwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChuZXcgSW50ZWdlcigyNTQpKSk7Ci0JCWFzc2VydE5vdE51bGwoYnl0ZVZhbHVlKTsKLQkJYXNzZXJ0RXF1YWxzKCJieXRlIiwgYnl0ZVZhbHVlLmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygoYnl0ZSkyNTQsICgoSU51bWJlckJlYW5Qcm94eSkgYnl0ZVZhbHVlKS5ieXRlVmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJbnZva2FibGVBY2Nlc3NvcnMoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlJQmVhblR5cGVQcm94eSBpbnRlZ2VyVHlwZSA9IHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkludGVnZXIiKTsgLy8kTk9OLU5MUy0xJAkJCQkKLQkJCi0JCS8vIFRlc3QgYWJsZSB0byBhY2Nlc3MgYmVhbnR5cGUgcHJveHkgYW5kIGludm9rZSBtZXRob2RzIG9uIGl0LiBUaGlzIGlzbid0Ci0JCS8vIHRoZSBhcHByb3ZlZCB3YXkgb2YgZ2V0dGluZyBtZXRob2RzLCBidXQgaXQgdGVzdHMgdGhhdCBtZXRob2QgcHJveGllcwotCQkvLyBhcmUgY3JlYXRlZCBjb3JyZWN0bHkgaWYgcmV0dXJuZWQgZnJvbSBhbiBpbnZva2UgbWV0aG9kLgotCQlJQmVhblR5cGVQcm94eSBjbGFzc1R5cGVQcm94eSA9IHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJSUludm9rYWJsZSBnZXRNZXRob2RJbnZva2FibGUgPSBjbGFzc1R5cGVQcm94eS5nZXRJbnZva2FibGUoImdldE1ldGhvZCIsIG5ldyBTdHJpbmdbXSB7ImphdmEubGFuZy5TdHJpbmciLCAiW0xqYXZhLmxhbmcuQ2xhc3M7In0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkvLyBHZXQgdGhlIEludGVnZXIuYnl0ZVZhbHVlKCkgbWV0aG9kIHRocm91Z2ggYW4gaW52b2tlIGluc3RlYWQgb2YgYSBtZXRob2QgZmFjdG9yeSBvciBiZWFuIHR5cGUuCi0JCUlCZWFuUHJveHkgbWV0aG9kID0gZ2V0TWV0aG9kSW52b2thYmxlLmludm9rZShpbnRlZ2VyVHlwZSwgbmV3IElCZWFuUHJveHlbXSB7Ci0JCQlwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCgiYnl0ZVZhbHVlIiksIG51bGx9KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKG1ldGhvZCk7Ci0JCWFzc2VydFRydWUobWV0aG9kIGluc3RhbmNlb2YgSU1ldGhvZFByb3h5KTsKLQkJCi0JCS8vIE5vdyBpbnZva2UgaXQgdG8gc2VlIGlmIGNvcnJlY3QgYW5zd2VyIGNvbWVzIGJhY2suCi0JCUlCZWFuUHJveHkgYnl0ZVZhbHVlID0gKChJTWV0aG9kUHJveHkpIG1ldGhvZCkuaW52b2tlKHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKG5ldyBJbnRlZ2VyKDI1NCkpKTsKLQkJYXNzZXJ0Tm90TnVsbChieXRlVmFsdWUpOwotCQlhc3NlcnRFcXVhbHMoImJ5dGUiLCBieXRlVmFsdWUuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKChieXRlKTI1NCwgKChJTnVtYmVyQmVhblByb3h5KSBieXRlVmFsdWUpLmJ5dGVWYWx1ZSgpKTsKLQl9CQotCQotCXB1YmxpYyB2b2lkIHRlc3RDYWxsYmFjaygpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tIFN0YXJ0aW5nIHRoZSBjYWxsYmFjayB0ZXN0IC0tLSIpOyAvLyROT04tTkxTLTEkCi0JCUlCZWFuVHlwZVByb3h5IGNhbGxiYWNrVHlwZSA9IHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgib3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LnZtLlRlc3RDYWxsYmFjayIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoY2FsbGJhY2tUeXBlKTsKLQkJT2JqZWN0IHRlc3RPYmplY3QgPSBuZXcgT2JqZWN0KCk7Ci0JCUlCZWFuUHJveHkgY2FsbGJhY2tQcm94eSA9IGNhbGxiYWNrVHlwZS5uZXdJbnN0YW5jZSgpOwotCQlUZXN0Q2FsbGJhY2sgY2IgPSBuZXcgVGVzdENhbGxiYWNrKHRlc3RPYmplY3QsIHJlZ2lzdHJ5KTsKLQkJcmVnaXN0cnkuZ2V0Q2FsbGJhY2tSZWdpc3RyeSgpLnJlZ2lzdGVyQ2FsbGJhY2soY2FsbGJhY2tQcm94eSwgY2IpOwotCQlJSW52b2thYmxlIHN0YXJ0ID0gY2FsbGJhY2tUeXBlLmdldEludm9rYWJsZSgic3RhcnQiKTsJLy8kTk9OLU5MUy0xJAotCQlJSW52b2thYmxlIHN0b3AgPSBjYWxsYmFja1R5cGUuZ2V0SW52b2thYmxlKCJzdG9wIik7CS8vJE5PTi1OTFMtMSQKLQkJc3luY2hyb25pemVkKHRlc3RPYmplY3QpIHsKLQkJCXN0YXJ0Lmludm9rZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucyhjYWxsYmFja1Byb3h5KTsKLQkJCXRyeSB7Ci0JCQkJdGVzdE9iamVjdC53YWl0KDMwMDAwKTsJLy8gU2hvdWxkIGJlIGRvbmUgYnkgMzAgc2Vjb25kcy4KLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQkJCQkKLQkJc3RvcC5pbnZva2VDYXRjaFRocm93YWJsZUV4Y2VwdGlvbnMoY2FsbGJhY2tQcm94eSk7Ci0JCXJlZ2lzdHJ5LmdldENhbGxiYWNrUmVnaXN0cnkoKS5kZXJlZ2lzdGVyQ2FsbGJhY2soY2FsbGJhY2tQcm94eSk7CQkJCQotCQljYi50ZXN0Q29tcGxldGVkKCk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiSWYgdGhlcmUgaXMgYW55dGhpbmcgaW4gdGhlIC5sb2cgZmlsZSwgdGhlbiB0aGUgdGVzdCBmYWlsZWQuIik7CQkJIC8vJE5PTi1OTFMtMSQJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2FsbGJhY2tTdHJlYW0oKSB0aHJvd3MgVGhyb3dhYmxlUHJveHksIElPRXhjZXB0aW9uIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCItLS0gU3RhcnRpbmcgdGhlIGNhbGxiYWNrIHN0cmVhbSB0ZXN0IC0tLSIpOyAvLyROT04tTkxTLTEkCi0JCUlCZWFuVHlwZVByb3h5IGNhbGxiYWNrVHlwZSA9IHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgib3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LnZtLlRlc3RDYWxsYmFja1N0cmVhbSIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoY2FsbGJhY2tUeXBlKTsKLQkJT2JqZWN0IHRlc3RPYmplY3QgPSBuZXcgT2JqZWN0KCk7Ci0JCUlCZWFuUHJveHkgY2FsbGJhY2tQcm94eSA9IGNhbGxiYWNrVHlwZS5uZXdJbnN0YW5jZSgpOwotCQlUZXN0Q2FsbGJhY2tTdHJlYW0gY2IgPSBuZXcgVGVzdENhbGxiYWNrU3RyZWFtKHRlc3RPYmplY3QpOwotCQlyZWdpc3RyeS5nZXRDYWxsYmFja1JlZ2lzdHJ5KCkucmVnaXN0ZXJDYWxsYmFjayhjYWxsYmFja1Byb3h5LCBjYik7Ci0JCUlNZXRob2RQcm94eSBzdGFydCA9IGNhbGxiYWNrVHlwZS5nZXRNZXRob2RQcm94eSgic3RhcnQiKTsJCQkJCQkJIC8vJE5PTi1OTFMtMSQKLQkJc3luY2hyb25pemVkKHRlc3RPYmplY3QpIHsJCQkKLQkJCXN0YXJ0Lmludm9rZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucyhjYWxsYmFja1Byb3h5KTsKLQkJdHJ5IHsKLQkJCQl0ZXN0T2JqZWN0LndhaXQoMzAwMDApOwkvLyBTaG91bGQgYmUgZG9uZSBieSAzMCBzZWNvbmRzLgotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJfQkKLQkJfQkJCi0JCXJlZ2lzdHJ5LmdldENhbGxiYWNrUmVnaXN0cnkoKS5kZXJlZ2lzdGVyQ2FsbGJhY2soY2FsbGJhY2tQcm94eSk7CQkJCQotCQljYi50ZXN0Q29tcGxldGUoKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJJZiB0aGVyZSBpcyBhbnl0aGluZyBpbiB0aGUgLmxvZyBmaWxlLCB0aGVuIHRoZSB0ZXN0IGZhaWxlZC4iKTsJCQkgLy8kTk9OLU5MUy0xJAkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTaW1wbGVHZXRGaWVsZCgpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCUlCZWFuVHlwZVByb3h5IGludGVnZXJUeXBlID0gcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuSW50ZWdlciIpOyAvLyROT04tTkxTLTEkCQkJCQotCQkKLQkJLy8gR2V0IHRoZSBwdWJsaWMgZmllbGQuCi0JCUlGaWVsZFByb3h5IGZpZWxkID0gaW50ZWdlclR5cGUuZ2V0RmllbGRQcm94eSgiTUFYX1ZBTFVFIik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbChmaWVsZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpbXBsZUdldERlY2xhcmVkRmllbGQoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlJQmVhblR5cGVQcm94eSBpbnRlZ2VyVHlwZSA9IHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkludGVnZXIiKTsgLy8kTk9OLU5MUy0xJAkJCQkKLQkJCi0JCS8vIEdldCB0aGUgcHVibGljIGZpZWxkLgotCQlJRmllbGRQcm94eSBmaWVsZCA9IGludGVnZXJUeXBlLmdldERlY2xhcmVkRmllbGRQcm94eSgidmFsdWUiKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKGZpZWxkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RmllbGRzKCkgewotCQlJQmVhblR5cGVQcm94eSB0ZXN0QWNjZXNzVHlwZSA9IHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgidGVzdFBhY2thZ2UuVGVzdEFjY2VzcyIpOyAvLyROT04tTkxTLTEkCQkJCQotCQkKLQkJLy8gR2V0IGFsbCBmaWVsZHMuCi0JCUlGaWVsZFByb3h5W10gZmllbGRzID0gdGVzdEFjY2Vzc1R5cGUuZ2V0RmllbGRzKCk7Ci0JCWFzc2VydE5vdE51bGwoZmllbGRzKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGZpZWxkcy5sZW5ndGgpOwkJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldERlY2xhcmVkRmllbGRzKCkgewotCQlJQmVhblR5cGVQcm94eSB0ZXN0QWNjZXNzVHlwZSA9IHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgidGVzdFBhY2thZ2UuVGVzdEFjY2VzcyIpOyAvLyROT04tTkxTLTEkCQkJCQotCQkKLQkJLy8gR2V0IGFsbCBmaWVsZHMuCi0JCUlGaWVsZFByb3h5W10gZmllbGRzID0gdGVzdEFjY2Vzc1R5cGUuZ2V0RGVjbGFyZWRGaWVsZHMoKTsKLQkJYXNzZXJ0Tm90TnVsbChmaWVsZHMpOwotCQlhc3NlcnRFcXVhbHMoMywgZmllbGRzLmxlbmd0aCk7CQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNpbXBsZUdldE1ldGhvZCgpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCUlCZWFuVHlwZVByb3h5IHRlc3RBY2Nlc3NUeXBlID0gcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJ0ZXN0UGFja2FnZS5UZXN0QWNjZXNzIik7IC8vJE5PTi1OTFMtMSQJCi0JCQotCQkvLyBHZXQgdGhlIHB1YmxpYyBmaWVsZC4KLQkJSU1ldGhvZFByb3h5IG1ldGhvZCA9IHRlc3RBY2Nlc3NUeXBlLmdldE1ldGhvZFByb3h5KCJ4eXoiKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKG1ldGhvZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpbXBsZUdldERlY2xhcmVkTWV0aG9kKCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJSUJlYW5UeXBlUHJveHkgdGVzdEFjY2Vzc1R5cGUgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoInRlc3RQYWNrYWdlLlRlc3RBY2Nlc3MiKTsgLy8kTk9OLU5MUy0xJAkKLQkJCi0JCS8vIEdldCB0aGUgcHVibGljIGZpZWxkLgotCQlJTWV0aG9kUHJveHkgbWV0aG9kID0gdGVzdEFjY2Vzc1R5cGUuZ2V0RGVjbGFyZWRNZXRob2RQcm94eSgicXhyIiwgKFN0cmluZ1tdKSBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKG1ldGhvZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE1ldGhvZHMoKSB7Ci0JCUlCZWFuVHlwZVByb3h5IHRlc3RBY2Nlc3NUeXBlID0gcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJ0ZXN0UGFja2FnZS5UZXN0QWNjZXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJSUJlYW5UeXBlUHJveHkgdGVzdE9iamVjdFR5cGUgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5PYmplY3QiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJLy8gR2V0IGFsbCBtZXRob2RzLiBOZWVkIHRvIGdldCBhbGwgb2YgT2JqZWN0IHRvbyBzaW5jZSBnZXRNZXRob2RzKCkgZ2V0cyB0aGVtIGFsbCBpbmNsdWRpbmcgaW5oZXJpdGVkLiBXZSB3aWxsCi0JCS8vIHRoZW4gdGFrZSB0aGUgZGlmZiB0byBzaG93IHdoYXQncyBvbmx5IGF0IHRoZSBsb2NhbCBsZXZlbC4KLQkJSU1ldGhvZFByb3h5W10gbWV0aG9kcyA9IHRlc3RBY2Nlc3NUeXBlLmdldE1ldGhvZHMoKTsKLQkJSU1ldGhvZFByb3h5W10gb2JqZWN0TWV0aG9kcyA9IHRlc3RPYmplY3RUeXBlLmdldE1ldGhvZHMoKTsKLQkJYXNzZXJ0Tm90TnVsbChtZXRob2RzKTsKLQkJYXNzZXJ0Tm90TnVsbChvYmplY3RNZXRob2RzKTsKLQkJYXNzZXJ0RXF1YWxzKDcsIG1ldGhvZHMubGVuZ3RoLW9iamVjdE1ldGhvZHMubGVuZ3RoKTsJCQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWNsYXJlZE1ldGhvZHMoKSB7Ci0JCUlCZWFuVHlwZVByb3h5IHRlc3RBY2Nlc3NUeXBlID0gcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJ0ZXN0UGFja2FnZS5UZXN0QWNjZXNzIik7IC8vJE5PTi1OTFMtMSQJCQkJCi0JCQotCQkvLyBHZXQgYWxsIGZpZWxkcy4KLQkJSU1ldGhvZFByb3h5W10gbWV0aG9kcyA9IHRlc3RBY2Nlc3NUeXBlLmdldERlY2xhcmVkTWV0aG9kcygpOwotCQlhc3NlcnROb3ROdWxsKG1ldGhvZHMpOwotCQlhc3NlcnRFcXVhbHMoOCwgbWV0aG9kcy5sZW5ndGgpOwkJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbmRDb21wYXRpYmxlQ29uc3RydWN0b3IoKSB0aHJvd3MgQW1iaWd1b3VzTWV0aG9kRXhjZXB0aW9uLCBOb1N1Y2hNZXRob2RFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gewotCQlJQmVhblR5cGVQcm94eSB0ZXN0QWNjZXNzVHlwZSA9IHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgidGVzdFBhY2thZ2UuVGVzdEFjY2VzcyIpOyAvLyROT04tTkxTLTEkCQkJCQotCi0JCUlDb25zdHJ1Y3RvclByb3h5IGN0b3IgPSB0ZXN0QWNjZXNzVHlwZS5nZXRDb21wYXRpYmxlQ29uc3RydWN0b3IobmV3IElCZWFuVHlwZVByb3h5W10ge3Byb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkFycmF5U3RvcmVFeGNlcHRpb24iKX0pOwotCQlJQ29uc3RydWN0b3JQcm94eSBjb21wID0gdGVzdEFjY2Vzc1R5cGUuZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvclByb3h5KG5ldyBJQmVhblR5cGVQcm94eVtdIHtwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uIil9KTsKLQkJCi0JCWFzc2VydE5vdE51bGwoY3Rvcik7Ci0JCWFzc2VydE5vdE51bGwoY29tcCk7Ci0JCWFzc2VydEVxdWFscyhjdG9yLCBjb21wKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEZpbmRDb21wYXRpYmxlTWV0aG9kKCkgdGhyb3dzIEFtYmlndW91c01ldGhvZEV4Y2VwdGlvbiwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJSUJlYW5UeXBlUHJveHkgdGVzdEFjY2Vzc1R5cGUgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoInRlc3RQYWNrYWdlLlRlc3RBY2Nlc3MiKTsgLy8kTk9OLU5MUy0xJAkJCQkKLQotCQlJTWV0aG9kUHJveHkgbWV0aG9kID0gdGVzdEFjY2Vzc1R5cGUuZ2V0Q29tcGF0aWJsZU1ldGhvZCgieHl6IiwgbmV3IElCZWFuVHlwZVByb3h5W10ge3Byb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkludGVnZXIiKX0pOwotCQlJTWV0aG9kUHJveHkgY29tcCA9IHRlc3RBY2Nlc3NUeXBlLmdldERlY2xhcmVkTWV0aG9kUHJveHkoInh5eiIsIG5ldyBJQmVhblR5cGVQcm94eVtdIHtwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5OdW1iZXIiKX0pOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChtZXRob2QpOwotCQlhc3NlcnROb3ROdWxsKGNvbXApOwotCQlhc3NlcnRFcXVhbHMobWV0aG9kLCBjb21wKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEZpbmRBbWJpZ3VvdXNNZXRob2QoKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJSUJlYW5UeXBlUHJveHkgdGVzdEFjY2Vzc1R5cGUgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoInRlc3RQYWNrYWdlLlRlc3RBY2Nlc3MiKTsgLy8kTk9OLU5MUy0xJAkJCQkKLQotCQl0cnkgewotCQkJdGVzdEFjY2Vzc1R5cGUuZ2V0Q29tcGF0aWJsZU1ldGhvZCgiZGRkIiwgbmV3IElCZWFuVHlwZVByb3h5W10ge3Byb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkludGVnZXIiKSwgcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuSW50ZWdlciIpfSk7Ci0JCQlmYWlsKCJTaG91bGQgb2YgYmVlbiBhbWJpZ3VvdXMiKTsKLQkJfSBjYXRjaCAoQW1iaWd1b3VzTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJfSAKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pZGUvSURFUHJveHlTdWl0ZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaWRlL0lERVByb3h5U3VpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRlMzNlNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pZGUvSURFUHJveHlTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaWRlOwotLyoKLSAqICAkUkNTZmlsZTogSURFUHJveHlTdWl0ZS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjU4OjU1ICQgCi0gKi8KLWltcG9ydCBqdW5pdC5leHRlbnNpb25zLlRlc3RTZXR1cDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLlByb3h5RmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGUuSURFUmVnaXN0cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5BYnN0cmFjdFRlc3RQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuUHJveHlTdWl0ZTsKLQotLyoqCi0gKiBAYXV0aG9yIHJpY2hrdWxwCi0gKgotICogVGhpcyBpcyB0aGUgdHJ1ZSB0ZXN0IHN1aXRlIGZvciBSZW1vdGUgUHJveHkgVGVzdGluZy4gVGhlIFJlbW90ZVByb3h5VGVzdCB3aWxsIHVzZSB0aGlzLgotICovCi1wdWJsaWMgY2xhc3MgSURFUHJveHlTdWl0ZSBleHRlbmRzIFRlc3RTZXR1cCB7Ci0KLQkvLyBUZXN0IGNhc2VzIHRvIGJlIGluY2x1ZGUgaW4gdGhlIHN1aXRlCi0JcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgdGVzdHNMaXN0W10gPSB7IFByb3h5U3VpdGUuY2xhc3MsIH07Ci0KLQlwcml2YXRlIEFic3RyYWN0VGVzdFByb3h5LlJlZ2lzdHJ5SGFuZGxlciByZWdpc3RyeUhhbmRsZXIgPSBuZXcgQWJzdHJhY3RUZXN0UHJveHkuUmVnaXN0cnlIYW5kbGVyKCkgewotCQlwcml2YXRlIFByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5OwotCi0JCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlwdWJsaWMgUHJveHlGYWN0b3J5UmVnaXN0cnkgZ2V0UmVnaXN0cnkoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlpZiAocmVnaXN0cnkgPT0gbnVsbCkgewotCQkJCXJlZ2lzdHJ5ID0gSURFUmVnaXN0cmF0aW9uLnN0YXJ0QW5JbXBsZW1lbnRhdGlvbihuZXcgSUNvbmZpZ3VyYXRpb25Db250cmlidXRvcltdIHsgUHJveHlTdWl0ZS5nZXRQcm94eVN1aXRlQ29udHJpYnV0b3IoKX0sIHRydWUsIG51bGwsICJKVW5pdCBUZXN0cyBmb3IgSURFIFByb3h5IiwgIm9yZy5lY2xpcHNlLmplbS50ZXN0cyIsIG51bGwpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCXJldHVybiByZWdpc3RyeTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRlc3Ryb3lSZWdpc3RyeSgpIHsKLQkJCWlmIChyZWdpc3RyeSAhPSBudWxsKSB7Ci0JCQkJcmVnaXN0cnkudGVybWluYXRlUmVnaXN0cnkoKTsKLQkJCQlyZWdpc3RyeSA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHVibGljIElERVByb3h5U3VpdGUoKSB7Ci0JCXRoaXMoIlRlc3QgSURFIFByb3h5IFN1aXRlIik7Ci0JfQotCi0JcHVibGljIElERVByb3h5U3VpdGUoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmV3IFRlc3RTdWl0ZShuYW1lKSB7Ci0JCQl7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0c0xpc3QubGVuZ3RoOyBpKyspIHsKLQkJCQkJLy8gV2UgbWF5IGdldCBzb21lIHRlc3RzIGFuZCBzdWl0ZXMuCi0JCQkJCWlmIChUZXN0U3VpdGUuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0ZXN0c0xpc3RbaV0pIHx8IFRlc3RTZXR1cC5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHRlc3RzTGlzdFtpXSkpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJVGVzdCB0cyA9IChUZXN0KSB0ZXN0c0xpc3RbaV0ubmV3SW5zdGFuY2UoKTsKLQkJCQkJCQlhZGRUZXN0KHRzKTsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlCi0JCQkJCQlhZGRUZXN0U3VpdGUodGVzdHNMaXN0W2ldKTsKLQkJCQl9Ci0KLQkJCX0KLQkJfSk7Ci0KLQkJQWJzdHJhY3RUZXN0UHJveHkuaW5pdFJlZ2lzdHJ5SGFuZGxlcigoVGVzdFN1aXRlKSBnZXRUZXN0KCksIHJlZ2lzdHJ5SGFuZGxlcik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IElERVByb3h5U3VpdGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZWdpc3RyeUhhbmRsZXIuZGVzdHJveVJlZ2lzdHJ5KCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL0Fic3RyYWN0SW5pdFBhcnNlclRlc3RDYXNlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL0Fic3RyYWN0SW5pdFBhcnNlclRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4NGFlMGIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9BYnN0cmFjdEluaXRQYXJzZXJUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlcjsKLS8qCi0gKiAgJFJDU2ZpbGU6IEFic3RyYWN0SW5pdFBhcnNlclRlc3RDYXNlLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6NTg6NTQgJCAKLSAqLwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIEBhdXRob3IgcmljaGt1bHAKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RJbml0UGFyc2VyVGVzdENhc2UgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIHRoZSB0ZXN0IGhlbHBlciBmb3IgYWxsIG9mIHRoZSB0ZXN0cyB3aXRoaW4gdGhlIGdpdmVuIHN1aXRlLgotCSAqIAotCSAqIEBwYXJhbSBzdWl0ZQotCSAqIEBwYXJhbSB0ZXN0SGVscGVyCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGluaXRTdWl0ZShUZXN0U3VpdGUgc3VpdGUsIEFic3RyYWN0SW5pdFN0cmluZ1BhcnNlclRlc3RIZWxwZXIgdGVzdEhlbHBlcikgewotCQlFbnVtZXJhdGlvbiB0ZXN0cyA9IHN1aXRlLnRlc3RzKCk7Ci0JCXdoaWxlICh0ZXN0cy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJVGVzdCB0ZXN0ID0gKFRlc3QpIHRlc3RzLm5leHRFbGVtZW50KCk7Ci0JCQlpZiAodGVzdCBpbnN0YW5jZW9mIEFic3RyYWN0SW5pdFBhcnNlclRlc3RDYXNlKQotCQkJCSgoQWJzdHJhY3RJbml0UGFyc2VyVGVzdENhc2UpIHRlc3QpLnNldFRlc3RIZWxwZXIodGVzdEhlbHBlcik7Ci0JCQllbHNlIGlmICh0ZXN0IGluc3RhbmNlb2YgVGVzdFN1aXRlKQotCQkJCWluaXRTdWl0ZSgoVGVzdFN1aXRlKSB0ZXN0LCB0ZXN0SGVscGVyKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgQWJzdHJhY3RJbml0UGFyc2VyVGVzdENhc2UoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEFic3RyYWN0SW5pdFBhcnNlclRlc3RDYXNlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBBYnN0cmFjdEluaXRTdHJpbmdQYXJzZXJUZXN0SGVscGVyIHRlc3RIZWxwZXI7Ci0JCi0JLyoqCi0JICogU2V0IHRoZSB0ZXN0IGhlbHBlciB0byB1c2UuCi0JICogCi0JICogQHBhcmFtIHRlc3RIZWxwZXIKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXN0SGVscGVyKEFic3RyYWN0SW5pdFN0cmluZ1BhcnNlclRlc3RIZWxwZXIgdGVzdEhlbHBlcikgewotCQl0aGlzLnRlc3RIZWxwZXIgPSB0ZXN0SGVscGVyOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvQWJzdHJhY3RJbml0U3RyaW5nUGFyc2VyVGVzdEhlbHBlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9BYnN0cmFjdEluaXRTdHJpbmdQYXJzZXJUZXN0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NjlhMjMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9BYnN0cmFjdEluaXRTdHJpbmdQYXJzZXJUZXN0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBBYnN0cmFjdEluaXRTdHJpbmdQYXJzZXJUZXN0SGVscGVyLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6NTg6NTQgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlcjsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIGluaXQgc3RyaW5nIHBhcnNlciBoZWxwZXIuIEFsbG93cyAiSW5pdFN0cmluZyBQYXJzZXIiIG9yICJBU1QgUGFyc2VyIiBvciBzb21lIG90aGVyIGtpbmQgb2YgdGVzdGluZy4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEluaXRTdHJpbmdQYXJzZXJUZXN0SGVscGVyIHsKLQkvKioKLQkgKiBUZXN0IHRoZSBnaXZlbiBzdHJpbmcgYWdhaW5zdCB0aGUgZ2l2ZW4gcmVzdWx0LiBlcXVhbHNPbmx5IGRldGVybWluZXMgaG93IGV4YWN0bHkgaXQgbWF0Y2hlcy4KLQkgKiBJZiBhbGxvd2VkIHRvIHRocm93IGV4Y2VwdGlvbnMsIHRoZW4gdGhlIGV4Y2VwdGlvbiBhcyB0aGUgcmVzdWx0IG9mIGV2YWx1YXRpb24gd2lsbCBiZSBzcXVhc2hlZC4KLQkgKiAKLQkgKiBAcGFyYW0gYVN0cmluZwotCSAqIEBwYXJhbSBleHBlY3RlZFJlc3VsdAotCSAqIEBwYXJhbSB0aHJvd3NFeGNlcHRpb24gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBleHBlY3RlZCB0byB0aHJvdyBhbiBleGNlcHRpb24gYW5kIHN1Y2ggZXhjZXB0aW9uIHdpbGwgbm90IGJlIHBhc3NlZCBvbiBvdXQgYW5kIHdpbGwgcmV0dXJuIG5vcm1hbC4KLQkgKiBAcGFyYW0gZXF1YWxzT25seSA8Y29kZT50cnVlPC9jb2RlPiBtZWFucyBpZiBtdXN0IG1hdGNoIGVpdGhlciA9PSwgZXF1YWxzKCksIG9yIHRvU3RyaW5nKCkncyBtYXRjaC4KLQkgKiBAdGhyb3dzIFRocm93YWJsZQotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHRlc3RJbml0U3RyaW5nKFN0cmluZyBhU3RyaW5nLCBPYmplY3QgZXhwZWN0ZWRSZXN1bHQsIGJvb2xlYW4gdGhyb3dzRXhjZXB0aW9uLCBib29sZWFuIGVxdWFsc09ubHkpCi0JCXRocm93cyBUaHJvd2FibGU7Ci0KLQkvKioKLQkgKiBUZXN0IHRoZSBnaXZlbiBzdHJpbmcgYWdhaW5zdCB0aGUgZ2l2ZW4gcmVzdWx0LiBJdCBtdXN0IG1hdGNoIGVpdGhlciA9PSwgZXF1YWxzKCksIG9yIHRvU3RyaW5nKCkncyBtYXRjaC4KLQkgKiBJdCBzaG91bGQgbm90IHRocm93IGV4Y2VwdGlvbnMuIElmIGl0IGRvZXMsIHRoZSBleGNlcHRpb24gd2lsbCBiZSBwYXNzZWQgb3V0LgotCSAqIAotCSAqIEBwYXJhbSBhU3RyaW5nCi0JICogQHBhcmFtIGV4cGVjdGVkUmVzdWx0Ci0JICogQHRocm93cyBUaHJvd2FibGUgCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEluaXRTdHJpbmcoU3RyaW5nIGFTdHJpbmcsIE9iamVjdCBleHBlY3RlZFJlc3VsdCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RJbml0U3RyaW5nKGFTdHJpbmcsIGV4cGVjdGVkUmVzdWx0LCBmYWxzZSwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogVGVzdCB0aGUgZ2l2ZW4gc3RyaW5nIGFnYWluc3QgdGhlIGdpdmVuIHJlc3VsdC4gZXF1YWxzT25seSBkZXRlcm1pbmVzIGhvdyBleGFjdGx5IGl0IG1hdGNoZXMKLQkgKiBJdCBzaG91bGQgbm90IHRocm93IGV4Y2VwdGlvbnMuIElmIGl0IGRvZXMsIHRoZSBleGNlcHRpb24gd2lsbCBiZSBwYXNzZWQgb3V0LgotCSAqIAotCSAqIEBwYXJhbSBhU3RyaW5nCi0JICogQHBhcmFtIGVxdWFsc09ubHkgPGNvZGU+dHJ1ZTwvY29kZT4gbWVhbnMgaWYgbXVzdCBtYXRjaCBlaXRoZXIgPT0sIGVxdWFscygpLCBvciB0b1N0cmluZygpJ3MgbWF0Y2guCi0JICogQHBhcmFtIGV4cGVjdGVkUmVzdWx0Ci0JICogQHRocm93cyBUaHJvd2FibGUKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0SW5pdFN0cmluZyhTdHJpbmcgYVN0cmluZywgYm9vbGVhbiBlcXVhbHNPbmx5LCBPYmplY3QgZXhwZWN0ZWRSZXN1bHQpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SW5pdFN0cmluZyhhU3RyaW5nLCBleHBlY3RlZFJlc3VsdCwgZmFsc2UsIGVxdWFsc09ubHkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvQXJyYXlDb25zdHJ1Y3RvclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvQXJyYXlDb25zdHJ1Y3RvclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRjMmUwYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL0FycmF5Q29uc3RydWN0b3JUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlcjsKLS8qCi0gKiAgJFJDU2ZpbGU6IEFycmF5Q29uc3RydWN0b3JUZXN0LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6NTg6NTQgJCAKLSAqLwotCi0vKioKLSAqIEBhdXRob3Igam15ZXJzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEFycmF5Q29uc3RydWN0b3JUZXN0IGV4dGVuZHMgQWJzdHJhY3RJbml0UGFyc2VyVGVzdENhc2UgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEFycmF5Q29udHJ1Y3RvclRlc3QuCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgQXJyYXlDb25zdHJ1Y3RvclRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQkKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlTdHJpbmcxRCgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgU3RyaW5nWzJdIixuZXcgU3RyaW5nWzJdKTsJCi0gICAgfQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eVN0cmluZzJEKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBTdHJpbmdbMl1bMl0iLG5ldyBTdHJpbmdbMl1bMl0pOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdEVtcHR5Q29sb3IxRCgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgamF2YS5hd3QuQ29sb3JbM10iLG5ldyBqYXZhLmF3dC5Db2xvclszXSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlDb2xvcjJEKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBqYXZhLmF3dC5Db2xvclszXVs0XSIsbmV3IGphdmEuYXd0LkNvbG9yWzNdWzRdKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eUludCgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgaW50WzNdIiwgbmV3IGludFszXSk7CQotCX0KLQkKLQkvLyBUT0RPOiBlbmFibGUgdGhpcyB0ZXN0IHdoZW4gdGhpcyB3b3JrcwotCS8qCi0JcHVibGljIHZvaWQgdGVzdENhbGN1bGF0ZWRTaXplKCkgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgU3RyaW5nW25ldyBJbnRlZ2VyKDMpLmludFZhbHVlKCldIixuZXcgU3RyaW5nW25ldyBJbnRlZ2VyKDMpLmludFZhbHVlKCldKTsgICAgCQotCX0KLQkqLwotCQotCXB1YmxpYyB2b2lkIHRlc3RJbml0aWFsaXplZEludHMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IGludFtdIHstMiwzfSIsbmV3IGludFtdey0yLDN9KTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RJbml0aWFsaXplZEludHNUcmFpbGluZ0NvbW1hKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBpbnRbXSB7LTIsMyx9IixuZXcgaW50W117LTIsMyx9KTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdEluaXRpYWxpemVkRG91YmxlUGFyZW5zKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBkb3VibGVbXSB7KC0yKSwgMy4wIH0iLG5ldyBkb3VibGVbXSB7KC0yKSwgMy4wIH0pOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdEluaXRpYWxpemVkU3RyaW5nc1R3bygpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgU3RyaW5nW10ge1wiMVwiLFwiMlwifSIsbmV3IFN0cmluZ1tdIHsiMSIsIjIifSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5pdGlhbGl6ZWRTdHJpbmdzVGhyZWUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IFN0cmluZ1tdIHtcIkZyb2dcIixcIkRvZ1wiLFwiQ293XCJ9IixuZXcgU3RyaW5nW10geyJGcm9nIiwiRG9nIiwiQ293In0pOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdEluaXRpYWxpemVkQ29sb3JzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBqYXZhLmF3dC5Db2xvcltdIHsgamF2YS5hd3QuQ29sb3IucmVkICwgbmV3IGphdmEuYXd0LkNvbG9yKDAsMCwwKSB9IixuZXcgamF2YS5hd3QuQ29sb3JbXSB7IGphdmEuYXd0LkNvbG9yLnJlZCAsIG5ldyBqYXZhLmF3dC5Db2xvcigwLDAsMCkgfSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5pdGFsaXplZEludHMyRDEoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IGludFtdW10geyB7IDIgLCAtMyB9ICwgeyA0ICwgNSB9IH0iLG5ldyBpbnRbXVtdIHsgeyAyICwgLTMgfSAsIHsgNCAsIDUgfSB9KTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RJbml0YWxpemVkSW50czJEMigpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgaW50W11bXSB7ezEsMiwzfSx7NCw1LDZ9fSIsbmV3IGludFtdW117ezEsMiwzfSx7NCw1LDZ9fSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5pdGFsaXplZEludHMyRFBhcmVuc0NvbW1hcygpIHRocm93cyBUaHJvd2FibGUgewotCQkvLyBNdWNoIHRvIG15IHN1cnByaXNlLCBleHRyYSBjb21tYW5kcyBhcmUgdmFsaWQgc3ludGF4IGF0IHRoZSBlbmQgb2YgdGhlIGFyZ3VtZW50cyBldmVuIHdpdGhvdXQgYW55IGZvbGxvd2luZyBhcmd1bWVudAotCQkvLyB0aGUgcmVzb2x2ZSB0aGF0IG9jY3VycyBieSB0aGUgVmlzdWFsIEVkaXRvciBhY3R1YWxseSBpbnNlcnRzIHRoZXNlLCBzbyB3ZSBuZWVkIHRlc3RzIHRvIG1ha2Ugc3VyZSB3ZSBjYW4gZGVhbCB3aXRoIHRoZW0gY29ycmVjdGx5Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBpbnRbXVtdIHsgezIgLCgtMyksfSAsIHsgNCAsIDUsfX0iLG5ldyBpbnRbXVtdIHsgeyAyICwgKC0zKSx9ICwgeyA0ICwgNSx9fSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5pdGFsaXplZEludHMyRFBhcmVuc0NvbW1hczIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IGludFtdW10geyB7MiAsKC0zKSx9ICwgeyA0ICwgNSx9LH0iLG5ldyBpbnRbXVtdIHsgeyAyICwgKC0zKSx9ICwgeyA0ICwgNSx9LH0pOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdEluaXRhbGl6ZWREb3VibGVzMkQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IGRvdWJsZVtdW10geyB7IDIgLCAzIH0gLCB7IDQgLCA1IH0gfSIsbmV3IGRvdWJsZVtdW10geyB7IDIgLCAzIH0gLCB7IDQgLCA1IH0gfSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5pdGFsaXplZERvdWJsZXMyRE1hbnkoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IGRvdWJsZVtdW117eyA1LjAsIC0yLjAsIDUuMCwgLTEuMCwgLTEuMCwgNS4wLCAtMi4wLCA1LjAgfSwgeyA1LjAsIC0yLjAsIDUuMCwgLTIuMCwgNS4wLCAtMS4wLCA1LjAsIC0yLjAsIDUuMCB9fSIsbmV3IGRvdWJsZVtdW117eyA1LjAsIC0yLjAsIDUuMCwgLTEuMCwgLTEuMCwgNS4wLCAtMi4wLCA1LjAgfSwgeyA1LjAsIC0yLjAsIDUuMCwgLTIuMCwgNS4wLCAtMS4wLCA1LjAsIC0yLjAsIDUuMCB9fSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0SW50MkRQYXJhbSgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMobmV3IGludFtdW10ge3sxLDIsM30sezMsNCw1fX0pIixuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMobmV3IGludFtdW10ge3sxLDIsM30sezMsNCw1fX0pKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RJbnQyRFBhcmFtQ29tbWFzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycyhuZXcgaW50W11bXSB7ezEsMiwzLH0sezMsNCw1LH19KSIsbmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKG5ldyBpbnRbXVtdIHt7MSwyLDMsfSx7Myw0LDUsfX0pKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RJbnQyRFBhcmFtQ29tbWFzMigpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMobmV3IGludFtdW10ge3sxLDIsMyx9LHszLDQsNSx9LH0pIixuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMobmV3IGludFtdW10ge3sxLDIsMyx9LHszLDQsNSx9LH0pKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3REb3VibGVQYXJhbSgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMobmV3IGRvdWJsZVtdezEsMiwzfSkiLG5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycyhuZXcgZG91YmxlW117MSwyLDN9KSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0RG91YmxlUGFyYW0yKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycyhuZXcgZG91YmxlW117MS4wLDIsLTMuNX0pIixuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMobmV3IGRvdWJsZVtdezEuMCwyLC0zLjV9KSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0RG91YmxlUGFyYW0zKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycyhuZXcgZG91YmxlW117LTEsMiwtMC41fSkiLG5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycyhuZXcgZG91YmxlW117LTEsMiwtMC41fSkpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdERvdWJsZTJEUGFyYW0oKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJLy8gVGhpcyB0ZXN0IGlzIG9uZSB0aGF0IGlzIHNpbWlsYXIgdG8gdGhlIHR5cGUgb2YgY29uc3RydWN0b3IgdXNlZCBieSBUYWJsZUxheW91dCBmb3IgU1dBCi0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycyhuZXcgZG91YmxlW11bXXt7IDUuMCwgLTIuMCwgNS4wLCAtMS4wLCAtMS4wLCA1LjAsIC0yLjAsIDUuMCB9LCB7IDUuMCwgLTIuMCwgNS4wLCAtMi4wLCA1LjAsIC0xLjAsIDUuMCwgLTIuMCwgNS4wIH19KSIsCi0JCQkJCQluZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMobmV3IGRvdWJsZVtdW117eyA1LjAsIC0yLjAsIDUuMCwgLTEuMCwgLTEuMCwgNS4wLCAtMi4wLCA1LjAgfSwgeyA1LjAsIC0yLjAsIDUuMCwgLTIuMCwgNS4wLCAtMS4wLCA1LjAsIC0yLjAsIDUuMCB9fSkpOyAgICAJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3REb3VibGUyRFBhcmFtQ29tbWFzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycyhuZXcgZG91YmxlW11bXXt7IDUuMCwgLTIuMCwgNS4wLCAtMS4wLCAtMS4wLCA1LjAsIC0yLjAsIDUuMCAsIH0sIHsgNS4wLCAtMi4wLCA1LjAsIC0yLjAsIDUuMCwgLTEuMCwgNS4wLCAtMi4wLCA1LjAgLCB9ICwgfSkiLAotCQkJCQkJCW5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycyhuZXcgZG91YmxlW11bXXt7IDUuMCwgLTIuMCwgNS4wLCAtMS4wLCAtMS4wLCA1LjAsIC0yLjAsIDUuMCAsIH0sIHsgNS4wLCAtMi4wLCA1LjAsIC0yLjAsIDUuMCwgLTEuMCwgNS4wLCAtMi4wLCA1LjAgLCB9ICwgfSkpOwkKLQl9Ci0JCi0JCi0JLy8gVE9ETzogZW5hYmxlIHRoaXMgdGVzdCB3aGVuIHRoZSBjYXNlIGlzIGhhbmRsZWQgcHJvcGVybHkKLQkvKgotCXB1YmxpYyB2b2lkIHRlc3RJbnQzRCgpIHsKLQkJLy8gTmVlZHMgZml4aW5nIC0gV2UgZG9uJ3QgaGF2ZSBkaW1lbnNpb25zIGdyZWF0ZXIgdGhhbiAyIHdvcmtpbmcgeWV0Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBpbnRbXVtdW10geyB7IHsgMSAsIDIgfSAsIHsgMyAsIDQgfSB9LCB7IHsgNSAsIDYgfSAsIHsgNyAsIDggfSB9IH0iLG5ldyBpbnRbXVtdW10geyB7IHsgMSAsIDIgfSAsIHsgMyAsIDQgfSB9LCB7IHsgNSAsIDYgfSAsIHsgNyAsIDggfSB9IH0pOyAgICAJCi0JfQotICAgICovCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL0Jsb2NrVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9CbG9ja1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdlN2Q3OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL0Jsb2NrVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXI7Ci0vKgotICogICRSQ1NmaWxlOiBCbG9ja1Rlc3QuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDo1ODo1NCAkIAotICovCi0KLS8qKgotICogQGF1dGhvciBqbXllcnMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQmxvY2tUZXN0IGV4dGVuZHMgQWJzdHJhY3RJbml0UGFyc2VyVGVzdENhc2UgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEJsb2NrVGVzdC4KLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBCbG9ja1Rlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0vKgotICogVE9ETyBUaGVzZSB0aHJlZSBkb24ndCB3b3JrIGZvciBub3cuIExhdGVyIHRoZXkgbWF5IGJlIGZpeGVkIGlmIGl0IHNob3dzIHVwIGFzIGEgZ2VuZXJhbCBwcm9ibGVtIGZvciBjdXN0b21lcnMuIFNvIGZhciB0aGV5IGhhdmVuJ3QuCi0gICAgICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRFbGVtZW50czEoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygKLQkJCSIoKChuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMoMykpLnNldEVsZW1BdChcImFjY291bnRTdGF0ZW1lbnREZXRhaWxzXCIsMCkpLnNldEVsZW1BdChuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMoXCJPcG5CYWxhbmNlXCIsXCJPcG5CYWxhbmNlXCIsbnVsbCxmYWxzZSxmYWxzZSx0cnVlLDUwKSwxKSkuc2V0RWxlbUF0KG5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycyhcIk9wbkRhdGVcIixcIk9wbkRhdGVcIixudWxsLGZhbHNlLGZhbHNlLHRydWUsNTApLDIpOyIsCi0JCQkoKChuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMoMykpLnNldEVsZW1BdCgiYWNjb3VudFN0YXRlbWVudERldGFpbHMiLDApKS5zZXRFbGVtQXQobmV3IE5hdmlnYXRpb25QYXJhbWV0ZXJzKCJPcG5CYWxhbmNlIiwiT3BuQmFsYW5jZSIsbnVsbCxmYWxzZSxmYWxzZSx0cnVlLDUwKSwxKSkuc2V0RWxlbUF0KG5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycygiT3BuRGF0ZSIsIk9wbkRhdGUiLG51bGwsZmFsc2UsZmFsc2UsdHJ1ZSw1MCksMikpOyAgICAJCi0gICAgfQotCXB1YmxpYyB2b2lkIHRlc3RTZXRFbGVtZW50czIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygKLQkJCQkiKCgobmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKDMpKS5zZXRFbGVtQXQoXCJhY2NvdW50U3RhdGVtZW50RGV0YWlsc1wiLDApKS5zZXRFbGVtQXQobmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKFwiT3BuQmFsYW5jZVwiLFwiT3BuQmFsYW5jZVwiLG51bGwsZmFsc2UsZmFsc2UsdHJ1ZSw1MCksMSkpIiwKLQkJCQkoKChuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMoMykpLnNldEVsZW1BdCgiYWNjb3VudFN0YXRlbWVudERldGFpbHMiLDApKS5zZXRFbGVtQXQobmV3IE5hdmlnYXRpb25QYXJhbWV0ZXJzKCJPcG5CYWxhbmNlIiwiT3BuQmFsYW5jZSIsbnVsbCxmYWxzZSxmYWxzZSx0cnVlLDUwKSwxKSkpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFNldEVsZW1lbnRzMygpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKAotCQkJIigobmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKDMpKS5zZXRFbGVtQXQobmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKFwiT3BuQmFsYW5jZVwiLFwiT3BuQmFsYW5jZVwiLG51bGwsZmFsc2UsZmFsc2UsdHJ1ZSw1MCksMSkpIiwKLQkJCSgobmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKDMpKS5zZXRFbGVtQXQobmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKCJPcG5CYWxhbmNlIiwiT3BuQmFsYW5jZSIsbnVsbCxmYWxzZSxmYWxzZSx0cnVlLDUwKSwxKSkpOyAgICAJCi0JfQotKi8KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RWxlbWVudDQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygKLQkJCQkiKChuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMoMykpLnNldEVsZW1BdChcImFjY291bnRTdGF0ZW1lbnREZXRhaWxzXCIsMCkpIiwKLQkJCQkoKG5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycygzKSkuc2V0RWxlbUF0KCJhY2NvdW50U3RhdGVtZW50RGV0YWlscyIsMCkpKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdSZXBsYWNlbWVudDEoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygKLQkJCQkiKCgobmV3IFN0cmluZyhcIkZyb2dcIikpLnJlcGxhY2UoJ28nLCdpJykpLnJlcGxhY2UoJ2knLCdhJykpLnJlcGxhY2UoJ2EnLCdvJykiLAotCQkJCSgoKG5ldyBTdHJpbmcoIkZyb2ciKSkucmVwbGFjZSgnbycsJ2knKSkucmVwbGFjZSgnaScsJ2EnKSkucmVwbGFjZSgnYScsJ28nKSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nUmVwbGFjZW1lbnQyKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoCi0JCQkJIigoKChuZXcgU3RyaW5nKFwiRnJvZ1wiKSkucmVwbGFjZSgnbycsJ2knKSkucmVwbGFjZSgnaScsJ2EnKSkucmVwbGFjZSgnYScsJ28nKSkucmVwbGFjZSgnbycsJ2UnKSIsCi0JCQkJKCgoKG5ldyBTdHJpbmcoIkZyb2ciKSkucmVwbGFjZSgnbycsJ2knKSkucmVwbGFjZSgnaScsJ2EnKSkucmVwbGFjZSgnYScsJ28nKSkucmVwbGFjZSgnbycsJ2UnKSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nQ2FzZXMxKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoCi0JCQkJIihuZXcgU3RyaW5nKFwiRnJvZ1wiKS50b0xvd2VyQ2FzZSgpKS50b1VwcGVyQ2FzZSgpIiwKLQkJCQkobmV3IFN0cmluZygiRnJvZyIpLnRvTG93ZXJDYXNlKCkpLnRvVXBwZXJDYXNlKCkKLQkJCQkpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFN0cmluZ0Nhc2VzMigpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKAotCQkJCSIoKG5ldyBTdHJpbmcoXCJGcm9nXCIpLnRvTG93ZXJDYXNlKCkpLnRvVXBwZXJDYXNlKCkpLnRvTG93ZXJDYXNlKCkiLAotCQkJCSgobmV3IFN0cmluZygiRnJvZyIpLnRvTG93ZXJDYXNlKCkpLnRvVXBwZXJDYXNlKCkpLnRvTG93ZXJDYXNlKCkKLQkJCQkpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFN0cmluZ0Nhc2VzMygpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKAotCQkJCSIoKChuZXcgU3RyaW5nKFwiRnJvZ1wiKS50b0xvd2VyQ2FzZSgpKS50b1VwcGVyQ2FzZSgpKS50b0xvd2VyQ2FzZSgpKS50b1VwcGVyQ2FzZSgpIiwKLQkJCQkoKChuZXcgU3RyaW5nKCJGcm9nIikudG9Mb3dlckNhc2UoKSkudG9VcHBlckNhc2UoKSkudG9Mb3dlckNhc2UoKSkudG9VcHBlckNhc2UoKQotCQkJCSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nQ29uY2F0MSgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKAotCQkJCSIobmV3IFN0cmluZyhcIkZyb2dzXCIpLmNvbmNhdChcImFyZVwiKSkuY29uY2F0KFwiY29vbFwiKSIsCi0JCQkJKG5ldyBTdHJpbmcoIkZyb2dzIikuY29uY2F0KCJhcmUiKSkuY29uY2F0KCJjb29sIikKLQkJCQkpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFN0cmluZ0NvbmNhdDIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygKLQkJCQkiKChuZXcgU3RyaW5nKFwiRnJvZ3NcIikuY29uY2F0KFwiYXJlXCIpKS5jb25jYXQoXCJ2ZXJ5XCIpKS5jb25jYXQoXCJjb29sXCIpIiwKLQkJCQkoKG5ldyBTdHJpbmcoIkZyb2dzIikuY29uY2F0KCJhcmUiKSkuY29uY2F0KCJ2ZXJ5IikpLmNvbmNhdCgiY29vbCIpCi0JCQkJKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdDb25jYXQzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoCi0JCQkJIigoKG5ldyBTdHJpbmcoXCJGcm9nc1wiKS5jb25jYXQoXCJqdXN0XCIpKS5jb25jYXQoXCJydWxlXCIpKS5jb25jYXQoXCJjb29sXCIpKS5jb25jYXQoXCJraW5nZG9tXCIpIiwKLQkJCQkoKChuZXcgU3RyaW5nKCJGcm9ncyIpLmNvbmNhdCgianVzdCIpKS5jb25jYXQoInJ1bGUiKSkuY29uY2F0KCJjb29sIikpLmNvbmNhdCgia2luZ2RvbSIpCi0JCQkJKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdDb25jYXQ0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoCi0JCQkJIigobmV3IFN0cmluZyhcIkZyb2dzXCIpLmNvbmNhdChcImp1c3RcIikpLmNvbmNhdChuZXcgU3RyaW5nKFwidG90YWxseVwiKSkuY29uY2F0KG5ldyBTdHJpbmcoXCJSb2NrXCIpKSkiLAotCQkJCSgobmV3IFN0cmluZygiRnJvZ3MiKS5jb25jYXQoImp1c3QiKSkuY29uY2F0KG5ldyBTdHJpbmcoInRvdGFsbHkiKSkuY29uY2F0KG5ldyBTdHJpbmcoIlJvY2siKSkpCi0JCQkJKTsJCi0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9Cb3JkZXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL0JvcmRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY4OGI2Ni4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL0JvcmRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyOwotLyoKLSAqICAkUkNTZmlsZTogQm9yZGVyVGVzdC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjU4OjU0ICQgCi0gKi8KLQotLyoqCi0gKiBAYXV0aG9yIGpteWVycwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBCb3JkZXJUZXN0IGV4dGVuZHMgQWJzdHJhY3RJbml0UGFyc2VyVGVzdENhc2UgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEJvcmRlclRlc3QuCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgQm9yZGVyVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEV0Y2hlZFJhaXNlZCgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKAotCQkJImphdmF4LnN3aW5nLkJvcmRlckZhY3RvcnkuY3JlYXRlRXRjaGVkQm9yZGVyKGphdmF4LnN3aW5nLmJvcmRlci5FdGNoZWRCb3JkZXIuUkFJU0VEKSIgLAotCQkJIGphdmF4LnN3aW5nLkJvcmRlckZhY3RvcnkuY3JlYXRlRXRjaGVkQm9yZGVyKGphdmF4LnN3aW5nLmJvcmRlci5FdGNoZWRCb3JkZXIuUkFJU0VEKSk7CQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QmV2ZWxSYWlzZWQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygKLQkJCSJqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5LmNyZWF0ZUJldmVsQm9yZGVyKGphdmF4LnN3aW5nLmJvcmRlci5CZXZlbEJvcmRlci5SQUlTRUQpIiwKLQkJCWphdmF4LnN3aW5nLkJvcmRlckZhY3RvcnkuY3JlYXRlQmV2ZWxCb3JkZXIoamF2YXguc3dpbmcuYm9yZGVyLkJldmVsQm9yZGVyLlJBSVNFRCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eSgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKAotCQkJImphdmF4LnN3aW5nLkJvcmRlckZhY3RvcnkuY3JlYXRlRW1wdHlCb3JkZXIoKSIsCi0JCQlqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5LmNyZWF0ZUVtcHR5Qm9yZGVyKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYXR0ZSgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKAotCQkJImphdmF4LnN3aW5nLkJvcmRlckZhY3RvcnkuY3JlYXRlTWF0dGVCb3JkZXIoMiwgMiwgMiwgMiwgamF2YS5hd3QuQ29sb3IuYmxhY2spIiwKLQkJCWZhbHNlLAotCQkJamF2YXguc3dpbmcuQm9yZGVyRmFjdG9yeS5jcmVhdGVNYXR0ZUJvcmRlcigyLCAyLCAyLCAyLCBqYXZhLmF3dC5Db2xvci5ibGFjaykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTb2Z0QmV2ZWwoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygKLQkJCSJuZXcgamF2YXguc3dpbmcuYm9yZGVyLlNvZnRCZXZlbEJvcmRlcigwKSIsCi0JCQlmYWxzZSwKLQkJCW5ldyBqYXZheC5zd2luZy5ib3JkZXIuU29mdEJldmVsQm9yZGVyKDApKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlTaXplKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoCi0JCQkiamF2YXguc3dpbmcuQm9yZGVyRmFjdG9yeS5jcmVhdGVFbXB0eUJvcmRlcigyLCAyLCAyLCAyKSIsCi0JCQlmYWxzZSwKLQkJCWphdmF4LnN3aW5nLkJvcmRlckZhY3RvcnkuY3JlYXRlRW1wdHlCb3JkZXIoMiwgMiwgMiwgMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaW5lKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoCi0JCQkiamF2YXguc3dpbmcuQm9yZGVyRmFjdG9yeS5jcmVhdGVMaW5lQm9yZGVyKGphdmEuYXd0LkNvbG9yLmJsYWNrLCAyKSIsCi0JCQlmYWxzZSwKLQkJCWphdmF4LnN3aW5nLkJvcmRlckZhY3RvcnkuY3JlYXRlTGluZUJvcmRlcihqYXZhLmF3dC5Db2xvci5ibGFjaywgMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTb2Z0QmV2ZWxSYWlzZWQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygKLQkJCSJuZXcgamF2YXguc3dpbmcuYm9yZGVyLlNvZnRCZXZlbEJvcmRlcihqYXZheC5zd2luZy5ib3JkZXIuQmV2ZWxCb3JkZXIuUkFJU0VEKSIsCi0JCQlmYWxzZSwKLQkJCW5ldyBqYXZheC5zd2luZy5ib3JkZXIuU29mdEJldmVsQm9yZGVyKGphdmF4LnN3aW5nLmJvcmRlci5CZXZlbEJvcmRlci5SQUlTRUQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VGl0bGVkQmFzaWMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygKLQkJCSJqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5LmNyZWF0ZVRpdGxlZEJvcmRlcihudWxsLFwiZnJvZ1wiLDIsMCkiLAotCQkJZmFsc2UsCi0JCQlqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5LmNyZWF0ZVRpdGxlZEJvcmRlcihudWxsLCAiZnJvZyIsIDIsIDApKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29tcG91bmRCYXNpYygpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKAotCQkJIm5ldyBqYXZheC5zd2luZy5ib3JkZXIuQ29tcG91bmRCb3JkZXIoamF2YXguc3dpbmcuQm9yZGVyRmFjdG9yeS5jcmVhdGVFbXB0eUJvcmRlcigpLGphdmF4LnN3aW5nLkJvcmRlckZhY3RvcnkuY3JlYXRlRW1wdHlCb3JkZXIoKSkiLAotCQkJZmFsc2UsCi0JCQluZXcgamF2YXguc3dpbmcuYm9yZGVyLkNvbXBvdW5kQm9yZGVyKGphdmF4LnN3aW5nLkJvcmRlckZhY3RvcnkuY3JlYXRlRW1wdHlCb3JkZXIoKSxqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5LmNyZWF0ZUVtcHR5Qm9yZGVyKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29tcG91bmRNZWRpdW0oKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygKLQkJCSJqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5LmNyZWF0ZUNvbXBvdW5kQm9yZGVyKGphdmF4LnN3aW5nLkJvcmRlckZhY3RvcnkuY3JlYXRlQmV2ZWxCb3JkZXIoamF2YXguc3dpbmcuYm9yZGVyLkJldmVsQm9yZGVyLlJBSVNFRCksIGphdmF4LnN3aW5nLkJvcmRlckZhY3RvcnkuY3JlYXRlQmV2ZWxCb3JkZXIoamF2YXguc3dpbmcuYm9yZGVyLkJldmVsQm9yZGVyLkxPV0VSRUQpKSIsCi0JCQlmYWxzZSwKLQkJCWphdmF4LnN3aW5nLkJvcmRlckZhY3RvcnkuY3JlYXRlQ29tcG91bmRCb3JkZXIoamF2YXguc3dpbmcuQm9yZGVyRmFjdG9yeS5jcmVhdGVCZXZlbEJvcmRlcihqYXZheC5zd2luZy5ib3JkZXIuQmV2ZWxCb3JkZXIuUkFJU0VEKSwgamF2YXguc3dpbmcuQm9yZGVyRmFjdG9yeS5jcmVhdGVCZXZlbEJvcmRlcihqYXZheC5zd2luZy5ib3JkZXIuQmV2ZWxCb3JkZXIuTE9XRVJFRCkpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFRpdGxlZEFkdmFuY2VkKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoCi0JCQkiamF2YXguc3dpbmcuQm9yZGVyRmFjdG9yeS5jcmVhdGVUaXRsZWRCb3JkZXIoamF2YXguc3dpbmcuQm9yZGVyRmFjdG9yeS5jcmVhdGVMaW5lQm9yZGVyKGphdmEuYXd0LlN5c3RlbUNvbG9yLmFjdGl2ZUNhcHRpb24sMzApLCBcIkhlbGxvXCIsIGphdmF4LnN3aW5nLmJvcmRlci5UaXRsZWRCb3JkZXIuQ0VOVEVSLCBqYXZheC5zd2luZy5ib3JkZXIuVGl0bGVkQm9yZGVyLkRFRkFVTFRfUE9TSVRJT04sIG5ldyBqYXZhLmF3dC5Gb250KFwiRGlhbG9nXCIsIGphdmEuYXd0LkZvbnQuQk9MRCwgMTgpLCBqYXZhLmF3dC5Db2xvci5saWdodEdyYXkpIiwKLQkJCWZhbHNlLAotCQkJamF2YXguc3dpbmcuQm9yZGVyRmFjdG9yeS5jcmVhdGVUaXRsZWRCb3JkZXIoamF2YXguc3dpbmcuQm9yZGVyRmFjdG9yeS5jcmVhdGVMaW5lQm9yZGVyKGphdmEuYXd0LlN5c3RlbUNvbG9yLmFjdGl2ZUNhcHRpb24sMzApLCAiSGVsbG8iLCBqYXZheC5zd2luZy5ib3JkZXIuVGl0bGVkQm9yZGVyLkNFTlRFUiwgamF2YXguc3dpbmcuYm9yZGVyLlRpdGxlZEJvcmRlci5ERUZBVUxUX1BPU0lUSU9OLCBuZXcgamF2YS5hd3QuRm9udCgiRGlhbG9nIiwgamF2YS5hd3QuRm9udC5CT0xELCAxOCksIGphdmEuYXd0LkNvbG9yLmxpZ2h0R3JheSkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvQ2FzdFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvQ2FzdFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQxODJkYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL0Nhc3RUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyOwotLyoKLSAqICAkUkNTZmlsZTogQ2FzdFRlc3QuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDo1ODo1NCAkIAotICovCi0KLS8qKgotICogQGF1dGhvciBqbXllcnMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQ2FzdFRlc3QgZXh0ZW5kcyBBYnN0cmFjdEluaXRQYXJzZXJUZXN0Q2FzZSB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQ2FzdFRlc3QuCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgQ2FzdFRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludFRvRmxvYXQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IEZsb2F0KChmbG9hdCkxMCkiLCBuZXcgRmxvYXQoMTApKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RJbnRUb0Zsb2F0U3BhY2UoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IEZsb2F0KCAoZmxvYXQpIDEwICkiLCBuZXcgRmxvYXQoMTApKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RGbG9hdFRvRmxvYXQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IEZsb2F0KChmbG9hdCkxMC4zKSIsIG5ldyBGbG9hdCgoZmxvYXQpIDEwLjMpKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RGbG9hdFRvRmxvYXQyKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBGbG9hdCgoZmxvYXQpNS4zKSIsIG5ldyBGbG9hdCgoZmxvYXQpIDUuMykpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdEZsb2F0VG9GbG9hdFNwYWNlKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBGbG9hdCggKGZsb2F0KSAxMC4zICkiLCBuZXcgRmxvYXQoKGZsb2F0KSAxMC4zKSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbFRvU3RyaW5nKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIihTdHJpbmcpbnVsbCIsIChTdHJpbmcpIG51bGwpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFN0cmluZ0xpdGVyYWxUb1N0cmluZygpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCIoU3RyaW5nKVwiaGlcIiIsICJoaSIpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdE51bGxUb1N0cmluZ1BhcmFtKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBqYXZheC5zd2luZy5KTGFiZWwoIChTdHJpbmcpIG51bGwpIiwgbmV3IGphdmF4LnN3aW5nLkpMYWJlbCgoU3RyaW5nKSBudWxsKSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0SW50VG9TaG9ydCgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCIoc2hvcnQpMTAiLCBuZXcgU2hvcnQoKHNob3J0KSAxMCkpOwkJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RGbG9hdFRvRmxvYXRQcmltKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIihmbG9hdCkxMC4zIiwgbmV3IEZsb2F0KChmbG9hdCkxMC4zKSk7CQotCX0KLQkKLSAgICAvLwlDYXN0cyBzdGF0ZW1lbnRzIHdpdGggcXVhbGlmaWVkIGV4cHJlc3Npb24gdXNlZCB0byBmYWlsCi0JcHVibGljIHZvaWQgdGVzdFF1YWxpZmllZFN0cmluZ1JldHVybigpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCIoamF2YS5sYW5nLlN0cmluZylvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycy5nZXRSZXZlcnNlZChcIkZyb2dcIikiLG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzLmdldFJldmVyc2VkKCJGcm9nIikpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFN0cmluZ1JldHVybigpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCIoU3RyaW5nKW9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzLmdldFJldmVyc2VkKFwiRnJvZ1wiKSIsb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMuZ2V0UmV2ZXJzZWQoIkZyb2ciKSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0UXVhbGlmaWVkQ29sb3JSZXR1cm4oKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygiKGphdmEuYXd0LkNvbG9yKW9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzLmdldENvbG9yKFwicmVkXCIpIixvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycy5nZXRDb2xvcigicmVkIikpOwkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENhc3RVcENvbG9yKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgICAvLwkJVGVzdCB3aGVyZSB0aGUgbWV0aG9kIGlzIHR5cGVkIHRvIHJldHVybiBDb2xvciBhbmQgd2UgY2FzdCB0byB0aGUgbW9yZSBnZW5lcmFpbGl6ZWQgc3ViY2xhc3Mgb2YgU3lzdGVtQ29sb3IKLQkJIHRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIihqYXZhLmF3dC5TeXN0ZW1Db2xvcilvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycy5nZXRDb2xvcihcIndpbmRvd1wiKSIsb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMuZ2V0Q29sb3IoIndpbmRvdyIpKTsJCi0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9DaGFyVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9DaGFyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTkyYmU5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvQ2hhclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXI7Ci0vKgotICogICRSQ1NmaWxlOiBDaGFyVGVzdC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjU4OjU0ICQgCi0gKi8KLQotLyoqCi0gKiBAYXV0aG9yIGpteWVycwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBDaGFyVGVzdCBleHRlbmRzIEFic3RyYWN0SW5pdFBhcnNlclRlc3RDYXNlIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBDaGFyVGVzdC4KLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBDaGFyVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENoYXIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygiJ2EnIiwgbmV3IENoYXJhY3RlcignYScpKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RDaGFyYWN0ZXIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IENoYXJhY3RlcignYScpIiwgbmV3IENoYXJhY3RlcignYScpKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3REb3VibGVRdW90ZSgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCInXCInIiwgbmV3IENoYXJhY3RlcignXCInKSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlUXVvdGUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygiJ1xcJyciLCBuZXcgQ2hhcmFjdGVyKCdcJycpKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RCYWNrc2xhc2goKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygiJ1xcXFwnIiwgbmV3IENoYXJhY3RlcignXFwnKSk7CQkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdENoYXJFeGNlcHRpb24oKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygiJ2FzZGYnIiwgbnVsbCwgdHJ1ZSwgdHJ1ZSk7CQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvRXhjZXB0aW9uVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9FeGNlcHRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMTIzM2QuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9FeGNlcHRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyOwotLyoKLSAqICAkUkNTZmlsZTogRXhjZXB0aW9uVGVzdC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjU4OjU0ICQgCi0gKi8KLQotLyoqCi0gKiBAYXV0aG9yIGpteWVycwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBFeGNlcHRpb25UZXN0IGV4dGVuZHMgQWJzdHJhY3RJbml0UGFyc2VyVGVzdENhc2UgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEV4Y2VwdGlvblRlc3QuCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgRXhjZXB0aW9uVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9vTWFueVBhcmFtcygpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgSW50ZWdlcihcIjMsM1wiKSIsIG51bGwsIHRydWUsIHRydWUpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFVucmVzb2x2ZWRDbGFzcygpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgQUJDRCg0KSIsIG51bGwsIHRydWUsIHRydWUpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFVucmVzb2x2ZWRNZXRob2QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygiZ2V0TWV0aG9kKCkiLG51bGwsdHJ1ZSwgdHJ1ZSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5yZXNvbHZlZExpdGVyYWwoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygidW5yZXNvbHZlZExpdGVyYWwiLG51bGwsdHJ1ZSwgdHJ1ZSk7CQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvSW5pdFBhcnNlclN1aXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL0luaXRQYXJzZXJTdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGY0ZDY2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvSW5pdFBhcnNlclN1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyOwotLyoKLSAqICAkUkNTZmlsZTogSW5pdFBhcnNlclN1aXRlLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjcgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6NTg6NTQgJCAKLSAqLwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogQGF1dGhvciBqbXllcnMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgSW5pdFBhcnNlclN1aXRlIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQotCS8vIFRlc3QgY2FzZXMgdG8gYmUgaW5jbHVkZSBpbiB0aGUgc3VpdGUKLQlwcml2YXRlIHN0YXRpYyBDbGFzcyB0ZXN0c0xpc3RbXSA9IHsKLQkJTmVlZHNDb2RpbmdUZXN0LmNsYXNzLAotCQlCbG9ja1Rlc3QuY2xhc3MsCi0JCUFycmF5Q29uc3RydWN0b3JUZXN0LmNsYXNzLAotCQlNdWx0aUFyZ1N0YXRpY01ldGhvZFRlc3QuY2xhc3MsCi0JCU11bHRpQXJnQ29uc3RydWN0b3JUZXN0LmNsYXNzLAotCQlNdWx0aUFyZ0luc3RhbmNlVGVzdC5jbGFzcywKLQkJTnVtYmVyVGVzdC5jbGFzcywKLQkJQ2FzdFRlc3QuY2xhc3MsCi0JCUV4Y2VwdGlvblRlc3QuY2xhc3MsCi0JCUxpdGVyYWxUZXN0LmNsYXNzLAotCQlTdHJpbmdUZXN0LmNsYXNzLAotCQlDaGFyVGVzdC5jbGFzcywKLQkJSkZDVGVzdC5jbGFzcywKLQkJQm9yZGVyVGVzdC5jbGFzcywKLQkJT3ZlcmxvYWRpbmdUZXN0LmNsYXNzLAotCQlTYW1lTmFtZTQ2Mzc2VGVzdC5jbGFzcwotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGtnTmFtZSA9ICJvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlciIgOwotCSAgICAKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgUGFja2FnZVN1aXRlLgotCSAqLwotCXB1YmxpYyBJbml0UGFyc2VyU3VpdGUoKSB7Ci0JCXN1cGVyKCk7Ci0JCXBvcHVsYXRlU3VpdGUoKSA7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFBhY2thZ2VTdWl0ZS4KLQkgKiBAcGFyYW0gdGhlQ2xhc3MKLQkgKi8KLQlwdWJsaWMgSW5pdFBhcnNlclN1aXRlKENsYXNzIHRoZUNsYXNzKSB7Ci0JCXN1cGVyKHRoZUNsYXNzKTsKLQkJcG9wdWxhdGVTdWl0ZSgpIDsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgUGFja2FnZVN1aXRlLgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIEluaXRQYXJzZXJTdWl0ZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQkJcG9wdWxhdGVTdWl0ZSgpIDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVTdWl0ZSAoKSB7Ci0JCWZvciAoaW50IGk9MDsgaTx0ZXN0c0xpc3QubGVuZ3RoOyBpKyspCi0JCSAgYWRkVGVzdFN1aXRlKHRlc3RzTGlzdFtpXSkgOwotCQkKLQkJQWJzdHJhY3RJbml0UGFyc2VyVGVzdENhc2UuaW5pdFN1aXRlKHRoaXMsIG5ldyBJbml0U3RyaW5nUGFyc2VyVGVzdEhlbHBlcih0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSkpOwotCX0KLSAgICAKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgSW5pdFBhcnNlclN1aXRlKCJUZXN0IGZvcjogIitwa2dOYW1lKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvSW5pdFN0cmluZ1BhcnNlclRlc3RIZWxwZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvSW5pdFN0cmluZ1BhcnNlclRlc3RIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdjNDQ3ZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL0luaXRTdHJpbmdQYXJzZXJUZXN0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlcjsKLS8qCi0gKiAgJFJDU2ZpbGU6IEluaXRTdHJpbmdQYXJzZXJUZXN0SGVscGVyLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6NTg6NTQgJCAKLSAqLwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci5Jbml0aWFsaXphdGlvblN0cmluZ0V2YWx1YXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIuSW5pdGlhbGl6YXRpb25TdHJpbmdQYXJzZXI7Ci0KLS8qKgotICogQGF1dGhvciBqbXllcnMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgSW5pdFN0cmluZ1BhcnNlclRlc3RIZWxwZXIgZXh0ZW5kcyBBYnN0cmFjdEluaXRTdHJpbmdQYXJzZXJUZXN0SGVscGVyIHsKLQotCXByaXZhdGUgZmluYWwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXI7Ci0JCi0JcHVibGljIEluaXRTdHJpbmdQYXJzZXJUZXN0SGVscGVyKCkgewotCQl0aGlzLmNsYXNzTG9hZGVyID0gbnVsbDsJCi0JfQotCQotCXB1YmxpYyBJbml0U3RyaW5nUGFyc2VyVGVzdEhlbHBlcihDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgewotCQl0aGlzLmNsYXNzTG9hZGVyID0gY2xhc3NMb2FkZXI7CQotCX0KLQkKLQkvKioKLQkgKiBUZXN0SW5pdGlhbGl6YXRpb25TdHJpbmdQYXJzZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0SW5pdFN0cmluZyhTdHJpbmcgYVN0cmluZywgT2JqZWN0IGV4cGVjdGVkUmVzdWx0LCBib29sZWFuIHRocm93c0V4Y2VwdGlvbiwgYm9vbGVhbiBlcXVhbHNPbmx5KSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJLy8gRXF1YWxzIG9ubHkgbWVhbnMgYWNjZXB0IGlmID09IG9yIGVxdWFscygpLCBkb24ndCB0cnkgdG8gZ28gb24gYW5kIHNheSBtYXliZSBlcXVhbC4KLQotCQl0cnkgewotCQkJSW5pdGlhbGl6YXRpb25TdHJpbmdQYXJzZXIgcGFyc2VyID0gSW5pdGlhbGl6YXRpb25TdHJpbmdQYXJzZXIuY3JlYXRlUGFyc2VyKGFTdHJpbmcsIGNsYXNzTG9hZGVyKTsKLQkJCU9iamVjdCByZXN1bHQgPSBwYXJzZXIuZXZhbHVhdGUoKTsKLQkJCWlmICh0aHJvd3NFeGNlcHRpb24pIHsKLQkJCQlBc3NlcnQuZmFpbCgiSXQgc2hvdWxkIG9mIHRocm93biBhbiBleGNlcHRpb24uIEluc3RlYWQgcmVzdWx0PSIgKyAocmVzdWx0ICE9IG51bGwgPyByZXN1bHQudG9TdHJpbmcoKSA6ICJudWxsIikpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAocmVzdWx0ID09IGV4cGVjdGVkUmVzdWx0KSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9IGVsc2UgaWYgKAotCQkJCQkocmVzdWx0ID09IG51bGwgJiYgZXhwZWN0ZWRSZXN1bHQgIT0gbnVsbCkgfHwgKGV4cGVjdGVkUmVzdWx0ID09IG51bGwgJiYgcmVzdWx0ICE9IG51bGwpKSB7Ci0JCQkJCQlBc3NlcnQuZmFpbCgiRXhwZWN0ZWRSZXN1bHQ9IiArIGV4cGVjdGVkUmVzdWx0ICsgIiByZXN1bHQ9IiArIHJlc3VsdCk7Ci0JCQkJfSBlbHNlIGlmIChyZXN1bHQuZXF1YWxzKGV4cGVjdGVkUmVzdWx0KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gSXQgbWF5IGJlIHRoYXQgdGhlIGVxdWFscyBleHByZXNzaW9uIGlzIGJhZC4gIElmIHNvIHVzZSB0aGUgdG9TdHJpbmcoKSB0byBkbyBhIHBhcnRpYWwgY29tcGFyaXNvbgotCQkJCQlpZiAocmVzdWx0LmdldENsYXNzKCkgPT0gZXhwZWN0ZWRSZXN1bHQuZ2V0Q2xhc3MoKSkgewotCQkJCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhleHBlY3RlZFJlc3VsdC50b1N0cmluZygpKSkgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJLy8gVGhlIHRvU3RyaW5ncyBkbyBub3QgbWF0Y2ggcGVyZmVjdGx5IGJ1dCB0aGUgY2xhc3NlcyBkby4KLQkJCQkJCQkvLyBUcnkgYW5kIHNlZSBob3cgY2xvc2UgdGhlIHR3byBzdHJpbmdzIGFyZQotCQkJCQkJCWlmICggZXhwZWN0ZWRSZXN1bHQuZ2V0Q2xhc3MoKS5pc0FycmF5KCkgJiYgcmVzdWx0LmdldENsYXNzKCkuaXNBcnJheSgpKXsKLQkJCQkJCQkJQ2xhc3MgZXhwZWN0ZWRSZXN1bHRDbGFzcyA9IGV4cGVjdGVkUmVzdWx0LmdldENsYXNzKCkuZ2V0Q29tcG9uZW50VHlwZSgpOwotCQkJCQkJCQlDbGFzcyByZXN1bHRDbGFzcyA9IHJlc3VsdC5nZXRDbGFzcygpLmdldENvbXBvbmVudFR5cGUoKTsKLQkJCQkJCQkJaW50IHJlc3VsdExlbmd0aCA9IEFycmF5LmdldExlbmd0aChyZXN1bHQpOwotCQkJCQkJCQlpbnQgZXhwZWN0ZWRMZW5ndGggPSBBcnJheS5nZXRMZW5ndGgoZXhwZWN0ZWRSZXN1bHQpOwotCQkJCQkJCQlpZiAoIGV4cGVjdGVkTGVuZ3RoID09IHJlc3VsdExlbmd0aCApewotCQkJCQkJCQkJaWYgKCByZXN1bHRDbGFzcyA9PSBleHBlY3RlZFJlc3VsdENsYXNzICkgewotCQkJCQkJCQkJCS8vIFRPRE8gU2hvdWxkIGFjdHVhbGx5IHN0ZXAgaW4gYW5kIGNoZWNrIGVhY2ggZWxlbWVudCB0b28uCi0JCQkJCQkJCQkJcmV0dXJuOwkJCQkJCQkJCQkJCQkJCQkJCQotCQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCQlBc3NlcnQuZmFpbCggYVN0cmluZwotCQkJCQkJCQkJCQkJKyAiIEV4cGVjdGVkUmVzdWx0PSIKLQkJCQkJCQkJCQkJCSsgZXhwZWN0ZWRSZXN1bHQKLQkJCQkJCQkJCQkJCSsgIiBBY3R1YWxSZXN1bHQ9IgotCQkJCQkJCQkJCQkJKyByZXN1bHQKLQkJCQkJCQkJCQkJCSsgIiBFeHBlY3RlZENsYXNzPSIKLQkJCQkJCQkJCQkJCSsgZXhwZWN0ZWRSZXN1bHQuZ2V0Q2xhc3MoKQotCQkJCQkJCQkJCQkJKyAiIEFjdHVhbENsYXNzPSIKLQkJCQkJCQkJCQkJCSsgcmVzdWx0LmdldENsYXNzKCkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJQXNzZXJ0LmZhaWwoIGFTdHJpbmcKLQkJCQkJCQkJCQkJKyAiIEV4cGVjdGVkUmVzdWx0PSIKLQkJCQkJCQkJCQkJKyBleHBlY3RlZFJlc3VsdAotCQkJCQkJCQkJCQkrICIgQWN0dWFsUmVzdWx0PSIKLQkJCQkJCQkJCQkJKyByZXN1bHQKLQkJCQkJCQkJCQkJKyAiIEV4cGVjdGVkQ2xhc3M9IgotCQkJCQkJCQkJCQkrIGV4cGVjdGVkUmVzdWx0LmdldENsYXNzKCkKLQkJCQkJCQkJCQkJKyAiIEFjdHVhbENsYXNzPSIKLQkJCQkJCQkJCQkJKyByZXN1bHQuZ2V0Q2xhc3MoKSk7CQkKLQkJCQkJCQkJfQkJCQkJCQkJCi0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJaWYgKGVxdWFsc09ubHkpCi0JCQkJCQkJCQlBc3NlcnQuZmFpbCggYVN0cmluZwotCQkJCQkJCQkJCSsgIiBFeHBlY3RlZFJlc3VsdD0iCi0JCQkJCQkJCQkJKyBleHBlY3RlZFJlc3VsdAotCQkJCQkJCQkJCSsgIiBBY3R1YWxSZXN1bHQ9IgotCQkJCQkJCQkJCSsgcmVzdWx0Ci0JCQkJCQkJCQkJKyAiIEV4cGVjdGVkQ2xhc3M9IgotCQkJCQkJCQkJCSsgZXhwZWN0ZWRSZXN1bHQuZ2V0Q2xhc3MoKQotCQkJCQkJCQkJCSsgIiBBY3R1YWxDbGFzcz0iCi0JCQkJCQkJCQkJKyByZXN1bHQuZ2V0Q2xhc3MoKSk7Ci0JCQkJCQkJCXJldHVybjsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlBc3NlcnQuZmFpbCggYVN0cmluZwotCQkJCQkJCQkrICIgRXhwZWN0ZWRSZXN1bHQ9IgotCQkJCQkJCQkrIGV4cGVjdGVkUmVzdWx0Ci0JCQkJCQkJCSsgIiBBY3R1YWxSZXN1bHQ9IgotCQkJCQkJCQkrIHJlc3VsdAotCQkJCQkJCQkrICIgRXhwZWN0ZWRDbGFzcz0iCi0JCQkJCQkJCSsgZXhwZWN0ZWRSZXN1bHQuZ2V0Q2xhc3MoKQotCQkJCQkJCQkrICIgQWN0dWFsQ2xhc3M9IgotCQkJCQkJCQkrIHJlc3VsdC5nZXRDbGFzcygpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoSW5pdGlhbGl6YXRpb25TdHJpbmdFdmFsdWF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCWlmICh0aHJvd3NFeGNlcHRpb24pIHsKLQkJCQlyZXR1cm47Ci0JCQl9IGVsc2UgewotCQkJCXRocm93IGUuZ2V0T3JpZ2luYWxFeGNlcHRpb24oKTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9KRkNUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL0pGQ1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk4M2E0Ni4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL0pGQ1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyOwotLyoKLSAqICAkUkNTZmlsZTogSkZDVGVzdC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjU4OjU0ICQgCi0gKi8KLQotLyoqCi0gKiBAYXV0aG9yIGpteWVycwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBKRkNUZXN0IGV4dGVuZHMgQWJzdHJhY3RJbml0UGFyc2VyVGVzdENhc2UgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEpGQ1Rlc3QuCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgSkZDVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGltZW5zaW9uKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBqYXZhLmF3dC5EaW1lbnNpb24oMSwxKSIsIG5ldyBqYXZhLmF3dC5EaW1lbnNpb24oMSwgMSkpOwkKLSAgICB9Ci0JcHVibGljIHZvaWQgdGVzdERpbWVuc2lvbk5lZygpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgamF2YS5hd3QuRGltZW5zaW9uKC0xLC0xKSIsIG5ldyBqYXZhLmF3dC5EaW1lbnNpb24oLTEsIC0xKSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sb3JDb25zdGFudCgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJqYXZhLmF3dC5Db2xvci5jeWFuIiwgamF2YS5hd3QuQ29sb3IuY3lhbik7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sb3JTdHJpbmcoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygiamF2YS5hd3QuQ29sb3IuY3lhbi50b1N0cmluZygpIiwgamF2YS5hd3QuQ29sb3IuY3lhbi50b1N0cmluZygpKTsgICAgCQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sb3JSR0IoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IGphdmEuYXd0LkNvbG9yKDEwLDIwLDMwKSIsIG5ldyBqYXZhLmF3dC5Db2xvcigxMCwgMjAsIDMwKSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0SW50ZWdlcigpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgSW50ZWdlcig1MCkiLCBuZXcgSW50ZWdlcig1MCkpOyAgICAJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RJbnRlZ2VyTmVnYXRpdmUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IGphdmEubGFuZy5JbnRlZ2VyKC01MCkiLCBuZXcgSW50ZWdlcigtNTApKTsgICAgCQotCX0JCi0JcHVibGljIHZvaWQgdGVzdFNob3J0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBTaG9ydCgoc2hvcnQpNTApIiwgbmV3IFNob3J0KChzaG9ydCk1MCkpOyAgICAJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RTaG9ydE5lZ2F0aXZlKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBTaG9ydCgoc2hvcnQpLTUwKSIsIG5ldyBTaG9ydCgoc2hvcnQpLTUwKSk7ICAgIAkKLQl9CQotCXB1YmxpYyB2b2lkIHRlc3RMb25nKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBMb25nKDUwTCkiLCBuZXcgTG9uZyg1MEwpKTsgICAgCQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0TG9uZ05lZ2F0aXZlKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBqYXZhLmxhbmcuTG9uZygtNTBMKSIsIG5ldyBMb25nKC01MEwpKTsgICAgCQotCX0JCi0JcHVibGljIHZvaWQgdGVzdEJ5dGUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IEJ5dGUoKGJ5dGUpMTApIiwgbmV3IEJ5dGUoKGJ5dGUpMTApKTsgICAgCQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0Qnl0ZU5lZ2F0aXZlKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBCeXRlKChieXRlKS0xMCkiLCBuZXcgQnl0ZSgoYnl0ZSktMTApKTsgICAgCQotCX0JCi0JcHVibGljIHZvaWQgdGVzdEZsb2F0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0vLwkJVE9ETyBOZWVkIHRvIGZpeCB0aGlzCi0vLwkJCUl0IGp1c3QgZG9lc24ndCB3b3JrIHcvbyBqYXZhLmxhbmcgb24gZnJvbnQuIFRoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIENvbnRydWN0b3IgZ29pbmcgY2xvc2VkIHRvbyBlYXJseSBiZWNhdXNlIG9mIHRoZScuJyBpbiAzLjUsCi0vLwkJCWJ1dCBpZiB5b3UgZml4IHRoYXQsIHRoZW4gKG5ldyBTdHJpbmcoIkZyb2ciKS5jb25jYXQoInh5eiIpKS5jb25jYXQoLi4uIGdldHMgYWxsIG1lc3NlZCB1cCBiZWNhdXNlIGl0Ci0vLwkJCXRyaWVzIHRvIHByb2Nlc3MgU3RyaW5nKCkuY29uY2F0KCkgdG9nZXRoZXIsIGFuZCBob3cgdGhhdCBzaG91bGQgd29yayBkb2Vzbid0IHdvcmsgdGhlIHdheSBpdCBkb2VzLiAJCQotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgamF2YS5sYW5nLkZsb2F0KDEwLjNGKSIsIG5ldyBGbG9hdCgxMC4zRikpOyAgICAJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3REb3VibGUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLS8vCQlUT0RPIHNhbWUgcHJvYmxlbSBhcyB0ZXN0RmxvYXQuIE5lZWQgamF2YS5sYW5nIGZvciBub3cuCQkKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IGphdmEubGFuZy5Eb3VibGUoMTAuM0QpIiwgbmV3IERvdWJsZSgxMC4zRCkpOyAgICAJCi0JfQkKLQlwdWJsaWMgdm9pZCB0ZXN0SW50ZWdlclN0cmluZygpIHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24sIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBJbnRlZ2VyKFwiNTBcIikiLCBuZXcgSW50ZWdlcigiNTAiKSk7ICAgIAkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdEZsb3dMYXlvdXQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IGphdmEuYXd0LkZsb3dMYXlvdXQoKSIsIG5ldyBqYXZhLmF3dC5GbG93TGF5b3V0KCkpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdEltYWdlSWNvbigpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgamF2YXguc3dpbmcuSW1hZ2VJY29uKCBcIkM6L1dJTk5UL1phcG90ZWMuYm1wXCIpIixuZXcgamF2YXguc3dpbmcuSW1hZ2VJY29uKCAiQzovV0lOTlQvWmFwb3RlYy5ibXAiICkpOyAgCQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVjdGFuZ2xlKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoCi0JCQkJIm5ldyBqYXZhLmF3dC5SZWN0YW5nbGUoIDEwICwgMjAgLCAzMCAsIDQwICkiLAotCQkJCW5ldyBqYXZhLmF3dC5SZWN0YW5nbGUoMTAsIDIwLCAzMCwgNDApKTsKLSAgICAJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RMb2NhbGUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IGphdmEudXRpbC5Mb2NhbGUoXCJmclwiLFwiRlJcIikiLCBuZXcgamF2YS51dGlsLkxvY2FsZSgiZnIiLCAiRlIiKSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0TG9jYWxlVmFyaWFudCgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgamF2YS51dGlsLkxvY2FsZShcImZyXCIsXCJGUlwiLFwiXCIpIiwgbmV3IGphdmEudXRpbC5Mb2NhbGUoImZyIiwgIkZSIiwgIiIpKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RMb2NhbGVFeGNlcHRpb24oKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgICAvL0xvY2FsZSBjb25zdHJ1Y3RvciBjYW5ub3QgdGFrZSBudWxsIGFzIGFyZ3VtZW50IGxpa2UgdGhpczogbmV3IEphdmEudXRpbC5Mb2NhbGUoImZyIiwgIkZSIiwgbnVsbCkKLQkJICAvL3NvIHRoaXMgaXMgZXhwZWN0ZWQgdG8gZmFpbAotCQkgIHRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBqYXZhLnV0aWwuTG9jYWxlKFwiZnJcIixcIkZSXCIsbnVsbCkiLCBudWxsLCB0cnVlLCB0cnVlKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3REaWFsb2coKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IGphdmEuYXd0LkRpYWxvZyhuZXcgamF2YS5hd3QuRnJhbWUoKSkiLCBmYWxzZSwgbmV3IGphdmEuYXd0LkRpYWxvZyhuZXcgamF2YS5hd3QuRnJhbWUoKSkpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdExlbmd0aCgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgSW50ZWdlciggNTAgKS50b1N0cmluZygpLmxlbmd0aCgpIiwgbmV3IEludGVnZXIobmV3IEludGVnZXIoIDUwICkudG9TdHJpbmcoKS5sZW5ndGgoKSkpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFNpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IGphdmEudXRpbC5BcnJheUxpc3QoKS5zaXplKCkiLCBuZXcgSW50ZWdlcihuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpLnNpemUoKSkpOwkJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RDdXJzb3IoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IGphdmEuYXd0LkN1cnNvcihqYXZhLmF3dC5DdXJzb3IuSEFORF9DVVJTT1IpIixuZXcgamF2YS5hd3QuQ3Vyc29yKGphdmEuYXd0LkN1cnNvci5IQU5EX0NVUlNPUikpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFBhbmVsKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBqYXZhLmF3dC5QYW5lbChudWxsKSIsIGZhbHNlLCBuZXcgamF2YS5hd3QuUGFuZWwobnVsbCkpOwkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvbXBsZXhGb250KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoCi0JCQkibmV3IGphdmEuYXd0LkZvbnQoXCJEaWFsb2dcIiwgamF2YS5hd3QuRm9udC5CT0xEIHwgamF2YS5hd3QuRm9udC5JVEFMSUMsIDEyKSIsCi0JCQluZXcgamF2YS5hd3QuRm9udCgiRGlhbG9nIiwgamF2YS5hd3QuRm9udC5CT0xEIHwgamF2YS5hd3QuRm9udC5JVEFMSUMsIDEyKSk7CQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEtleVN0cm9rZSgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKAotCQkJImphdmF4LnN3aW5nLktleVN0cm9rZS5nZXRLZXlTdHJva2UoamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQuVktfSCwgamF2YS5hd3QuRXZlbnQuQUxUX01BU0sgfCBqYXZhLmF3dC5FdmVudC5DVFJMX01BU0sgfCBqYXZhLmF3dC5FdmVudC5TSElGVF9NQVNLLCB0cnVlKSIsCi0JCQlqYXZheC5zd2luZy5LZXlTdHJva2UuZ2V0S2V5U3Ryb2tlKGphdmEuYXd0LmV2ZW50LktleUV2ZW50LlZLX0gsIGphdmEuYXd0LkV2ZW50LkFMVF9NQVNLIHwgamF2YS5hd3QuRXZlbnQuQ1RSTF9NQVNLIHwgamF2YS5hd3QuRXZlbnQuU0hJRlRfTUFTSywgdHJ1ZSkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvTGl0ZXJhbFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvTGl0ZXJhbFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI4YTczOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL0xpdGVyYWxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyOwotLyoKLSAqICAkUkNTZmlsZTogTGl0ZXJhbFRlc3QuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDo1ODo1NCAkIAotICovCi0KLS8qKgotICogQGF1dGhvciBqbXllcnMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgTGl0ZXJhbFRlc3QgZXh0ZW5kcyBBYnN0cmFjdEluaXRQYXJzZXJUZXN0Q2FzZSB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTGl0ZXJhbFRlc3QuCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgTGl0ZXJhbFRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmcoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygiXCJGcm9nXCIiLCAiRnJvZyIpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdE51bGwoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibnVsbCIsIG51bGwpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdEZhbHNlKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoImZhbHNlIiwgQm9vbGVhbi5GQUxTRSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0VHJ1ZSgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJ0cnVlIiwgQm9vbGVhbi5UUlVFKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RCb29sZWFuVHJ1ZSgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJCb29sZWFuLlRSVUUiLCBCb29sZWFuLlRSVUUpOwkKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL011bHRpQXJnQ29uc3RydWN0b3JUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL011bHRpQXJnQ29uc3RydWN0b3JUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1NTdmZmEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9NdWx0aUFyZ0NvbnN0cnVjdG9yVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlcjsKLS8qCi0gKiAgJFJDU2ZpbGU6IE11bHRpQXJnQ29uc3RydWN0b3JUZXN0LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjcgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6NTg6NTQgJCAKLSAqLwotCi0vKioKLSAqIEBhdXRob3Igam15ZXJzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIE11bHRpQXJnQ29uc3RydWN0b3JUZXN0IGV4dGVuZHMgQWJzdHJhY3RJbml0UGFyc2VyVGVzdENhc2UgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE11bHRpQXJnQ29uc3RydWN0b3JUZXN0LgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIE11bHRpQXJnQ29uc3RydWN0b3JUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUd29Cb29sZWFucygpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMoZmFsc2UsIGZhbHNlKSIsbmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKGZhbHNlLGZhbHNlKSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0VHdvSW50cygpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMoMTIsIDI0KSIsbmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKDEyLDI0KSk7CQkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFRocmVlRmxvYXRzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycygoZmxvYXQpMTIsKGZsb2F0KTI0LChmbG9hdCk1MCkiLG5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycygxMiwyNCw1MCkpOwkJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RUd29Eb3VibGVzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycygxMi41ZCwgMjQuNWQpIixuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMoMTIuNWQsMjQuNWQpKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RUd29TdHJpbmdzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycyhcImFcIiwgXCJiXCIpIixuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMoImEiLCJiIikpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFR3b0NvbG9ycygpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMoamF2YS5hd3QuQ29sb3IucmVkLCBqYXZhLmF3dC5Db2xvci5yZWQpIixuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMoamF2YS5hd3QuQ29sb3IucmVkLGphdmEuYXd0LkNvbG9yLnJlZCkpOwkJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RUd29OZXdDb2xvcnMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKG5ldyBqYXZhLmF3dC5Db2xvcigyNTUsMCwwKSwgbmV3IGphdmEuYXd0LkNvbG9yKDI1NSwwLDApKSIsbmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKG5ldyBqYXZhLmF3dC5Db2xvcigyNTUsMCwwKSxuZXcgamF2YS5hd3QuQ29sb3IoMjU1LDAsMCkpKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RMb3RzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycyhcInByb2Nlc3NvclwiLCAwLCBcImN1c3RvbWVyU2VhcmNoQ2xpZW50T3BcIiwgMCwgXCIyMzQzNDM0XCIsIFwiMzQ0MzIzNDIzNFwiLCBcImRlcG9zaXRSZXBGbXRcIiwgXCJkZXBvc2l0UmVwRm10XCIsIFwiXCIsIFwiXCIsIDAsIDAsIDAsIDAsIGZhbHNlLCBmYWxzZSkiLG5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycygicHJvY2Vzc29yIiwgMCwgImN1c3RvbWVyU2VhcmNoQ2xpZW50T3AiLCAwLCAiMjM0MzQzNCIsICIzNDQzMjM0MjM0IiwgImRlcG9zaXRSZXBGbXQiLCAiZGVwb3NpdFJlcEZtdCIsICIiLCAiIiwgMCwgMCwgMCwgMCwgZmFsc2UsIGZhbHNlKSk7CQotCX0KLQotLy8gVGVzdGNhc2UgZm9yIEJ1Z3ppbGxhIGJ1ZyAjNTg4NTQgLSBub3QgeWV0IGZpeGVkLgotLy8JcHVibGljIHZvaWQgdGVzdE5lc3RlZE5lc3RlZCgpIHRocm93cyBUaHJvd2FibGUgewotLy8JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycyhuZXcgamF2YS5sYW5nLlN0cmluZyhuZXcgU3RyaW5nKFwic1wiKSksIFwiYVwiKSIsbmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKG5ldyBqYXZhLmxhbmcuU3RyaW5nKG5ldyBTdHJpbmcoInMiKSksICJhIikpOwkKLS8vCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvTXVsdGlBcmdJbnN0YW5jZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvTXVsdGlBcmdJbnN0YW5jZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYwMzg0Yy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL011bHRpQXJnSW5zdGFuY2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyOwotLyoKLSAqICAkUkNTZmlsZTogTXVsdGlBcmdJbnN0YW5jZVRlc3QuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDo1ODo1NCAkIAotICovCi0KLS8qKgotICogQGF1dGhvciBqbXllcnMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgTXVsdGlBcmdJbnN0YW5jZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdEluaXRQYXJzZXJUZXN0Q2FzZSB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTXVsdGlBcmdJbnN0YW5jZVRlc3QuCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgTXVsdGlBcmdJbnN0YW5jZVRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RUd29Cb29sZWFucygpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMoKS5zZXQoZmFsc2UsIGZhbHNlKSIsbmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKCkuc2V0KGZhbHNlLGZhbHNlKSk7CQkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFR3b0ludHMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKCkuc2V0KDEyLCAyNCkiLG5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycygpLnNldCgxMiwyNCkpOwkJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RUaHJlZUZsb2F0cygpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMoKS5zZXQoKGZsb2F0KTEyLChmbG9hdCkyNCwoZmxvYXQpNTApIixuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMoKS5zZXQoMTIsMjQsNTApKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RUd29Eb3VibGVzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycygpLnNldCgxMi41ZCwgMjQuNWQpIixuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMoKS5zZXQoMTIuNWQsMjQuNWQpKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RUd29TdHJpbmdzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycygpLnNldChcImFcIiwgXCJiXCIpIixuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMoKS5zZXQoImEiLCJiIikpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFR3b0NvbG9ycygpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMoKS5zZXQoamF2YS5hd3QuQ29sb3IucmVkLCBqYXZhLmF3dC5Db2xvci5yZWQpIixuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMoKS5zZXQoamF2YS5hd3QuQ29sb3IucmVkLGphdmEuYXd0LkNvbG9yLnJlZCkpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFR3b05ld0NvbG9ycygpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMoKS5zZXQobmV3IGphdmEuYXd0LkNvbG9yKDI1NSwwLDApLCBuZXcgamF2YS5hd3QuQ29sb3IoMjU1LDAsMCkpIixuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMoKS5zZXQobmV3IGphdmEuYXd0LkNvbG9yKDI1NSwwLDApLG5ldyBqYXZhLmF3dC5Db2xvcigyNTUsMCwwKSkpOwkKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL011bHRpQXJnU3RhdGljTWV0aG9kVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9NdWx0aUFyZ1N0YXRpY01ldGhvZFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJkMmY5MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL011bHRpQXJnU3RhdGljTWV0aG9kVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlcjsKLS8qCi0gKiAgJFJDU2ZpbGU6IE11bHRpQXJnU3RhdGljTWV0aG9kVGVzdC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjU4OjU0ICQgCi0gKi8KLQotLyoqCi0gKiBAYXV0aG9yIGpteWVycwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBNdWx0aUFyZ1N0YXRpY01ldGhvZFRlc3QgZXh0ZW5kcyBBYnN0cmFjdEluaXRQYXJzZXJUZXN0Q2FzZSB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTXVsdGlBcmdTdGF0aWNNZXRob2RUZXN0LgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIE11bHRpQXJnU3RhdGljTWV0aG9kVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHdvQm9vbGVhbnMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygib3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMuZ2V0KGZhbHNlLCBmYWxzZSkiLG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzLmdldChmYWxzZSxmYWxzZSkpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFR3b0ludHMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygib3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMuZ2V0KDEyLCAyNCkiLG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzLmdldCgxMiwyNCkpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFRocmVlRmxvYXRzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzLmdldCgoZmxvYXQpMTIsKGZsb2F0KTI0LChmbG9hdCk1MCkiLG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzLmdldCgxMiwyNCw1MCkpOwkJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RUd29Eb3VibGVzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzLmdldCgxMi41ZCwgMjQuNWQpIixvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycy5nZXQoMTIuNWQsMjQuNWQpKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RUd29TdHJpbmdzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzLmdldChcImFcIiwgXCJiXCIpIixvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycy5nZXQoImEiLCJiIikpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFR3b0NvbG9ycygpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycy5nZXQoamF2YS5hd3QuQ29sb3IucmVkLCBqYXZhLmF3dC5Db2xvci5yZWQpIixvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycy5nZXQoamF2YS5hd3QuQ29sb3IucmVkLGphdmEuYXd0LkNvbG9yLnJlZCkpOwkJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RUd29OZXdDb2xvcnMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygib3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMuZ2V0KG5ldyBqYXZhLmF3dC5Db2xvcigyNTUsMCwwKSwgbmV3IGphdmEuYXd0LkNvbG9yKDI1NSwwLDApKSIsb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMuZ2V0KG5ldyBqYXZhLmF3dC5Db2xvcigyNTUsMCwwKSxuZXcgamF2YS5hd3QuQ29sb3IoMjU1LDAsMCkpKTsJCQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvTmF2aWdhdGlvblBhcmFtZXRlcnMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvTmF2aWdhdGlvblBhcmFtZXRlcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUxZTZmZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL05hdmlnYXRpb25QYXJhbWV0ZXJzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlcjsKLS8qCi0gKiAgJFJDU2ZpbGU6IE5hdmlnYXRpb25QYXJhbWV0ZXJzLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6NTg6NTQgJCAKLSAqLwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS5hd3QuKjsKLQotLyoqCi0gKiBUZXN0IGNsYXNzIGZvciB0aGUgaW5pdFN0cmltZyBwYXJzZXIgLSBUaGlzIGlzIHRoZXJlIGFmdGVyIHRoZSBTcGFuaXNoIGZvbGtzIGZvdW5kIHNvbWUgZXJyb3JzIHdpdGggaW5pdFN0cmluZ3MKLSAqIHRoYXQgc2hvd2VkIHVwIGRlZmljaWVuY2llcyB3aGVyZSB3ZSBoYWQgbWV0aG9kcyB3aXRoIG11bHRpcGxlIGFyZ3VtZW50cyBhbmQgc29tZSBvZiB0aGUgZXhwcmVzc2lvbnMgaW5zaWRlIHRoZQotICogYXJndW1lbnRzIHdlcmUgbm90IGJlaW5nIGNsb3NlZCBjb3JyZWN0bHkuICBUaGlzIGNsYXNzIGlzIGRlc2lnbmVkIHRvIGhhdmUgbG90cyBvZiBtZXRob2RzICggY29uc3RydWN0b3JzIGFuZCBzdGF0aWNzCi0gKiBhbmQgaW5zdGFuY2UgbWV0aG9kcyApIHdpdGggbXVsdGlwbGUgYXJndW1lbnQgdHlwZXMgdG8gdGVzdCB0aGVzZSBzY2VuYXJpb3MsIGFuZCBuaWNlIHRvU3RyaW5nKCkgbWV0aG9kcyBzbyB0aGF0IHdlIGNhbgotICogZ2V0IGdvb2QgaGl0IHJlc3VsdHMgb24gdGhlIHRlc3Qgc3VjY2VlZGluZyBieSBhIHBlcmZlY3QgdG9TdHJpbmcoKSBtYXRjaAotICovCi1wdWJsaWMgY2xhc3MgTmF2aWdhdGlvblBhcmFtZXRlcnMgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7Ci0JLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA1Mjg5NTMwNDkyODMzNDg0NjQwTDsKLQlwcm90ZWN0ZWQgaW50IHggPSBJbnRlZ2VyLk1JTl9WQUxVRTsKLQlwcm90ZWN0ZWQgaW50IHkgPSBJbnRlZ2VyLk1JTl9WQUxVRTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBib29sQSwgYm9vbEIsIGJvb2xDOwotCXByb3RlY3RlZCBDb2xvciBjb2xvckEsIGNvbG9yQjsKLQlwcm90ZWN0ZWQgU3RyaW5nIHN0cmluZ0EsIHN0cmluZ0IsIHN0cmluZ0M7Ci0JcHJvdGVjdGVkIGRvdWJsZSBkMSA9IERvdWJsZS5NSU5fVkFMVUU7Ci0JcHJvdGVjdGVkIGRvdWJsZSBkMiA9IERvdWJsZS5NSU5fVkFMVUU7Ci0JcHJvdGVjdGVkIGZsb2F0IGYxID0gRmxvYXQuTUlOX1ZBTFVFOwotCXByb3RlY3RlZCBmbG9hdCBmMiA9IEZsb2F0Lk1JTl9WQUxVRTsJCi0JcHJvdGVjdGVkIGZsb2F0IGYzID0gRmxvYXQuTUlOX1ZBTFVFOwkKLQlwcm90ZWN0ZWQgaW50W11bXSBmSW50QXJyYXk7CQotCXByb3RlY3RlZCBkb3VibGVbXVtdIGZEb3VibGVEb3VibGVBcnJheTsKLQlwcm90ZWN0ZWQgZG91YmxlW10gZkRvdWJsZUFycmF5OwkKLQlwcm90ZWN0ZWQgTWFwIGZFbGVtZW50czsJCi0KLS8vIFRoZSBvcmlnaW5hbCBjb25zdHJ1Y3RvciB3ZSBicm9rZSBvbiAtIGxlZnQgdGhlcmUgZm9yIHBvc3Rlcml0eQotcHVibGljIE5hdmlnYXRpb25QYXJhbWV0ZXJzKFN0cmluZyBuZXdDb250ZXh0VXNlZCwgaW50IG5ld05hdmlnYXRpb24sIFN0cmluZyBuZXdPcGVyYXRpb25OYW1lLCBpbnQgbmV3Q2hhaW5Db250ZXh0LCBTdHJpbmcgbmV3Vmlld05hbWUsIFN0cmluZyBuZXdWaWV3U291cmNlLCBTdHJpbmcgbmV3T3V0cHV0TWFwRm9ybWF0LCBTdHJpbmcgbmV3SW5wdXRNYXBGb3JtYXQsIFN0cmluZyBhLCBTdHJpbmcgYiwgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGJvb2xlYW4gdXNlUCwgYm9vbGVhbiB1c2VTKSB7Ci19Ci1wdWJsaWMgTmF2aWdhdGlvblBhcmFtZXRlcnMoKXsKLX0KLXB1YmxpYyBOYXZpZ2F0aW9uUGFyYW1ldGVycyhpbnQgeCl7Ci0JdGhpcy54ID0geDsKLQl5ID0gMTAwOwotfQotcHVibGljIE5hdmlnYXRpb25QYXJhbWV0ZXJzIHNldEVsZW1BdChPYmplY3QgYUtleSwgaW50IGFWYWx1ZSl7Ci0JaWYgKCBmRWxlbWVudHMgPT0gbnVsbCApIHsKLQkJZkVsZW1lbnRzID0gbmV3IEhhc2hNYXAoMSk7Ci0JfTsKLQlmRWxlbWVudHMucHV0KGFLZXksbmV3IEludGVnZXIoYVZhbHVlKSk7Ci0JcmV0dXJuIHRoaXM7Ci19Ci1wdWJsaWMgTmF2aWdhdGlvblBhcmFtZXRlcnMoU3RyaW5nIHN0cmluZzEsIFN0cmluZyBzdHJpbmcyLCBTdHJpbmcgc3RyaW5nMywgYm9vbGVhbiBib29sMSwgYm9vbGVhbiBib29sMiwgYm9vbGVhbiBib29sMywgaW50IHgpewotCXN0cmluZ0EgPSBzdHJpbmcxOwotCXN0cmluZ0IgPSBzdHJpbmcyOwotCXN0cmluZ0MgPSBzdHJpbmczOwotCWJvb2xBID0gYm9vbDE7Ci0JYm9vbEIgPSBib29sMjsKLQlib29sQyA9IGJvb2wzOwkKLQl0aGlzLnggPSB4OwotfQotcHVibGljIE5hdmlnYXRpb25QYXJhbWV0ZXJzKGludFtdW10gaW50QXJyYXkpewotCWZJbnRBcnJheSA9IGludEFycmF5OwotfQotcHVibGljIE5hdmlnYXRpb25QYXJhbWV0ZXJzKGRvdWJsZVtdIGRvdWJsZUFycmF5KXsKLQlmRG91YmxlQXJyYXkgPSBkb3VibGVBcnJheTsKLX0KLS8vIENvbnN0cnVjdG9ycyB3aXRoIGRpZmZlcmVudCBjb21iaW5hdGlvbnMgb2YgYXJndW1lbnRzCi1wdWJsaWMgTmF2aWdhdGlvblBhcmFtZXRlcnMoYm9vbGVhbiBhLCBib29sZWFuIGIpewotCWJvb2xBID0gYTsKLQlib29sQiA9IGI7Ci19Ci1wdWJsaWMgTmF2aWdhdGlvblBhcmFtZXRlcnMoaW50IHgsIGludCB5KXsKLQl0aGlzLnggPSB4OwotCXRoaXMueSA9IHk7Ci19Ci1wdWJsaWMgTmF2aWdhdGlvblBhcmFtZXRlcnMoZmxvYXQgZjEsIGZsb2F0IGYyLCBmbG9hdCBmMyl7Ci0JdGhpcy5mMSA9IGYxOwotCXRoaXMuZjIgPSBmMjsKLQl0aGlzLmYzID0gZjM7CQotfQotcHVibGljIE5hdmlnYXRpb25QYXJhbWV0ZXJzKGRvdWJsZVtdW10gYURvdWJsZURvdWJsZUFycmF5KXsKLQlmRG91YmxlRG91YmxlQXJyYXkgPSBhRG91YmxlRG91YmxlQXJyYXk7Ci19Ci1wdWJsaWMgTmF2aWdhdGlvblBhcmFtZXRlcnMoZG91YmxlIGQxLCBkb3VibGUgZDIpewotCXRoaXMuZDEgPSBkMTsKLQl0aGlzLmQyID0gZDI7Ci19Ci1wdWJsaWMgTmF2aWdhdGlvblBhcmFtZXRlcnMoQ29sb3IgY29sb3JBLCBDb2xvciBjb2xvckIpewotCXRoaXMuY29sb3JBID0gY29sb3JBOwotCXRoaXMuY29sb3JCID0gY29sb3JCOwotfQotcHVibGljIE5hdmlnYXRpb25QYXJhbWV0ZXJzKFN0cmluZyBzdHJpbmdBLCBTdHJpbmcgc3RyaW5nQil7Ci0JdGhpcy5zdHJpbmdBID0gc3RyaW5nQTsKLQl0aGlzLnN0cmluZ0IgPSBzdHJpbmdCOwotfQotLy8gU3RhdGljIG1ldGhvZCBjYWxscyB3aXRoIGRpZmZlcmVudCBjb21iaW5hdGlvbnMgb2YgYXJndW1lbnRzCi1wdWJsaWMgc3RhdGljIE5hdmlnYXRpb25QYXJhbWV0ZXJzIGdldChib29sZWFuIGEsIGJvb2xlYW4gYil7Ci0JcmV0dXJuIG5ldyBOYXZpZ2F0aW9uUGFyYW1ldGVycyhhLGIpOwotfQotcHVibGljIHN0YXRpYyBOYXZpZ2F0aW9uUGFyYW1ldGVycyBnZXQoaW50IHgsIGludCB5KXsKLQlyZXR1cm4gbmV3IE5hdmlnYXRpb25QYXJhbWV0ZXJzKHgseSk7Ci19Ci1wdWJsaWMgc3RhdGljIE5hdmlnYXRpb25QYXJhbWV0ZXJzIGdldChmbG9hdCBmMSwgZmxvYXQgZjIsIGZsb2F0IGYzKXsKLQlyZXR1cm4gbmV3IE5hdmlnYXRpb25QYXJhbWV0ZXJzKGYxLGYyLGYzKTsKLX0KLXB1YmxpYyBzdGF0aWMgTmF2aWdhdGlvblBhcmFtZXRlcnMgZ2V0KGRvdWJsZSBkMSwgZG91YmxlIGQyKXsKLQlyZXR1cm4gbmV3IE5hdmlnYXRpb25QYXJhbWV0ZXJzKGQxLGQyKTsKLX0KLXB1YmxpYyBzdGF0aWMgTmF2aWdhdGlvblBhcmFtZXRlcnMgZ2V0KENvbG9yIGNvbG9yQSwgQ29sb3IgY29sb3JCKXsKLQlyZXR1cm4gbmV3IE5hdmlnYXRpb25QYXJhbWV0ZXJzKGNvbG9yQSxjb2xvckIpOwotfQotcHVibGljIHN0YXRpYyBOYXZpZ2F0aW9uUGFyYW1ldGVycyBnZXQoU3RyaW5nIHN0cmluZ0EsIFN0cmluZyBzdHJpbmdCKXsKLQlyZXR1cm4gbmV3IE5hdmlnYXRpb25QYXJhbWV0ZXJzKHN0cmluZ0Esc3RyaW5nQik7Ci19Ci1wdWJsaWMgc3RhdGljIE9iamVjdCBnZXRSZXZlcnNlZChTdHJpbmcgYXJnKXsKLQkvLyBSZXR1cm4gdGhlIGFyZ3VtZW50IHJldmVyc2VkCi0JU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoYXJnLmxlbmd0aCgpKTsKLQlmb3IgKGludCBpID0gYXJnLmxlbmd0aCgpLTE7IGkgPj0gMDsgaS0tKSB7Ci0JCWJ1ZmZlci5hcHBlbmQoYXJnLmNoYXJBdChpKSk7Ci0JfQotCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLX0KLXB1YmxpYyBzdGF0aWMgQ29sb3IgZ2V0Q29sb3IoU3RyaW5nIGNvbG9yTmFtZSl7Ci0JLy8gUmV0dXJuIHRoZSBjb2xvck5hbWUgdG8gdGVzdCBjYXN0IHN0YXRlbWVudHMKLQl0cnkgewotCQlGaWVsZCBmaWVsZCA9IENvbG9yLmNsYXNzLmdldEZpZWxkKGNvbG9yTmFtZSk7Ci0JCXJldHVybiAoQ29sb3IpIGZpZWxkLmdldChDb2xvci5jbGFzcyk7Ci0JfSBjYXRjaCAoIE5vU3VjaEZpZWxkRXhjZXB0aW9uIGV4YyApIHsKLQkJdHJ5IHsKLQkJCS8vIEl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIGZpZWxkIGlzIG9uIFN5c3RlbUNvbG9yIGFuZCBub3QgY29sb3IKLQkJCUZpZWxkIGZpZWxkID0gU3lzdGVtQ29sb3IuY2xhc3MuZ2V0RmllbGQoY29sb3JOYW1lKTsKLQkJCXJldHVybiAoQ29sb3IpIGZpZWxkLmdldChDb2xvci5jbGFzcyk7CQkKLQkJfSBjYXRjaCAoIEV4Y2VwdGlvbiBlICkgewotCQl9Ci0JfSBjYXRjaCAoIEV4Y2VwdGlvbiBleGMgKSB7Ci0JfQotCXJldHVybiBudWxsOwotfQotLy8gSW5zdGFuY2UgbWV0aG9kIGNhbGxzIHdpdGggZGlmZmVyZW50IGNvbWJpbmF0aW9ucyBvZiBhcmd1bWVudHMKLXB1YmxpYyBOYXZpZ2F0aW9uUGFyYW1ldGVycyBzZXQoYm9vbGVhbiBhLCBib29sZWFuIGIpewotCWJvb2xBID0gYTsKLQlib29sQiA9IGI7Ci0JcmV0dXJuIHRoaXM7CQotfQotcHVibGljIE5hdmlnYXRpb25QYXJhbWV0ZXJzIHNldChpbnQgeCwgaW50IHkpewotCXRoaXMueCA9IHg7Ci0JdGhpcy55ID0geTsKLQlyZXR1cm4gdGhpczsJCi19Ci1wdWJsaWMgTmF2aWdhdGlvblBhcmFtZXRlcnMgc2V0KGZsb2F0IGYxLCBmbG9hdCBmMiwgZmxvYXQgZjMpewotCXRoaXMuZjEgPSBmMTsKLQl0aGlzLmYyID0gZjI7Ci0JdGhpcy5mMyA9IGYzOwotCXJldHVybiB0aGlzOwkKLX0KLXB1YmxpYyBOYXZpZ2F0aW9uUGFyYW1ldGVycyBzZXQoZG91YmxlIGQxLCBkb3VibGUgZDIpewotCXRoaXMuZDEgPSBkMTsKLQl0aGlzLmQyID0gZDI7Ci0JcmV0dXJuIHRoaXM7CQotfQotcHVibGljIE5hdmlnYXRpb25QYXJhbWV0ZXJzIHNldChDb2xvciBjb2xvckEsIENvbG9yIGNvbG9yQil7Ci0JdGhpcy5jb2xvckEgPSBjb2xvckE7Ci0JdGhpcy5jb2xvckIgPSBjb2xvckI7Ci0JcmV0dXJuIHRoaXM7Ci19Ci1wdWJsaWMgTmF2aWdhdGlvblBhcmFtZXRlcnMgc2V0KFN0cmluZyBzdHJpbmdBLCBTdHJpbmcgc3RyaW5nQil7Ci0JdGhpcy5zdHJpbmdBID0gc3RyaW5nQTsKLQl0aGlzLnN0cmluZ0IgPSBzdHJpbmdCOwotCXJldHVybiB0aGlzOwkKLX0KLS8vIFRvIHN0cmluZyBtZXRob2QgdG8gaGVscCB0aGUgdGVzdHMgYmUgT0s/IHdpdGggbWF0Y2hpbmcgdG9TdHJpbmcoKSByZXN1bHRzCi1wdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7Ci0JU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQl3cml0ZXIud3JpdGUoIk5hdmlnYXRpb25QYXJhbWV0ZXJzKCIpOwotCWlmICggeCAhPSBJbnRlZ2VyLk1JTl9WQUxVRSApIHdyaXRlci53cml0ZShuZXcgSW50ZWdlcih4KS50b1N0cmluZygpKTsKLQlpZiAoIHkgIT0gSW50ZWdlci5NSU5fVkFMVUUgKSB3cml0ZXIud3JpdGUobmV3IEludGVnZXIoeSkudG9TdHJpbmcoKSk7CQotCXdyaXRlci53cml0ZSgiYm9vbEE9IiArIGJvb2xBKTsKLQl3cml0ZXIud3JpdGUoImJvb2xBPSIgKyBib29sQik7CQotCXdyaXRlci53cml0ZSgiYm9vbEE9IiArIGJvb2xBKTsKLQl3cml0ZXIud3JpdGUoImJvb2xDPSIgKyBib29sQyk7CQkKLQlpZiAoIGNvbG9yQSAhPSBudWxsICkgd3JpdGVyLndyaXRlKCJjb2xvckE9IiArIGNvbG9yQSk7Ci0JaWYgKCBjb2xvckIgIT0gbnVsbCApIHdyaXRlci53cml0ZSgiY29sb3JCPSIgKyBjb2xvckIpOwkKLQlpZiAoIHN0cmluZ0EgIT0gbnVsbCApIHdyaXRlci53cml0ZSgic3RyaW5nQT0iICsgc3RyaW5nQSk7Ci0JaWYgKCBzdHJpbmdCICE9IG51bGwgKSB3cml0ZXIud3JpdGUoInN0cmluZ0I9IiArIHN0cmluZ0IpOwkJCi0JaWYgKCBzdHJpbmdDICE9IG51bGwgKSB3cml0ZXIud3JpdGUoInN0cmluZ0I9IiArIHN0cmluZ0MpOwotCWlmICggZDEgIT0gRG91YmxlLk1JTl9WQUxVRSApIHdyaXRlci53cml0ZSgiZDE9IiArIGQxKTsKLQlpZiAoIGQyICE9IERvdWJsZS5NSU5fVkFMVUUgKSB3cml0ZXIud3JpdGUoImQxPSIgKyBkMik7Ci0JaWYgKCBmMSAhPSBGbG9hdC5NSU5fVkFMVUUgKSB3cml0ZXIud3JpdGUoImYxPSIgKyBmMSk7Ci0JaWYgKCBmMiAhPSBGbG9hdC5NSU5fVkFMVUUgKSB3cml0ZXIud3JpdGUoImYyPSIgKyBmMik7Ci0JaWYgKCBmMiAhPSBGbG9hdC5NSU5fVkFMVUUgKSB3cml0ZXIud3JpdGUoImYzPSIgKyBmMyk7CQotCWlmICggZkludEFycmF5ICE9IG51bGwgKSB7Ci0JCXdyaXRlci53cml0ZSgiaW50IGFycmF5PSIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZJbnRBcnJheS5sZW5ndGg7IGkrKykgewotCQkJd3JpdGVyLndyaXRlKCJbIik7Ci0JCQkvLyBUaGUgZWxlbWVudHMgaW4gdGhlIGFycmF5IGFyZSB0aGVtc2VsdmVzIGFycmF5cyAtIGl0IGlzIHR3byBkaW1lbnNpb25hbAotCQkJaW50W10gZWxlbWVudHMgPSBmSW50QXJyYXlbaV07Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGVsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJd3JpdGVyLndyaXRlKG5ldyBJbnRlZ2VyKGVsZW1lbnRzW2pdKS50b1N0cmluZygpKTsJCi0JCQl9Ci0JCQl3cml0ZXIud3JpdGUoIl0iKTsKLQkJfQotCX0KLQlpZiAoIGZEb3VibGVEb3VibGVBcnJheSAhPSBudWxsICkgewotCQl3cml0ZXIud3JpdGUoImRvdWJsZWRvdWJsZSBhcnJheT0iKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmRG91YmxlRG91YmxlQXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCXdyaXRlci53cml0ZSgiWyIpOwotCQkJLy8gVGhlIGVsZW1lbnRzIGluIHRoZSBhcnJheSBhcmUgdGhlbXNlbHZlcyBhcnJheXMgLSBpdCBpcyB0d28gZGltZW5zaW9uYWwKLQkJCWRvdWJsZVtdIGVsZW1lbnRzID0gZkRvdWJsZURvdWJsZUFycmF5W2ldOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBlbGVtZW50cy5sZW5ndGg7IGorKykgewotCQkJCXdyaXRlci53cml0ZShuZXcgRG91YmxlKGVsZW1lbnRzW2pdKS50b1N0cmluZygpKTsJCi0JCQl9Ci0JCQl3cml0ZXIud3JpdGUoIl0iKTsKLQkJfQotCX0KLQkKLQlpZiAoIGZEb3VibGVBcnJheSAhPSBudWxsICkgewkKLQkJd3JpdGVyLndyaXRlKCJkb3VibGUgYXJyYXk9Iik7CQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmRG91YmxlQXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCXdyaXRlci53cml0ZSgiKCIpOwkJCQotCQkJd3JpdGVyLndyaXRlKG5ldyBEb3VibGUoZkRvdWJsZUFycmF5W2ldKS50b1N0cmluZygpKTsKLQkJCXdyaXRlci53cml0ZSgiKSIpOwkJCQotCQl9Ci0JfQotCXdyaXRlci53cml0ZSgiKSIpOwotCXJldHVybiB3cml0ZXIudG9TdHJpbmcoKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9OZWVkc0NvZGluZ1Rlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvTmVlZHNDb2RpbmdUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyZWM0NTMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9OZWVkc0NvZGluZ1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXI7Ci0vKgotICogICRSQ1NmaWxlOiBOZWVkc0NvZGluZ1Rlc3QuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNiAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDo1ODo1NCAkIAotICovCi0KLS8qKgotICogQGF1dGhvciBqbXllcnMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgTmVlZHNDb2RpbmdUZXN0IGV4dGVuZHMgQWJzdHJhY3RJbml0UGFyc2VyVGVzdENhc2UgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE5lZWRzQ29kaW5nVGVzdC4KLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBOZWVkc0NvZGluZ1Rlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQkKLQkKLQkvLyBUT0RPOiBlbmFibGUgdGhpcyB0ZXN0IHdoZW4gbWF0aCB3b3JrcwotCS8qCi0JcHVibGljIHZvaWQgdGVzdE1hdGgoKSB7Ci0JCS8vIERvaW5nIG1hdGggaXMgbm90IGNvZGVkIHlldC4gIFdlIGRvbid0IGV4cGVjdCB0byBlbmNvdW50ZXIgYW55IHN0cmluZ3MgbGlrZSB0aGlzIGFzIHBhcnQgb2YgR0EKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygiMTAgKyAyMCIsIG5ldyBJbnRlZ2VyKDEwICsgMjApKTsJCi0JfQotCSovCi0JCi0JcHVibGljIHZvaWQgdGVzdElubmVyQ2xhc3NlcygpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICAgLy8JSW5uZXIgY2xhc3NlcyBuZWVkIGNvZGluZyBidXQgd2UgaGF2ZSBhIHRlc3QgdG8gbWFrZSBzdXJlIHdlIHRocm93IGFuIGV4cGxpY2l0IGV4Y2VwdGlvbgotCQkgdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IGphdmF4LnN3aW5nLnRhYmxlLkRlZmF1bHRUYWJsZU1vZGVsKCl7fSIsbmV3IGphdmF4LnN3aW5nLnRhYmxlLkRlZmF1bHRUYWJsZU1vZGVsKCl7Ci0KLQkJCS8qKgotCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJCSAqIAotCQkJICogQHNpbmNlIDEuMS4wCi0JCQkgKi8KLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMO30sdHJ1ZSwgdHJ1ZSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFyYW1zVGhyZWVGbG9hdHMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygib3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMuZ2V0KChmbG9hdCkxMiwoZmxvYXQpMjQsKGZsb2F0KTUwKSIsb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMuZ2V0KDEyLDI0LDUwKSk7CQkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdFRocmVlRmxvYXRzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycygoZmxvYXQpMTIsKGZsb2F0KTI0LChmbG9hdCk1MCkiLG5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycygxMiwyNCw1MCkpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdE5ld1BhcmFtc1RocmVlRmxvYXRzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycygpLnNldCgoZmxvYXQpMTIsKGZsb2F0KTI0LChmbG9hdCk1MCkiLG5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycygpLnNldCgxMiwyNCw1MCkpOwkKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL051bWJlclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvTnVtYmVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODYzYjY2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvTnVtYmVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlcjsKLS8qCi0gKiAgJFJDU2ZpbGU6IE51bWJlclRlc3QuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDo1ODo1NCAkIAotICovCi0KLS8qKgotICogQGF1dGhvciBqbXllcnMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgTnVtYmVyVGVzdCBleHRlbmRzIEFic3RyYWN0SW5pdFBhcnNlclRlc3RDYXNlIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBOdW1iZXJUZXN0LgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIE51bWJlclRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludFByaW0oKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygiMTAiLCBuZXcgSW50ZWdlcigxMCkpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFNob3J0UHJpbSgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCIoc2hvcnQpMTAiLCBuZXcgU2hvcnQoKHNob3J0KTEwKSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0TmVnYXRpdmVTaG9ydFByaW0oKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygiKHNob3J0KS0xMCIsIG5ldyBTaG9ydCgoc2hvcnQpLTEwKSk7CQotCX0JCi0JcHVibGljIHZvaWQgdGVzdEJ5dGVQcmltKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIihieXRlKTEwIiwgbmV3IEJ5dGUoKGJ5dGUpMTApKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3REb3VibGVQcmltRXhwbGljaXQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygiMTBkIiwgbmV3IERvdWJsZSgxMGQpKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3ROZWdhdGl2ZURvdWJsZVByaW1FeHBsaWNpdCgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCItMTBkIiwgbmV3IERvdWJsZSgtMTBkKSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0RmxvYXRQcmltRXhwbGljaXQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygiMTBmIiwgbmV3IEZsb2F0KDEwZikpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdExvbmdQcmltRXhwbGljaXQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygiMTBsIiwgbmV3IExvbmcoMTBsKSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0RG91YmxlUHJpbUltcGxpY2l0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIjEwLjc1IiwgbmV3IERvdWJsZSgxMC43NSkpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdE5lZ2F0aXZlRG91YmxlUHJpbUltcGxpY2l0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIi0xMC43NSIsIG5ldyBEb3VibGUoLTEwLjc1KSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0U3BhY2VkRG91YmxlUHJpbUltcGxpY2l0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIiAxMC43NSAiLCBuZXcgRG91YmxlKDEwLjc1KSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0TmVnYXRpdmVEb3VibGVQcmltRXhwbGljaXQyKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIi0xMC43NWQiLCBuZXcgRG91YmxlKC0xMC43NWQpKTsJCi0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9PdmVybG9hZGluZ1Rlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvT3ZlcmxvYWRpbmdUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4M2FlNDQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9PdmVybG9hZGluZ1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXI7Ci0vKgotICogICRSQ1NmaWxlOiBPdmVybG9hZGluZ1Rlc3QuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDo1ODo1NCAkIAotICovCi0KLS8qKgotICogVGVzdCB0aGF0IGNvcnJlY3Qgb3ZlcmxvYWRlZCBtZXRob2QgaXMgY2FsbGVkLgotICogQGF1dGhvciBqbXllcnMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgT3ZlcmxvYWRpbmdUZXN0IGV4dGVuZHMgQWJzdHJhY3RJbml0UGFyc2VyVGVzdENhc2UgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE92ZXJsb2FkaW5nVGVzdC4KLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBPdmVybG9hZGluZ1Rlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE92ZXJsb2FkU3RyaW5nKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBJbnRlZ2VyKFwiM1wiKSIsIG5ldyBJbnRlZ2VyKDMpKTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdE92ZXJsb2FkU2hvcnQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IEludGVnZXIoNSkiLCBuZXcgSW50ZWdlcig1KSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9TYW1lTmFtZTQ2Mzc2VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9TYW1lTmFtZTQ2Mzc2VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2U1YTc1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvU2FtZU5hbWU0NjM3NlRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXI7Ci0vKgotICogICRSQ1NmaWxlOiBTYW1lTmFtZTQ2Mzc2VGVzdC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjU4OjU0ICQgCi0gKi8KLSAKLS8qKgotICogVGhpcyBpcyB0byB0ZXN0IGZvciBkZWZlY3QgWzQ2Mzc2XS4KLSAqIAotICogU2FtZU5hbWUgdGVzdC4gVGhpcyBpcyB0ZXN0IHdoZXJlIHlvdSBoYXZlIHRoaXM6Ci0gKiAJSW5pdFBhcnNlclRlc3Q0NjM3Ni5TYW1lTmFtZVRlc3RDbGFzcy5qYXZhCi0gKiAJSW5pdFBhcnNlclRlc3Q0NjM3Ni5qYXZhCi0gKiAKLSAqIGFuZAotICogCi0gKiAJbmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLlNhbWVOYW1lVGVzdENsYXNzLlJlYWxDbGFzcygpCi0gKiAKLSAqIEJlZm9yZSBbNDYzNzZdIHRoZSBTdGF0aWMgcGFyc2VyIHdvdWxkIGZpbmQgU2FtZU5hbWVUZXN0Q2xhc3MuamF2YSBpbnN0ZWFkIG9mIHRoZSBSZWFsQ2xhc3MgYW5kIHdvdWxkIG9mIGZhaWxlZC4KLSAqIFRvIGNvbXBpbGUgaW4gRWNsaXBzZSB3ZSBuZWVkIHRvIGhhdmUgb25lIG9mIHRoZSBjbGFzc2VzIGJlIGluIHRoZSBkZWZhdWx0IHBhY2thZ2UuIEVjbGlwc2UgY29tcGxhaW5zIGlmIHdlIGRpZG4ndC4KLSAqIEJ1dCB0aGVyZSBpcyBub3RoaW5nIHRvIHN0b3AgdGhpcyBmcm9tIGhhcHBlbmluZyB3aXRoIHBhY2thZ2VzIHRvbyBpZiB0aGV5IGFyZSBzcHJlYWQgYWNyb3NzIGNvbXBpbGUgZ3JvdXBzLiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBTYW1lTmFtZTQ2Mzc2VGVzdCBleHRlbmRzIEFic3RyYWN0SW5pdFBhcnNlclRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgU2FtZU5hbWU0NjM3NlRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQkKLQotCXB1YmxpYyB2b2lkIHRlc3Q0NjM3NigpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgaW5pdFBhcnNlclRlc3Q0NjM3Ni5TYW1lTmFtZVRlc3RDbGFzcygpIiwgbmV3IGluaXRQYXJzZXJUZXN0NDYzNzYuU2FtZU5hbWVUZXN0Q2xhc3MoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9TdHJpbmdUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL1N0cmluZ1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdiNDQ2NS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL1N0cmluZ1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXI7Ci0vKgotICogICRSQ1NmaWxlOiBTdHJpbmdUZXN0LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6NTg6NTQgJCAKLSAqLwotCi0vKioKLSAqIEBhdXRob3Igam15ZXJzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFN0cmluZ1Rlc3QgZXh0ZW5kcyBBYnN0cmFjdEluaXRQYXJzZXJUZXN0Q2FzZSB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgU3RyaW5nVGVzdC4KLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmdUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCYXNpYygpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJcIkZyb2cvMTIzXCIiLCAiRnJvZy8xMjMiKTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdEludFZhbHVlKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIlN0cmluZy52YWx1ZU9mKDEwKSIsICIxMCIpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFBhcmVucygpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJcIkZyb2coMTIzKXByaW5jZVwiIiwgIkZyb2coMTIzKXByaW5jZSIpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdERvdWJsZVF1b3RlcygpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJcIkZyb2dcXFwicHJpbmNlXFxcIjEyM1wiIiwgIkZyb2dcInByaW5jZVwiMTIzIik7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFja1NsYXNoZXMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygiXCJGcm9nXFxcXHByaW5jZVxcXFwxMjNcIiIsICJGcm9nXFxwcmluY2VcXDEyMyIpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdEJhY2tTbGFzaCgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJcIlxcXFxGcm9nXCIiLCAiXFxGcm9nIik7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nRnVuY3Rpb24oKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygiXCJGcm9nXCIubGVuZ3RoKCkiLCBuZXcgSW50ZWdlcig0KSk7CQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9BU1RBcnJheXNUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL3RyZWUvQVNUQXJyYXlzVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjVkNDkyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9BU1RBcnJheXNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBBU1RBcnJheXNUZXN0LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6NTg6NTQgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci50cmVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZS5Gb3JFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLkFycmF5Q29uc3RydWN0b3JUZXN0OwotIAotLyoqCi0gKiBUZXN0IEFycmF5cyBmb3IgQVNULgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIEFTVEFycmF5c1Rlc3QgZXh0ZW5kcyBBcnJheUNvbnN0cnVjdG9yVGVzdCB7Ci0KLQlwdWJsaWMgQVNUQXJyYXlzVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEFTVFRyZWVJbml0U3RyaW5nUGFyc2VyVGVzdEhlbHBlciBnZXRUcmVlUGFyc2VyKCkgewotCQlyZXR1cm4gKEFTVFRyZWVJbml0U3RyaW5nUGFyc2VyVGVzdEhlbHBlcikgdGVzdEhlbHBlcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVuZGVmaW5lZFNlY29uZERpbSgpIHRocm93cyBUaHJvd2FibGUgewotCQlJRXhwcmVzc2lvbiBleHAgPSBnZXRUcmVlUGFyc2VyKCkuZ2V0UmVnaXN0cnkoKS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlQXJyYXlDcmVhdGlvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCAiaW50W11bXSIsIDEpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLkFSUkFZQ1JFQVRJT05fRElNRU5TSU9OLCAzKTsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IGludFszXVtdIiwgZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFycmF5QWNjZXNzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IGdldFRyZWVQYXJzZXIoKS5nZXRSZWdpc3RyeSgpLmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVBcnJheUFjY2VzcyhGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCAxKTsKLQkJZXhwLmNyZWF0ZUFycmF5Q3JlYXRpb24oRm9yRXhwcmVzc2lvbi5BUlJBWUFDQ0VTU19BUlJBWSwgImphdmEubGFuZy5JbnRlZ2VyW10iLCAxKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5BUlJBWUNSRUFUSU9OX0RJTUVOU0lPTiwgMyk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uQVJSQVlBQ0NFU1NfSU5ERVgsIDApOwotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCIobmV3IEludGVnZXJbM10pWzBdIiwgZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpKTsgCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNdXRsdGlBcnJheUFjY2VzcygpIHRocm93cyBUaHJvd2FibGUgewotCQlJRXhwcmVzc2lvbiBleHAgPSBnZXRUcmVlUGFyc2VyKCkuZ2V0UmVnaXN0cnkoKS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlQXJyYXlBY2Nlc3MoRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgMik7Ci0JCWV4cC5jcmVhdGVBcnJheUNyZWF0aW9uKEZvckV4cHJlc3Npb24uQVJSQVlBQ0NFU1NfQVJSQVksICJpbnRbXVtdIiwgMCk7Ci0JCWV4cC5jcmVhdGVBcnJheUluaXRpYWxpemVyKDIpOwotCQlleHAuY3JlYXRlQXJyYXlJbml0aWFsaXplcigxKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5BUlJBWUlOSVRJQUxJWkVSX0VYUFJFU1NJT04sIDIpOwotCQlleHAuY3JlYXRlQXJyYXlJbml0aWFsaXplcigxKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5BUlJBWUlOSVRJQUxJWkVSX0VYUFJFU1NJT04sIDQpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLkFSUkFZQUNDRVNTX0lOREVYLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5BUlJBWUFDQ0VTU19JTkRFWCwgMCk7CQkKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygiKG5ldyBpbnRbXVtdIHt7Mn0sIHs0fX0pWzBdWzBdIiwgZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpKTsgCi0JfQkKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9BU1RGaWVsZEFjY2Vzc1Rlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9BU1RGaWVsZEFjY2Vzc1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg0ZWFkYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL3RyZWUvQVNURmllbGRBY2Nlc3NUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBBU1RGaWVsZEFjY2Vzc1Rlc3QuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDo1ODo1NCAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLnRyZWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci50cmVlLkZvckV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuQWJzdHJhY3RJbml0UGFyc2VyVGVzdENhc2U7Ci0gCi0vKioKLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBU1RGaWVsZEFjY2Vzc1Rlc3QgZXh0ZW5kcyBBYnN0cmFjdEluaXRQYXJzZXJUZXN0Q2FzZSB7Ci0KLQkvKioKLQkgKiBDcmVhdGUgd2l0aCBuYW1lLgotCSAqIEBwYXJhbSBuYW1lCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIEFTVEZpZWxkQWNjZXNzVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEFTVFRyZWVJbml0U3RyaW5nUGFyc2VyVGVzdEhlbHBlciBnZXRUcmVlUGFyc2VyKCkgewotCQlyZXR1cm4gKEFTVFRyZWVJbml0U3RyaW5nUGFyc2VyVGVzdEhlbHBlcikgdGVzdEhlbHBlcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE5vblF1YWxpZmllZEZpZWxkQWNjZXNzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCWdldFRyZWVQYXJzZXIoKS50ZXN0SW5pdFN0cmluZygiQ29sb3IucmVkIiwgbmV3IFN0cmluZ1tdIHsiamF2YS5hd3QuKiJ9LCBnZXRUcmVlUGFyc2VyKCkuZ2V0UmVnaXN0cnkoKS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpLmdldEJlYW5UeXBlUHJveHkoImphdmEuYXd0LkNvbG9yIikubmV3SW5zdGFuY2UoImphdmEuYXd0LkNvbG9yLnJlZCIpICk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RFeHByZXNzaW9uRmllbGRBY2Nlc3MoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJZ2V0VHJlZVBhcnNlcigpLnRlc3RJbml0U3RyaW5nKCIoQ29sb3IucmVkKS5yZWQiLCBuZXcgU3RyaW5nW10geyJqYXZhLmF3dC4qIn0sIGdldFRyZWVQYXJzZXIoKS5nZXRSZWdpc3RyeSgpLmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5hd3QuQ29sb3IiKS5uZXdJbnN0YW5jZSgiamF2YS5hd3QuQ29sb3IucmVkIikgKTsJLy8gU2hvdWxkIG5vdCB1c2UgdGhpcyBmb3JtLCBidXQgaXQgaXMgdmFsaWQsIHVzZSB2YWxpZCBmb3JtIGZvciBleHBlY3RlZCByZXN1bHRzIHNvIG5vIHdhcm5pbmdzLgotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkRmllbGRBY2Nlc3MoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJZ2V0VHJlZVBhcnNlcigpLnRlc3RJbml0U3RyaW5nKCJBU1ROZXN0RmllbGRBY2Nlc3NUZXN0RGF0YS5hY29sb3IucmVkIiwgbmV3IFN0cmluZ1tdIHsib3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIudHJlZS5BU1ROZXN0RmllbGRBY2Nlc3NUZXN0RGF0YSJ9LCAgZ2V0VHJlZVBhcnNlcigpLmdldFJlZ2lzdHJ5KCkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmF3dC5Db2xvciIpLm5ld0luc3RhbmNlKCJqYXZhLmF3dC5Db2xvci5yZWQiKSk7CS8vIFNob3VsZCBub3QgdXNlIHRoaXMgZm9ybSwgYnV0IGl0IGlzIHZhbGlkLCB1c2UgdmFsaWQgZm9ybSBmb3IgZXhwZWN0ZWQgcmVzdWx0cyBzbyBubyB3YXJuaW5ncy4KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkRmllbGRFeHByZXNzaW9uQWNjZXNzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCWdldFRyZWVQYXJzZXIoKS50ZXN0SW5pdFN0cmluZygibmV3IEFTVE5lc3RGaWVsZEFjY2Vzc1Rlc3REYXRhKCkuYWNvbG9yLnJlZCIsIG5ldyBTdHJpbmdbXSB7Im9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLnRyZWUuQVNUTmVzdEZpZWxkQWNjZXNzVGVzdERhdGEifSwgIGdldFRyZWVQYXJzZXIoKS5nZXRSZWdpc3RyeSgpLmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5hd3QuQ29sb3IiKS5uZXdJbnN0YW5jZSgiamF2YS5hd3QuQ29sb3IucmVkIikpOwkvLyBTaG91bGQgbm90IHVzZSB0aGlzIGZvcm0sIGJ1dCBpdCBpcyB2YWxpZCwgdXNlIHZhbGlkIGZvcm0gZm9yIGV4cGVjdGVkIHJlc3VsdHMgc28gbm8gd2FybmluZ3MuCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3ROb25zdGF0aWNGaWVsZEFjY2VzcygpIHRocm93cyBUaHJvd2FibGUgewotCQlJRXhwcmVzc2lvbiBleHAgPSBnZXRUcmVlUGFyc2VyKCkuZ2V0UmVnaXN0cnkoKS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlRmllbGRBY2Nlc3MoRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgImFyZWN0IiwgdHJ1ZSk7Ci0JCWV4cC5jcmVhdGVDbGFzc0luc3RhbmNlQ3JlYXRpb24oRm9yRXhwcmVzc2lvbi5GSUVMRF9SRUNFSVZFUiwgIm9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLnRyZWUuQVNUTmVzdEZpZWxkQWNjZXNzVGVzdERhdGEiLCAwKTsKLQkJZ2V0VHJlZVBhcnNlcigpLnRlc3RJbml0U3RyaW5nKCJuZXcgQVNUTmVzdEZpZWxkQWNjZXNzVGVzdERhdGEoKS5hcmVjdCIsIG5ldyBTdHJpbmdbXSB7Im9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLnRyZWUuQVNUTmVzdEZpZWxkQWNjZXNzVGVzdERhdGEifSwgIGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3ROb25zdGF0aWNOZXN0ZWRGaWVsZEFjY2VzcygpIHRocm93cyBUaHJvd2FibGUgewotCQlJRXhwcmVzc2lvbiBleHAgPSBnZXRUcmVlUGFyc2VyKCkuZ2V0UmVnaXN0cnkoKS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlRmllbGRBY2Nlc3MoRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgIngiLCB0cnVlKTsKLQkJZXhwLmNyZWF0ZUZpZWxkQWNjZXNzKEZvckV4cHJlc3Npb24uRklFTERfUkVDRUlWRVIsICJhcmVjdCIsIHRydWUpOwotCQlleHAuY3JlYXRlQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKEZvckV4cHJlc3Npb24uRklFTERfUkVDRUlWRVIsICJvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci50cmVlLkFTVE5lc3RGaWVsZEFjY2Vzc1Rlc3REYXRhIiwgMCk7Ci0JCWdldFRyZWVQYXJzZXIoKS50ZXN0SW5pdFN0cmluZygibmV3IEFTVE5lc3RGaWVsZEFjY2Vzc1Rlc3REYXRhKCkuYXJlY3QueCIsIG5ldyBTdHJpbmdbXSB7Im9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLnRyZWUuQVNUTmVzdEZpZWxkQWNjZXNzVGVzdERhdGEifSwgIGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKSk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci90cmVlL0FTVElubmVyQ2xhc3NBY2Nlc3NUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL3RyZWUvQVNUSW5uZXJDbGFzc0FjY2Vzc1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ1OTNkMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL3RyZWUvQVNUSW5uZXJDbGFzc0FjY2Vzc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IEFTVElubmVyQ2xhc3NBY2Nlc3NUZXN0LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6NTg6NTQgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci50cmVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZS5Gb3JFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLkFic3RyYWN0SW5pdFBhcnNlclRlc3RDYXNlOwotIAotLyoqCi0gKiBUaGlzIGlzIGZvciB0ZXN0aW5nIGlubmVyIGNsYXNzIGFjY2Vzcy4KLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgQVNUSW5uZXJDbGFzc0FjY2Vzc1Rlc3QgZXh0ZW5kcyBBYnN0cmFjdEluaXRQYXJzZXJUZXN0Q2FzZSB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3Qgd2l0aCBuYW1lLgotCSAqIEBwYXJhbSBuYW1lCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIEFTVElubmVyQ2xhc3NBY2Nlc3NUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBBU1RUcmVlSW5pdFN0cmluZ1BhcnNlclRlc3RIZWxwZXIgZ2V0VHJlZVBhcnNlcigpIHsKLQkJcmV0dXJuIChBU1RUcmVlSW5pdFN0cmluZ1BhcnNlclRlc3RIZWxwZXIpIHRlc3RIZWxwZXI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJbm5lckZpZWxkQWNjZXNzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IGdldFRyZWVQYXJzZXIoKS5nZXRSZWdpc3RyeSgpLmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVGaWVsZEFjY2VzcyhGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCAiR1JFRU4iLCB0cnVlKTsKLQkJZXhwLmNyZWF0ZVR5cGVSZWNlaXZlcigib3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIudHJlZS5Jbm5lckNsYXNzVGVzdERhdGEkSW5uZXJJbm5lckNsYXNzIik7Ci0JCWdldFRyZWVQYXJzZXIoKS50ZXN0SW5pdFN0cmluZygiSW5uZXJDbGFzc1Rlc3REYXRhLklubmVySW5uZXJDbGFzcy5HUkVFTiIsIG5ldyBTdHJpbmdbXSB7Im9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLnRyZWUuKiJ9LCBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SW5uZXJGaWVsZEFjY2VzczIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gZ2V0VHJlZVBhcnNlcigpLmdldFJlZ2lzdHJ5KCkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUZpZWxkQWNjZXNzKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sICJHUkVFTiIsIHRydWUpOwotCQlleHAuY3JlYXRlVHlwZVJlY2VpdmVyKCJvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci50cmVlLklubmVyQ2xhc3NUZXN0RGF0YSRJbm5lcklubmVyQ2xhc3MiKTsKLQkJCi0JCS8vIFRlc3Qgd2hlcmUgdGhlIGlubmVyIGNsYXNzIGlzIHRoZSB0b3AgbGV2ZWwgbGlzdGVkLgotCQlnZXRUcmVlUGFyc2VyKCkudGVzdEluaXRTdHJpbmcoIklubmVySW5uZXJDbGFzcy5HUkVFTiIsIG5ldyBTdHJpbmdbXSB7Im9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLnRyZWUuSW5uZXJDbGFzc1Rlc3REYXRhLklubmVySW5uZXJDbGFzcyJ9LCBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCkpOwotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdElubmVySW5uZXJGaWVsZEFjY2VzcygpIHRocm93cyBUaHJvd2FibGUgewotCQlJRXhwcmVzc2lvbiBleHAgPSBnZXRUcmVlUGFyc2VyKCkuZ2V0UmVnaXN0cnkoKS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlRmllbGRBY2Nlc3MoRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgIlJFRCIsIHRydWUpOwotCQlleHAuY3JlYXRlVHlwZVJlY2VpdmVyKCJvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci50cmVlLklubmVyQ2xhc3NUZXN0RGF0YSRJbm5lcklubmVyQ2xhc3MkSW5uZXJJbm5lcklubmVyQ2xhc3MiKTsKLQkJCi0JCWdldFRyZWVQYXJzZXIoKS50ZXN0SW5pdFN0cmluZygiSW5uZXJDbGFzc1Rlc3REYXRhLklubmVySW5uZXJDbGFzcy5Jbm5lcklubmVySW5uZXJDbGFzcy5SRUQiLCBuZXcgU3RyaW5nW10geyJvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci50cmVlLioifSwgZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5uZXJDbGFzc0NyZWF0aW9uKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IGdldFRyZWVQYXJzZXIoKS5nZXRSZWdpc3RyeSgpLmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVDbGFzc0luc3RhbmNlQ3JlYXRpb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgIm9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLnRyZWUuSW5uZXJDbGFzc1Rlc3REYXRhJElubmVySW5uZXJDbGFzcyIsIDApOwotCQkvLyBDcmVhdGUgc3RhdGljIGlubmVyIGNsYXNzCi0JCWdldFRyZWVQYXJzZXIoKS50ZXN0SW5pdFN0cmluZygibmV3IElubmVyQ2xhc3NUZXN0RGF0YS5Jbm5lcklubmVyQ2xhc3MoKSIsIG5ldyBTdHJpbmdbXSB7Im9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLnRyZWUuKiJ9LCBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCkpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9BU1RNaXNjVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci90cmVlL0FTVE1pc2NUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkMmFiZmQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci90cmVlL0FTVE1pc2NUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBBU1RNaXNjVGVzdC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjU4OjU0ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIudHJlZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDaGFyYWN0ZXJMaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLkFic3RyYWN0SW5pdFBhcnNlclRlc3RDYXNlOwotIAotLyoqCi0gKiBTb21lIG1pc2MuIHRlc3RzLgotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBU1RNaXNjVGVzdCBleHRlbmRzIEFic3RyYWN0SW5pdFBhcnNlclRlc3RDYXNlIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdCB3aXRoIG5hbWUuCi0JICogQHBhcmFtIG5hbWUKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgQVNUTWlzY1Rlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDaGFyTGl0ZXJhbCgpIHsKLQkJUFRDaGFyYWN0ZXJMaXRlcmFsIGNsID0gSW5zdGFudGlhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBUQ2hhcmFjdGVyTGl0ZXJhbCgpOwotCQljbC5zZXRFc2NhcGVkVmFsdWUoIlwnYVwnIik7Ci0JCWFzc2VydEVxdWFscygnYScsIGNsLmdldENoYXJWYWx1ZSgpKTsKLQkJY2wuc2V0Q2hhclZhbHVlKCdiJyk7Ci0JCWFzc2VydEVxdWFscygiXCdiXCciLCBjbC5nZXRFc2NhcGVkVmFsdWUoKSk7Ci0JCWNsLnNldEVzY2FwZWRWYWx1ZSgiXCdcXG5cJyIpOwotCQlhc3NlcnRFcXVhbHMoJ1xuJywgY2wuZ2V0Q2hhclZhbHVlKCkpOwotCQljbC5zZXRDaGFyVmFsdWUoJ1xiJyk7Ci0JCWFzc2VydEVxdWFscygiXCdcXGJcJyIsIGNsLmdldEVzY2FwZWRWYWx1ZSgpKTsKLQkJY2wuc2V0RXNjYXBlZFZhbHVlKCJcJ1xcdTAzMDBcJyIpOwotCQlhc3NlcnRFcXVhbHMoJ1x1MDMwMCcsIGNsLmdldENoYXJWYWx1ZSgpKTsKLQkJY2wuc2V0Q2hhclZhbHVlKCdcdTA0MDAnKTsKLQkJYXNzZXJ0RXF1YWxzKCJcJ1xcdTA0MDBcJyIsIGNsLmdldEVzY2FwZWRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nTGl0ZXJhbCgpIHsKLQkJUFRTdHJpbmdMaXRlcmFsIHNsID0gSW5zdGFudGlhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBUU3RyaW5nTGl0ZXJhbCgpOwotCQlzbC5zZXRFc2NhcGVkVmFsdWUoIlwiYVwiIik7Ci0JCWFzc2VydEVxdWFscygiYSIsIHNsLmdldExpdGVyYWxWYWx1ZSgpKTsKLQkJc2wuc2V0TGl0ZXJhbFZhbHVlKCJcYiIpOwotCQlhc3NlcnRFcXVhbHMoIlwiXFxiXCIiLCBzbC5nZXRFc2NhcGVkVmFsdWUoKSk7Ci0JCXNsLnNldEVzY2FwZWRWYWx1ZSgiXCJcXG5cIiIpOwotCQlhc3NlcnRFcXVhbHMoIlxuIiwgc2wuZ2V0TGl0ZXJhbFZhbHVlKCkpOwotCQlzbC5zZXRMaXRlcmFsVmFsdWUoIlxiIik7Ci0JCWFzc2VydEVxdWFscygiXCJcXGJcIiIsIHNsLmdldEVzY2FwZWRWYWx1ZSgpKTsKLQkJc2wuc2V0RXNjYXBlZFZhbHVlKCJcIlxcdTAzMDBcIiIpOwotCQlhc3NlcnRFcXVhbHMoIlx1MDMwMCIsIHNsLmdldExpdGVyYWxWYWx1ZSgpKTsKLQkJc2wuc2V0TGl0ZXJhbFZhbHVlKCJcdTA0MDAiKTsKLQkJYXNzZXJ0RXF1YWxzKCJcIlxcdTA0MDBcIiIsIHNsLmdldEVzY2FwZWRWYWx1ZSgpKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL3RyZWUvQVNUTmVzdEZpZWxkQWNjZXNzVGVzdERhdGEuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9BU1ROZXN0RmllbGRBY2Nlc3NUZXN0RGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjQ4ZTczLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9BU1ROZXN0RmllbGRBY2Nlc3NUZXN0RGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci50cmVlOwotLyoKLSAqICAkUkNTZmlsZTogQVNUTmVzdEZpZWxkQWNjZXNzVGVzdERhdGEuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDo1ODo1NCAkIAotICovCi0KLWltcG9ydCBqYXZhLmF3dC5Db2xvcjsKLWltcG9ydCBqYXZhLmF3dC5SZWN0YW5nbGU7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB1c2VkIGluIHRoZSB0ZXN0aW5nIG9mIG5lc3RlZCBmaWVsZCBhY2Nlc3MgZm9yIFBhcnNlIHRlc3RpbmcuCi0gKiBUaGlzIGlzIHdoZW4geW91IGFjY2VzcyBhIGZpZWxkLCBhbmQgdGhlbiBhY2Nlc3MgYSBmaWVsZCBvZiB0aGF0LgotICogSW4gdGhpcyBjYXNlICA8Y29kZT5BU1ROZXN0RmllbGRBY2Nlc3NUZXN0RGF0YS5hY29sb3IucmVkPC9jb2RlPgotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBU1ROZXN0RmllbGRBY2Nlc3NUZXN0RGF0YSB7Ci0JcHVibGljIHN0YXRpYyBDb2xvciBhY29sb3IgPSBDb2xvci5ncmVlbjsKLQlwdWJsaWMgUmVjdGFuZ2xlIGFyZWN0ID0gbmV3IFJlY3RhbmdsZSgxMCwyMCwzMCw0MCk7IAotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci90cmVlL0FTVE9wZXJhdGlvbnNUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL3RyZWUvQVNUT3BlcmF0aW9uc1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjAwMWQ0YS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL3RyZWUvQVNUT3BlcmF0aW9uc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IEFTVE9wZXJhdGlvbnNUZXN0LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6NTg6NTQgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci50cmVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuQWJzdHJhY3RJbml0UGFyc2VyVGVzdENhc2U7Ci0gCi0vKioKLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBU1RPcGVyYXRpb25zVGVzdCBleHRlbmRzIEFic3RyYWN0SW5pdFBhcnNlclRlc3RDYXNlIHsKLQotCS8qKgotCSAqIENyZWF0ZSB3aXRoIG5hbWUuCi0JICogQHBhcmFtIG5hbWUKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgQVNUT3BlcmF0aW9uc1Rlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByb3RlY3RlZCBBU1RUcmVlSW5pdFN0cmluZ1BhcnNlclRlc3RIZWxwZXIgZ2V0VHJlZVBhcnNlcigpIHsKLQkJcmV0dXJuIChBU1RUcmVlSW5pdFN0cmluZ1BhcnNlclRlc3RIZWxwZXIpIHRlc3RIZWxwZXI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RUd29PcGVycygpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCIzKzQiLCBnZXRUcmVlUGFyc2VyKCkuZ2V0UmVnaXN0cnkoKS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlQmVhblByb3h5V2l0aCgzKzQpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEZvdXJPcGVyc0V4dGVuZGVkKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIjMrNCs1KzYiLCBnZXRUcmVlUGFyc2VyKCkuZ2V0UmVnaXN0cnkoKS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlQmVhblByb3h5V2l0aCgzKzQrNSs2KSk7Ci0JfQkKLQotCXB1YmxpYyB2b2lkIHRlc3RNaXhlZE9wZXJzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIjMrNC01IiwgZ2V0VHJlZVBhcnNlcigpLmdldFJlZ2lzdHJ5KCkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgoMys0LTUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1peGVkT3BlcnNQcmVjZWRlbmNlKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIjYgfCAzKzQgfCA4IiwgZ2V0VHJlZVBhcnNlcigpLmdldFJlZ2lzdHJ5KCkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgoNiB8IDMrNCB8IDgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvbmRpdGlvbmFsKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoImphdmEuYXd0LkNvbG9yLnJlZCAhPSBudWxsID8gMyA6IDUiLCBnZXRUcmVlUGFyc2VyKCkuZ2V0UmVnaXN0cnkoKS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlQmVhblByb3h5V2l0aChqYXZhLmF3dC5Db2xvci5yZWQgIT0gbnVsbCA/IDMgOiA1KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluc3RhbmNlb2YoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygiamF2YS5hd3QuQ29sb3IucmVkIGluc3RhbmNlb2YgamF2YS5hd3QuQ29sb3IiLCBnZXRUcmVlUGFyc2VyKCkuZ2V0UmVnaXN0cnkoKS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlQmVhblByb3h5V2l0aCh0cnVlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFR5cGVMaXRlcmFsKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIk9iamVjdC5jbGFzcyIsIGdldFRyZWVQYXJzZXIoKS5nZXRSZWdpc3RyeSgpLmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLk9iamVjdCIpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFN0cmluZ1BsdXNPcGVyYXRpb25zKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIjMrXCJhXCIiLCBnZXRUcmVlUGFyc2VyKCkuZ2V0UmVnaXN0cnkoKS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlQmVhblByb3h5V2l0aCgzKyJhIikpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nUGx1c09wZXJhdGlvbnMxKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIlwiYVwiKzMiLCBnZXRUcmVlUGFyc2VyKCkuZ2V0UmVnaXN0cnkoKS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlQmVhblByb3h5V2l0aCgiYSIrMykpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nUGx1c0V4dGVuZGVkT3BlcmF0aW9ucygpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCIzKzQrXCJhXCIiLCBnZXRUcmVlUGFyc2VyKCkuZ2V0UmVnaXN0cnkoKS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlQmVhblByb3h5V2l0aCgzKzQrImEiKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdQbHVzRXh0ZW5kZWRPcGVyYXRpb25zMSgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCIzK1wiYVwiKzQiLCBnZXRUcmVlUGFyc2VyKCkuZ2V0UmVnaXN0cnkoKS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlQmVhblByb3h5V2l0aCgzKyJhIis0KSk7Ci0JfQotCQotCQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci90cmVlL0FTVFBhcnNlclN1aXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL3RyZWUvQVNUUGFyc2VyU3VpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMzOTA0ZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL3RyZWUvQVNUUGFyc2VyU3VpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIudHJlZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IEFTVFBhcnNlclN1aXRlLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjEyICQgICREYXRlOiAyMDA2LzA1LzE3IDIwOjEzOjU2ICQgCi0gKi8KLWltcG9ydCBqdW5pdC5leHRlbnNpb25zLlRlc3RTZXR1cDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnRlc3RzLkphdmFQcm9qZWN0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udGVzdHMuSmF2YVRlc3RzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5Qcm94eVN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLio7Ci0KLS8qKgotICogQGF1dGhvciBqbXllcnMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQVNUUGFyc2VyU3VpdGUgZXh0ZW5kcyBUZXN0U2V0dXAgewotCi0JLy8gVGVzdCBjYXNlcyB0byBiZSBpbmNsdWRlIGluIHRoZSBzdWl0ZQotCXByaXZhdGUgc3RhdGljIENsYXNzIHRlc3RzTGlzdFtdID0gewotCQlOZWVkc0NvZGluZ1Rlc3QuY2xhc3MsCi0JCUJsb2NrVGVzdC5jbGFzcywKLQkJQVNURmllbGRBY2Nlc3NUZXN0LmNsYXNzLAotCQlBU1RBcnJheXNUZXN0LmNsYXNzLAotCQlNdWx0aUFyZ1N0YXRpY01ldGhvZFRlc3QuY2xhc3MsCi0JCU11bHRpQXJnQ29uc3RydWN0b3JUZXN0LmNsYXNzLAotCQlNdWx0aUFyZ0luc3RhbmNlVGVzdC5jbGFzcywKLQkJTnVtYmVyVGVzdC5jbGFzcywKLQkJQ2FzdFRlc3QuY2xhc3MsCi0vLwkJRXhjZXB0aW9uVGVzdC5jbGFzcywJLy8gbWl4ZXMgcGFyc2UgZXJyb3Igdy9leGVjdXRpb24gZXJyb3JzLiBDYW4ndCB0ZXN0IHBhcnNlIGVycm9ycy4gTmVlZCBzcGVjaWZpYyB0ZXN0IGZvciBleGVjIGVycm9ycyBsaWtlIG1ldGhvZCBub3QgZm91bmQuCi0JCUxpdGVyYWxUZXN0LmNsYXNzLAotCQlTdHJpbmdUZXN0LmNsYXNzLAotCQlDaGFyVGVzdC5jbGFzcywKLQkJSkZDVGVzdC5jbGFzcywKLQkJQm9yZGVyVGVzdC5jbGFzcywKLQkJT3ZlcmxvYWRpbmdUZXN0LmNsYXNzLAotCQlTYW1lTmFtZTQ2Mzc2VGVzdC5jbGFzcywKLQkJQVNUT3BlcmF0aW9uc1Rlc3QuY2xhc3MsCi0JCUFTVElubmVyQ2xhc3NBY2Nlc3NUZXN0LmNsYXNzLAotCQlBU1RNaXNjVGVzdC5jbGFzcywKLQkJVGVzdENvbXBhdGlibGVNZXRob2RzLmNsYXNzLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGtnTmFtZSA9ICJvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci50cmVlIiA7Ci0JICAgIAotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBQYWNrYWdlU3VpdGUuCi0JICovCi0JcHVibGljIEFTVFBhcnNlclN1aXRlKCkgewotCQl0aGlzKCJBU1QgUGFyc2VyIFN1aXRlIik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFBhY2thZ2VTdWl0ZS4KLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBBU1RQYXJzZXJTdWl0ZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuZXcgVGVzdFN1aXRlKG5hbWUpKTsKLQkJcG9wdWxhdGVTdWl0ZSgpIDsKLQl9Ci0KLQlQcm94eUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeTsKLQkKLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVTdWl0ZSAoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IChUZXN0U3VpdGUpIGdldFRlc3QoKTsKLQkJZm9yIChpbnQgaT0wOyBpPHRlc3RzTGlzdC5sZW5ndGg7IGkrKykKLQkJICBzdWl0ZS5hZGRUZXN0U3VpdGUodGVzdHNMaXN0W2ldKSA7Ci0JCQotCQl0cnkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IEphdmFQcm9qZWN0VXRpbC5jcmVhdGVFbXB0eUphdmFQcm9qZWN0KFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKSwgbmV3IFBhdGgoQVNUX1BST0pFQ1QpLCBudWxsKTsKLQkJCUlKYXZhUHJvamVjdCBqcHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJCS8vIEFkZCBqYXZhdGVzdHMuamFyIChpLmUuIHRoaXMgcGx1Z2lucyBqYXIpIHNvIHRoYXQgdGhlIGNsYXNzZXMgd2l0aGluIHRoZSB0ZXN0cyBqYXIgYXJlIGF2YWlsYWJsZQotCQkJLy8gdG8gdGhlIGpkdCBwYXJzZXIgZm9yIHJlZmVyZW5jaW5nLgotCQkJSmF2YVByb2plY3RVdGlsLmFkZEJ1bmRsZUphclRvUGF0aChKYXZhVGVzdHNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCksICJqYXZhdGVzdHMuamFyIiwganByb2plY3QsIG51bGwpOwotCQkJCi0JCQkvLyBXZSdyZSBnb2luZyB0byB1c2UgdGhlIHJlbW90ZSBwcm94eSwgYmVjYXVzZSBpdCBpcyBlYXNpZXIgdG8gc3RhcnQgdXAsIGJ1dCB3ZSBhcmVuJ3QgcmVhbGx5IHRlc3RpbmcKLQkJCS8vIHRoZSByZW1vdGUgcHJveHkgZXhwcmVzc2lvbiBldmFsdWF0aW9uLiBXZSBhcmUgcmVhbGx5IHRlc3RpbmcgQVNULT5QYXJzZVRyZWUtPkJlYW5Qcm94eS4gSWYgYW55IGV4cHJlc3Npb24KLQkJCS8vIHR5cGUgZXJyb3JzIHNob3cgdXAgKGkuZS4gdGhlIHByb3h5IGV4cHJlc3Npb24gaXRzZWxmIGlzIG5vdCB3b3JraW5nIGNvcnJlY3RseSkuIFRoZW4gdGhhdCBzaG91bGQgYmUgZml4ZWQKLQkJCS8vIGFuZCBhIGp1bml0IHRlc3QgaW4gdGhlIHByb3h5IHN1aXRlIHNob3VsZCBiZSBjcmVhdGVkIGluc3RlYWQuCi0JCQlyZWdpc3RyeSA9IFByb3h5TGF1bmNoU3VwcG9ydC5zdGFydEltcGxlbWVudGF0aW9uKAotCQkJCQlwcm9qZWN0LAotCQkJCQkiSlVuaXQgUGFyc2UgVHJlZSBUZXN0IiwKLQkJCQkJbmV3IElDb25maWd1cmF0aW9uQ29udHJpYnV0b3JbXSB7IFByb3h5U3VpdGUuZ2V0UHJveHlTdWl0ZUNvbnRyaWJ1dG9yKCl9LAotCQkJCQluZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQotCQkJQWJzdHJhY3RJbml0UGFyc2VyVGVzdENhc2UuaW5pdFN1aXRlKHN1aXRlLCBuZXcgQVNUVHJlZUluaXRTdHJpbmdQYXJzZXJUZXN0SGVscGVyKHByb2plY3QsIHJlZ2lzdHJ5KSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJQXNzZXJ0LmFzc2VydE5vdE51bGwoZSk7Ci0JCX0KLQl9Ci0gICAgCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IEFTVFBhcnNlclN1aXRlKCJUZXN0IGZvcjogIitwa2dOYW1lKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVNUX1BST0pFQ1QgPSAiL0FTVCB0ZXN0cy8iOwotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUganVuaXQuZXh0ZW5zaW9ucy5UZXN0U2V0dXAjdGVhckRvd24oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChyZWdpc3RyeSAhPSBudWxsKSB7Ci0JCQlyZWdpc3RyeS50ZXJtaW5hdGVSZWdpc3RyeSgpOwotCQkJVGhyZWFkLnNsZWVwKDUwMDApOwkvLyBHaXZlIGl0IGZpdmUgc2Vjb25kcyB0byBSRUFMTFkgZ28gYXdheS4gVGhlcmUgaXMgYSBzbWFsbCB3aW5kb3cgYmV0d2VlbiAKLQkJCS8vIHRlcm1pbmF0ZSByZXF1ZXN0IGFuZCB0cnVlIHNodXRkb3duIG9mIHRoZSByZW1vdGUgdm0uIFdlIHJldHVybiBpbW1lZGlhdGVseSBhbmQgbGV0IGEKLQkJCS8vIGpvYiB3YWl0IGZvciB0aGUgYWN0dWFsIHRydWUgdGVybWluYXRpb24uCi0JCX0KLQkJCi0JCUphdmFQcm9qZWN0VXRpbC5kZWxldGVQcm9qZWN0KEphdmFQcm9qZWN0VXRpbC5nZXRQcm9qZWN0KEFTVF9QUk9KRUNUKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL3RyZWUvQVNUVHJlZUluaXRTdHJpbmdQYXJzZXJUZXN0SGVscGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL3RyZWUvQVNUVHJlZUluaXRTdHJpbmdQYXJzZXJUZXN0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiMjliMjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci90cmVlL0FTVFRyZWVJbml0U3RyaW5nUGFyc2VyVGVzdEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IEFTVFRyZWVJbml0U3RyaW5nUGFyc2VyVGVzdEhlbHBlci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xMiAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDo1ODo1NCAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLnRyZWU7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLklQcm9ibGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2UuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLkFic3RyYWN0SW5pdFN0cmluZ1BhcnNlclRlc3RIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC51dGlsaXR5Lio7Ci0gCi0vKioKLSAqIEluaXQgU3RyaW5nIHBhcnNlciBoZWxwZXIgZm9yIHdvcmtpbmcgd2l0aCBBU1QgdHJlZXMuCi0gKiAgCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIEFTVFRyZWVJbml0U3RyaW5nUGFyc2VyVGVzdEhlbHBlciBleHRlbmRzIEFic3RyYWN0SW5pdFN0cmluZ1BhcnNlclRlc3RIZWxwZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFTVBMQVRFX0NMQVNTID0gInB1YmxpYyBjbGFzcyBURU1QTEFURSAneydcbiAgcHVibGljIHZvaWQgdGVzdCgpICd7J1xuICAgIFN0cmluZy52YWx1ZU9mKHswfSk7XHQvLyBhIGxpbmUgY29tbWVudFxuICB9XG59IjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVNUExBVEVfQ0xBU1NfSU1QT1JUUyA9ICJ7MH1cbnB1YmxpYyBjbGFzcyBURU1QTEFURSAneydcbiAgcHVibGljIHZvaWQgdGVzdCgpICd7J1xuICAgIFN0cmluZy52YWx1ZU9mKHsxfSk7XG4gIH1cbn0iOwotCQotCXByaXZhdGUgSUphdmFQcm9qZWN0IHByb2plY3Q7Ci0JcHJpdmF0ZSBQYXJzZVRyZWVDcmVhdGlvbkZyb21BU1QgcGFyc2VyID0gbmV3IFBhcnNlVHJlZUNyZWF0aW9uRnJvbUFTVChuZXcgQVNUQm91bmRSZXNvbHZlcigpKTsKLQlwcml2YXRlIFByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5OwotCQotCXB1YmxpYyBBU1RUcmVlSW5pdFN0cmluZ1BhcnNlclRlc3RIZWxwZXIoKSB7Ci0JfQotCQotCXB1YmxpYyBBU1RUcmVlSW5pdFN0cmluZ1BhcnNlclRlc3RIZWxwZXIoSVByb2plY3QgcHJvamVjdCwgUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkpIHsKLQkJdGhpcy5wcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCQl0aGlzLnJlZ2lzdHJ5ID0gcmVnaXN0cnk7Ci0JfQotCQotCXB1YmxpYyBBU1RUcmVlSW5pdFN0cmluZ1BhcnNlclRlc3RIZWxwZXIoSVByb2plY3QgcHJvamVjdCkgewotCQl0aGlzKHByb2plY3QsIG51bGwpOwotCX0JCi0JCi0JcHVibGljIFByb3h5RmFjdG9yeVJlZ2lzdHJ5IGdldFJlZ2lzdHJ5KCkgewotCQlyZXR1cm4gcmVnaXN0cnk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLkFic3RyYWN0SW5pdFN0cmluZ1BhcnNlclRlc3RIZWxwZXIjdGVzdEluaXRTdHJpbmcoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCwgYm9vbGVhbiwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0SW5pdFN0cmluZyhTdHJpbmcgYVN0cmluZywgT2JqZWN0IGV4cGVjdGVkUmVzdWx0LCBib29sZWFuIHRocm93c0V4Y2VwdGlvbiwgYm9vbGVhbiBlcXVhbHNPbmx5KSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJU3RyaW5nIHRlc3RDbGFzcyA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFRFTVBMQVRFX0NMQVNTLCBuZXcgT2JqZWN0W10ge2FTdHJpbmd9KTsKLQkJQVNUUGFyc2VyIHBhcnNlciA9IEFTVFBhcnNlci5uZXdQYXJzZXIoQVNULkpMUzMpOwotCQlwYXJzZXIuc2V0U291cmNlKHRlc3RDbGFzcy50b0NoYXJBcnJheSgpKTsKLQkJcGFyc2VyLnNldFVuaXROYW1lKCJURU1QTEFURS5qYXZhIik7Ci0JCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCXBhcnNlci5zZXRQcm9qZWN0KHByb2plY3QpOwotCQkJcGFyc2VyLnNldFJlc29sdmVCaW5kaW5ncyh0cnVlKTsKLQkJfQotCQlDb21waWxhdGlvblVuaXQgY3UgID0gKENvbXBpbGF0aW9uVW5pdCkgcGFyc2VyLmNyZWF0ZUFTVChuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQotCQkvLyBUaGlzIGlzIHRoZSBvbmx5IG1ldGhvZCB0aGF0IGlzIGNhbGxlZCBmcm9tIGJvdGggaW5pdCBzdHJpbmcgYW5kIHBhcnNlIGFsbG9jYXRpb24uIFNvIHdlIGNhbiBiZSBhc3N1bWUgdGhhdAotCQkvLyBpdCBpcyBhIHN0cmFpZ2h0IGluaXQgc3RyaW5nLiBJbiB0aGF0IGNhc2Ugd2UgY2FuIGdvIGFoZWFkIGFuZCBkbyByZWd1bGFyIHByb3h5IGluaXQgc3RyaW5nIHBhcnNpbmcgdG8KLQkJLy8gZ2V0IGEgcHJveHkgdG8gcGFzcyBpbnRvIHRoZSBwYXJzZSB0ZXN0aW5nLgotCQlJQmVhblByb3h5IGV4cGVjdGVkUHJveHkgPSBudWxsOwotCQlpZiAoZXhwZWN0ZWRSZXN1bHQgaW5zdGFuY2VvZiBJQmVhblByb3h5KQotCQkJZXhwZWN0ZWRQcm94eSA9IChJQmVhblByb3h5KSBleHBlY3RlZFJlc3VsdDsKLQkJZWxzZSBpZiAoZXhwZWN0ZWRSZXN1bHQgIT0gbnVsbCAmJiAhdGhyb3dzRXhjZXB0aW9uICYmIHJlZ2lzdHJ5ICE9IG51bGwpIHsKLQkJCWV4cGVjdGVkUHJveHkgPSByZWdpc3RyeS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlQmVhblByb3h5RnJvbShhU3RyaW5nKTsKLQkJfQotCQl0ZXN0SW5pdFN0cmluZyhhU3RyaW5nLCBjdSwgZXhwZWN0ZWRQcm94eSwgdGhyb3dzRXhjZXB0aW9uLCBlcXVhbHNPbmx5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5pdFN0cmluZyhTdHJpbmcgYVN0cmluZywgU3RyaW5nW10gaW1wb3J0cywgSUJlYW5Qcm94eSBleHBlY3RlZFJlc3VsdCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RJbml0U3RyaW5nKGFTdHJpbmcsIGltcG9ydHMsZXhwZWN0ZWRSZXN1bHQsIGZhbHNlLCB0cnVlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEluaXRTdHJpbmcoU3RyaW5nIGFTdHJpbmcsIFN0cmluZ1tdIGltcG9ydHMsIElCZWFuUHJveHkgZXhwZWN0ZWRSZXN1bHQsIGJvb2xlYW4gdGhyb3dzRXhjZXB0aW9uLCBib29sZWFuIGVxdWFsc09ubHkpIHRocm93cyBUaHJvd2FibGUgewotCQlTdHJpbmdCdWZmZXIgaW1wb3J0TGluZXMgPSBuZXcgU3RyaW5nQnVmZmVyKDEwMCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW1wb3J0cy5sZW5ndGg7IGkrKykgewotCQkJaW1wb3J0TGluZXMuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQlpbXBvcnRMaW5lcy5hcHBlbmQoaW1wb3J0c1tpXSk7Ci0JCQlpbXBvcnRMaW5lcy5hcHBlbmQoIjtcbiIpOwotCQl9Ci0JCVN0cmluZyB0ZXN0Q2xhc3MgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChURU1QTEFURV9DTEFTU19JTVBPUlRTLCBuZXcgT2JqZWN0W10ge2ltcG9ydExpbmVzLCBhU3RyaW5nfSk7Ci0JCUFTVFBhcnNlciBwYXJzZXIgPSBBU1RQYXJzZXIubmV3UGFyc2VyKEFTVC5KTFMzKTsKLQkJcGFyc2VyLnNldFNvdXJjZSh0ZXN0Q2xhc3MudG9DaGFyQXJyYXkoKSk7Ci0JCXBhcnNlci5zZXRVbml0TmFtZSgiVEVNUExBVEUuamF2YSIpOwotCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQlwYXJzZXIuc2V0UHJvamVjdChwcm9qZWN0KTsKLQkJCXBhcnNlci5zZXRSZXNvbHZlQmluZGluZ3ModHJ1ZSk7Ci0JCX0KLQkJQ29tcGlsYXRpb25Vbml0IGN1ICA9IChDb21waWxhdGlvblVuaXQpIHBhcnNlci5jcmVhdGVBU1QobnVsbCk7Ci0JCXRlc3RJbml0U3RyaW5nKGFTdHJpbmcsIGN1LCBleHBlY3RlZFJlc3VsdCwgdGhyb3dzRXhjZXB0aW9uLCBlcXVhbHNPbmx5KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdGVzdEluaXRTdHJpbmcoCi0JCVN0cmluZyBhU3RyaW5nLAotCQlDb21waWxhdGlvblVuaXQgY3UsCi0JCUlCZWFuUHJveHkgZXhwZWN0ZWRSZXN1bHQsCi0JCWJvb2xlYW4gdGhyb3dzRXhjZXB0aW9uLAotCQlib29sZWFuIGVxdWFsc09ubHkpCi0JCXRocm93cyBUaHJvd2FibGUgewotCQlJUHJvYmxlbVtdIHByb2JsZW1zID0gY3UuZ2V0UHJvYmxlbXMoKTsKLQkJaWYgKHByb2JsZW1zLmxlbmd0aCA+IDApIHsKLQkJCWJvb2xlYW4gZXJyb3JzID0gZmFsc2U7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigxMDApOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9ibGVtcy5sZW5ndGg7IGkrKykgewotCQkJCWVycm9ycyA9IGVycm9ycyB8IHByb2JsZW1zW2ldLmlzRXJyb3IoKTsKLQkJCQlidWYuYXBwZW5kKCIgIiArIHByb2JsZW1zW2ldLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCQkvLyBJZiBvbmx5IHdhcm5pbmdzLCB0cnkgZ29pbmcgb24uIE9ubHkgZXJyb3JzIHNob3VsZCBjYXVzZSBhIGZhaWx1cmUuCi0JCQlpZiAoZXJyb3JzKQotCQkJCWlmICghdGhyb3dzRXhjZXB0aW9uKQotCQkJCQlBc3NlcnQuZmFpbCgiUHJvYmxlbXMgd2l0aCBcIiIgKyBhU3RyaW5nICsgIlwiOiAiICsgYnVmKTsKLQkJCQllbHNlCi0JCQkJCXJldHVybjsgLy8gVHJlYXQgdGhpcyBhcyBhbiBleGNlcHRpb24uCi0JCQllbHNlIHsKLQkJCQkvLyBFbHNlIGp1c3QgbG9nIHRoZSB3YXJuaW5ncy4KLQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIldhcm5pbmdzIG9jdXJyZWQgZm9yIFwiIiArIGFTdHJpbmcgKyAiXCI6IiArIGJ1Zik7Ci0JCQl9Ci0JCX0KLQotCQlUeXBlRGVjbGFyYXRpb24gdGQgPSAoVHlwZURlY2xhcmF0aW9uKSBjdS50eXBlcygpLmdldCgwKTsKLQkJRXhwcmVzc2lvblN0YXRlbWVudCBlcyA9IChFeHByZXNzaW9uU3RhdGVtZW50KSB0ZC5nZXRNZXRob2RzKClbMF0uZ2V0Qm9keSgpLnN0YXRlbWVudHMoKS5nZXQoMCk7Ci0JCU1ldGhvZEludm9jYXRpb24gbWkgPSAoTWV0aG9kSW52b2NhdGlvbikgZXMuZ2V0RXhwcmVzc2lvbigpOwotCQlvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbiBleHAgPSAob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb24pIG1pLmFyZ3VtZW50cygpLmdldCgwKTsKLQkJUFRFeHByZXNzaW9uIHBhcnNlRXhwID0gcGFyc2VyLmNyZWF0ZUV4cHJlc3Npb24oZXhwKTsKLQotCQlpZiAocmVnaXN0cnkgIT0gbnVsbCkgewotCQkJUGFyc2VUcmVlQWxsb2NhdGlvbkluc3RhbnRpYXRpb25WaXNpdG9yIHYgPSBuZXcgUGFyc2VUcmVlQWxsb2NhdGlvbkluc3RhbnRpYXRpb25WaXNpdG9yKCk7Ci0JCQl0cnkgewotCQkJCUlCZWFuUHJveHkgYmVhbiA9IHYuZ2V0QmVhblByb3h5KHBhcnNlRXhwLCByZWdpc3RyeSk7Ci0JCQkJaWYgKHRocm93c0V4Y2VwdGlvbikKLQkJCQkJQXNzZXJ0LmZhaWwoIlNob3VsZCBvZiB0aHJvd24gZXhjZXB0aW9uLiBJbnN0ZWFkIHJlc3VsdCB3YXMgXCIiICsgKGJlYW4gIT0gbnVsbCA/IGJlYW4udG9CZWFuU3RyaW5nKCkgOiBudWxsKSArICJcIiIpOwotCQkJCWlmIChiZWFuID09IGV4cGVjdGVkUmVzdWx0KQotCQkJCQlyZXR1cm47Ci0JCQkJaWYgKChiZWFuID09IG51bGwgJiYgZXhwZWN0ZWRSZXN1bHQgIT0gbnVsbCkgfHwgKGV4cGVjdGVkUmVzdWx0ID09IG51bGwgJiYgYmVhbiAhPSBudWxsKSkKLQkJCQkJQXNzZXJ0LmZhaWwoCi0JCQkJCQkiRXhwZWN0ZWRSZXN1bHQ9IgotCQkJCQkJCSsgKGV4cGVjdGVkUmVzdWx0ICE9IG51bGwgPyBleHBlY3RlZFJlc3VsdC50b0JlYW5TdHJpbmcoKSA6IG51bGwpCi0JCQkJCQkJKyAiIHJlc3VsdD0iCi0JCQkJCQkJKyAoYmVhbiAhPSBudWxsID8gYmVhbi50b0JlYW5TdHJpbmcoKSA6IG51bGwpKTsKLQkJCQlpZiAoYmVhbi5lcXVhbHMoZXhwZWN0ZWRSZXN1bHQpKQotCQkJCQlyZXR1cm47Ci0JCQkJLy8gSXQgbWF5IGJlIHRoYXQgdGhlIGVxdWFscyBleHByZXNzaW9uIGlzIGJhZC4gSWYgc28gdXNlIHRoZSB0b1N0cmluZygpIHRvIGRvCi0JCQkJLy8gYSBwYXJ0aWFsIGNvbXBhcmlzb24KLQkJCQlpZiAoYmVhbi5nZXRUeXBlUHJveHkoKSA9PSBleHBlY3RlZFJlc3VsdC5nZXRUeXBlUHJveHkoKSkgewotCQkJCQlpZiAoYmVhbi50b0JlYW5TdHJpbmcoKS5lcXVhbHMoZXhwZWN0ZWRSZXN1bHQudG9CZWFuU3RyaW5nKCkpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBUaGUgdG9TdHJpbmdzIGRvIG5vdCBtYXRjaCBwZXJmZWN0bHkgYnV0IHRoZSBjbGFzc2VzIGRvLgotCQkJCQkJLy8gVHJ5IGFuZCBzZWUgaG93IGNsb3NlIHRoZSB0d28gc3RyaW5ncyBhcmUKLQkJCQkJCWlmIChleHBlY3RlZFJlc3VsdC5nZXRUeXBlUHJveHkoKS5pc0FycmF5KCkgJiYgYmVhbi5nZXRUeXBlUHJveHkoKS5pc0FycmF5KCkpIHsKLQkJCQkJCQlJQmVhblR5cGVQcm94eSBleHBlY3RlZFJlc3VsdENsYXNzID0gKChJQXJyYXlCZWFuVHlwZVByb3h5KSBleHBlY3RlZFJlc3VsdC5nZXRUeXBlUHJveHkoKSkuZ2V0Q29tcG9uZW50VHlwZSgpOwotCQkJCQkJCUlCZWFuVHlwZVByb3h5IHJlc3VsdENsYXNzID0gKChJQXJyYXlCZWFuVHlwZVByb3h5KSBiZWFuLmdldFR5cGVQcm94eSgpKS5nZXRDb21wb25lbnRUeXBlKCk7Ci0JCQkJCQkJaW50IHJlc3VsdExlbmd0aCA9ICgoSUFycmF5QmVhblByb3h5KSBiZWFuKS5nZXRMZW5ndGgoKTsKLQkJCQkJCQlpbnQgZXhwZWN0ZWRMZW5ndGggPSAoKElBcnJheUJlYW5Qcm94eSkgZXhwZWN0ZWRSZXN1bHQpLmdldExlbmd0aCgpOwotCQkJCQkJCWlmIChleHBlY3RlZExlbmd0aCA9PSByZXN1bHRMZW5ndGgpIHsKLQkJCQkJCQkJaWYgKHJlc3VsdENsYXNzID09IGV4cGVjdGVkUmVzdWx0Q2xhc3MpIHsKLQkJCQkJCQkJCS8vIFRPRE8gU2hvdWxkIGFjdHVhbGx5IHN0ZXAgaW4gYW5kIGNoZWNrIGVhY2ggZWxlbWVudCB0b28uCi0JCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQlBc3NlcnQuZmFpbCgKLQkJCQkJCQkJCQlhU3RyaW5nCi0JCQkJCQkJCQkJCSsgIiBFeHBlY3RlZFJlc3VsdD0iCi0JCQkJCQkJCQkJCSsgZXhwZWN0ZWRSZXN1bHQudG9CZWFuU3RyaW5nKCkKLQkJCQkJCQkJCQkJKyAiIEFjdHVhbFJlc3VsdD0iCi0JCQkJCQkJCQkJCSsgYmVhbi50b0JlYW5TdHJpbmcoKQotCQkJCQkJCQkJCQkrICIgRXhwZWN0ZWRDbGFzcz0iCi0JCQkJCQkJCQkJCSsgZXhwZWN0ZWRSZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0Rm9ybWFsVHlwZU5hbWUoKQotCQkJCQkJCQkJCQkrICIgQWN0dWFsQ2xhc3M9IgotCQkJCQkJCQkJCQkrIGJlYW4uZ2V0VHlwZVByb3h5KCkuZ2V0Rm9ybWFsVHlwZU5hbWUoKSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlBc3NlcnQuZmFpbCgKLQkJCQkJCQkJCWFTdHJpbmcKLQkJCQkJCQkJCQkrICIgRXhwZWN0ZWRSZXN1bHQ9IgotCQkJCQkJCQkJCSsgZXhwZWN0ZWRSZXN1bHQudG9CZWFuU3RyaW5nKCkKLQkJCQkJCQkJCQkrICIgQWN0dWFsUmVzdWx0PSIKLQkJCQkJCQkJCQkrIGJlYW4udG9CZWFuU3RyaW5nKCkKLQkJCQkJCQkJCQkrICIgRXhwZWN0ZWRDbGFzcz0iCi0JCQkJCQkJCQkJKyBleHBlY3RlZFJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRGb3JtYWxUeXBlTmFtZSgpCi0JCQkJCQkJCQkJKyAiIEFjdHVhbENsYXNzPSIKLQkJCQkJCQkJCQkrIGJlYW4uZ2V0VHlwZVByb3h5KCkuZ2V0Rm9ybWFsVHlwZU5hbWUoKSk7Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlpZiAoZXF1YWxzT25seSkKLQkJCQkJCQkJQXNzZXJ0LmZhaWwoCi0JCQkJCQkJCQlhU3RyaW5nCi0JCQkJCQkJCQkJKyAiIEV4cGVjdGVkUmVzdWx0PSIKLQkJCQkJCQkJCQkrIGV4cGVjdGVkUmVzdWx0LnRvQmVhblN0cmluZygpCi0JCQkJCQkJCQkJKyAiIEFjdHVhbFJlc3VsdD0iCi0JCQkJCQkJCQkJKyBiZWFuLnRvQmVhblN0cmluZygpCi0JCQkJCQkJCQkJKyAiIEV4cGVjdGVkQ2xhc3M9IgotCQkJCQkJCQkJCSsgZXhwZWN0ZWRSZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0Rm9ybWFsVHlwZU5hbWUoKQotCQkJCQkJCQkJCSsgIiBBY3R1YWxDbGFzcz0iCi0JCQkJCQkJCQkJKyBiZWFuLmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkpOwotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCUFzc2VydC5mYWlsKAotCQkJCQkJYVN0cmluZwotCQkJCQkJCSsgIiBFeHBlY3RlZFJlc3VsdD0iCi0JCQkJCQkJKyBleHBlY3RlZFJlc3VsdC50b0JlYW5TdHJpbmcoKQotCQkJCQkJCSsgIiBBY3R1YWxSZXN1bHQ9IgotCQkJCQkJCSsgYmVhbi50b0JlYW5TdHJpbmcoKQotCQkJCQkJCSsgIiBFeHBlY3RlZENsYXNzPSIKLQkJCQkJCQkrIGV4cGVjdGVkUmVzdWx0LmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkKLQkJCQkJCQkrICIgQWN0dWFsQ2xhc3M9IgotCQkJCQkJCSsgYmVhbi5nZXRUeXBlUHJveHkoKS5nZXRGb3JtYWxUeXBlTmFtZSgpKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWlmICh0aHJvd3NFeGNlcHRpb24pCi0JCQkJCXJldHVybjsgLy8gVGhpcyBpcyBvaywgaXQgc2hvdWxkIG9mIHRocm93biBleGNlcHRpb24uCi0JCQkJZWxzZQotCQkJCQl0aHJvdyBlOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL3RyZWUvSW5uZXJDbGFzc1Rlc3REYXRhLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL3RyZWUvSW5uZXJDbGFzc1Rlc3REYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMTNmMmEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci90cmVlL0lubmVyQ2xhc3NUZXN0RGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogSW5uZXJDbGFzc1Rlc3REYXRhLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6NTg6NTQgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci50cmVlOwotCi1pbXBvcnQgamF2YS5hd3QuQ29sb3I7Ci0gCi0vKioKLSAqIFRoaXMgaXMgZm9yIHRlc3RpbmcgaW5uZXIgY2xhc3MgYWNjZXNzLgotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJbm5lckNsYXNzVGVzdERhdGEgewotCi0JLyoqCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBJbm5lcklubmVyQ2xhc3MgZXh0ZW5kcyBPYmplY3QgewotCQlwdWJsaWMgZmluYWwgc3RhdGljIENvbG9yIEdSRUVOID0gQ29sb3IuZ3JlZW47Ci0KLQkJLyoqCi0JCSAqIAotCQkgKiBAc2luY2UgMS4wLjAKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgY2xhc3MgSW5uZXJJbm5lcklubmVyQ2xhc3MgZXh0ZW5kcyBPYmplY3QgewotCQkJcHVibGljIGZpbmFsIHN0YXRpYyBDb2xvciBSRUQgPSBDb2xvci5yZWQ7IAotCi0JCQkvKioKLQkJCSAqIAotCQkJICogQHNpbmNlIDEuMC4wCi0JCQkgKi8KLQkJCXB1YmxpYyBjbGFzcyBJbm5lcklubmVySW5uZXJJbm5lckNsYXNzIHsKLQotCQkJCS8qIChub24tSmF2YWRvYykKLQkJCQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0JCQkJICovCi0JCQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJCQkJcmV0dXJuIHN1cGVyLmVxdWFscyhvYmopIHx8IG9iaiBpbnN0YW5jZW9mIElubmVySW5uZXJJbm5lcklubmVyQ2xhc3M7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0JCQkgKi8KLQkJCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCQkJcmV0dXJuIHN1cGVyLmVxdWFscyhvYmopIHx8IG9iaiBpbnN0YW5jZW9mIElubmVySW5uZXJJbm5lckNsYXNzOwotCQkJfQotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCQlyZXR1cm4gc3VwZXIuZXF1YWxzKG9iaikgfHwgb2JqIGluc3RhbmNlb2YgSW5uZXJJbm5lckNsYXNzOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gc3VwZXIuZXF1YWxzKG9iaikgfHwgb2JqIGluc3RhbmNlb2YgSW5uZXJDbGFzc1Rlc3REYXRhOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9UZXN0Q29tcGF0aWJsZU1ldGhvZHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9UZXN0Q29tcGF0aWJsZU1ldGhvZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQyZTVjOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL3RyZWUvVGVzdENvbXBhdGlibGVNZXRob2RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBUZXN0Q29tcGF0aWJsZU1ldGhvZHMuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMSAkICAkRGF0ZTogMjAwNi8wMy8xOSAxODoyNzoxMiAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLnRyZWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWUuRm9yRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci50cmVlLk5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLkFic3RyYWN0SW5pdFBhcnNlclRlc3RDYXNlOwotIAotCi0vKioKLSAqIAotICogQHNpbmNlIDEuMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0Q29tcGF0aWJsZU1ldGhvZHMgZXh0ZW5kcyBBYnN0cmFjdEluaXRQYXJzZXJUZXN0Q2FzZSB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmFtZQotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXB1YmxpYyBUZXN0Q29tcGF0aWJsZU1ldGhvZHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEFTVFRyZWVJbml0U3RyaW5nUGFyc2VyVGVzdEhlbHBlciBnZXRUcmVlUGFyc2VyKCkgewotCQlyZXR1cm4gKEFTVFRyZWVJbml0U3RyaW5nUGFyc2VyVGVzdEhlbHBlcikgdGVzdEhlbHBlcjsKLQl9Ci0JCi0JcHJvdGVjdGVkIElCZWFuUHJveHkgZXhlY3V0ZVFRUShJQmVhblByb3h5IGExLCBJQmVhblByb3h5IGEyKSB0aHJvd3MgVGhyb3dhYmxlUHJveHksIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlQcm94eUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSA9IGdldFRyZWVQYXJzZXIoKS5nZXRSZWdpc3RyeSgpOwotCQlJRXhwcmVzc2lvbiBleHAgPSByZWdpc3RyeS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlTWV0aG9kSW52b2NhdGlvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCAicXFxIiwgdHJ1ZSwgMik7Ci0JCWV4cC5jcmVhdGVDbGFzc0luc3RhbmNlQ3JlYXRpb24oRm9yRXhwcmVzc2lvbi5NRVRIT0RfUkVDRUlWRVIsICJvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci50cmVlLlRlc3RDb21wYXRpYmxlTWV0aG9kc0RhdGExIiwgMCk7Ci0JCWV4cC5jcmVhdGVQcm94eUV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5NRVRIT0RfQVJHVU1FTlQsIGExKTsKLQkJZXhwLmNyZWF0ZVByb3h5RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLk1FVEhPRF9BUkdVTUVOVCwgYTIpOwotCQlyZXR1cm4gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QW1iaWd1b3VzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCVByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gZ2V0VHJlZVBhcnNlcigpLmdldFJlZ2lzdHJ5KCk7Ci0JCXRyeSB7Ci0JCQlleGVjdXRlUVFRKHJlZ2lzdHJ5LmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlXaXRoKG5ldyBJbnRlZ2VyKDEpKSwgcmVnaXN0cnkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgoCi0JCQkJCW5ldyBJbnRlZ2VyKDEpKSk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCWlmIChlLmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkuZXF1YWxzKCJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLkFtYmlndW91c01ldGhvZEV4Y2VwdGlvbiIpKQotCQkJCXJldHVybjsJLy8gVGhpcyBpcyBnb29kLgotCQkJdGhyb3cgZTsKLQkJfQkJCi0JCWZhaWwoIlNob3VsZCBvZiB0aHJvd24gYW1iaXF1b3VzLiIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RXhhY3RNYXRjaCgpIHRocm93cyBUaHJvd2FibGUgewotCQlQcm94eUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSA9IGdldFRyZWVQYXJzZXIoKS5nZXRSZWdpc3RyeSgpOwotCQlJSW50ZWdlckJlYW5Qcm94eSByZXN1bHQgPSAoSUludGVnZXJCZWFuUHJveHkpIGV4ZWN1dGVRUVEocmVnaXN0cnkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgobmV3IEludGVnZXIoMSkpLCByZWdpc3RyeS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlQmVhblByb3h5RnJvbSgibmV3IE9iamVjdCgpIikpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzdWx0LmludFZhbHVlKCkpOwotCQkKLQkJcmVzdWx0ID0gKElJbnRlZ2VyQmVhblByb3h5KSBleGVjdXRlUVFRKHJlZ2lzdHJ5LmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlGcm9tKCJuZXcgT2JqZWN0KCkiKSwgcmVnaXN0cnkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eUZyb20oIm5ldyBPYmplY3QoKSIpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc3VsdC5pbnRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvbXBhdGlibGVNYXRjaCgpIHRocm93cyBUaHJvd2FibGUgewotCQlQcm94eUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSA9IGdldFRyZWVQYXJzZXIoKS5nZXRSZWdpc3RyeSgpOwotCQlJSW50ZWdlckJlYW5Qcm94eSByZXN1bHQgPSAoSUludGVnZXJCZWFuUHJveHkpIGV4ZWN1dGVRUVEocmVnaXN0cnkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgobmV3IEZsb2F0KDEpKSwgcmVnaXN0cnkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgobmV3IEludGVnZXIoMSkpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc3VsdC5pbnRWYWx1ZSgpKTsKLQotCQlyZXN1bHQgPSAoSUludGVnZXJCZWFuUHJveHkpIGV4ZWN1dGVRUVEocmVnaXN0cnkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgobmV3IEZsb2F0KDEpKSwgcmVnaXN0cnkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eUZyb20oIm5ldyBPYmplY3QoKSIpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc3VsdC5pbnRWYWx1ZSgpKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL3RyZWUvVGVzdENvbXBhdGlibGVNZXRob2RzRGF0YS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci90cmVlL1Rlc3RDb21wYXRpYmxlTWV0aG9kc0RhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNhNTJmZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL3RyZWUvVGVzdENvbXBhdGlibGVNZXRob2RzRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogVGVzdENvbXBhdGlibGVNZXRob2RzRGF0YS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xICQgICREYXRlOiAyMDA2LzAzLzE5IDE4OjI3OjEyICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIudHJlZTsKLSAKLQotLyoqCi0gKiBVc2VkIHRvIHRlc3QgY29tcGF0aWJsZSBtZXRob2RzIHNlYXJjaGluZy4KLSAqIEBzaW5jZSAxLjIuMAotICovCi1wdWJsaWMgY2xhc3MgVGVzdENvbXBhdGlibGVNZXRob2RzRGF0YSB7Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0KCkgewotCQlxcXEobmV3IEludGVnZXIoMSksIG5ldyBPYmplY3QoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBpbnQgcXFxKE9iamVjdCBvLCBPYmplY3QgbzEpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCQotCXByaXZhdGUgaW50IHFxcShJbnRlZ2VyIGksIE9iamVjdCBvKSB7Ci0JCXJldHVybiAtMTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL3RyZWUvVGVzdENvbXBhdGlibGVNZXRob2RzRGF0YTEuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9UZXN0Q29tcGF0aWJsZU1ldGhvZHNEYXRhMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDhlNDg5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9UZXN0Q29tcGF0aWJsZU1ldGhvZHNEYXRhMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogVGVzdENvbXBhdGlibGVNZXRob2RzRGF0YTEuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMSAkICAkRGF0ZTogMjAwNi8wMy8xOSAxODoyNzoxMiAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLnRyZWU7Ci0KLSAKLQotLyoqCi0gKiBVc2VkIGZvciB0ZXN0aW5nIG1vc3QgY29tcGF0aWJsZSBwcm90ZWN0ZWQgbWV0aG9kcwotICogQHNpbmNlIDEuMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0Q29tcGF0aWJsZU1ldGhvZHNEYXRhMSBleHRlbmRzIFRlc3RDb21wYXRpYmxlTWV0aG9kc0RhdGEgewotCi0JcHJvdGVjdGVkIGludCBxcXEoTnVtYmVyIG4sIEludGVnZXIgaTEpIHsKLQkJcmV0dXJuIDE7Ci0JfQotCQotCXByb3RlY3RlZCBpbnQgcXFxKEludGVnZXIgaSwgT2JqZWN0IG8xKSB7Ci0JCXJldHVybiAyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvcmVtb3RlL1JlbW90ZVByb3h5U3VpdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L3JlbW90ZS9SZW1vdGVQcm94eVN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2ZTgwNTguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvcmVtb3RlL1JlbW90ZVByb3h5U3VpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFJlbW90ZVByb3h5U3VpdGUuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMTAgJCAgJERhdGU6IDIwMDYvMDUvMTcgMjA6MTM6NTYgJCAKLSAqLwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IGp1bml0LmV4dGVuc2lvbnMuVGVzdFNldHVwOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnRlc3RzLkphdmFQcm9qZWN0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udGVzdHMuSmF2YVRlc3RzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5BYnN0cmFjdFRlc3RQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuUHJveHlTdWl0ZTsKLQotLyoqCi0gKiBAYXV0aG9yIHJpY2hrdWxwCi0gKgotICogVGhpcyBpcyB0aGUgdHJ1ZSB0ZXN0IHN1aXRlIGZvciBSZW1vdGUgUHJveHkgVGVzdGluZy4gVGhlIFJlbW90ZVByb3h5VGVzdCB3aWxsIHVzZSB0aGlzLgotICovCi1wdWJsaWMgY2xhc3MgUmVtb3RlUHJveHlTdWl0ZSBleHRlbmRzIFRlc3RTZXR1cCB7Ci0KLQkvLyBUZXN0IGNhc2VzIHRvIGJlIGluY2x1ZGUgaW4gdGhlIHN1aXRlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3MgdGVzdHNMaXN0W10gPSB7IFByb3h5U3VpdGUuY2xhc3MsIFRlc3RQcm9qZWN0QWNjZXNzLmNsYXNzLCB9OwotCi0JcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0OyAvLyBUaGUgcHJvamVjdCB0byBzdGFydCB0aGUgcHJveHkgZmFjdG9yeSBvbi4JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQlwcml2YXRlIEFic3RyYWN0VGVzdFByb3h5LlJlZ2lzdHJ5SGFuZGxlciByZWdpc3RyeUhhbmRsZXIgPSBuZXcgQWJzdHJhY3RUZXN0UHJveHkuUmVnaXN0cnlIYW5kbGVyKCkgewotCQlwcml2YXRlIFByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5OwotCi0JCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7Ci0JCQlyZXR1cm4gcHJvamVjdCAhPSBudWxsOwotCQl9Ci0JCXB1YmxpYyBQcm94eUZhY3RvcnlSZWdpc3RyeSBnZXRSZWdpc3RyeSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCWlmIChyZWdpc3RyeSA9PSBudWxsKSB7Ci0JCQkJcmVnaXN0cnkgPQotCQkJCQlQcm94eUxhdW5jaFN1cHBvcnQuc3RhcnRJbXBsZW1lbnRhdGlvbigKLQkJCQkJCXByb2plY3QsCi0JCQkJCQkiSlVuaXQgUmVtb3RlIFByb3h5IFRlc3QiLAotCQkJCQkJbmV3IElDb25maWd1cmF0aW9uQ29udHJpYnV0b3JbXSB7IFByb3h5U3VpdGUuZ2V0UHJveHlTdWl0ZUNvbnRyaWJ1dG9yKCl9LAotCQkJCQkJbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVnaXN0cnk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkZXN0cm95UmVnaXN0cnkoKSB7Ci0JCQlpZiAocmVnaXN0cnkgIT0gbnVsbCkgewotCQkJCXJlZ2lzdHJ5LnRlcm1pbmF0ZVJlZ2lzdHJ5KCk7Ci0JCQkJcmVnaXN0cnkgPSBudWxsOwotCQkJfQotCQl9Ci0JfTsKLQotCXB1YmxpYyBSZW1vdGVQcm94eVN1aXRlKCkgewotCQl0aGlzKCJUZXN0IFJlbW90ZSBQcm94eSBTdWl0ZSIpOwotCX0KLQotCXB1YmxpYyBSZW1vdGVQcm94eVN1aXRlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5ldyBUZXN0U3VpdGUobmFtZSkgewotCQkJewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGVzdHNMaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJCS8vIFdlIG1heSBnZXQgc29tZSB0ZXN0cyBhbmQgc3VpdGVzLgotCQkJCQlpZiAoVGVzdFN1aXRlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odGVzdHNMaXN0W2ldKSB8fCBUZXN0U2V0dXAuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0ZXN0c0xpc3RbaV0pKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCVRlc3QgdHMgPSAoVGVzdCkgdGVzdHNMaXN0W2ldLm5ld0luc3RhbmNlKCk7Ci0JCQkJCQkJYWRkVGVzdCh0cyk7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZQotCQkJCQkJYWRkVGVzdFN1aXRlKHRlc3RzTGlzdFtpXSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlBYnN0cmFjdFRlc3RQcm94eS5pbml0UmVnaXN0cnlIYW5kbGVyKChUZXN0U3VpdGUpIHRoaXMuZ2V0VGVzdCgpLCByZWdpc3RyeUhhbmRsZXIpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBSZW1vdGVQcm94eVN1aXRlKCk7Ci0JfQotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRFU1RfUFJPSkVDVF9OQU1FID0gIlRlc3QgUmVtb3RlIFByb3h5IjsKLQlwcml2YXRlIGJvb2xlYW4gb2xkQXV0b0J1aWxkaW5nU3RhdGU7IC8vIGF1dG9CdWlsZGluZyBzdGF0ZSBiZWZvcmUgd2Ugc3RhcnRlZC4KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tIEluaXRpYWxpemluZyB0aGUgUHJveHkgUmVtb3RlIHRlc3QgZGF0YSAtLSIpOyAvLyROT04tTkxTLTEkCi0JCW9sZEF1dG9CdWlsZGluZ1N0YXRlID0gSmF2YVByb2plY3RVdGlsLnNldEF1dG9CdWlsZCh0cnVlKTsKLQkJU3RyaW5nIHppcFBhdGggPQotCQkJRmlsZUxvY2F0b3IudG9GaWxlVVJMKG5ldyBVUkwoSmF2YVRlc3RzUGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCIvIiksICJ0ZXN0ZGF0YS90ZXN0cmVtb3RlcHJvamVjdC56aXAiKSkKLQkJCQkuZ2V0RmlsZSgpOwotCQlJUHJvamVjdFtdIHByb2plY3RzID0gSmF2YVByb2plY3RVdGlsLmltcG9ydFByb2plY3RzKG5ldyBTdHJpbmdbXSB7IFRFU1RfUFJPSkVDVF9OQU1FIH0sIG5ldyBTdHJpbmdbXSB7IHppcFBhdGggfSk7Ci0JCWFzc2VydE5vdE51bGwocHJvamVjdHNbMF0pOwotCQlKYXZhUHJvamVjdFV0aWwud2FpdEZvckF1dG9CdWlsZCgpOwkJCi0JCXByb2plY3QgPSBwcm9qZWN0c1swXTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCItLSBEYXRhIGluaXRpYWxpemVkIC0tIik7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJlZ2lzdHJ5SGFuZGxlci5kZXN0cm95UmVnaXN0cnkoKTsKLQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJcHJvamVjdC5kZWxldGUodHJ1ZSwgZmFsc2UsIG51bGwpOyAvLyBHZXQgcmlkIG9mIHRoZSBwcm9qZWN0IGFuZCB0aGUgZmlsZXMgdGhlbXNlbHZlcy4KLQkJCXByb2plY3QgPSBudWxsOwotCQl9Ci0JCUphdmFQcm9qZWN0VXRpbC5zZXRBdXRvQnVpbGQob2xkQXV0b0J1aWxkaW5nU3RhdGUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvcmVtb3RlL1Rlc3RQcm9qZWN0QWNjZXNzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9yZW1vdGUvVGVzdFByb2plY3RBY2Nlc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDEzYzFmYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9yZW1vdGUvVGVzdFByb2plY3RBY2Nlc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFRlc3RQcm9qZWN0QWNjZXNzLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6NTg6NTUgJCAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuQWJzdHJhY3RUZXN0UHJveHk7Ci0KLS8qKgotICogQGF1dGhvciByaWNoa3VscAotICoKLSAqIFRlc3QgUHJvamVjdCBBY2Nlc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0UHJvamVjdEFjY2VzcyBleHRlbmRzIEFic3RyYWN0VGVzdFByb3h5IHsKLQotCXB1YmxpYyBUZXN0UHJvamVjdEFjY2VzcygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgVGVzdFByb2plY3RBY2Nlc3MoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDbGFzc0Zyb21Qcm9qZWN0KCkgewotCQlJQmVhblR5cGVQcm94eSB0ZXN0Q2xhc3NUeXBlID0gcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJvcmcuZWNsaXBzZS5qZW0udGVzdGluZy5wcm94eS5yZW1vdGUuVGVzdENsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCh0ZXN0Q2xhc3NUeXBlKTsJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UHJvamVjdENsYXNzSW5zdGFudGlhdGlvbigpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCUlCZWFuVHlwZVByb3h5IHRlc3RDbGFzc1R5cGUgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoIm9yZy5lY2xpcHNlLmplbS50ZXN0aW5nLnByb3h5LnJlbW90ZS5UZXN0Q2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQlJQmVhblByb3h5IHRlc3RDbGFzcyA9IHRlc3RDbGFzc1R5cGUubmV3SW5zdGFuY2UoKTsKLQkJYXNzZXJ0Tm90TnVsbCh0ZXN0Q2xhc3MpOwkJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByb2plY3RDbGFzc01ldGhvZCgpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCUlCZWFuVHlwZVByb3h5IHRlc3RDbGFzc1R5cGUgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoIm9yZy5lY2xpcHNlLmplbS50ZXN0aW5nLnByb3h5LnJlbW90ZS5UZXN0Q2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQlJTWV0aG9kUHJveHkgdGVzdE1ldGhvZCA9IHRlc3RDbGFzc1R5cGUuZ2V0TWV0aG9kUHJveHkoImdldFRlc3RTdHJpbmciKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKHRlc3RNZXRob2QpOwkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RQcm9qZWN0Q2xhc3NNZXRob2RJbnZva2UoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlJQmVhblR5cGVQcm94eSB0ZXN0Q2xhc3NUeXBlID0gcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJvcmcuZWNsaXBzZS5qZW0udGVzdGluZy5wcm94eS5yZW1vdGUuVGVzdENsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJSU1ldGhvZFByb3h5IHRlc3RNZXRob2QgPSB0ZXN0Q2xhc3NUeXBlLmdldE1ldGhvZFByb3h5KCJnZXRUZXN0U3RyaW5nIik7IC8vJE5PTi1OTFMtMSQKLQkJSUJlYW5Qcm94eSB0ZXN0Q2xhc3MgPSB0ZXN0Q2xhc3NUeXBlLm5ld0luc3RhbmNlKCk7Ci0JCUlTdHJpbmdCZWFuUHJveHkgYVN0cmluZyA9IChJU3RyaW5nQmVhblByb3h5KSB0ZXN0TWV0aG9kLmludm9rZSh0ZXN0Q2xhc3MpOwotCQlhc3NlcnROb3ROdWxsKGFTdHJpbmcpOwotCQlhc3NlcnRFcXVhbHMoIlRFU1RTVFJJTkciLCBhU3RyaW5nLnN0cmluZ1ZhbHVlKCkpOwkJCi0JfQkKLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGVlOGI5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jICRTb3VyY2U6IC9jdnNyb290L3dlYnRvb2xzL2plZXRvb2xzLm1vdmUvd2VidG9vbHMuamF2YWVlLnRlc3RzLmdpdC90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvcGx1Z2luLnByb3BlcnRpZXMsdiAkCi0jICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjU4OjU1ICQKLSMKLQotCi1wbHVnaW5OYW1lPUphdmEgRU1GIE1vZGVsIEpVbml0IFRlc3QgQ2FzZXMKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvcGx1Z2luLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODdkMzcxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmplbS5iZWFuaW5mby5yZWdpc3RyYXRpb25zIj4KLSAgICAgIDxyZWdpc3RyYXRpb24KLSAgICAgICAgICAgIGNvbnRhaW5lcj0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIj4KLSAgICAgICAgIDxvdmVycmlkZQotICAgICAgICAgICAgICAgcGFja2FnZT0ib3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvIgotICAgICAgICAgICAgICAgcGF0aD0idGVzdGRhdGEvb3ZlcnJpZGVzL2JlYW5pbmZvIj4KLSAgICAgICAgIDwvb3ZlcnJpZGU+Ci0gICAgICA8L3JlZ2lzdHJhdGlvbj4KLQk8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvcHJveHkuamFycyBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9wcm94eS5qYXJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTcwMjlhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9wcm94eS5qYXJzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi12bS90ZXN0cy5qYXI9L29yZy5lY2xpcHNlLmplbS50ZXN0cy9iaW4vCi1qYXZhdGVzdHMuamFyPS9vcmcuZWNsaXBzZS5qZW0udGVzdHMvYmluLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy90ZXN0LnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy90ZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE1YjFhMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvdGVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPHByb2plY3QgbmFtZT0idGVzdHN1aXRlIiBkZWZhdWx0PSJydW4iIGJhc2VkaXI9Ii4iPgotICA8IS0tIFRoZSBwcm9wZXJ0eSAke2VjbGlwc2UtaG9tZX0gc2hvdWxkIGJlIHBhc3NlZCBpbnRvIHRoaXMgc2NyaXB0IC0tPgotICA8IS0tIFNldCBhIG1lYW5pbmdmdWwgZGVmYXVsdCB2YWx1ZSBmb3Igd2hlbiBpdCBpcyBub3QuIC0tPgotICA8cHJvcGVydHkgbmFtZT0iZWNsaXBzZS1ob21lIiB2YWx1ZT0iJHtiYXNlZGlyfVwuLlwuLiIvPgotCi0gIDwhLS0gc2V0cyB0aGUgcHJvcGVydGllcyBwbHVnaW4tbmFtZSwgYW5kIGxpYnJhcnktZmlsZSAtLT4KLSAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2UuamVtLnRlc3RzIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJsaWJyYXJ5LWZpbGUiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vcGx1Z2lucy9vcmcuZWNsaXBzZS50ZXN0L2xpYnJhcnkueG1sIi8+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBob2xkcyBhbGwgaW5pdGlhbGl6YXRpb24gY29kZSB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgZm9yIC0tPgotICA8IS0tIGFsbCB0ZXN0cyB0aGF0IGFyZSB0byBiZSBydW4uIEluaXRpYWxpemF0aW9uIGZvciBpbmRpdmlkdWFsIHRlc3RzIC0tPgotICA8IS0tIHNob3VsZCBiZSBkb25lIHdpdGhpbiB0aGUgYm9keSBvZiB0aGUgc3VpdGUgdGFyZ2V0LiAtLT4KLSAgPHRhcmdldCBuYW1lPSJpbml0Ij4KLSAgICA8dHN0YW1wLz4KLSAgICA8ZGVsZXRlPgotICAgICAgPGZpbGVzZXQgZGlyPSIke2VjbGlwc2UtaG9tZX0iIGluY2x1ZGVzPSJvcmcqLnhtbCIvPgotICAgIDwvZGVsZXRlPgotICA8L3RhcmdldD4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IGRlZmluZXMgdGhlIHRlc3RzIHRoYXQgbmVlZCB0byBiZSBydW4uIC0tPgotICA8dGFyZ2V0IG5hbWU9InN1aXRlIj4KLSAgICA8cHJvcGVydHkgbmFtZT0iamVtLWZvbGRlciIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9qZW1fZm9sZGVyIi8+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7amVtLWZvbGRlcn0iIHF1aWV0PSJ0cnVlIi8+Ci0gIAk8IS0tIE5vdGU6IERvZXNuJ3QgcmVhbGx5IG5lZWQgdG8gYmUgVUkgdGVzdCBidXQgbGF1bmNoaW5nIHJlbW90ZSBWTSdzIHdpdGgKLSAgCSAgICAgRGVidWdVSSBwbHVnaW4gcHJlc2VudCBidXQgbm90IGxhdW5jaGluZyBVSSBjYXVzZXMgc2V2ZXJlIGVycnJvcnMKLSAgCSAgICAgYmVjYXVzZSBpdCB0cmllcyB0byBzdGFydCBEZWJ1Z1VJIGluIGhlYWRsZXNzIGVudi4gQmlnIFBhaW4hIC0tPgotICAgIDxhbnQgdGFyZ2V0PSJ1aS10ZXN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkYXRhLWRpciIgdmFsdWU9IiR7amVtLWZvbGRlcn0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3NuYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2UuamVtLnRlc3RzLkFsbFN1aXRlcyIvPgotICAgIDwvYW50PgotICA8L3RhcmdldD4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGNvZGUgdG8gY2xlYW51cCB0aGUgdGVzdGluZyBlbnZpcm9ubWVudCBhZnRlciAtLT4KLSAgPCEtLSBhZnRlciBhbGwgb2YgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4uIFlvdSBjYW4gdXNlIHRoaXMgdGFyZ2V0IHRvIC0tPgotICA8IS0tIGRlbGV0ZSB0ZW1wb3JhcnkgZmlsZXMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZC4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0iY2xlYW51cCI+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgcnVucyB0aGUgdGVzdCBzdWl0ZS4gQW55IGFjdGlvbnMgdGhhdCBuZWVkIHRvIGhhcHBlbiAtLT4KLSAgPCEtLSBhZnRlciBhbGwgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4gc2hvdWxkIGdvIGhlcmUuIC0tPgotICA8dGFyZ2V0IG5hbWU9InJ1biIgZGVwZW5kcz0iaW5pdCxzdWl0ZSxjbGVhbnVwIj4KLSAgICA8YW50IHRhcmdldD0iY29sbGVjdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iaW5jbHVkZXMiIHZhbHVlPSJvcmcqLnhtbCIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9Im91dHB1dC1maWxlIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0ueG1sIi8+Ci0gICAgPC9hbnQ+Ci0gIDwvdGFyZ2V0PgotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3Rlc3RkYXRhL2V4dGphcm9wcy50eHQgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvdGVzdGRhdGEvZXh0amFyb3BzLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVjZmI3ZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvdGVzdGRhdGEvZXh0amFyb3BzLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotZ2V0QWN0aW9uQ29tbWFuZAotZ2V0TGFiZWwKLXNldEFjdGlvbkNvbW1hbmQKLXNldExhYmVsCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvdGVzdGRhdGEvZXh0amFycHJvcHMudHh0IGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3Rlc3RkYXRhL2V4dGphcnByb3BzLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM3ZWQ2Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvdGVzdGRhdGEvZXh0amFycHJvcHMudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotYWxpZ25tZW50WAotYWxpZ25tZW50WQotYmFja2dyb3VuZAotYm91bmRzCi1jb2xvck1vZGVsCi1jdXJzb3IKLWVuYWJsZWQKLWZvY3VzVHJhdmVyc2FibGUKLWNvbXBvbmVudE9yaWVudGF0aW9uCi1mb250Ci1mb3JlZ3JvdW5kCi1ncmFwaGljcwotbG9jYWxlCi1sb2NhdGlvbgotbG9jYXRpb25PblNjcmVlbgotbWF4aW11bVNpemUKLW1pbmltdW1TaXplCi1uYW1lCi1wYXJlbnQKLXByZWZlcnJlZFNpemUKLXNob3dpbmcKLXNpemUKLXRvb2xraXQKLXRyZWVMb2NrCi12YWxpZAotdmlzaWJsZQotYWN0aW9uQ29tbWFuZAotbGFiZWwKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy90ZXN0ZGF0YS9qbGFiZWxvcHMudHh0IGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3Rlc3RkYXRhL2psYWJlbG9wcy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkYWQ4ZDYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3Rlc3RkYXRhL2psYWJlbG9wcy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotaGFzaENvZGUKLW5vdGlmeQotbm90aWZ5QWxsCi13YWl0Ci13YWl0Ci13YWl0Ci1nZXRDbGFzcwotZXF1YWxzCi10b1N0cmluZwotYWRkCi1hZGROb3RpZnkKLWNoZWNrSW1hZ2UKLWNvbnRhaW5zCi1jcmVhdGVJbWFnZQotY3JlYXRlSW1hZ2UKLWRpc3BhdGNoRXZlbnQKLWRvTGF5b3V0Ci1nZXRCYWNrZ3JvdW5kCi1nZXRCb3VuZHMKLWdldENvbG9yTW9kZWwKLWdldEN1cnNvcgotZ2V0Rm9udAotZ2V0Rm9udE1ldHJpY3MKLWdldEZvcmVncm91bmQKLWdldEdyYXBoaWNzCi1nZXRMb2NhbGUKLWdldExvY2F0aW9uCi1nZXRMb2NhdGlvbk9uU2NyZWVuCi1nZXRNYXhpbXVtU2l6ZQotZ2V0TWluaW11bVNpemUKLWdldE5hbWUKLWdldFBhcmVudAotZ2V0UHJlZmVycmVkU2l6ZQotZ2V0U2l6ZQotZ2V0VG9vbGtpdAotZ2V0VHJlZUxvY2sKLWludmFsaWRhdGUKLWlzRW5hYmxlZAotaXNTaG93aW5nCi1pc1ZhbGlkCi1pc1Zpc2libGUKLWxpc3QKLWxpc3QKLXBhaW50QWxsCi1wcmVwYXJlSW1hZ2UKLXByaW50QWxsCi1yZW1vdmUKLXJlbW92ZU5vdGlmeQotcmVwYWludAotcmVxdWVzdEZvY3VzCi1zZXRCYWNrZ3JvdW5kCi1zZXRCb3VuZHMKLXNldEN1cnNvcgotc2V0RW5hYmxlZAotc2V0Rm9yZWdyb3VuZAotc2V0TG9jYWxlCi1zZXRMb2NhdGlvbgotc2V0TG9jYXRpb24KLXNldE5hbWUKLXNldFNpemUKLXNldFNpemUKLXRyYW5zZmVyRm9jdXMKLXZhbGlkYXRlCi1hZGQKLWFkZAotYWRkCi1hZGQKLWFkZAotZ2V0QWxpZ25tZW50WAotZ2V0QWxpZ25tZW50WQotZ2V0Q29tcG9uZW50Ci1nZXRDb21wb25lbnRBdAotZ2V0Q29tcG9uZW50QXQKLWdldENvbXBvbmVudENvdW50Ci1nZXRDb21wb25lbnRzCi1nZXRJbnNldHMKLWdldExheW91dAotaXNBbmNlc3Rvck9mCi1saXN0Ci1saXN0Ci1wcmludAotcmVtb3ZlCi1yZW1vdmUKLXJlbW92ZUFsbAotc2V0TGF5b3V0Ci1jb21wdXRlVmlzaWJsZVJlY3QKLWNvbnRhaW5zCi1jcmVhdGVUb29sVGlwCi1maXJlUHJvcGVydHlDaGFuZ2UKLWZpcmVQcm9wZXJ0eUNoYW5nZQotZmlyZVByb3BlcnR5Q2hhbmdlCi1maXJlUHJvcGVydHlDaGFuZ2UKLWZpcmVQcm9wZXJ0eUNoYW5nZQotZmlyZVByb3BlcnR5Q2hhbmdlCi1maXJlUHJvcGVydHlDaGFuZ2UKLWdldEFjY2Vzc2libGVDb250ZXh0Ci1nZXRBY3Rpb25Gb3JLZXlTdHJva2UKLWdldEF1dG9zY3JvbGxzCi1nZXRCb3JkZXIKLWdldEJvdW5kcwotZ2V0Q2xpZW50UHJvcGVydHkKLWdldENvbmRpdGlvbkZvcktleVN0cm9rZQotZ2V0SGVpZ2h0Ci1nZXRMb2NhdGlvbgotZ2V0TmV4dEZvY3VzYWJsZUNvbXBvbmVudAotZ2V0UmVnaXN0ZXJlZEtleVN0cm9rZXMKLWdldFJvb3RQYW5lCi1nZXRTaXplCi1nZXRUb29sVGlwVGV4dAotZ2V0VG9wTGV2ZWxBbmNlc3RvcgotZ2V0VmlzaWJsZVJlY3QKLWdldFdpZHRoCi1nZXRYCi1nZXRZCi1ncmFiRm9jdXMKLWhhc0ZvY3VzCi1pc0RvdWJsZUJ1ZmZlcmVkCi1pc0ZvY3VzQ3ljbGVSb290Ci1pc0ZvY3VzVHJhdmVyc2FibGUKLWlzTWFuYWdpbmdGb2N1cwotaXNPcGFxdWUKLWlzT3B0aW1pemVkRHJhd2luZ0VuYWJsZWQKLWlzUmVxdWVzdEZvY3VzRW5hYmxlZAotaXNWYWxpZGF0ZVJvb3QKLXBhaW50Ci1wYWludEltbWVkaWF0ZWx5Ci1wdXRDbGllbnRQcm9wZXJ0eQotcmVwYWludAotcmVxdWVzdERlZmF1bHRGb2N1cwotcmVzZXRLZXlib2FyZEFjdGlvbnMKLXJldmFsaWRhdGUKLXNjcm9sbFJlY3RUb1Zpc2libGUKLXNldEFsaWdubWVudFgKLXNldEFsaWdubWVudFkKLXNldEF1dG9zY3JvbGxzCi1zZXRCb3JkZXIKLXNldEJvdW5kcwotc2V0RGVidWdHcmFwaGljc09wdGlvbnMKLXNldERvdWJsZUJ1ZmZlcmVkCi1zZXRNYXhpbXVtU2l6ZQotc2V0TWluaW11bVNpemUKLXNldE5leHRGb2N1c2FibGVDb21wb25lbnQKLXNldE9wYXF1ZQotc2V0UHJlZmVycmVkU2l6ZQotc2V0UmVxdWVzdEZvY3VzRW5hYmxlZAotc2V0VG9vbFRpcFRleHQKLXNldFZpc2libGUKLXVucmVnaXN0ZXJLZXlib2FyZEFjdGlvbgotdXBkYXRlCi1nZXREaXNhYmxlZEljb24KLWdldERpc3BsYXllZE1uZW1vbmljCi1nZXRIb3Jpem9udGFsQWxpZ25tZW50Ci1nZXRIb3Jpem9udGFsVGV4dFBvc2l0aW9uCi1nZXRJY29uCi1nZXRJY29uVGV4dEdhcAotZ2V0TGFiZWxGb3IKLWdldFRleHQKLWdldFVJCi1nZXRWZXJ0aWNhbEFsaWdubWVudAotZ2V0VmVydGljYWxUZXh0UG9zaXRpb24KLXNldERpc2FibGVkSWNvbgotc2V0RGlzcGxheWVkTW5lbW9uaWMKLXNldEZvbnQKLXNldEhvcml6b250YWxBbGlnbm1lbnQKLXNldEhvcml6b250YWxUZXh0UG9zaXRpb24KLXNldEljb24KLXNldEljb25UZXh0R2FwCi1zZXRMYWJlbEZvcgotc2V0VGV4dAotc2V0VUkKLXNldFZlcnRpY2FsQWxpZ25tZW50Ci1zZXRWZXJ0aWNhbFRleHRQb3NpdGlvbgotdXBkYXRlVUkKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy90ZXN0ZGF0YS9qbGFiZWxwcm9wcy50eHQgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvdGVzdGRhdGEvamxhYmVscHJvcHMudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGJjNzA3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy90ZXN0ZGF0YS9qbGFiZWxwcm9wcy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi1iYWNrZ3JvdW5kCi1ib3VuZHMKLWNvbG9yTW9kZWwKLWN1cnNvcgotZW5hYmxlZAotZm9jdXNUcmF2ZXJzYWJsZQotZm9yZWdyb3VuZAotbG9jYWxlCi1sb2NhdGlvbgotbG9jYXRpb25PblNjcmVlbgotY29tcG9uZW50T3JpZW50YXRpb24KLW5hbWUKLXBhcmVudAotc2hvd2luZwotc2l6ZQotdG9vbGtpdAotdHJlZUxvY2sKLXZhbGlkCi12aXNpYmxlCi1jb21wb25lbnRDb3VudAotY29tcG9uZW50cwotbGF5b3V0Ci1hbGlnbm1lbnRYCi1hbGlnbm1lbnRZCi1hdXRvc2Nyb2xscwotYm9yZGVyCi1kZWJ1Z0dyYXBoaWNzT3B0aW9ucwotZG91YmxlQnVmZmVyZWQKLWZvY3VzQ3ljbGVSb290Ci1ncmFwaGljcwotaGVpZ2h0Ci1pbnNldHMKLW1hbmFnaW5nRm9jdXMKLW1heGltdW1TaXplCi1taW5pbXVtU2l6ZQotbmV4dEZvY3VzYWJsZUNvbXBvbmVudAotb3BhcXVlCi1vcHRpbWl6ZWREcmF3aW5nRW5hYmxlZAotcGFpbnRpbmdUaWxlCi1wcmVmZXJyZWRTaXplCi1yZWdpc3RlcmVkS2V5U3Ryb2tlcwotcmVxdWVzdEZvY3VzRW5hYmxlZAotcm9vdFBhbmUKLXRvb2xUaXBUZXh0Ci10b3BMZXZlbEFuY2VzdG9yCi12YWxpZGF0ZVJvb3QKLXZpc2libGVSZWN0Ci13aWR0aAoteAoteQotZGlzYWJsZWRJY29uCi1kaXNwbGF5ZWRNbmVtb25pYwotZm9udAotaG9yaXpvbnRhbEFsaWdubWVudAotaG9yaXpvbnRhbFRleHRQb3NpdGlvbgotaWNvbgotaWNvblRleHRHYXAKLWxhYmVsRm9yCi10ZXh0Ci12ZXJ0aWNhbEFsaWdubWVudAotdmVydGljYWxUZXh0UG9zaXRpb24KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy90ZXN0ZGF0YS9vdmVycmlkZXMvYmVhbmluZm8vVGVzdE92ZXJyaWRlcy5vdmVycmlkZSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy90ZXN0ZGF0YS9vdmVycmlkZXMvYmVhbmluZm8vVGVzdE92ZXJyaWRlcy5vdmVycmlkZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA5ZWJlNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvdGVzdGRhdGEvb3ZlcnJpZGVzL2JlYW5pbmZvL1Rlc3RPdmVycmlkZXMub3ZlcnJpZGUKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNoYW5nZTpDaGFuZ2VEZXNjcmlwdGlvbiB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuamVtLmphdmE9ImphdmEueG1pIiB4bWxuczpvcmcuZWNsaXBzZS52ZS5pbnRlcm5hbC5jZGUuZGVjb3JhdG9ycz0iaHR0cDovLy9vcmcvZWNsaXBzZS92ZS9pbnRlcm5hbC9jZGUvZGVjb3JhdG9ycy5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UudmUuaW50ZXJuYWwuY2RlLnV0aWxpdHk9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvdmUvaW50ZXJuYWwvY2RlL3V0aWxpdHkuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLnZlLmludGVybmFsLmpjbT0iaHR0cDovLy9vcmcvZWNsaXBzZS92ZS9pbnRlcm5hbC9qY20uZWNvcmUiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6Y2hhbmdlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL0NoYW5nZSIgeG1pOnZlcnNpb249IjIuMCI+Ci0gICA8b2JqZWN0Q2hhbmdlcyBrZXk9Ilg6Uk9PVCMvL0Byb290Ij4KLSAgICAgIDx2YWx1ZSBmZWF0dXJlTmFtZT0iZVN0cnVjdHVyYWxGZWF0dXJlcyI+Ci0gICAgICAgICA8bGlzdENoYW5nZXMgcmVmZXJlbmNlVmFsdWVzPSJfZVN0cnVjdHVyYWxGZWF0dXJlcyBfZVN0cnVjdHVyYWxGZWF0dXJlczEiLz4KLSAgICAgIDwvdmFsdWU+Ci0gICA8L29iamVjdENoYW5nZXM+Ci0gICA8b2JqZWN0c1RvQXR0YWNoIHhtaTppZD0iX2VTdHJ1Y3R1cmFsRmVhdHVyZXMiIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ4eXoiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Ik92ZXJyaWRlIEFubm90YXRpb24iLz4KLSAgICA8L29iamVjdHNUb0F0dGFjaD4KLSAgIDxvYmplY3RzVG9BdHRhY2ggeG1pOmlkPSJfZVN0cnVjdHVyYWxGZWF0dXJlczEiIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0ZXN0NzkwODMiLz4gICAgCi08L2NoYW5nZTpDaGFuZ2VEZXNjcmlwdGlvbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvdGVzdGRhdGEvdGVzdGJhc2ljLnppcCBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy90ZXN0ZGF0YS90ZXN0YmFzaWMuemlwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2U3NjAyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy90ZXN0ZGF0YS90ZXN0YmFzaWMuemlwCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3Rlc3RkYXRhL3Rlc3RiZWFuaW5mby56aXAgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvdGVzdGRhdGEvdGVzdGJlYW5pbmZvLnppcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY3MGFiZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvdGVzdGRhdGEvdGVzdGJlYW5pbmZvLnppcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy90ZXN0ZGF0YS90ZXN0YmVhbmluZm9iZWFuaW5mb3MuemlwIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3Rlc3RkYXRhL3Rlc3RiZWFuaW5mb2JlYW5pbmZvcy56aXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhNjljMWEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3Rlc3RkYXRhL3Rlc3RiZWFuaW5mb2JlYW5pbmZvcy56aXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvdGVzdGRhdGEvdGVzdGJlYW5pbmZvcHJlcS56aXAgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvdGVzdGRhdGEvdGVzdGJlYW5pbmZvcHJlcS56aXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxM2U4YWYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3Rlc3RkYXRhL3Rlc3RiZWFuaW5mb3ByZXEuemlwCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3Rlc3RkYXRhL3Rlc3RidXR0b25iZWFuaW5mb3VpMXByb2plY3RqYXIuemlwIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3Rlc3RkYXRhL3Rlc3RidXR0b25iZWFuaW5mb3VpMXByb2plY3RqYXIuemlwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzJiNTg3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy90ZXN0ZGF0YS90ZXN0YnV0dG9uYmVhbmluZm91aTFwcm9qZWN0amFyLnppcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy90ZXN0ZGF0YS90ZXN0cmVtb3RlcHJvamVjdC56aXAgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvdGVzdGRhdGEvdGVzdHJlbW90ZXByb2plY3QuemlwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTIzMDIyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy90ZXN0ZGF0YS90ZXN0cmVtb3RlcHJvamVjdC56aXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvdGVzdGRhdGEvdW56aXAueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3Rlc3RkYXRhL3VuemlwLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA5N2E3NS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvdGVzdGRhdGEvdW56aXAueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08cHJvamVjdCBuYW1lPSJ6aXAiIGRlZmF1bHQ9InppcCIgYmFzZWRpcj0iLiI+Ci0gIDx0YXJnZXQgbmFtZT0iemlwIj4KLSAgICA8dW56aXAgc3JjPSIke3ppcGZyb219IiBkZXN0PSIke3ppcHRvfSIgLz4gIAotICA8L3RhcmdldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvdm1fdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L3ZtL1Rlc3RDYWxsYmFjay5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3ZtX3Rlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS92bS9UZXN0Q2FsbGJhY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYyMThkYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvdm1fdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L3ZtL1Rlc3RDYWxsYmFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkudm07Ci0vKgotICogICRSQ1NmaWxlOiBUZXN0Q2FsbGJhY2suamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNiAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDo1ODo1NCAkIAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLio7Ci0vKioKLSAqIFRoaXMgaXMgYSB0ZXN0IGZvciB0ZXN0aW5nIGNhbGxiYWNrcy4KLSAqLwotcHVibGljIGNsYXNzIFRlc3RDYWxsYmFjayBpbXBsZW1lbnRzIElDYWxsYmFjayB7Ci0JCi0JSVZNQ2FsbGJhY2tTZXJ2ZXIgdm1TZXJ2ZXI7Ci0JaW50IGNhbGxiYWNrSUQ7Ci0JYm9vbGVhbiBzdG9wID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBXaGVuIHRvbGQgdG8gc3RhcnQsIGl0IHdpbGwgc2VuZCBhIGNhbGxiYWNrCi0JICogb25jZSBldmVyeSBoYWxmIHNlY29uZCB1bnRpbCB0b2xkIHRvIHN0b3AuCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoKSB7Ci0JCW5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCS8vIEZpcnN0IHNlbmQgYmFjayB0ZXN0IGZvciBJREUgY2FsbGluZyBiYWNrIG9uIHNhbWUgdGhyZWFkLiBXZSBkbyB0aGlzIGJ5IHNlbmRpbmcgdGhlIHRocmVhZCBpZAotCQkJCS8vIGFzIGEgY29uc3RhbnQgYW5kIHRoZSBvdGhlciBzaWRlIHdpbGwgdGhlbiBjYWxsIGJhY2sgdG8gcmVtb3RlLCBhc2sgZm9yIHRoZSB0aHJlYWQgaWQsIGFuZAotCQkJCS8vIHNlZSBpZiBpdCBtYXRjaGVzLgotCQkJCXRyeSB7Ci0JCQkJCXZtU2VydmVyLmRvQ2FsbGJhY2sobmV3IElDYWxsYmFja1J1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIE9iamVjdCBydW4oSUNhbGxiYWNrSGFuZGxlciBoYW5kbGVyKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCQkJCQkJcmV0dXJuIGhhbmRsZXIuY2FsbGJhY2tBc0NvbnN0YW50cyhjYWxsYmFja0lELCAxLCBuZXcgSW50ZWdlcihUaHJlYWQuY3VycmVudFRocmVhZCgpLmhhc2hDb2RlKCkpKTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJCQotCQkJCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCQkKLQkJCQkvLyBOb3cgZG8gdGhlIHJlZ3VsYXIgdGVzdGluZy4KLQkJCQlmaW5hbCBJbnRlZ2VyW10gcCA9IG5ldyBJbnRlZ2VyW10ge25ldyBJbnRlZ2VyKDApfTsKLQkJCQl3aGlsZSghc3RvcCkgewotCQkJCQl0cnkgewotCQkJCQkJVGhyZWFkLnNsZWVwKDUwMCk7Ci0JCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWlmIChzdG9wKQotCQkJCQkJYnJlYWs7Ci0JCQkJCS8vIE5vdyBzaWduYWwgdGhlIGNhbGxiYWNrLgotCQkJCQlwWzBdID0gbmV3IEludGVnZXIocFswXS5pbnRWYWx1ZSgpKzEpOwotCQkJCQl0cnkgewotCQkJCQkJdm1TZXJ2ZXIuZG9DYWxsYmFjayhuZXcgSUNhbGxiYWNrUnVubmFibGUoKSB7Ci0JCQkJCQkJcHVibGljIE9iamVjdCBydW4oSUNhbGxiYWNrSGFuZGxlciBoYW5kbGVyKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCQkJCQkJCXJldHVybiBoYW5kbGVyLmNhbGxiYWNrV2l0aFBhcm1zKGNhbGxiYWNrSUQsIDAsIHApOwkJCQkJCQkJCi0JCQkJCQkJfQotCQkJCQkJfSk7Ci0JCQkJCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZSkgewotCQkJCQl9CQkJCQkJCi0JCQkJfQotCQkJfQotCQl9KS5zdGFydCgpOwotCX0KLQkKLQkvKioKLQkgKiBUZWxsIGl0IHN0b3AuCi0JICovCi0JcHVibGljIHZvaWQgc3RvcCgpIHsKLQkJc3RvcCA9IHRydWU7Ci0JfQotCQotCS8qKgotCSAqIEl0IGlzIGJlaW5nIGluaXRpYWxpemVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVDYWxsYmFjayhJVk1DYWxsYmFja1NlcnZlciBzZXJ2ZXIsIGludCBpZCkgewotCQl2bVNlcnZlciA9IHNlcnZlcjsKLQkJY2FsbGJhY2tJRCA9IGlkOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3ZtX3Rlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS92bS9UZXN0Q2FsbGJhY2tTdHJlYW0uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy92bV90ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvdm0vVGVzdENhbGxiYWNrU3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkODNlYjUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3ZtX3Rlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS92bS9UZXN0Q2FsbGJhY2tTdHJlYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LnZtOwotLyoKLSAqICAkUkNTZmlsZTogVGVzdENhbGxiYWNrU3RyZWFtLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6NTg6NTQgJCAKLSAqLwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uSUNhbGxiYWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uSVZNQ2FsbGJhY2tTZXJ2ZXI7Ci0vKioKLSAqIFRoaXMgaXMgYSB0ZXN0IGZvciB0ZXN0aW5nIGNhbGxiYWNrIHN0cmVhbXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0Q2FsbGJhY2tTdHJlYW0gaW1wbGVtZW50cyBJQ2FsbGJhY2sgewotCQotCUlWTUNhbGxiYWNrU2VydmVyIHZtU2VydmVyOwotCWludCBjYWxsYmFja0lEOwotCWJvb2xlYW4gc3RvcCA9IGZhbHNlOwotCi0JLyoqCi0JICogV2hlbiB0b2xkIHRvIHN0YXJ0LCBpdCB3aWxsIHNlbmQgYSBzdHJlYW0gb2YgMzAwMDAgYnl0ZXMgb2YgaW5jcmVtZW50aW5nCi0JICogdmFsdWUgKGkuZS4gMCwgMSwgMiwgLi4uLCAxMjcsIC0xMjcsIC4uLikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydCgpIHsKLQkJbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJT3V0cHV0U3RyZWFtIG9zID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQlvcyA9IHZtU2VydmVyLnJlcXVlc3RTdHJlYW0oY2FsbGJhY2tJRCwgMCk7Ci0JCQkJCWlmIChvcyAhPSBudWxsKQotCQkJCQkJZm9yIChpbnQgaT0wOyBpPDMwMDAwOyBpKyspCi0JCQkJCQkJb3Mud3JpdGUoaSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKG9zICE9IG51bGwpCi0JCQkJCQlvcy5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCX19KS5zdGFydCgpOwotCX0KLQkKLQkvKioKLQkgKiBJdCBpcyBiZWluZyBpbml0aWFsaXplZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplQ2FsbGJhY2soSVZNQ2FsbGJhY2tTZXJ2ZXIgc2VydmVyLCBpbnQgaWQpIHsKLQkJdm1TZXJ2ZXIgPSBzZXJ2ZXI7Ci0JCWNhbGxiYWNrSUQgPSBpZDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy92bV90ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvdm0vVGVzdEV4cHJlc3Npb25UaHJlYWRUcmFuc2Zlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3ZtX3Rlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS92bS9UZXN0RXhwcmVzc2lvblRocmVhZFRyYW5zZmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3NWI1YWQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3ZtX3Rlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS92bS9UZXN0RXhwcmVzc2lvblRocmVhZFRyYW5zZmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS52bTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFRlc3RFeHByZXNzaW9uVGhyZWFkVHJhbnNmZXIuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDo1ODo1NCAkIAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLio7Ci0vKioKLSAqIFRoaXMgaXMgYSB0ZXN0IGZvciB0ZXN0aW5nIGNhbGxiYWNrcy4KLSAqLwotcHVibGljIGNsYXNzIFRlc3RFeHByZXNzaW9uVGhyZWFkVHJhbnNmZXIgaW1wbGVtZW50cyBJQ2FsbGJhY2sgewotCQotCUlWTUNhbGxiYWNrU2VydmVyIHZtU2VydmVyOwotCWludCBjYWxsYmFja0lEOwotCWJvb2xlYW4gc3RvcCA9IGZhbHNlOwotCi0JLyoqCi0JICogV2hlbiB0b2xkIHRvIHN0YXJ0LCBpdCB3aWxsIHNlbmQgYSBjYWxsYmFjawotCSAqIG9uY2UgZXZlcnkgaGFsZiBzZWNvbmQgdW50aWwgdG9sZCB0byBzdG9wLgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KCkgewotCQkvLyBOZWVkIHRvIHB1dCBpdCBpbnRvIGEgbmV3IHRocmVhZC4KLQkJLy8gVGhlbiB3ZSdsbCBqdXN0IHdhaXQgdW50aWwgdGhlIHRocmVhZCBpcyBkb25lLgotCQkvLyBUaGlzIHdpbGwgY2F1c2UgY2FsbGJhY2sgb250byBhIGRpZmZlcmVudCB0aHJlYWQgaW4gSURFLgotCQlUaHJlYWQgdCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCS8vIENhbGJhY2sgdG8gSURFIG9uIHRoaXMgdGhyZWFkLiBJdCB3b24ndCByZXR1cm4gdW50aWwgY29tcGxldGUgb24gdGhlIG90aGVyIHNpZGUuCi0JCQkJdHJ5IHsKLQkJCQkJdm1TZXJ2ZXIuZG9DYWxsYmFjayhuZXcgSUNhbGxiYWNrUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgT2JqZWN0IHJ1bihJQ2FsbGJhY2tIYW5kbGVyIGhhbmRsZXIpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uIHsKLQkJCQkJCQlyZXR1cm4gaGFuZGxlci5jYWxsYmFja0FzQ29uc3RhbnRzKGNhbGxiYWNrSUQsIDAsIG51bGwpOwotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQkJCi0JCQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJdC5zdGFydCgpOwotCQl3aGlsZSAodHJ1ZSkgewotCQkJdHJ5IHsKLQkJCQl0LmpvaW4oKTsKLQkJCQlicmVhazsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQkvLyBOb3cgd2UgcmV0dXJuIGFuZCBvcmlnaW5hbCB0aHJlYWQgb24gSURFIHJlc3VtZXMgcHJvY2Vzc2luZy4KLQl9Ci0JCQotCS8qKgotCSAqIEl0IGlzIGJlaW5nIGluaXRpYWxpemVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVDYWxsYmFjayhJVk1DYWxsYmFja1NlcnZlciBzZXJ2ZXIsIGludCBpZCkgewotCQl2bVNlcnZlciA9IHNlcnZlcjsKLQkJY2FsbGJhY2tJRCA9IGlkOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3ZtX3Rlc3RzL3Rlc3RQYWNrYWdlL1Rlc3RBY2Nlc3MuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy92bV90ZXN0cy90ZXN0UGFja2FnZS9UZXN0QWNjZXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMGJkNjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3ZtX3Rlc3RzL3Rlc3RQYWNrYWdlL1Rlc3RBY2Nlc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBUZXN0QWNjZXNzLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDUvMTEgMTk6MDE6MzIgJCAKLSAqLwotcGFja2FnZSB0ZXN0UGFja2FnZTsKLSAKLQotLyoqCi0gKiBVc2VkIGZvciB0ZXN0aW5nIGZpZWxkcy4KLSAqIEBzaW5jZSAxLjEuMAotICovCi1wdWJsaWMgY2xhc3MgVGVzdEFjY2VzcyB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdGVzdFZvaWQoKSB7Ci0JCQotCX0KLQkKLQlwdWJsaWMgaW50IGZpZWxkMTsKLQlwcm90ZWN0ZWQgaW50IGZpZWxkMjsKLQkKLQlwdWJsaWMgc3RhdGljIGludCBTVEFUSUNfRklFTEQgPSAzOwotCi0JVGVzdEFjY2VzcyhSdW50aW1lRXhjZXB0aW9uIGkpIHsKLQkJCi0JfQotCQotCVRlc3RBY2Nlc3MoVGhyb3dhYmxlIG4pIHsKLQkJCi0JfQotCQotCXB1YmxpYyBUZXN0QWNjZXNzKCkgewotCQkKLQl9Ci0JCi0JcHVibGljIFRlc3RBY2Nlc3MoRXhjZXB0aW9uIG8pIHsKLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIGRkZChJbnRlZ2VyIG8sIE51bWJlciBuKSB7Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCBkZGQoTnVtYmVyIG8sIEludGVnZXIgbikgewotCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgZGRkKE51bWJlciBuLCBOdW1iZXIgbjEpIHsKLQkJCi0JfQotCi0JCi0JcHVibGljIHZvaWQgeHl6KCkgewotCX0KLQkKLQlwdWJsaWMgdm9pZCB4eXooTnVtYmVyIG4pIHsKLQl9Ci0JCi0JcHVibGljIHZvaWQgeHl6KE9iamVjdCBuKSB7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHF4cigpIHsKLQkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3ZtX3Rlc3RzL3Rlc3RQYWNrYWdlL1Rlc3RDdG9yV2l0aE51bGwuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy92bV90ZXN0cy90ZXN0UGFja2FnZS9UZXN0Q3RvcldpdGhOdWxsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlZGY1YzIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3ZtX3Rlc3RzL3Rlc3RQYWNrYWdlL1Rlc3RDdG9yV2l0aE51bGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2UgdGVzdFBhY2thZ2U7Ci0vKgotICogICRSQ1NmaWxlOiBUZXN0Q3RvcldpdGhOdWxsLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6NTg6NTUgJCAKLSAqLwotCi0vKioKLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0Q3RvcldpdGhOdWxsIHsKLQotCXB1YmxpYyBUZXN0Q3RvcldpdGhOdWxsKFN0cmluZyB4KSB7Ci0JCS8vIFRoaXMgaXMganVzdCBhIHRlc3QgdG8gc2VlIHRoYXQgY3RvciB3aWxsIGJlIHNlbGVjdGVkIGlmIGl0IGhhcyBhIG51bGwgcGFzc2VkIGluIGZvciBUcmVlIEV4cHJlc3Npb24gUHJvY2Vzc2luZy4KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMucGVyZm9ybWFuY2UvLmNsYXNzcGF0aCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMucGVyZm9ybWFuY2UvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxYzhmMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLnBlcmZvcm1hbmNlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLnBlcmZvcm1hbmNlLy5jdnNpZ25vcmUgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLnBlcmZvcm1hbmNlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1ODZlZTEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5wZXJmb3JtYW5jZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1iaW4KLXRlbXAuZm9sZGVyCi1idWlsZC54bWwKLWNvcmUtcGVyZm9ybWFuY2UuamFyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLnBlcmZvcm1hbmNlLy5wcm9qZWN0IGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5wZXJmb3JtYW5jZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNlMTJmYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLnBlcmZvcm1hbmNlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5wZXJmb3JtYW5jZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLnBlcmZvcm1hbmNlL2Fib3V0Lmh0bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLnBlcmZvcm1hbmNlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYzU5ODkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5wZXJmb3JtYW5jZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+TWF5IDIsIDIwMDY8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5wZXJmb3JtYW5jZS9idWlsZC5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5wZXJmb3JtYW5jZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGE5MGQzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMucGVyZm9ybWFuY2UvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotc291cmNlLmNvcmUtcGVyZm9ybWFuY2UuamFyID0gc3JjLwotb3V0cHV0LmNvcmUtcGVyZm9ybWFuY2UuamFyID0gYmluLwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBjb3JlLXBlcmZvcm1hbmNlLmphcixcCi0gICAgICAgICAgICAgICB0ZXN0LnhtbCxcCi0gICAgICAgICAgICAgICB0ZXN0Y2FzZS54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbApkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5wZXJmb3JtYW5jZS9wbHVnaW4ueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5wZXJmb3JtYW5jZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2ZkNTEzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMucGVyZm9ybWFuY2UvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5wZXJmb3JtYW5jZSIKLSAgIG5hbWU9IkNvcmUgUGVyZm9ybWFuY2UgUGx1Zy1pbiIKLSAgIHZlcnNpb249IjEuMS4wIgotICAgcHJvdmlkZXItbmFtZT0iIgotICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMucGVyZm9ybWFuY2UuQ29yZVBlcmZvcm1hbmNlVGVzdFBsdWdpbiI+Ci0KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0iY29yZS1wZXJmb3JtYW5jZS5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuanVuaXQiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29yZS90ZXN0cy9wZXJmb3JtYW5jZS9BbGxDb3JlUGVyZm9ybWFuY2VUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29yZS90ZXN0cy9wZXJmb3JtYW5jZS9BbGxDb3JlUGVyZm9ybWFuY2VUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTUwNDQxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvcmUvdGVzdHMvcGVyZm9ybWFuY2UvQWxsQ29yZVBlcmZvcm1hbmNlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIE5vdiAyOCwgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5wZXJmb3JtYW5jZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLmVtZnRlc3RzLkFwcENsaWVudEVNRkVkaXRUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuZW1mdGVzdHMuQXBwQ2xpZW50RU1GVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLmVtZnRlc3RzLkVhckVNRkVkaXRUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuZW1mdGVzdHMuRWFyRU1GVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLmVtZnRlc3RzLkVqYkVNRkVkaXRUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuZW1mdGVzdHMuUmFyRU1GRWRpdFRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0cy5SYXJFTUZUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuZW1mdGVzdHMuV2FyRU1GRWRpdFRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0cy5XYXJFTUZUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuZW1mdGVzdHMuV2ViU2VydmljZXNFTUZUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlLkJhc2VQZXJmb3JtYW5jZVRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlLlBlcmZvcm1hbmNlVGVzdENhc2VXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnd0cC5oZWFkbGVzcy50ZXN0cy5zYXZlc3RyYXRlZ3kuRUpCSW1wb3J0T3BlcmF0aW9uVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5hcHBjbGllbnQub3BlcmF0aW9ucy5BcHBDbGllbnRQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb25UZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnd0cC5qMmVlLmhlYWRsZXNzLnRlc3RzLmVqYi5vcGVyYXRpb25zLkVKQlByb2plY3RDcmVhdGlvbk9wZXJhdGlvblRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3RwLmoyZWUuaGVhZGxlc3MudGVzdHMuamNhLm9wZXJhdGlvbnMuQ29ubmVjdG9yUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy53ZWIub3BlcmF0aW9ucy5XZWJQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb25UZXN0OwotCi0vKioKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBBbGxDb3JlUGVyZm9ybWFuY2VUZXN0cyBleHRlbmRzIEJhc2VQZXJmb3JtYW5jZVRlc3RDYXNlewotCQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgiUGVyZm9ybWFuY2UgVGVzdCBmb3IgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5lbWZ0ZXN0Iik7Ci0JCWFkZFBlcmZvcm1hbmNlVGVzdChzdWl0ZSwgbmV3IEFwcENsaWVudEVNRkVkaXRUZXN0KCJ0ZXN0QXBwbGljYXRpb25DbGllbnRFZGl0IiksIFBlcmZvcm1hbmNlVGVzdENhc2VXcmFwcGVyLkdMT0JBTCwgIkFwcGxpY2F0aW9uIENsaWVudCBlbWYgZWRpdCB0ZXN0IiApOwotCQlhZGRQZXJmb3JtYW5jZVRlc3Qoc3VpdGUsIG5ldyBBcHBDbGllbnRFTUZUZXN0KCJ0ZXN0QXBwbGljYXRpb25DbGllbnRQb3B1bGF0aW9uIiksIFBlcmZvcm1hbmNlVGVzdENhc2VXcmFwcGVyLkxPQ0FMLCAiQXBwbGljYXRpb24gQ2xpZW50IGVtZiB0ZXN0IiApOwotCQlhZGRQZXJmb3JtYW5jZVRlc3Qoc3VpdGUsIG5ldyBBcHBDbGllbnRFTUZUZXN0KCJ0ZXN0MTRBcHBsaWNhdGlvbkNsaWVudFBvcHVsYXRpb24iKSwgUGVyZm9ybWFuY2VUZXN0Q2FzZVdyYXBwZXIuR0xPQkFMLCAiQXBwbGljYXRpb24gQ2xpZW50IDE0IGVtZiB0ZXN0IiApOwotCQkKLQkJYWRkUGVyZm9ybWFuY2VUZXN0KHN1aXRlLCBuZXcgRWFyRU1GRWRpdFRlc3QoInRlc3RFQVJFZGl0IiksIFBlcmZvcm1hbmNlVGVzdENhc2VXcmFwcGVyLkdMT0JBTCwgIkVBUiBlbWYgZWRpdCB0ZXN0IiApOwotCQkvL2FkZFBlcmZvcm1hbmNlVGVzdChzdWl0ZSwgbmV3IEVhckVNRlRlc3QoInRlc3RFQVJQb3B1bGF0aW9uIiksIFBlcmZvcm1hbmNlVGVzdENhc2VXcmFwcGVyLkxPQ0FMLCAiRUFSICBlbWYgdGVzdCIgKTsKLQkJYWRkUGVyZm9ybWFuY2VUZXN0KHN1aXRlLCBuZXcgRWFyRU1GVGVzdCgidGVzdDE0RUFSUG9wdWxhdGlvbiIpLCBQZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlci5HTE9CQUwsICJFQVIgMTQgZW1mIHRlc3QiICk7Ci0JCQotCQkvL2FkZFBlcmZvcm1hbmNlVGVzdChzdWl0ZSwgbmV3IEVqYkVNRkVkaXRUZXN0KCJ0ZXN0RUpCSmFyRWRpdCIpLCBQZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlci5HTE9CQUwsICJFSkIgZW1mIGVkaXQgdGVzdCAtdGVzdEVKQkphckVkaXQiICk7Ci0JCWFkZFBlcmZvcm1hbmNlVGVzdChzdWl0ZSwgbmV3IEVqYkVNRkVkaXRUZXN0KCJ0ZXN0V0NDTUphciIpLCBQZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlci5MT0NBTCwgIkVKQiBlbWYgZWRpdCB0ZXN0IC0gdGVzdFdDQ01KYXIiICk7Ci0JCS8vYWRkUGVyZm9ybWFuY2VUZXN0KHN1aXRlLCBuZXcgRWpiRU1GVGVzdCgidGVzdEVKQkphclBvcHVsYXRpb24iKSwgUGVyZm9ybWFuY2VUZXN0Q2FzZVdyYXBwZXIuTE9DQUwsICJFSkIgIGVtZiB0ZXN0IiApOwotCQkvL2FkZFBlcmZvcm1hbmNlVGVzdChzdWl0ZSwgbmV3IEVqYkVNRlRlc3QoInRlc3QxNEVKQkphclBvcHVsYXRpb24iKSwgUGVyZm9ybWFuY2VUZXN0Q2FzZVdyYXBwZXIuR0xPQkFMLCAiRUpCIDE0IGVtZiB0ZXN0IiApOwotCQotCQlhZGRQZXJmb3JtYW5jZVRlc3Qoc3VpdGUsIG5ldyBSYXJFTUZFZGl0VGVzdCgidGVzdFJBUkVkaXQiKSwgUGVyZm9ybWFuY2VUZXN0Q2FzZVdyYXBwZXIuR0xPQkFMLCAiUkFSIGVtZiBlZGl0IHRlc3QiICk7Ci0JCWFkZFBlcmZvcm1hbmNlVGVzdChzdWl0ZSwgbmV3IFJhckVNRlRlc3QoInRlc3RSQVJQb3B1bGF0aW9uIiksIFBlcmZvcm1hbmNlVGVzdENhc2VXcmFwcGVyLkxPQ0FMLCAiUkFSICBlbWYgdGVzdCIgKTsKLQkJYWRkUGVyZm9ybWFuY2VUZXN0KHN1aXRlLCBuZXcgUmFyRU1GVGVzdCgidGVzdDE0UkFSUG9wdWxhdGlvbiIpLCBQZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlci5HTE9CQUwsICJSQVIgMTQgZW1mIHRlc3QiICk7Ci0JCi0JCWFkZFBlcmZvcm1hbmNlVGVzdChzdWl0ZSwgbmV3IFdhckVNRkVkaXRUZXN0KCJ0ZXN0V0FSRWRpdCIpLCBQZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlci5HTE9CQUwsICJXQVIgZW1mIGVkaXQgdGVzdCIgKTsKLQkJLy9hZGRQZXJmb3JtYW5jZVRlc3Qoc3VpdGUsIG5ldyBXYXJFTUZUZXN0KCJ0ZXN0V0FSUG9wdWxhdGlvbiIpLCBQZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlci5MT0NBTCwgIldBUiAgZW1mIHRlc3QiICk7Ci0JCWFkZFBlcmZvcm1hbmNlVGVzdChzdWl0ZSwgbmV3IFdhckVNRlRlc3QoInRlc3QxNFdBUlBvcHVsYXRpb24iKSwgUGVyZm9ybWFuY2VUZXN0Q2FzZVdyYXBwZXIuR0xPQkFMLCAiV0FSIDE0IGVtZiB0ZXN0IiApOwotCQkKLQkJYWRkUGVyZm9ybWFuY2VUZXN0KHN1aXRlLCBuZXcgV2ViU2VydmljZXNFTUZUZXN0KCJ0ZXN0MTNXZWJTZXJ2aWNlc0NsaWVudFBvcHVsYXRpb24iKSwgUGVyZm9ybWFuY2VUZXN0Q2FzZVdyYXBwZXIuTk9ORSwgIldlYiBTZXJ2aWNlIENsaWVudCAxMyBlbWYgdGVzdCIgKTsKLQkJYWRkUGVyZm9ybWFuY2VUZXN0KHN1aXRlLCBuZXcgV2ViU2VydmljZXNFTUZUZXN0KCJ0ZXN0MTNXZWJTZXJ2aWNlc0REUG9wdWxhdGlvbiIpLCBQZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlci5MT0NBTCwgIldlYiBzZXJ2aWNlcyAxMyBlbWYgdGVzdCIgKTsKLQkJYWRkUGVyZm9ybWFuY2VUZXN0KHN1aXRlLCBuZXcgV2ViU2VydmljZXNFTUZUZXN0KCJ0ZXN0MTRXZWJTZXJ2aWNlc0REUG9wdWxhdGlvbiIpLCBQZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlci5HTE9CQUwsICJXZWIgc2VydmljZXMgMTQgZW1mIHRlc3QiICk7Ci0JCWFkZFBlcmZvcm1hbmNlVGVzdChzdWl0ZSwgbmV3IFdlYlNlcnZpY2VzRU1GVGVzdCgidGVzdEpheFJQQ01hcFBvcHVsYXRpb24iKSwgUGVyZm9ybWFuY2VUZXN0Q2FzZVdyYXBwZXIuR0xPQkFMLCAiSmF4UlBDTWFwcGluZyBlbWYgdGVzdCIgKTsKLQkJCi0JCQotCQkvL0NyZWF0aW9uIHRlc3RzCi0JCWFkZFBlcmZvcm1hbmNlVGVzdChzdWl0ZSwgbmV3IEVKQlByb2plY3RDcmVhdGlvbk9wZXJhdGlvblRlc3QoInRlc3REZWZhdWx0cyIpLCBQZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlci5OT05FLCAiRUpCIENvbXBvbmVudCBjcmVhdGlvbiB0ZXN0IiApOwotCQlhZGRQZXJmb3JtYW5jZVRlc3Qoc3VpdGUsIG5ldyBBcHBDbGllbnRQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb25UZXN0KCJ0ZXN0RGVmYXVsdHMiKSwgUGVyZm9ybWFuY2VUZXN0Q2FzZVdyYXBwZXIuTE9DQUwsICJBcHAgQ2xpZW50IENvbXBvbmVudCBjcmVhdGlvbiB0ZXN0IiApOwotCQlhZGRQZXJmb3JtYW5jZVRlc3Qoc3VpdGUsIG5ldyBDb25uZWN0b3JQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb25UZXN0KCJ0ZXN0RGVmYXVsdHMiKSwgUGVyZm9ybWFuY2VUZXN0Q2FzZVdyYXBwZXIuR0xPQkFMLCAiQ29ubmVjdG9yIENvbXBvbmVudCBjcmVhdGlvbiB0ZXN0IiApOwotCQlhZGRQZXJmb3JtYW5jZVRlc3Qoc3VpdGUsIG5ldyBXZWJQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb25UZXN0KCJ0ZXN0RGVmYXVsdHMiKSwgUGVyZm9ybWFuY2VUZXN0Q2FzZVdyYXBwZXIuR0xPQkFMLCAiV2ViIENvbXBvbmVudCBjcmVhdGlvbiB0ZXN0IiApOwotCQkKLQkJYWRkUGVyZm9ybWFuY2VUZXN0KHN1aXRlLCBuZXcgRUpCSW1wb3J0T3BlcmF0aW9uVGVzdCgidGVzdEVKQjIxSW1wb3J0IiksIFBlcmZvcm1hbmNlVGVzdENhc2VXcmFwcGVyLk5PTkUsICJFSkIgQ29tcG9uZW50IGltcG9ydCB0ZXN0IiApOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JCi0JCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb3JlL3Rlc3RzL3BlcmZvcm1hbmNlL0NvcmVQZXJmb3JtYW5jZVRlc3RQbHVnaW4uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvcmUvdGVzdHMvcGVyZm9ybWFuY2UvQ29yZVBlcmZvcm1hbmNlVGVzdFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODc2OWViLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvcmUvdGVzdHMvcGVyZm9ybWFuY2UvQ29yZVBlcmZvcm1hbmNlVGVzdFBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLnBlcmZvcm1hbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLio7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb3JlUGVyZm9ybWFuY2VUZXN0UGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JLy9UaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIENvcmVQZXJmb3JtYW5jZVRlc3RQbHVnaW4gcGx1Z2luOwotCS8vUmVzb3VyY2UgYnVuZGxlLgotCXByaXZhdGUgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBDb3JlUGVyZm9ybWFuY2VUZXN0UGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB1cG9uIHBsdWctaW4gYWN0aXZhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBwbHVnLWluIGlzIHN0b3BwZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXJlc291cmNlQnVuZGxlID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBDb3JlUGVyZm9ybWFuY2VUZXN0UGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIGZyb20gdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKiBvciAna2V5JyBpZiBub3QgZm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBDb3JlUGVyZm9ybWFuY2VUZXN0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotCQl0cnkgewotCQkJcmV0dXJuIChidW5kbGUgIT0gbnVsbCkgPyBidW5kbGUuZ2V0U3RyaW5nKGtleSkgOiBrZXk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJdHJ5IHsKLQkJCWlmIChyZXNvdXJjZUJ1bmRsZSA9PSBudWxsKQotCQkJCXJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLnBlcmZvcm1hbmNlLlBlcmZvcm1hbmNlUGx1Z2luUmVzb3VyY2VzIik7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB4KSB7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlQnVuZGxlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMucGVyZm9ybWFuY2UvdGVzdC54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLnBlcmZvcm1hbmNlL3Rlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjE1NDRiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMucGVyZm9ybWFuY2UvdGVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPHByb2plY3QgbmFtZT0iSjJFRSBQZXJmb3JtYW5jZSB0ZXN0IiBkZWZhdWx0PSJwZXJmb3JtYW5jZSIgYmFzZWRpcj0iLiI+Ci0gIDwhLS0gVGhlIHByb3BlcnR5ICR7ZWNsaXBzZS1ob21lfSBzaG91bGQgYmUgcGFzc2VkIGludG8gdGhpcyBzY3JpcHQgLS0+Ci0gIDwhLS0gU2V0IGEgbWVhbmluZ2Z1bCBkZWZhdWx0IHZhbHVlIGZvciB3aGVuIGl0IGlzIG5vdC4gLS0+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJlY2xpcHNlLWhvbWUiIHZhbHVlPSIke2Jhc2VkaXJ9Ly4uLy4uIi8+Ci0KLSAgPCEtLSBzZXRzIHRoZSBwcm9wZXJ0aWVzIGVjbGlwc2UtaG9tZSwgYW5kIGxpYnJhcnktZmlsZSAtLT4KLSAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5wZXJmb3JtYW5jZSIvPgotICA8cHJvcGVydHkgbmFtZT0ibGlicmFyeS1maWxlIgotICAgICAgICAgICAgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zL29yZy5lY2xpcHNlLnRlc3RfMy4xLjAvbGlicmFyeS54bWwiLz4KLSAgPHByb3BlcnR5IG5hbWU9InBlcmYtdGVzdHMtZmlsZSIKLSAgICAgICAgICAgIHZhbHVlPSIke3Rlc3REaXJ9L3BlcmZvcm1hbmNlLXRlc3RzLnhtbCIvPgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgYWxsIGluaXRpYWxpemF0aW9uIGNvZGUgdGhhdCBuZWVkcyB0byBiZSBkb25lIGZvciAtLT4KLSAgPCEtLSBhbGwgdGVzdHMgdGhhdCBhcmUgdG8gYmUgcnVuLiBJbml0aWFsaXphdGlvbiBmb3IgaW5kaXZpZHVhbCB0ZXN0cyAtLT4KLSAgPCEtLSBzaG91bGQgYmUgZG9uZSB3aXRoaW4gdGhlIGJvZHkgb2YgdGhlIHN1aXRlIHRhcmdldC4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0gICAgPHRzdGFtcC8+Ci0gICAgPGRlbGV0ZT4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtlY2xpcHNlLWhvbWV9IiBpbmNsdWRlcz0ib3JnKi54bWwiLz4KLSAgICA8L2RlbGV0ZT4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBob2xkcyBjb2RlIHRvIGNsZWFudXAgdGhlIHRlc3RpbmcgZW52aXJvbm1lbnQgYWZ0ZXIgLS0+Ci0gIDwhLS0gYWZ0ZXIgYWxsIG9mIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuLiBZb3UgY2FuIHVzZSB0aGlzIHRhcmdldCB0byAtLT4KLSAgPCEtLSBkZWxldGUgdGVtcG9yYXJ5IGZpbGVzIHRoYXQgaGF2ZSBiZWVuIGNyZWF0ZWQuIC0tPgotICA8dGFyZ2V0IG5hbWU9ImNsZWFudXAiPgotICA8L3RhcmdldD4KLQotIAotICA8IS0tIFRoaXMgdGFyZ2V0IGRlZmluZXMgdGhlIHBlcmZvcm1hbmNlIHRlc3RzIHRoYXQgbmVlZCB0byBiZSBydW4uIC0tPgotPHRhcmdldCBuYW1lPSJwZXJmb3JtYW5jZS1zdWl0ZSI+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJwZXJmb3JtYW5jZS1mb2xkZXIiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vcGVyZm9ybWFuY2VfZm9sZGVyIi8+Ci0gIDxkZWxldGUgZGlyPSIke3BlcmZvcm1hbmNlLWZvbGRlcn0iIHF1aWV0PSJ0cnVlIi8+Ci0gIDxhbnQgdGFyZ2V0PSJjb3JlLXRlc3QiIGFudGZpbGU9IiR7cGVyZi10ZXN0cy1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotICAgICA8cHJvcGVydHkgbmFtZT0iZGF0YS1kaXIiIHZhbHVlPSIke3BlcmZvcm1hbmNlLWZvbGRlcn0iLz4KLSAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0iLz4KLSAgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMucGVyZm9ybWFuY2UuQWxsQ29yZVBlcmZvcm1hbmNlVGVzdHMiLz4KLSAgPC9hbnQ+Ci08L3RhcmdldD4KLSAgICAgICAgICAgICAgICAgICAgCi08IS0tIFRoaXMgdGFyZ2V0IHJ1bnMgdGhlIHBlcmZvcm1hbmNlIHRlc3Qgc3VpdGUuIEFueSBhY3Rpb25zIHRoYXQgbmVlZCB0byBoYXBwZW4gLS0+Ci08IS0tIGFmdGVyIGFsbCB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1biBzaG91bGQgZ28gaGVyZS4gLS0+Ci08dGFyZ2V0IG5hbWU9InBlcmZvcm1hbmNlIiBkZXBlbmRzPSJpbml0LHBlcmZvcm1hbmNlLXN1aXRlLGNsZWFudXAiPgotICA8YW50IHRhcmdldD0iY29sbGVjdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImluY2x1ZGVzIiB2YWx1ZT0ib3JnKi54bWwiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0ib3V0cHV0LWZpbGUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfS54bWwiLz4KLSAgPC9hbnQ+Ci08L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMucGVyZm9ybWFuY2UvdGVzdGNhc2UueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5wZXJmb3JtYW5jZS90ZXN0Y2FzZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNzE4NjQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5wZXJmb3JtYW5jZS90ZXN0Y2FzZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTx0ZXN0Q2FzZXM+Ci0JPHRlc3RDYXNlIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLmVtZnRlc3RzLkVhckVNRkVkaXRUZXN0Ij4KLQkJPG1ldGhvZCBuYW1lPSJ0ZXN0RUFSRWRpdCIgdGFnZ2luZz0iR0xPQkFMIiBzaG9ydE5hbWU9IkVBUiBlbWYgZWRpdCIgLz4KLQk8L3Rlc3RDYXNlPgotCTx0ZXN0Q2FzZSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0cy5FYXJFTUZUZXN0Ij4KLQkJPG1ldGhvZCBuYW1lPSJ0ZXN0MTRFQVJQb3B1bGF0aW9uIiB0YWdnaW5nPSJHTE9CQUwiIHNob3J0TmFtZT0iRUFSIDE0IGVtZiB0ZXN0IiAvPgotIAk8L3Rlc3RDYXNlPgotIAk8dGVzdENhc2UgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuZW1mdGVzdHMuRWpiRU1GRWRpdFRlc3QiPgotCQk8bWV0aG9kIG5hbWU9InRlc3RFSkJKYXJFZGl0IiB0YWdnaW5nPSJHTE9CQUwiIHNob3J0TmFtZT0iRUpCIGVtZiBlZGl0IiAvPgotIAk8L3Rlc3RDYXNlPgotIAk8dGVzdENhc2UgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuZW1mdGVzdHMuRWpiRU1GRWRpdFRlc3QiPgotCQk8bWV0aG9kIG5hbWU9InRlc3RXQ0NNSmFyIiB0YWdnaW5nPSJHTE9CQUwiIHNob3J0TmFtZT0iRUpCIGVtZiBlZGl0IiAvPgotIAk8L3Rlc3RDYXNlPgotIAk8dGVzdENhc2UgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuZW1mdGVzdHMuRWpiRU1GVGVzdCI+Ci0JCTxtZXRob2QgbmFtZT0idGVzdEVKQkphclBvcHVsYXRpb24iIHRhZ2dpbmc9IkdMT0JBTCIgc2hvcnROYW1lPSJFSkIgZW1mIHRlc3QiIC8+Ci0gCTwvdGVzdENhc2U+Ci0gCTx0ZXN0Q2FzZSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0cy5FamJFTUZUZXN0Ij4KLQkJPG1ldGhvZCBuYW1lPSJ0ZXN0MTRFSkJKYXJQb3B1bGF0aW9uIiB0YWdnaW5nPSJHTE9CQUwiIHNob3J0TmFtZT0iRUpCIDE0IGVtZiB0ZXN0IiAvPgotIAk8L3Rlc3RDYXNlPgotIAk8dGVzdENhc2UgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuZW1mdGVzdHMuQXBwQ2xpZW50RU1GRWRpdFRlc3QiPgotCQk8bWV0aG9kIG5hbWU9InRlc3RBcHBsaWNhdGlvbkNsaWVudEVkaXQiIHRhZ2dpbmc9IkdMT0JBTCIgc2hvcnROYW1lPSJBcHBsaWNhdGlvbiBDbGllbnQgZW1mIGVkaXQiIC8+Ci0gCTwvdGVzdENhc2U+Ci0gCTx0ZXN0Q2FzZSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0cy5BcHBDbGllbnRFTUZUZXN0Ij4KLQkJPG1ldGhvZCBuYW1lPSJ0ZXN0MTRBcHBsaWNhdGlvbkNsaWVudFBvcHVsYXRpb24iIHRhZ2dpbmc9IkdMT0JBTCIgc2hvcnROYW1lPSJBcHBsaWNhdGlvbiBDbGllbnQgMTQgZW1mIHRlc3QiIC8+Ci0gCTwvdGVzdENhc2U+Ci0gCQotIAk8dGVzdENhc2UgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuZW1mdGVzdHMuUmFyRU1GRWRpdFRlc3QiPgotCQk8bWV0aG9kIG5hbWU9InRlc3RSQVJFZGl0IiB0YWdnaW5nPSJHTE9CQUwiIHNob3J0TmFtZT0iQ29ubmVjdG9yIGVtZiBlZGl0IiAvPgotIAk8L3Rlc3RDYXNlPgotIAkKLSAJPHRlc3RDYXNlIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLmVtZnRlc3RzLlJhckVNRlRlc3QiPgotCQk8bWV0aG9kIG5hbWU9InRlc3QxNFJBUlBvcHVsYXRpb24iIHRhZ2dpbmc9IkdMT0JBTCIgc2hvcnROYW1lPSJDb25uZWN0b3IgMTQgZW1mIHRlc3QiIC8+Ci0gCTwvdGVzdENhc2U+Ci0gCTx0ZXN0Q2FzZSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0cy5XYXJFTUZFZGl0VGVzdCI+Ci0JCTxtZXRob2QgbmFtZT0idGVzdFdBUkVkaXQiIHRhZ2dpbmc9IkdMT0JBTCIgc2hvcnROYW1lPSJXZWIgZW1mIGVkaXQiIC8+Ci0gCTwvdGVzdENhc2U+Ci0gCTx0ZXN0Q2FzZSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0cy5XYXJFTUZUZXN0Ij4KLQkJPG1ldGhvZCBuYW1lPSJ0ZXN0MTRXQVJQb3B1bGF0aW9uIiB0YWdnaW5nPSJHTE9CQUwiIHNob3J0TmFtZT0iV2ViIDE0IGVtZiB0ZXN0IiAvPgotIAk8L3Rlc3RDYXNlPgotIAkKLSAJPHRlc3RDYXNlIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLmVtZnRlc3RzLldlYlNlcnZpY2VzRU1GVGVzdCI+Ci0JCTxtZXRob2QgbmFtZT0idGVzdDE0V2ViU2VydmljZXNERFBvcHVsYXRpb24iIHRhZ2dpbmc9IkdMT0JBTCIgc2hvcnROYW1lPSJXZWIgc2VydmljZXMgMTQgZW1mIHRlc3QiIC8+Ci0gCTwvdGVzdENhc2U+IAotIAkKLTwvdGVzdENhc2VzPgotCQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvLmNsYXNzcGF0aCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU1ZDliMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImNvbW1vbkFyY2hpdmVUZXN0cyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Im1vZmoyZWVUZXN0cyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLy5jdnNpZ25vcmUgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjNjk5NjkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4KLXRlc3RPdXRwdXQKLWJ1aWxkLnhtbAotdGVtcC5mb2xkZXIKLXRlc3RzLmphcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy8ucHJvamVjdCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjZDdhYWEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz48L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9hYm91dC5odG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWM1OTg5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAyLCAyMDA2PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvYnVpbGQucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U2OWY4Yy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSB0ZXN0cy5qYXIsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICB0ZXN0LnhtbCxcCi0gICAgICAgICAgICAgICBjb21tb25BcmNoaXZlUmVzb3VyY2VzLyxcCi0gICAgICAgICAgICAgICB0ZXN0RGF0YS8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotb3V0cHV0LnRlc3RzLmphciA9IGJpbi8KLWphcnMuY29tcGlsZS5vcmRlciA9IHRlc3RzLmphcgotc291cmNlLnRlc3RzLmphciA9IGNvbW1vbkFyY2hpdmVUZXN0cy8sXAotICAgICAgICAgICAgICAgICAgIG1vZmoyZWVUZXN0cy8KLWJpbi5leGNsdWRlcyA9IGNvbW1vbkFyY2hpdmVSZXNvdXJjZXMvLmN2c2lnbm9yZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9idWlsZC9idWlsZGNvbnRyb2wucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvYnVpbGQvYnVpbGRjb250cm9sLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4MmE5OTMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9idWlsZC9idWlsZGNvbnRyb2wucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotQ09OVEFDVD1kYW5iZXJnQHVzLmlibS5jb20KLUNvbXBvbmVudFNob3J0TmFtZT1jb20uaWJtLmV0b29scy5qMmVlLmNvcmUudGVzdAotQ29tcG9uZW50RnVsbE5hbWU9Y29tLmlibS5ldG9vbHMuajJlZS5jb3JlLnRlc3QKLUNvbXBvbmVudENvbXBldGVuY3k9VEVTVFMKLUphdmFDb21waWxlLjE9c3JjamFyCi1CdWlsZFZlcmlmaWNhdGlvbi4xPWRpcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9idWlsZC9wYWNrYWdlLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvYnVpbGQvcGFja2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5MWYzMjYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9idWlsZC9wYWNrYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9ImNvbS5pYm0uZXRvb2xzLmoyZWUuY29yZS50ZXN0IiBkZWZhdWx0PSJwYWNrYWdpbmdQbHVnaW4iIGJhc2VkaXI9Ii4vLi4iPgotICAgIDx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwYWNrYWdlRGlyIiB2YWx1ZT0iIi8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4uZGlyZWN0b3J5IiAgdmFsdWU9IiR7YmFzZWRpcn0iLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi5pZCIgdmFsdWU9ImNvbS5pYm0uZXRvb2xzLmoyZWUuY29yZS50ZXN0Ii8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4udmVyc2lvbiIgIHZhbHVlPSIiLz4KLSAgICA8L3RhcmdldD4KLSAgICA8dGFyZ2V0IG5hbWU9InBhY2thZ2luZ1BsdWdpbiIgZGVwZW5kcz0iaW5pdCI+Ci0gICAgICAgIDxlY2hvIG1lc3NhZ2U9IiR7cGx1Z2luLmlkfSIvPgotICAgICAgICA8Y29weSB0b2Rpcj0iJHtwYWNrYWdlRGlyfS9wbHVnaW5zLyR7cGx1Z2luLmlkfV8ke3BsdWdpbi52ZXJzaW9ufSI+Ci0gICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7cGx1Z2luLmRpcmVjdG9yeX0iPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9InBsdWdpbi54bWwiLz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJ0ZXN0LnhtbCIvPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9InJ1bnRpbWUvY29tbW9uQXJjaGl2ZVRlc3RzLmphciIvPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9InJ1bnRpbWUvbW9kZWxUZXN0cy5qYXIiLz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJydW50aW1lL2phdmFUZXN0cy5qYXIiLz4KLSAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPC9jb3B5PgotICAgIDwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9idWlsZC93c0J1aWxkLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvYnVpbGQvd3NCdWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiNTM4ODUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9idWlsZC93c0J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCFET0NUWVBFIHByb2plY3QgWwotCTwhRU5USVRZIGJhc2VCdWlsZCBTWVNURU0gImZpbGU6Li4vLi4vd3NCdWlsZERlZi54bWwiPgotXT4KLQotPHByb2plY3QgbmFtZT0iYnVpbGRQbHVnaW4iIGRlZmF1bHQ9ImJ1aWxkIiBiYXNlZGlyPSIuLy4uIj4KLQotPCEtLSBpbmNsdWRlIHRoZSBjb21tb24geG1sIGJ1aWxkIGZpbGUgLS0+Ci0mYmFzZUJ1aWxkOwotCi08dGFyZ2V0IG5hbWU9ImJ1aWxkIiBkZXBlbmRzPSJwcmVwYXJlIiBpZj0icGx1Z2luLmlkIj4KLQotICAgIDxhbnRjYWxsIHRhcmdldD0idW56aXBzcmNqYXIiPiA8cGFyYW0gbmFtZT0iamFybmFtZSIgdmFsdWU9ImNvbW1vbkFyY2hpdmVUZXN0cyIvPiA8L2FudGNhbGw+Ci0gICAgPGFudGNhbGwgdGFyZ2V0PSJ1bnppcHNyY2phciI+IDxwYXJhbSBuYW1lPSJqYXJuYW1lIiB2YWx1ZT0ibW9kZWxUZXN0cyIvPiA8L2FudGNhbGw+Ci0gICAgPGFudGNhbGwgdGFyZ2V0PSJ1bnppcHNyY2phciI+IDxwYXJhbSBuYW1lPSJqYXJuYW1lIiB2YWx1ZT0iamF2YVRlc3RzIi8+IDwvYW50Y2FsbD4KLQotICAgIDxta2RpciBkaXI9ICIke3BsdWdpbi5idWlsZC5kaXJlY3Rvcnl9L2NvbW1vbmJsZCIvPgotICAgIDxqYXZhYyBmYWlsb25lcnJvcj0iZmFsc2UiIGRlc3RkaXI9IiR7cGx1Z2luLmJ1aWxkLmRpcmVjdG9yeX0vY29tbW9uYmxkIiBpbmNsdWRlQW50UnVudGltZT0iZmFsc2UiPgotICAgICAgICA8c3JjIHBhdGg9IiR7cGx1Z2luLnNyYy5kaXJlY3Rvcnl9L2NvbW1vbkFyY2hpdmVUZXN0cyIvPgotICAgICAgICA8c3JjIHBhdGg9IiR7cGx1Z2luLnNyYy5kaXJlY3Rvcnl9L21vZGVsVGVzdHMiLz4KLSAgICAgICAgPHNyYyBwYXRoPSIke3BsdWdpbi5zcmMuZGlyZWN0b3J5fS9qYXZhVGVzdHMiLz4KLSAgICAgICAgPGJvb3RjbGFzc3BhdGggcGF0aD0iJHtib290Y2xhc3NwYXRofSIvPgotICAgICAgICA8Y2xhc3NwYXRoIHBhdGg9IiR7cGx1Z2luLmNsYXNzcGF0aH0iLz4KLSAgICA8L2phdmFjPgotCi0JPGFudGNhbGwgdGFyZ2V0PSJidWlsZGphciI+Ci0JCTxwYXJhbSBuYW1lPSJqYXJuYW1lIiB2YWx1ZT0iY29tbW9uQXJjaGl2ZVRlc3RzIi8+Ci0JCTxwYXJhbSBuYW1lPSJqYXJjbGFzc3BhdGgiIHZhbHVlPSIke3BsdWdpbi5jbGFzc3BhdGh9OyR7cGx1Z2luLmJ1aWxkLmRpcmVjdG9yeX0vY29tbW9uYmxkIi8+Ci0JPC9hbnRjYWxsPgotCTxhbnRjYWxsIHRhcmdldD0iYnVpbGRqYXIiPgotCQk8cGFyYW0gbmFtZT0iamFybmFtZSIgdmFsdWU9Im1vZGVsVGVzdHMiLz4KLQkJPHBhcmFtIG5hbWU9ImphcmNsYXNzcGF0aCIgdmFsdWU9IiR7cGx1Z2luLmNsYXNzcGF0aH07JHtwbHVnaW4uYnVpbGQuZGlyZWN0b3J5fS9jb21tb25ibGQiLz4KLQk8L2FudGNhbGw+Ci0JPGFudGNhbGwgdGFyZ2V0PSJidWlsZGphciI+Ci0JCTxwYXJhbSBuYW1lPSJqYXJuYW1lIiB2YWx1ZT0iamF2YVRlc3RzIi8+Ci0JCTxwYXJhbSBuYW1lPSJqYXJjbGFzc3BhdGgiIHZhbHVlPSIke3BsdWdpbi5jbGFzc3BhdGh9OyR7cGx1Z2luLmJ1aWxkLmRpcmVjdG9yeX0vY29tbW9uYmxkIi8+Ci0JPC9hbnRjYWxsPgotCi08L3RhcmdldD4KLTwvcHJvamVjdD4KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzLy5jdnNpZ25vcmUgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDkxNzhlZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYmluCi10ZXN0T3V0cHV0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL0VNRlRlc3ROb0lEL2FwcGxpY2F0aW9uLWNsaWVudC54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvRU1GVGVzdE5vSUQvYXBwbGljYXRpb24tY2xpZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc5NmUyMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvRU1GVGVzdE5vSUQvYXBwbGljYXRpb24tY2xpZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGFwcGxpY2F0aW9uLWNsaWVudCBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKMkVFIEFwcGxpY2F0aW9uIENsaWVudCAxLjMvL0VOIiAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvYXBwbGljYXRpb24tY2xpZW50XzFfMy5kdGQiPgotCi0gICA8YXBwbGljYXRpb24tY2xpZW50IGlkPSJBcHBsaWNhdGlvbi1jbGllbnRfSUQiPgotICAgICAgPGljb24+Ci0gICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMDwvc21hbGwtaWNvbj4KLSAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8wPC9sYXJnZS1pY29uPgotICAgICAgPC9pY29uPgotICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8wPC9kaXNwbGF5LW5hbWU+Ci0gICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlN0cmluZzwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzA8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgIDwvZW52LWVudHJ5PgotICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzE8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJvb2xlYW48L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8yPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICA8L2Vudi1lbnRyeT4KLSAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8zPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuRG91YmxlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMzwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJ5dGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV80PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICA8L2Vudi1lbnRyeT4KLSAgICAgIDxlamItcmVmPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzA8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgPGhvbWU+aG9tZV8wPC9ob21lPgotICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMDwvcmVtb3RlPgotICAgICAgICAgPGVqYi1saW5rPmxpbmtfMDwvZWpiLWxpbms+Ci0gICAgICA8L2VqYi1yZWY+Ci0gICAgICA8ZWpiLXJlZj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgPGhvbWU+aG9tZV8xPC9ob21lPgotICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTwvcmVtb3RlPgotICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTwvZWpiLWxpbms+Ci0gICAgICA8L2VqYi1yZWY+Ci0gICAgICA8ZWpiLXJlZj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgIDxob21lPmhvbWVfMjwvaG9tZT4KLSAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzI8L3JlbW90ZT4KLSAgICAgICAgIDxlamItbGluaz5saW5rXzI8L2VqYi1saW5rPgotICAgICAgPC9lamItcmVmPgotICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgIDxob21lPmhvbWVfMzwvaG9tZT4KLSAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzM8L3JlbW90ZT4KLSAgICAgICAgIDxlamItbGluaz5saW5rXzM8L2VqYi1saW5rPgotICAgICAgPC9lamItcmVmPgotICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICA8aG9tZT5ob21lXzQ8L2hvbWU+Ci0gICAgICAgICA8cmVtb3RlPnJlbW90ZV80PC9yZW1vdGU+Ci0gICAgICAgICA8ZWpiLWxpbms+bGlua180PC9lamItbGluaz4KLSAgICAgIDwvZWpiLXJlZj4KLSAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMDwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgPHJlcy10eXBlPnR5cGVfMDwvcmVzLXR5cGU+Ci0gICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzE8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgIDxyZXMtdHlwZT50eXBlXzE8L3Jlcy10eXBlPgotICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgPHJlcy10eXBlPnR5cGVfMjwvcmVzLXR5cGU+Ci0gICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzM8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgIDxyZXMtdHlwZT50eXBlXzM8L3Jlcy10eXBlPgotICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNDwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgPHJlcy10eXBlPnR5cGVfNDwvcmVzLXR5cGU+Ci0gICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8wPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzE8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzI8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5zcWwuRGF0YTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMzwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICA8Y2FsbGJhY2staGFuZGxlcj5qYXZhLnV0aWwuSGFzaFRhYmxlPC9jYWxsYmFjay1oYW5kbGVyPgotICAgPC9hcHBsaWNhdGlvbi1jbGllbnQ+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvRU1GVGVzdE5vSUQvYXBwbGljYXRpb24ueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL0VNRlRlc3ROb0lEL2FwcGxpY2F0aW9uLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJlNzc0NS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvRU1GVGVzdE5vSUQvYXBwbGljYXRpb24ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBhcHBsaWNhdGlvbiBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKMkVFIEFwcGxpY2F0aW9uIDEuMy8vRU4iICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9hcHBsaWNhdGlvbl8xXzMuZHRkIj4KLQotICAgPGFwcGxpY2F0aW9uIGlkPSJBcHBsaWNhdGlvbl9JRCI+Ci0gICAgICA8aWNvbj4KLSAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8wPC9zbWFsbC1pY29uPgotICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzA8L2xhcmdlLWljb24+Ci0gICAgICA8L2ljb24+Ci0gICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzA8L2Rpc3BsYXktbmFtZT4KLSAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgIDxtb2R1bGU+Ci0gICAgICAgICA8amF2YT51cmlfMDwvamF2YT4KLSAgICAgICAgIDxhbHQtZGQ+YWx0RERfMDwvYWx0LWRkPgotICAgICAgPC9tb2R1bGU+Ci0gICAgICA8bW9kdWxlPgotICAgICAgICAgPGVqYj51cmlfMDwvZWpiPgotICAgICAgICAgPGFsdC1kZD5hbHRERF8wPC9hbHQtZGQ+Ci0gICAgICA8L21vZHVsZT4KLSAgICAgIDxtb2R1bGU+Ci0gICAgICAgICA8d2ViPgotICAgICAgICAgICAgPHdlYi11cmk+dXJpXzA8L3dlYi11cmk+Ci0gICAgICAgICAgICA8Y29udGV4dC1yb290PmNvbnRleHRSb290XzA8L2NvbnRleHQtcm9vdD4KLSAgICAgICAgIDwvd2ViPgotICAgICAgICAgPGFsdC1kZD5hbHRERF8wPC9hbHQtZGQ+Ci0gICAgICA8L21vZHVsZT4KLSAgICAgIDxtb2R1bGU+Ci0gICAgICAgICA8Y29ubmVjdG9yPnVyaV8wPC9jb25uZWN0b3I+Ci0gICAgICAgICA8YWx0LWRkPmFsdEREXzA8L2FsdC1kZD4KLSAgICAgIDwvbW9kdWxlPgotICAgICAgPG1vZHVsZT4KLSAgICAgICAgIDxqYXZhPnVyaV8xPC9qYXZhPgotICAgICAgICAgPGFsdC1kZD5hbHRERF8xPC9hbHQtZGQ+Ci0gICAgICA8L21vZHVsZT4KLSAgICAgIDxzZWN1cml0eS1yb2xlPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8wPC9yb2xlLW5hbWU+Ci0gICAgICA8L3NlY3VyaXR5LXJvbGU+Ci0gICAgICA8c2VjdXJpdHktcm9sZT4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMTwvcm9sZS1uYW1lPgotICAgICAgPC9zZWN1cml0eS1yb2xlPgotICAgICAgPHNlY3VyaXR5LXJvbGU+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzI8L3JvbGUtbmFtZT4KLSAgICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgICAgIDxzZWN1cml0eS1yb2xlPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8zPC9yb2xlLW5hbWU+Ci0gICAgICA8L3NlY3VyaXR5LXJvbGU+Ci0gICAgICA8c2VjdXJpdHktcm9sZT4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfNDwvcm9sZS1uYW1lPgotICAgICAgPC9zZWN1cml0eS1yb2xlPgotICAgPC9hcHBsaWNhdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9FTUZUZXN0Tm9JRC9lamItamFyLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9FTUZUZXN0Tm9JRC9lamItamFyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM5ZDY4ZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvRU1GVGVzdE5vSUQvZWpiLWphci54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyODY5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgZWpiLWphciBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBFbnRlcnByaXNlIEphdmFCZWFucyAyLjAvL0VOIiAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvZWpiLWphcl8yXzAuZHRkIj4KLQotICAgPGVqYi1qYXIgaWQ9ImVqYi1qYXJfSUQiPgotICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8wPC9kaXNwbGF5LW5hbWU+Ci0gICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMDwvc21hbGwtaWNvbj4KLSAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8wPC9sYXJnZS1pY29uPgotICAgICAgPGVudGVycHJpc2UtYmVhbnM+Ci0gICAgICAgICA8ZW50aXR5PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8wPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMDwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8wPC9sYXJnZS1pY29uPgotICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMDwvZWpiLW5hbWU+Ci0gICAgICAgICAgICA8aG9tZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9ob21lPgotICAgICAgICAgICAgPHJlbW90ZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZW1vdGU+Ci0gICAgICAgICAgICA8bG9jYWwtaG9tZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgPGxvY2FsPmphdmEudXRpbC5IYXNoVGFibGU8L2xvY2FsPgotICAgICAgICAgICAgPGVqYi1jbGFzcz5qYXZhLnV0aWwuSGFzaFRhYmxlPC9lamItY2xhc3M+Ci0gICAgICAgICAgICA8cGVyc2lzdGVuY2UtdHlwZT5CZWFuPC9wZXJzaXN0ZW5jZS10eXBlPgotICAgICAgICAgICAgPHByaW0ta2V5LWNsYXNzPmphdmEudXRpbC5IYXNoVGFibGU8L3ByaW0ta2V5LWNsYXNzPgotICAgICAgICAgICAgPHJlZW50cmFudD5UcnVlPC9yZWVudHJhbnQ+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlN0cmluZzwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzA8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzE8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJvb2xlYW48L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8yPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8zPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuRG91YmxlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMzwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJ5dGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV80PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzA8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8wPC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMDwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8xPC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMjwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzI8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMzwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzM8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzQ8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV80PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzA8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8wPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8wPC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzA8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMTwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8yPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8yPC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMzwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV80PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV80PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzA8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18wPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzE8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzI8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzM8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18zPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzQ8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua180PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJ1bi1hcz4KLSAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPC9ydW4tYXM+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8wPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8wPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8yPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8yPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMzwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV80PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV80PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzA8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuTGlzdDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnNxbC5EYXRhPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8zPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV80PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5TdHJpbmc8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgIDwvZW50aXR5PgotICAgICAgICAgPGVudGl0eT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMTwvZGlzcGxheS1uYW1lPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzE8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMTwvbGFyZ2UtaWNvbj4KLSAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzE8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGhvbWU+amF2YS51dGlsLkxpc3Q8L2hvbWU+Ci0gICAgICAgICAgICA8cmVtb3RlPmphdmEudXRpbC5MaXN0PC9yZW1vdGU+Ci0gICAgICAgICAgICA8bG9jYWwtaG9tZT5qYXZhLnV0aWwuTGlzdDwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgIDxsb2NhbD5qYXZhLnV0aWwuTGlzdDwvbG9jYWw+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmphdmEudXRpbC5MaXN0PC9lamItY2xhc3M+Ci0gICAgICAgICAgICA8cGVyc2lzdGVuY2UtdHlwZT5CZWFuPC9wZXJzaXN0ZW5jZS10eXBlPgotICAgICAgICAgICAgPHByaW0ta2V5LWNsYXNzPmphdmEudXRpbC5MaXN0PC9wcmltLWtleS1jbGFzcz4KLSAgICAgICAgICAgIDxyZWVudHJhbnQ+RmFsc2U8L3JlZW50cmFudD4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV81PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU2hvcnQ8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV81PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV82PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuTG9uZzwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzY8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzc8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5GbG9hdDwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzc8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzg8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5DaGFyYWN0ZXI8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV84PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV85PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfOTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV81PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV81PC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNTwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV82PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfNjwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzY8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzY8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfNzwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzc8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzc8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfODwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzg8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV84PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua184PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzk8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzk8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV85PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua185PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzU8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzU8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzU8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV82PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNjwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNjwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua182PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzc8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzc8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzc8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV84PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfODwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfODwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua184PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzk8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzk8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzk8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfOTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzU8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzY8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzc8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfODwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzg8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfOTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzk8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8dXNlLWNhbGxlci1pZGVudGl0eT48L3VzZS1jYWxsZXItaWRlbnRpdHk+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV81PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV81PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzY8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzY8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV83PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV83PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzg8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzg8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV85PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV85PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV81PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzY8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzc8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5zcWwuRGF0YTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfODwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfOTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICA8L2VudGl0eT4KLSAgICAgICAgIDxlbnRpdHk+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzA8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8wPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzA8L2xhcmdlLWljb24+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8yPC9lamItbmFtZT4KLSAgICAgICAgICAgIDxob21lPmphdmEudXRpbC5IYXNoVGFibGU8L2hvbWU+Ci0gICAgICAgICAgICA8cmVtb3RlPmphdmEudXRpbC5IYXNoVGFibGU8L3JlbW90ZT4KLSAgICAgICAgICAgIDxsb2NhbC1ob21lPmphdmEudXRpbC5IYXNoVGFibGU8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICA8bG9jYWw+amF2YS51dGlsLkhhc2hUYWJsZTwvbG9jYWw+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmphdmEudXRpbC5IYXNoVGFibGU8L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS10eXBlPkNvbnRhaW5lcjwvcGVyc2lzdGVuY2UtdHlwZT4KLSAgICAgICAgICAgIDxwcmltLWtleS1jbGFzcz5qYXZhLnV0aWwuSGFzaFRhYmxlPC9wcmltLWtleS1jbGFzcz4KLSAgICAgICAgICAgIDxyZWVudHJhbnQ+VHJ1ZTwvcmVlbnRyYW50PgotICAgICAgICAgICAgPGNtcC12ZXJzaW9uPjIueDwvY21wLXZlcnNpb24+Ci0gICAgICAgICAgICA8YWJzdHJhY3Qtc2NoZW1hLW5hbWU+YWJzdHJhY3RTY2hlbWFOYW1lXzA8L2Fic3RyYWN0LXNjaGVtYS1uYW1lPgotICAgICAgICAgICAgPGNtcC1maWVsZD4KLSAgICAgICAgICAgICAgIDxmaWVsZC1uYW1lPm5hbWVfMDwvZmllbGQtbmFtZT4KLSAgICAgICAgICAgIDwvY21wLWZpZWxkPgotICAgICAgICAgICAgPGNtcC1maWVsZD4KLSAgICAgICAgICAgICAgIDxmaWVsZC1uYW1lPm5hbWVfMTwvZmllbGQtbmFtZT4KLSAgICAgICAgICAgIDwvY21wLWZpZWxkPgotICAgICAgICAgICAgPGNtcC1maWVsZD4KLSAgICAgICAgICAgICAgIDxmaWVsZC1uYW1lPm5hbWVfMjwvZmllbGQtbmFtZT4KLSAgICAgICAgICAgIDwvY21wLWZpZWxkPgotICAgICAgICAgICAgPGNtcC1maWVsZD4KLSAgICAgICAgICAgICAgIDxmaWVsZC1uYW1lPm5hbWVfMzwvZmllbGQtbmFtZT4KLSAgICAgICAgICAgIDwvY21wLWZpZWxkPgotICAgICAgICAgICAgPGNtcC1maWVsZD4KLSAgICAgICAgICAgICAgIDxmaWVsZC1uYW1lPm5hbWVfNDwvZmllbGQtbmFtZT4KLSAgICAgICAgICAgIDwvY21wLWZpZWxkPgotICAgICAgICAgICAgPHByaW1rZXktZmllbGQ+bmFtZV8wPC9wcmlta2V5LWZpZWxkPgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xMDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkludGVnZXI8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xMDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzExPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzExPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQm9vbGVhbjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzExPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTI8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Eb3VibGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xMjwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzEzPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQnl0ZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzEzPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTQ8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TaG9ydDwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzE0PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xMDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzEwPC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTA8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzEwPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzExPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xMTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMTE8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8xMTwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTE8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzEyPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMTI8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8xMjwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTI8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzEzPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8xMzwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzEzPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xMzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTQ8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8xNDwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzE0PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xNDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTA8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8xMDwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMTA8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTA8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzExPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8xMTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMTE8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTE8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzEyPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMTI8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzEyPC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzEyPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xMzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMTM8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzEzPC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzEzPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xNDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzE0PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8xNDwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xNDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzEwPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTA8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzExPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTE8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzEyPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTI8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzEzPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTM8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzE0PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTQ8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cnVuLWFzPgotICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8xPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8L3J1bi1hcz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xMDwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMTA8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTE8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzExPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xMjwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMTI8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTM8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzEzPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xNDwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMTQ8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzEwPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzExPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xMTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuTGlzdDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzEyPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xMzwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzE0PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5TdHJpbmc8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxxdWVyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxxdWVyeS1tZXRob2Q+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8wPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPjwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgIDwvcXVlcnktbWV0aG9kPgotICAgICAgICAgICAgICAgPHJlc3VsdC10eXBlLW1hcHBpbmc+UmVtb3RlPC9yZXN1bHQtdHlwZS1tYXBwaW5nPgotICAgICAgICAgICAgICAgPGVqYi1xbD5lamJRTF8wPC9lamItcWw+Ci0gICAgICAgICAgICA8L3F1ZXJ5PgotICAgICAgICAgICAgPHF1ZXJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHF1ZXJ5LW1ldGhvZD4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzE8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzA8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgIDwvcXVlcnktbWV0aG9kPgotICAgICAgICAgICAgICAgPHJlc3VsdC10eXBlLW1hcHBpbmc+TG9jYWw8L3Jlc3VsdC10eXBlLW1hcHBpbmc+Ci0gICAgICAgICAgICAgICA8ZWpiLXFsPmVqYlFMXzE8L2VqYi1xbD4KLSAgICAgICAgICAgIDwvcXVlcnk+Ci0gICAgICAgICAgICA8cXVlcnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cXVlcnktbWV0aG9kPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICA8L3F1ZXJ5LW1ldGhvZD4KLSAgICAgICAgICAgICAgIDxyZXN1bHQtdHlwZS1tYXBwaW5nPlJlbW90ZTwvcmVzdWx0LXR5cGUtbWFwcGluZz4KLSAgICAgICAgICAgICAgIDxlamItcWw+ZWpiUUxfMjwvZWpiLXFsPgotICAgICAgICAgICAgPC9xdWVyeT4KLSAgICAgICAgICAgIDxxdWVyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxxdWVyeS1tZXRob2Q+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQ8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgPC9xdWVyeS1tZXRob2Q+Ci0gICAgICAgICAgICAgICA8cmVzdWx0LXR5cGUtbWFwcGluZz5Mb2NhbDwvcmVzdWx0LXR5cGUtbWFwcGluZz4KLSAgICAgICAgICAgICAgIDxlamItcWw+ZWpiUUxfMzwvZWpiLXFsPgotICAgICAgICAgICAgPC9xdWVyeT4KLSAgICAgICAgICAgIDxxdWVyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxxdWVyeS1tZXRob2Q+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPjwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgIDwvcXVlcnktbWV0aG9kPgotICAgICAgICAgICAgICAgPHJlc3VsdC10eXBlLW1hcHBpbmc+UmVtb3RlPC9yZXN1bHQtdHlwZS1tYXBwaW5nPgotICAgICAgICAgICAgICAgPGVqYi1xbD5lamJRTF80PC9lamItcWw+Ci0gICAgICAgICAgICA8L3F1ZXJ5PgotICAgICAgICAgPC9lbnRpdHk+Ci0gICAgICAgICA8c2Vzc2lvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMDwvZGlzcGxheS1uYW1lPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzA8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMDwvbGFyZ2UtaWNvbj4KLSAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzM8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGhvbWU+amF2YS51dGlsLkhhc2hUYWJsZTwvaG9tZT4KLSAgICAgICAgICAgIDxyZW1vdGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVtb3RlPgotICAgICAgICAgICAgPGxvY2FsLWhvbWU+amF2YS51dGlsLkhhc2hUYWJsZTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgIDxsb2NhbD5qYXZhLnV0aWwuSGFzaFRhYmxlPC9sb2NhbD4KLSAgICAgICAgICAgIDxlamItY2xhc3M+amF2YS51dGlsLkhhc2hUYWJsZTwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHNlc3Npb24tdHlwZT5TdGF0ZWZ1bDwvc2Vzc2lvbi10eXBlPgotICAgICAgICAgICAgPHRyYW5zYWN0aW9uLXR5cGU+QmVhbjwvdHJhbnNhY3Rpb24tdHlwZT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTU8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Mb25nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTU8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xNjwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkZsb2F0PC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTY8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xNzwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkNoYXJhY3RlcjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzE3PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTg8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TdHJpbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xODwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzE5PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzE5PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xNTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMTU8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8xNTwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTU8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE2PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMTY8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8xNjwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTY8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE3PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8xNzwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzE3PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xNzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTg8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8xODwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzE4PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xODwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTk8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzE5PC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTk8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE5PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xNTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMTU8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzE1PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE1PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xNjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzE2PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8xNjwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xNjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTc8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzE3PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8xNzwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xNzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTg8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8xODwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMTg8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTg8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE5PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8xOTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMTk8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTk8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xNTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzE1PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xNjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzE2PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xNzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzE3PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xODwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzE4PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xOTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzE5PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHVzZS1jYWxsZXItaWRlbnRpdHk+PC91c2UtY2FsbGVyLWlkZW50aXR5PgotICAgICAgICAgICAgPC9zZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzE1PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8xNTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTY8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzE2PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzE3PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8xNzwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTg8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzE4PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzE5PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8xOTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzE1PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xNjwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuTGlzdDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzE3PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xODwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzE5PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5TdHJpbmc8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgIDwvc2Vzc2lvbj4KLSAgICAgICAgIDxlbnRpdHk+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzI8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8yPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzI8L2xhcmdlLWljb24+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV80PC9lamItbmFtZT4KLSAgICAgICAgICAgIDxob21lPmphdmEuc3FsLkRhdGE8L2hvbWU+Ci0gICAgICAgICAgICA8cmVtb3RlPmphdmEuc3FsLkRhdGE8L3JlbW90ZT4KLSAgICAgICAgICAgIDxsb2NhbC1ob21lPmphdmEuc3FsLkRhdGE8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICA8bG9jYWw+amF2YS5zcWwuRGF0YTwvbG9jYWw+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmphdmEuc3FsLkRhdGE8L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS10eXBlPkJlYW48L3BlcnNpc3RlbmNlLXR5cGU+Ci0gICAgICAgICAgICA8cHJpbS1rZXktY2xhc3M+amF2YS5zcWwuRGF0YTwvcHJpbS1rZXktY2xhc3M+Ci0gICAgICAgICAgICA8cmVlbnRyYW50PlRydWU8L3JlZW50cmFudD4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjA8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjA8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yMTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkRvdWJsZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzIxPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjI8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5CeXRlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjI8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yMzwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlNob3J0PC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjM8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yNDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkxvbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8yNDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjA8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8yMDwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzIwPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yMDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjE8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzIxPC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjE8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzIxPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yMjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzIyPC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjI8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzIyPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yMzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMjM8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8yMzwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjM8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI0PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMjQ8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8yNDwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjQ8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzIwPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMjA8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzIwPC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzIwPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yMTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMjE8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzIxPC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzIxPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yMjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzIyPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8yMjwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yMjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzIzPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8yMzwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yMzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjQ8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8yNDwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMjQ8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjQ8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yMDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzIwPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yMTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzIxPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yMjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzIyPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yMzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzIzPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yNDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzI0PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJ1bi1hcz4KLSAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPC9ydW4tYXM+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjA8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzIwPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzIxPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8yMTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjI8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzIyPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzIzPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8yMzwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjQ8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzI0PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8yMDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjE8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8yMjwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnNxbC5EYXRhPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjM8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8yNDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICA8L2VudGl0eT4KLSAgICAgICAgIDxlbnRpdHk+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzM8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8zPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzM8L2xhcmdlLWljb24+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV81PC9lamItbmFtZT4KLSAgICAgICAgICAgIDxob21lPmphdmEubGFuZy5JbnRlZ2VyPC9ob21lPgotICAgICAgICAgICAgPHJlbW90ZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVtb3RlPgotICAgICAgICAgICAgPGxvY2FsLWhvbWU+amF2YS5sYW5nLkludGVnZXI8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICA8bG9jYWw+amF2YS5sYW5nLkludGVnZXI8L2xvY2FsPgotICAgICAgICAgICAgPGVqYi1jbGFzcz5qYXZhLmxhbmcuSW50ZWdlcjwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXR5cGU+QmVhbjwvcGVyc2lzdGVuY2UtdHlwZT4KLSAgICAgICAgICAgIDxwcmltLWtleS1jbGFzcz5qYXZhLmxhbmcuSW50ZWdlcjwvcHJpbS1rZXktY2xhc3M+Ci0gICAgICAgICAgICA8cmVlbnRyYW50PkZhbHNlPC9yZWVudHJhbnQ+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzI1PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuRmxvYXQ8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8yNTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzI2PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQ2hhcmFjdGVyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjY8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yNzwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlN0cmluZzwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzI3PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjg8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjg8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yOTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJvb2xlYW48L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8yOTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjU8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzI1PC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjU8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI1PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yNjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzI2PC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjY8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI2PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yNzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMjc8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8yNzwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjc8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI4PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMjg8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8yODwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjg8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI5PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8yOTwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzI5PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yOTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjU8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzI1PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8yNTwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yNTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjY8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8yNjwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMjY8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjY8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI3PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8yNzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMjc8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjc8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI4PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMjg8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzI4PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI4PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yOTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMjk8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzI5PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI5PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjU8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yNTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjY8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yNjwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjc8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yNzwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjg8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yODwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjk8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yOTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDx1c2UtY2FsbGVyLWlkZW50aXR5PjwvdXNlLWNhbGxlci1pZGVudGl0eT4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8yNTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMjU8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzI2PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8yNjwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8yNzwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMjc8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzI4PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8yODwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8yOTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMjk8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8yNTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjY8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8yNzwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnNxbC5EYXRhPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjg8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8yOTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICA8L2VudGl0eT4KLSAgICAgICAgIDxtZXNzYWdlLWRyaXZlbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMDwvZGlzcGxheS1uYW1lPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzA8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMDwvbGFyZ2UtaWNvbj4KLSAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzY8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGVqYi1jbGFzcz5qYXZhLnV0aWwuSGFzaFRhYmxlPC9lamItY2xhc3M+Ci0gICAgICAgICAgICA8dHJhbnNhY3Rpb24tdHlwZT5CZWFuPC90cmFuc2FjdGlvbi10eXBlPgotICAgICAgICAgICAgPG1lc3NhZ2Utc2VsZWN0b3I+bWVzc2FnZVNlbGVjdG9yXzA8L21lc3NhZ2Utc2VsZWN0b3I+Ci0gICAgICAgICAgICA8YWNrbm93bGVkZ2UtbW9kZT5BdXRvLWFja25vd2xlZGdlPC9hY2tub3dsZWRnZS1tb2RlPgotICAgICAgICAgICAgPG1lc3NhZ2UtZHJpdmVuLWRlc3RpbmF0aW9uPgotICAgICAgICAgICAgICAgPGRlc3RpbmF0aW9uLXR5cGU+amF2YXguam1zLlF1ZXVlPC9kZXN0aW5hdGlvbi10eXBlPgotICAgICAgICAgICAgICAgPHN1YnNjcmlwdGlvbi1kdXJhYmlsaXR5PkR1cmFibGU8L3N1YnNjcmlwdGlvbi1kdXJhYmlsaXR5PgotICAgICAgICAgICAgPC9tZXNzYWdlLWRyaXZlbi1kZXN0aW5hdGlvbj4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMzA8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Eb3VibGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8zMDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzMxPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQnl0ZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzMxPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMzI8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TaG9ydDwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzMyPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMzM8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Mb25nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMzM8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8zNDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkZsb2F0PC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMzQ8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzMwPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMzA8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8zMDwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzA8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzMxPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8zMTwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzMxPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zMTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8zMjwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzMyPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zMjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzMzPC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzM8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzMzPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zNDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzM0PC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzQ8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM0PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zMDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzMwPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8zMDwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zMDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzE8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzMxPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8zMTwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zMTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8zMjwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMzI8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzI8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzMzPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8zMzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMzM8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzM8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM0PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMzQ8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzM0PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM0PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxydW4tYXM+Ci0gICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzM8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDwvcnVuLWFzPgotICAgICAgICAgICAgPC9zZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzMwPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8zMDwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zMTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMzE8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzMyPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8zMjwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zMzwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMzM8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzM0PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8zNDwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMzA8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzMxPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5MaXN0PC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMzI8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5zcWwuRGF0YTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzMzPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMzQ8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgPC9tZXNzYWdlLWRyaXZlbj4KLSAgICAgICAgIDxzZXNzaW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8xPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMTwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8xPC9sYXJnZS1pY29uPgotICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfNzwvZWpiLW5hbWU+Ci0gICAgICAgICAgICA8aG9tZT5qYXZhLnV0aWwuTGlzdDwvaG9tZT4KLSAgICAgICAgICAgIDxyZW1vdGU+amF2YS51dGlsLkxpc3Q8L3JlbW90ZT4KLSAgICAgICAgICAgIDxsb2NhbC1ob21lPmphdmEudXRpbC5MaXN0PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgPGxvY2FsPmphdmEudXRpbC5MaXN0PC9sb2NhbD4KLSAgICAgICAgICAgIDxlamItY2xhc3M+amF2YS51dGlsLkxpc3Q8L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDxzZXNzaW9uLXR5cGU+U3RhdGVsZXNzPC9zZXNzaW9uLXR5cGU+Ci0gICAgICAgICAgICA8dHJhbnNhY3Rpb24tdHlwZT5Db250YWluZXI8L3RyYW5zYWN0aW9uLXR5cGU+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzM1PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQ2hhcmFjdGVyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMzU8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8zNjwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlN0cmluZzwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzM2PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMzc8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMzc8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8zODwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJvb2xlYW48L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8zODwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzM5PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuRG91YmxlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMzk8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM1PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8zNTwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzM1PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zNTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzY8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8zNjwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzM2PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zNjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzc8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzM3PC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzc8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM3PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zODwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzM4PC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzg8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM4PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zOTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMzk8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8zOTwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzk8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM1PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8zNTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMzU8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzU8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM2PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMzY8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzM2PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM2PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zNzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMzc8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzM3PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM3PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zODwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzM4PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8zODwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zODwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzk8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzM5PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8zOTwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zOTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzMwPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMzA8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzMxPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMzE8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzMyPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMzI8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzMzPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMzM8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzM0PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMzQ8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8dXNlLWNhbGxlci1pZGVudGl0eT48L3VzZS1jYWxsZXItaWRlbnRpdHk+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzU8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzM1PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zNjwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMzY8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzc8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzM3PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zODwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMzg8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzk8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzM5PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMzU8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzM2PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5MaXN0PC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMzc8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5zcWwuRGF0YTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzM4PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMzk8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgPC9zZXNzaW9uPgotICAgICAgICAgPGVudGl0eT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfNDwvZGlzcGxheS1uYW1lPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzQ8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fNDwvbGFyZ2UtaWNvbj4KLSAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzg8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGhvbWU+amF2YS5sYW5nLlN0cmluZzwvaG9tZT4KLSAgICAgICAgICAgIDxyZW1vdGU+amF2YS5sYW5nLlN0cmluZzwvcmVtb3RlPgotICAgICAgICAgICAgPGxvY2FsLWhvbWU+amF2YS5sYW5nLlN0cmluZzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgIDxsb2NhbD5qYXZhLmxhbmcuU3RyaW5nPC9sb2NhbD4KLSAgICAgICAgICAgIDxlamItY2xhc3M+amF2YS5sYW5nLlN0cmluZzwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXR5cGU+QmVhbjwvcGVyc2lzdGVuY2UtdHlwZT4KLSAgICAgICAgICAgIDxwcmltLWtleS1jbGFzcz5qYXZhLmxhbmcuU3RyaW5nPC9wcmltLWtleS1jbGFzcz4KLSAgICAgICAgICAgIDxyZWVudHJhbnQ+VHJ1ZTwvcmVlbnRyYW50PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV80MDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJ5dGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV80MDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzQxPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU2hvcnQ8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV80MTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzQyPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuTG9uZzwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzQyPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNDM8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5GbG9hdDwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzQzPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNDQ8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5DaGFyYWN0ZXI8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV80NDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDA8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV80MDwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzQwPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180MDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDE8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzQxPC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNDE8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQxPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80MjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzQyPC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNDI8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQyPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80MzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfNDM8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV80MzwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDM8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ0PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfNDQ8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV80NDwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDQ8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQwPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNDA8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzQwPC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQwPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80MTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNDE8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzQxPC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQxPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80MjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzQyPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV80MjwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180MjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzQzPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV80MzwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180MzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDQ8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV80NDwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNDQ8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDQ8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8zNTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzM1PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8zNjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzM2PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8zNzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzM3PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8zODwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzM4PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8zOTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzM5PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJ1bi1hcz4KLSAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfNDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPC9ydW4tYXM+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNDA8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzQwPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzQxPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV80MTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNDI8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzQyPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzQzPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV80MzwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNDQ8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzQ0PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV80MDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDE8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV80MjwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnNxbC5EYXRhPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDM8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV80NDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICA8L2VudGl0eT4KLSAgICAgICAgIDxlbnRpdHk+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzU8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl81PC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzU8L2xhcmdlLWljb24+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV85PC9lamItbmFtZT4KLSAgICAgICAgICAgIDxob21lPmphdmEudXRpbC5IYXNoVGFibGU8L2hvbWU+Ci0gICAgICAgICAgICA8cmVtb3RlPmphdmEudXRpbC5IYXNoVGFibGU8L3JlbW90ZT4KLSAgICAgICAgICAgIDxsb2NhbC1ob21lPmphdmEudXRpbC5IYXNoVGFibGU8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICA8bG9jYWw+amF2YS51dGlsLkhhc2hUYWJsZTwvbG9jYWw+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmphdmEudXRpbC5IYXNoVGFibGU8L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS10eXBlPkJlYW48L3BlcnNpc3RlbmNlLXR5cGU+Ci0gICAgICAgICAgICA8cHJpbS1rZXktY2xhc3M+amF2YS51dGlsLkhhc2hUYWJsZTwvcHJpbS1rZXktY2xhc3M+Ci0gICAgICAgICAgICA8cmVlbnRyYW50PkZhbHNlPC9yZWVudHJhbnQ+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzQ1PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNDU8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV80NjwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkludGVnZXI8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV80NjwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzQ3PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQm9vbGVhbjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzQ3PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNDg8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Eb3VibGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV80ODwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzQ5PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQnl0ZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzQ5PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80NTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfNDU8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV80NTwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDU8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ2PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfNDY8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV80NjwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDY8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ3PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV80NzwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzQ3PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180NzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80ODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDg8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV80ODwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzQ4PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180ODwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80OTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDk8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzQ5PC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNDk8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ5PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80NTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNDU8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzQ1PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ1PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80NjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzQ2PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV80NjwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180NjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDc8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzQ3PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV80NzwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180NzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80ODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDg8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV80ODwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNDg8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDg8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ5PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV80OTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNDk8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDk8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV80MDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzQwPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV80MTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzQxPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV80Mjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzQyPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV80Mzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzQzPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV80NDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzQ0PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHVzZS1jYWxsZXItaWRlbnRpdHk+PC91c2UtY2FsbGVyLWlkZW50aXR5PgotICAgICAgICAgICAgPC9zZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzQ1PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV80NTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNDY8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzQ2PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzQ3PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV80NzwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80ODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNDg8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzQ4PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzQ5PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV80OTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQ1PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV80NjwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuTGlzdDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQ3PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV80ODwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQ5PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5TdHJpbmc8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgIDwvZW50aXR5PgotICAgICAgPC9lbnRlcnByaXNlLWJlYW5zPgotICAgICAgPHJlbGF0aW9uc2hpcHM+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8ZWpiLXJlbGF0aW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbi1uYW1lPm5hbWVfMDwvZWpiLXJlbGF0aW9uLW5hbWU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5PbmU8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8yPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgPGNtci1maWVsZD4KLSAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtbmFtZT5uYW1lXzg8L2Ntci1maWVsZC1uYW1lPgotICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC10eXBlPmphdmEudXRpbC5Db2xsZWN0aW9uPC9jbXItZmllbGQtdHlwZT4KLSAgICAgICAgICAgICAgIDwvY21yLWZpZWxkPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzE8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5NYW55PC9tdWx0aXBsaWNpdHk+Ci0JCQkgICA8Y2FzY2FkZS1kZWxldGUvPgotICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzI8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICA8Y21yLWZpZWxkPgotICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC1uYW1lPm5hbWVfOTwvY21yLWZpZWxkLW5hbWU+Ci0gICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLXR5cGU+amF2YS51dGlsLkNvbGxlY3Rpb248L2Ntci1maWVsZC10eXBlPgotICAgICAgICAgICAgICAgPC9jbXItZmllbGQ+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgIDwvZWpiLXJlbGF0aW9uPgotICAgICAgICAgPGVqYi1yZWxhdGlvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb24tbmFtZT5uYW1lXzE8L2VqYi1yZWxhdGlvbi1uYW1lPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV8yPC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+T25lPC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMjwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV8zPC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+TWFueTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzI8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgIDwvZWpiLXJlbGF0aW9uPgotICAgICAgICAgPGVqYi1yZWxhdGlvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb24tbmFtZT5uYW1lXzI8L2VqYi1yZWxhdGlvbi1uYW1lPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV80PC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+T25lPC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMjwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV81PC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+TWFueTwvbXVsdGlwbGljaXR5PgotCQkJICAgPGNhc2NhZGUtZGVsZXRlLz4KLSAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8yPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICA8L2VqYi1yZWxhdGlvbj4KLSAgICAgICAgIDxlamItcmVsYXRpb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uLW5hbWU+bmFtZV8zPC9lamItcmVsYXRpb24tbmFtZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfNjwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk9uZTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzI8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfNzwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk1hbnk8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8yPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICA8L2VqYi1yZWxhdGlvbj4KLSAgICAgICAgIDxlamItcmVsYXRpb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uLW5hbWU+bmFtZV80PC9lamItcmVsYXRpb24tbmFtZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfODwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk9uZTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzI8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfOTwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk1hbnk8L211bHRpcGxpY2l0eT4KLQkJCSAgIDxjYXNjYWRlLWRlbGV0ZS8+Ci0gICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMjwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgPC9lamItcmVsYXRpb24+Ci0gICAgICA8L3JlbGF0aW9uc2hpcHM+Ci0gICAgICA8YXNzZW1ibHktZGVzY3JpcHRvcj4KLSAgICAgICAgIDxzZWN1cml0eS1yb2xlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8wPC9yb2xlLW5hbWU+Ci0gICAgICAgICA8L3NlY3VyaXR5LXJvbGU+Ci0gICAgICAgICA8c2VjdXJpdHktcm9sZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMTwvcm9sZS1uYW1lPgotICAgICAgICAgPC9zZWN1cml0eS1yb2xlPgotICAgICAgICAgPHNlY3VyaXR5LXJvbGU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzI8L3JvbGUtbmFtZT4KLSAgICAgICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgICAgICAgIDxzZWN1cml0eS1yb2xlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8zPC9yb2xlLW5hbWU+Ci0gICAgICAgICA8L3NlY3VyaXR5LXJvbGU+Ci0gICAgICAgICA8c2VjdXJpdHktcm9sZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfNDwvcm9sZS1uYW1lPgotICAgICAgICAgPC9zZWN1cml0eS1yb2xlPgotICAgICAgICAgPG1ldGhvZC1wZXJtaXNzaW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVuY2hlY2tlZC8+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMDwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8wPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzE8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPjwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzI8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMzwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV80PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzU8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgPC9tZXRob2QtcGVybWlzc2lvbj4KLSAgICAgICAgIDxtZXRob2QtcGVybWlzc2lvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzU8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV82PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz48L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV83PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzc8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzY8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzg8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzg8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzc8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfODwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfOTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzk8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzk8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTA8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTE8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgPC9tZXRob2QtcGVybWlzc2lvbj4KLSAgICAgICAgIDxtZXRob2QtcGVybWlzc2lvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8xPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzA8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTA8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzExPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzE8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xMTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz48L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMjwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xMjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTI8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8zPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xMzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTM8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTQ8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV80PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTQ8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzE1PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzE2PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzE3PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgIDwvbWV0aG9kLXBlcm1pc3Npb24+Ci0gICAgICAgICA8bWV0aG9kLXBlcm1pc3Npb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzA8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8yPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzU8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTU8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzY8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xNjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz48L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfNzwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xNzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTg8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV84PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xODwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTk8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjA8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV85PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTk8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzIxPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzIyPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzIzPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgIDwvbWV0aG9kLXBlcm1pc3Npb24+Ci0gICAgICAgICA8bWV0aG9kLXBlcm1pc3Npb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzA8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8yPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzM8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMDwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yMDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzIxPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPjwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8yPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzIyPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yNDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzM8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzIzPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yNTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yNjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzQ8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yNDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjc8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjg8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjk8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgPC9tZXRob2QtcGVybWlzc2lvbj4KLSAgICAgICAgIDxjb250YWluZXItdHJhbnNhY3Rpb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzU8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjU8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzY8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yNjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz48L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfNzwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yNzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMzA8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV84PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yODwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMzE8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMzI8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV85PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjk8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzMzPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzM0PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzM1PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDx0cmFucy1hdHRyaWJ1dGU+Tm90U3VwcG9ydGVkPC90cmFucy1hdHRyaWJ1dGU+Ci0gICAgICAgICA8L2NvbnRhaW5lci10cmFuc2FjdGlvbj4KLSAgICAgICAgIDxjb250YWluZXItdHJhbnNhY3Rpb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzA8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzA8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzE8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zMTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz48L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMjwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zMjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMzY8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8zPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zMzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMzc8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMzg8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV80PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzQ8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzM5PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQwPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQxPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDx0cmFucy1hdHRyaWJ1dGU+U3VwcG9ydHM8L3RyYW5zLWF0dHJpYnV0ZT4KLSAgICAgICAgIDwvY29udGFpbmVyLXRyYW5zYWN0aW9uPgotICAgICAgICAgPGNvbnRhaW5lci10cmFuc2FjdGlvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfNTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zNTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfNjwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzM2PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPjwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV83PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzM3PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180MjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzg8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzM4PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180MzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180NDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzk8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zOTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDU8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDY8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDc8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPHRyYW5zLWF0dHJpYnV0ZT5SZXF1aXJlZDwvdHJhbnMtYXR0cmlidXRlPgotICAgICAgICAgPC9jb250YWluZXItdHJhbnNhY3Rpb24+Ci0gICAgICAgICA8Y29udGFpbmVyLXRyYW5zYWN0aW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8wPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQwPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8xPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDE8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+PC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzI8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDI8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQ4PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMzwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDM8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQ5PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzUwPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfNDwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQ0PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181MTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181MjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181MzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8dHJhbnMtYXR0cmlidXRlPlJlcXVpcmVzTmV3PC90cmFucy1hdHRyaWJ1dGU+Ci0gICAgICAgICA8L2NvbnRhaW5lci10cmFuc2FjdGlvbj4KLSAgICAgICAgIDxjb250YWluZXItdHJhbnNhY3Rpb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzU8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDU8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzY8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80NjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz48L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfNzwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80NzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTQ8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80ODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV84PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80ODwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTU8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTY8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80OTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV85PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDk8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzU3PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzU4PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzU5PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDx0cmFucy1hdHRyaWJ1dGU+TWFuZGF0b3J5PC90cmFucy1hdHRyaWJ1dGU+Ci0gICAgICAgICA8L2NvbnRhaW5lci10cmFuc2FjdGlvbj4KLSAgICAgICAgIDxleGNsdWRlLWxpc3Q+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzUwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzA8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNTA8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzUxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzE8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV81MTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz48L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMjwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV81MjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNjA8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81MzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8zPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV81MzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNjE8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNjI8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81NDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV80PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNTQ8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzYzPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzY0PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzY1PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgIDwvZXhjbHVkZS1saXN0PgotICAgICAgPC9hc3NlbWJseS1kZXNjcmlwdG9yPgotICAgICAgPGVqYi1jbGllbnQtamFyPmVqYkNsaWVudEphcl8wPC9lamItY2xpZW50LWphcj4KLSAgIDwvZWpiLWphcj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9FTUZUZXN0Tm9JRC9yYS54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvRU1GVGVzdE5vSUQvcmEueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTJhMjYyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9FTUZUZXN0Tm9JRC9yYS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBjb25uZWN0b3IgUFVCTElDICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgQ29ubmVjdG9yIDEuMC8vRU4iICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9jb25uZWN0b3JfMV8wLmR0ZCI+Ci08Y29ubmVjdG9yPgotICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMDwvZGlzcGxheS1uYW1lPgotICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICA8aWNvbj4KLSAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzA8L3NtYWxsLWljb24+Ci0gICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8wPC9sYXJnZS1pY29uPgotICAgIDwvaWNvbj4KLSAgICA8dmVuZG9yLW5hbWU+dmVuZG9yTmFtZV8wPC92ZW5kb3ItbmFtZT4KLSAgICA8c3BlYy12ZXJzaW9uPjEuMDwvc3BlYy12ZXJzaW9uPgotICAgIDxlaXMtdHlwZT5laXNUeXBlXzA8L2Vpcy10eXBlPgotICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgICA8bGljZW5zZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bGljZW5zZS1yZXF1aXJlZD50cnVlPC9saWNlbnNlLXJlcXVpcmVkPgotICAgIDwvbGljZW5zZT4KLSAgICA8cmVzb3VyY2VhZGFwdGVyPgotICAgICAgICA8bWFuYWdlZGNvbm5lY3Rpb25mYWN0b3J5LWNsYXNzPm1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzXzA8L21hbmFnZWRjb25uZWN0aW9uZmFjdG9yeS1jbGFzcz4KLSAgICAgICAgPGNvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZT5jb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZV8wPC9jb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2U+Ci0gICAgICAgIDxjb25uZWN0aW9uZmFjdG9yeS1pbXBsLWNsYXNzPmNvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzXzA8L2Nvbm5lY3Rpb25mYWN0b3J5LWltcGwtY2xhc3M+Ci0gICAgICAgIDxjb25uZWN0aW9uLWludGVyZmFjZT5jb25uZWN0aW9uSW50ZXJmYWNlXzA8L2Nvbm5lY3Rpb24taW50ZXJmYWNlPgotICAgICAgICA8Y29ubmVjdGlvbi1pbXBsLWNsYXNzPmNvbm5lY3Rpb25JbXBsQ2xhc3NfMDwvY29ubmVjdGlvbi1pbXBsLWNsYXNzPgotICAgICAgICA8dHJhbnNhY3Rpb24tc3VwcG9ydD5Ob1RyYW5zYWN0aW9uPC90cmFuc2FjdGlvbi1zdXBwb3J0PgotICAgICAgICA8Y29uZmlnLXByb3BlcnR5PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS1uYW1lPm5hbWVfMDwvY29uZmlnLXByb3BlcnR5LW5hbWU+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5LXR5cGU+amF2YS5sYW5nLlN0cmluZzwvY29uZmlnLXByb3BlcnR5LXR5cGU+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5LXZhbHVlPnZhbHVlXzA8L2NvbmZpZy1wcm9wZXJ0eS12YWx1ZT4KLSAgICAgICAgPC9jb25maWctcHJvcGVydHk+Ci0gICAgICAgIDxjb25maWctcHJvcGVydHk+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5LW5hbWU+bmFtZV8xPC9jb25maWctcHJvcGVydHktbmFtZT4KLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydHktdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9jb25maWctcHJvcGVydHktdHlwZT4KLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydHktdmFsdWU+dmFsdWVfMTwvY29uZmlnLXByb3BlcnR5LXZhbHVlPgotICAgICAgICA8L2NvbmZpZy1wcm9wZXJ0eT4KLSAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydHktbmFtZT5uYW1lXzI8L2NvbmZpZy1wcm9wZXJ0eS1uYW1lPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS10eXBlPmphdmEubGFuZy5TdHJpbmc8L2NvbmZpZy1wcm9wZXJ0eS10eXBlPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS12YWx1ZT52YWx1ZV8yPC9jb25maWctcHJvcGVydHktdmFsdWU+Ci0gICAgICAgIDwvY29uZmlnLXByb3BlcnR5PgotICAgICAgICA8Y29uZmlnLXByb3BlcnR5PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS1uYW1lPm5hbWVfMzwvY29uZmlnLXByb3BlcnR5LW5hbWU+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5LXR5cGU+amF2YS5sYW5nLlN0cmluZzwvY29uZmlnLXByb3BlcnR5LXR5cGU+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5LXZhbHVlPnZhbHVlXzM8L2NvbmZpZy1wcm9wZXJ0eS12YWx1ZT4KLSAgICAgICAgPC9jb25maWctcHJvcGVydHk+Ci0gICAgICAgIDxjb25maWctcHJvcGVydHk+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5LW5hbWU+bmFtZV80PC9jb25maWctcHJvcGVydHktbmFtZT4KLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydHktdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9jb25maWctcHJvcGVydHktdHlwZT4KLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydHktdmFsdWU+dmFsdWVfNDwvY29uZmlnLXByb3BlcnR5LXZhbHVlPgotICAgICAgICA8L2NvbmZpZy1wcm9wZXJ0eT4KLSAgICAgICAgPGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT5CYXNpY1Bhc3N3b3JkPC9hdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT4KLSAgICAgICAgICAgIDxjcmVkZW50aWFsLWludGVyZmFjZT5qYXZheC5yZXNvdXJjZS5zcGkuc2VjdXJpdHkuUGFzc3dvcmRDcmVkZW50aWFsPC9jcmVkZW50aWFsLWludGVyZmFjZT4KLSAgICAgICAgPC9hdXRoZW50aWNhdGlvbi1tZWNoYW5pc20+Ci0gICAgICAgIDxhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8YXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+S2VyYnY1PC9hdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT4KLSAgICAgICAgICAgIDxjcmVkZW50aWFsLWludGVyZmFjZT5qYXZheC5yZXNvdXJjZS5zcGkuc2VjdXJpdHkuUGFzc3dvcmRDcmVkZW50aWFsPC9jcmVkZW50aWFsLWludGVyZmFjZT4KLSAgICAgICAgPC9hdXRoZW50aWNhdGlvbi1tZWNoYW5pc20+Ci0gICAgICAgIDxhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8YXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+QmFzaWNQYXNzd29yZDwvYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+Ci0gICAgICAgICAgICA8Y3JlZGVudGlhbC1pbnRlcmZhY2U+amF2YXgucmVzb3VyY2Uuc3BpLnNlY3VyaXR5LlBhc3N3b3JkQ3JlZGVudGlhbDwvY3JlZGVudGlhbC1pbnRlcmZhY2U+Ci0gICAgICAgIDwvYXV0aGVudGljYXRpb24tbWVjaGFuaXNtPgotICAgICAgICA8YXV0aGVudGljYXRpb24tbWVjaGFuaXNtPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPktlcmJ2NTwvYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+Ci0gICAgICAgICAgICA8Y3JlZGVudGlhbC1pbnRlcmZhY2U+amF2YXgucmVzb3VyY2Uuc3BpLnNlY3VyaXR5LlBhc3N3b3JkQ3JlZGVudGlhbDwvY3JlZGVudGlhbC1pbnRlcmZhY2U+Ci0gICAgICAgIDwvYXV0aGVudGljYXRpb24tbWVjaGFuaXNtPgotICAgICAgICA8YXV0aGVudGljYXRpb24tbWVjaGFuaXNtPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPkJhc2ljUGFzc3dvcmQ8L2F1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPgotICAgICAgICAgICAgPGNyZWRlbnRpYWwtaW50ZXJmYWNlPmphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5QYXNzd29yZENyZWRlbnRpYWw8L2NyZWRlbnRpYWwtaW50ZXJmYWNlPgotICAgICAgICA8L2F1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbT4KLSAgICAgICAgPHJlYXV0aGVudGljYXRpb24tc3VwcG9ydD50cnVlPC9yZWF1dGhlbnRpY2F0aW9uLXN1cHBvcnQ+Ci0gICAgICAgIDxzZWN1cml0eS1wZXJtaXNzaW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHNlY3VyaXR5LXBlcm1pc3Npb24tc3BlYz5zcGVjaWZpY2F0aW9uXzA8L3NlY3VyaXR5LXBlcm1pc3Npb24tc3BlYz4KLSAgICAgICAgPC9zZWN1cml0eS1wZXJtaXNzaW9uPgotICAgICAgICA8c2VjdXJpdHktcGVybWlzc2lvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1wZXJtaXNzaW9uLXNwZWM+c3BlY2lmaWNhdGlvbl8xPC9zZWN1cml0eS1wZXJtaXNzaW9uLXNwZWM+Ci0gICAgICAgIDwvc2VjdXJpdHktcGVybWlzc2lvbj4KLSAgICAgICAgPHNlY3VyaXR5LXBlcm1pc3Npb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcGVybWlzc2lvbi1zcGVjPnNwZWNpZmljYXRpb25fMjwvc2VjdXJpdHktcGVybWlzc2lvbi1zcGVjPgotICAgICAgICA8L3NlY3VyaXR5LXBlcm1pc3Npb24+Ci0gICAgICAgIDxzZWN1cml0eS1wZXJtaXNzaW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHNlY3VyaXR5LXBlcm1pc3Npb24tc3BlYz5zcGVjaWZpY2F0aW9uXzM8L3NlY3VyaXR5LXBlcm1pc3Npb24tc3BlYz4KLSAgICAgICAgPC9zZWN1cml0eS1wZXJtaXNzaW9uPgotICAgICAgICA8c2VjdXJpdHktcGVybWlzc2lvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1wZXJtaXNzaW9uLXNwZWM+c3BlY2lmaWNhdGlvbl80PC9zZWN1cml0eS1wZXJtaXNzaW9uLXNwZWM+Ci0gICAgICAgIDwvc2VjdXJpdHktcGVybWlzc2lvbj4KLSAgICA8L3Jlc291cmNlYWRhcHRlcj4KLTwvY29ubmVjdG9yPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL0VNRlRlc3ROb0lEL3dlYi54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvRU1GVGVzdE5vSUQvd2ViLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM0ZWM1Ny4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvRU1GVGVzdE5vSUQvd2ViLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyODQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSB3ZWItYXBwIFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIFdlYiBBcHBsaWNhdGlvbiAyLjMvL0VOIiAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvd2ViLWFwcF8yXzMuZHRkIj4KLTx3ZWItYXBwIGlkPSJXZWJBcHBfSUQiPgotICAgIDxpY29uPgotICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMDwvc21hbGwtaWNvbj4KLSAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzA8L2xhcmdlLWljb24+Ci0gICAgPC9pY29uPgotICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMDwvZGlzcGxheS1uYW1lPgotICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICA8ZGlzdHJpYnV0YWJsZS8+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8wPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8wPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzE8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzE8L3BhcmFtLXZhbHVlPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMjwvcGFyYW0tdmFsdWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8zPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8zPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzQ8L3BhcmFtLXZhbHVlPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxmaWx0ZXI+Ci0gICAgICAgIDxpY29uPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzA8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMDwvbGFyZ2UtaWNvbj4KLSAgICAgICAgPC9pY29uPgotICAgICAgICA8ZmlsdGVyLW5hbWU+bmFtZV8wPC9maWx0ZXItbmFtZT4KLSAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8wPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGZpbHRlci1jbGFzcz5qYXZhLnV0aWwuSGFzaFRhYmxlPC9maWx0ZXItY2xhc3M+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzI1PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMjU8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8yNjwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzI2PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMjc8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8yNzwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjc8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzI4PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMjg8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8yOTwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzI5PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICA8L2ZpbHRlcj4KLSAgICA8ZmlsdGVyPgotICAgICAgICA8aWNvbj4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8xPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzE8L2xhcmdlLWljb24+Ci0gICAgICAgIDwvaWNvbj4KLSAgICAgICAgPGZpbHRlci1uYW1lPm5hbWVfMTwvZmlsdGVyLW5hbWU+Ci0gICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMTwvZGlzcGxheS1uYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxmaWx0ZXItY2xhc3M+amF2YS51dGlsLkxpc3Q8L2ZpbHRlci1jbGFzcz4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMzA8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8zMDwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzMxPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMzE8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8zMjwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzMyPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMzM8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8zMzwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzM0PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMzQ8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgIDwvZmlsdGVyPgotICAgIDxmaWx0ZXI+Ci0gICAgICAgIDxpY29uPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzI8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMjwvbGFyZ2UtaWNvbj4KLSAgICAgICAgPC9pY29uPgotICAgICAgICA8ZmlsdGVyLW5hbWU+bmFtZV8yPC9maWx0ZXItbmFtZT4KLSAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8yPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGZpbHRlci1jbGFzcz5qYXZhLnNxbC5EYXRhPC9maWx0ZXItY2xhc3M+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzM1PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMzU8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8zNjwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzM2PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMzc8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8zNzwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzM4PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMzg8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8zOTwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzM5PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICA8L2ZpbHRlcj4KLSAgICA8ZmlsdGVyPgotICAgICAgICA8aWNvbj4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8zPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzM8L2xhcmdlLWljb24+Ci0gICAgICAgIDwvaWNvbj4KLSAgICAgICAgPGZpbHRlci1uYW1lPm5hbWVfMzwvZmlsdGVyLW5hbWU+Ci0gICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMzwvZGlzcGxheS1uYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxmaWx0ZXItY2xhc3M+amF2YS5sYW5nLkludGVnZXI8L2ZpbHRlci1jbGFzcz4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfNDA8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV80MDwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzQxPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfNDE8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV80MjwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzQyPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfNDM8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV80MzwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDM8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzQ0PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfNDQ8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgIDwvZmlsdGVyPgotICAgIDxmaWx0ZXI+Ci0gICAgICAgIDxpY29uPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzQ8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fNDwvbGFyZ2UtaWNvbj4KLSAgICAgICAgPC9pY29uPgotICAgICAgICA8ZmlsdGVyLW5hbWU+bmFtZV80PC9maWx0ZXItbmFtZT4KLSAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV80PC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGZpbHRlci1jbGFzcz5qYXZhLmxhbmcuU3RyaW5nPC9maWx0ZXItY2xhc3M+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzQ1PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfNDU8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV80NjwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzQ2PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfNDc8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV80NzwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDc8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzQ4PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfNDg8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV80OTwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzQ5PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80OTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICA8L2ZpbHRlcj4KLSAgICA8ZmlsdGVyLW1hcHBpbmc+Ci0gICAgICAgIDxmaWx0ZXItbmFtZT5uYW1lXzA8L2ZpbHRlci1uYW1lPgotICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8wPC91cmwtcGF0dGVybj4KLSAgICA8L2ZpbHRlci1tYXBwaW5nPgotICAgIDxmaWx0ZXItbWFwcGluZz4KLSAgICAgICAgPGZpbHRlci1uYW1lPm5hbWVfMTwvZmlsdGVyLW5hbWU+Ci0gICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzE8L3VybC1wYXR0ZXJuPgotICAgIDwvZmlsdGVyLW1hcHBpbmc+Ci0gICAgPGZpbHRlci1tYXBwaW5nPgotICAgICAgICA8ZmlsdGVyLW5hbWU+bmFtZV8yPC9maWx0ZXItbmFtZT4KLSAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMjwvdXJsLXBhdHRlcm4+Ci0gICAgPC9maWx0ZXItbWFwcGluZz4KLSAgICA8ZmlsdGVyLW1hcHBpbmc+Ci0gICAgICAgIDxmaWx0ZXItbmFtZT5uYW1lXzM8L2ZpbHRlci1uYW1lPgotICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8zPC91cmwtcGF0dGVybj4KLSAgICA8L2ZpbHRlci1tYXBwaW5nPgotICAgIDxmaWx0ZXItbWFwcGluZz4KLSAgICAgICAgPGZpbHRlci1uYW1lPm5hbWVfNDwvZmlsdGVyLW5hbWU+Ci0gICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzQ8L3VybC1wYXR0ZXJuPgotICAgIDwvZmlsdGVyLW1hcHBpbmc+Ci0gICAgPGxpc3RlbmVyPgotICAgICAgICA8bGlzdGVuZXItY2xhc3M+amF2YS51dGlsLkhhc2hUYWJsZTwvbGlzdGVuZXItY2xhc3M+Ci0gICAgPC9saXN0ZW5lcj4KLSAgICA8bGlzdGVuZXI+Ci0gICAgICAgIDxsaXN0ZW5lci1jbGFzcz5qYXZhLnV0aWwuTGlzdDwvbGlzdGVuZXItY2xhc3M+Ci0gICAgPC9saXN0ZW5lcj4KLSAgICA8bGlzdGVuZXI+Ci0gICAgICAgIDxsaXN0ZW5lci1jbGFzcz5qYXZhLnNxbC5EYXRhPC9saXN0ZW5lci1jbGFzcz4KLSAgICA8L2xpc3RlbmVyPgotICAgIDxsaXN0ZW5lcj4KLSAgICAgICAgPGxpc3RlbmVyLWNsYXNzPmphdmEubGFuZy5JbnRlZ2VyPC9saXN0ZW5lci1jbGFzcz4KLSAgICA8L2xpc3RlbmVyPgotICAgIDxsaXN0ZW5lcj4KLSAgICAgICAgPGxpc3RlbmVyLWNsYXNzPmphdmEubGFuZy5TdHJpbmc8L2xpc3RlbmVyLWNsYXNzPgotICAgIDwvbGlzdGVuZXI+Ci0gICAgPHNlcnZsZXQ+Ci0gICAgICAgIDxpY29uPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzA8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMDwvbGFyZ2UtaWNvbj4KLSAgICAgICAgPC9pY29uPgotICAgICAgICA8c2VydmxldC1uYW1lPnNlcnZsZXROYW1lXzA8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8wPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGpzcC1maWxlPmpzcEZpbGVfMDwvanNwLWZpbGU+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzA8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8wPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8xPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMTwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMjwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzI8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzM8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8zPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV80PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfNDwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4wPC9sb2FkLW9uLXN0YXJ0dXA+Ci0gICAgICAgIDxydW4tYXM+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzA8L3JvbGUtbmFtZT4KLSAgICAgICAgPC9ydW4tYXM+Ci0gICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8wPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMDwvcm9sZS1saW5rPgotICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzE8L3JvbGUtbGluaz4KLSAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzI8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yPC9yb2xlLWxpbms+Ci0gICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8zPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMzwvcm9sZS1saW5rPgotICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzQ8L3JvbGUtbGluaz4KLSAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICA8L3NlcnZsZXQ+Ci0gICAgPHNlcnZsZXQ+Ci0gICAgICAgIDxpY29uPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzE8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMTwvbGFyZ2UtaWNvbj4KLSAgICAgICAgPC9pY29uPgotICAgICAgICA8c2VydmxldC1uYW1lPnNlcnZsZXROYW1lXzE8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8xPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHNlcnZsZXQtY2xhc3M+Y2xhc3NOYW1lXzA8L3NlcnZsZXQtY2xhc3M+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzU8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV81PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV82PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfNjwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfNzwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzc8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzg8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV84PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV85PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfOTwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+Ci0gICAgICAgIDxydW4tYXM+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzE8L3JvbGUtbmFtZT4KLSAgICAgICAgPC9ydW4tYXM+Ci0gICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV81PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNTwvcm9sZS1saW5rPgotICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzY8L3JvbGUtbGluaz4KLSAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzc8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua183PC9yb2xlLWxpbms+Ci0gICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV84PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfODwvcm9sZS1saW5rPgotICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfOTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzk8L3JvbGUtbGluaz4KLSAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICA8L3NlcnZsZXQ+Ci0gICAgPHNlcnZsZXQ+Ci0gICAgICAgIDxpY29uPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzI8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMjwvbGFyZ2UtaWNvbj4KLSAgICAgICAgPC9pY29uPgotICAgICAgICA8c2VydmxldC1uYW1lPnNlcnZsZXROYW1lXzI8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8yPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGpzcC1maWxlPmpzcEZpbGVfMTwvanNwLWZpbGU+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzEwPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMTA8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8xMTwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzExPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMTI8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8xMjwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzEzPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMTM8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8xNDwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzE0PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4yPC9sb2FkLW9uLXN0YXJ0dXA+Ci0gICAgICAgIDxydW4tYXM+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzI8L3JvbGUtbmFtZT4KLSAgICAgICAgPC9ydW4tYXM+Ci0gICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTA8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xMDwvcm9sZS1saW5rPgotICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzExPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTE8L3JvbGUtbGluaz4KLSAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xMjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzEyPC9yb2xlLWxpbms+Ci0gICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTM8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xMzwvcm9sZS1saW5rPgotICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzE0PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTQ8L3JvbGUtbGluaz4KLSAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICA8L3NlcnZsZXQ+Ci0gICAgPHNlcnZsZXQ+Ci0gICAgICAgIDxpY29uPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzM8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMzwvbGFyZ2UtaWNvbj4KLSAgICAgICAgPC9pY29uPgotICAgICAgICA8c2VydmxldC1uYW1lPnNlcnZsZXROYW1lXzM8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8zPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHNlcnZsZXQtY2xhc3M+Y2xhc3NOYW1lXzE8L3NlcnZsZXQtY2xhc3M+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzE1PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMTU8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8xNjwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzE2PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMTc8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8xNzwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTc8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzE4PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMTg8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8xOTwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzE5PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4zPC9sb2FkLW9uLXN0YXJ0dXA+Ci0gICAgICAgIDxydW4tYXM+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzM8L3JvbGUtbmFtZT4KLSAgICAgICAgPC9ydW4tYXM+Ci0gICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTU8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xNTwvcm9sZS1saW5rPgotICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzE2PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTY8L3JvbGUtbGluaz4KLSAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xNzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzE3PC9yb2xlLWxpbms+Ci0gICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTg8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xODwvcm9sZS1saW5rPgotICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzE5PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTk8L3JvbGUtbGluaz4KLSAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICA8L3NlcnZsZXQ+Ci0gICAgPHNlcnZsZXQ+Ci0gICAgICAgIDxpY29uPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzQ8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fNDwvbGFyZ2UtaWNvbj4KLSAgICAgICAgPC9pY29uPgotICAgICAgICA8c2VydmxldC1uYW1lPnNlcnZsZXROYW1lXzQ8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV80PC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGpzcC1maWxlPmpzcEZpbGVfMjwvanNwLWZpbGU+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzIwPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMjA8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8yMTwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzIxPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMjI8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8yMjwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzIzPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMjM8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8yNDwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzI0PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGxvYWQtb24tc3RhcnR1cD40PC9sb2FkLW9uLXN0YXJ0dXA+Ci0gICAgICAgIDxydW4tYXM+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzQ8L3JvbGUtbmFtZT4KLSAgICAgICAgPC9ydW4tYXM+Ci0gICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjA8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yMDwvcm9sZS1saW5rPgotICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzIxPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjE8L3JvbGUtbGluaz4KLSAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yMjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzIyPC9yb2xlLWxpbms+Ci0gICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjM8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yMzwvcm9sZS1saW5rPgotICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzI0PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjQ8L3JvbGUtbGluaz4KLSAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICA8L3NlcnZsZXQ+Ci0gICAgPHNlcnZsZXQtbWFwcGluZz4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5zZXJ2bGV0TmFtZV8wPC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzA8L3VybC1wYXR0ZXJuPgotICAgIDwvc2VydmxldC1tYXBwaW5nPgotICAgIDxzZXJ2bGV0LW1hcHBpbmc+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+c2VydmxldE5hbWVfMTwvc2VydmxldC1uYW1lPgotICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xPC91cmwtcGF0dGVybj4KLSAgICA8L3NlcnZsZXQtbWFwcGluZz4KLSAgICA8c2VydmxldC1tYXBwaW5nPgotICAgICAgICA8c2VydmxldC1uYW1lPnNlcnZsZXROYW1lXzI8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMjwvdXJsLXBhdHRlcm4+Ci0gICAgPC9zZXJ2bGV0LW1hcHBpbmc+Ci0gICAgPHNlcnZsZXQtbWFwcGluZz4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5zZXJ2bGV0TmFtZV8zPC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzM8L3VybC1wYXR0ZXJuPgotICAgIDwvc2VydmxldC1tYXBwaW5nPgotICAgIDxzZXJ2bGV0LW1hcHBpbmc+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+c2VydmxldE5hbWVfNDwvc2VydmxldC1uYW1lPgotICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl80PC91cmwtcGF0dGVybj4KLSAgICA8L3NlcnZsZXQtbWFwcGluZz4KLSAgICA8c2Vzc2lvbi1jb25maWc+Ci0gICAgICAgIDxzZXNzaW9uLXRpbWVvdXQ+MDwvc2Vzc2lvbi10aW1lb3V0PgotICAgIDwvc2Vzc2lvbi1jb25maWc+Ci0gICAgPG1pbWUtbWFwcGluZz4KLSAgICAgICAgPGV4dGVuc2lvbj5leHRlbnNpb25fMDwvZXh0ZW5zaW9uPgotICAgICAgICA8bWltZS10eXBlPm1pbWVUeXBlXzA8L21pbWUtdHlwZT4KLSAgICA8L21pbWUtbWFwcGluZz4KLSAgICA8bWltZS1tYXBwaW5nPgotICAgICAgICA8ZXh0ZW5zaW9uPmV4dGVuc2lvbl8xPC9leHRlbnNpb24+Ci0gICAgICAgIDxtaW1lLXR5cGU+bWltZVR5cGVfMTwvbWltZS10eXBlPgotICAgIDwvbWltZS1tYXBwaW5nPgotICAgIDxtaW1lLW1hcHBpbmc+Ci0gICAgICAgIDxleHRlbnNpb24+ZXh0ZW5zaW9uXzI8L2V4dGVuc2lvbj4KLSAgICAgICAgPG1pbWUtdHlwZT5taW1lVHlwZV8yPC9taW1lLXR5cGU+Ci0gICAgPC9taW1lLW1hcHBpbmc+Ci0gICAgPG1pbWUtbWFwcGluZz4KLSAgICAgICAgPGV4dGVuc2lvbj5leHRlbnNpb25fMzwvZXh0ZW5zaW9uPgotICAgICAgICA8bWltZS10eXBlPm1pbWVUeXBlXzM8L21pbWUtdHlwZT4KLSAgICA8L21pbWUtbWFwcGluZz4KLSAgICA8bWltZS1tYXBwaW5nPgotICAgICAgICA8ZXh0ZW5zaW9uPmV4dGVuc2lvbl80PC9leHRlbnNpb24+Ci0gICAgICAgIDxtaW1lLXR5cGU+bWltZVR5cGVfNDwvbWltZS10eXBlPgotICAgIDwvbWltZS1tYXBwaW5nPgotICAgIDx3ZWxjb21lLWZpbGUtbGlzdD4KLSAgICAgICAgPHdlbGNvbWUtZmlsZT53ZWxjb21lRmlsZV8wPC93ZWxjb21lLWZpbGU+Ci0gICAgICAgIDx3ZWxjb21lLWZpbGU+d2VsY29tZUZpbGVfMTwvd2VsY29tZS1maWxlPgotICAgICAgICA8d2VsY29tZS1maWxlPndlbGNvbWVGaWxlXzI8L3dlbGNvbWUtZmlsZT4KLSAgICAgICAgPHdlbGNvbWUtZmlsZT53ZWxjb21lRmlsZV8zPC93ZWxjb21lLWZpbGU+Ci0gICAgICAgIDx3ZWxjb21lLWZpbGU+d2VsY29tZUZpbGVfNDwvd2VsY29tZS1maWxlPgotICAgIDwvd2VsY29tZS1maWxlLWxpc3Q+Ci0gICAgPGVycm9yLXBhZ2U+Ci0gICAgICAgIDxleGNlcHRpb24tdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9leGNlcHRpb24tdHlwZT4KLSAgICAgICAgPGxvY2F0aW9uPmxvY2F0aW9uXzA8L2xvY2F0aW9uPgotICAgIDwvZXJyb3ItcGFnZT4KLSAgICA8ZXJyb3ItcGFnZT4KLSAgICAgICAgPGVycm9yLWNvZGU+ZXJyb3JDb2RlXzA8L2Vycm9yLWNvZGU+Ci0gICAgICAgIDxsb2NhdGlvbj5sb2NhdGlvbl8wPC9sb2NhdGlvbj4KLSAgICA8L2Vycm9yLXBhZ2U+Ci0gICAgPGVycm9yLXBhZ2U+Ci0gICAgICAgIDxleGNlcHRpb24tdHlwZT5qYXZhLnV0aWwuTGlzdDwvZXhjZXB0aW9uLXR5cGU+Ci0gICAgICAgIDxsb2NhdGlvbj5sb2NhdGlvbl8xPC9sb2NhdGlvbj4KLSAgICA8L2Vycm9yLXBhZ2U+Ci0gICAgPGVycm9yLXBhZ2U+Ci0gICAgICAgIDxlcnJvci1jb2RlPmVycm9yQ29kZV8xPC9lcnJvci1jb2RlPgotICAgICAgICA8bG9jYXRpb24+bG9jYXRpb25fMTwvbG9jYXRpb24+Ci0gICAgPC9lcnJvci1wYWdlPgotICAgIDxlcnJvci1wYWdlPgotICAgICAgICA8ZXhjZXB0aW9uLXR5cGU+amF2YS5zcWwuRGF0YTwvZXhjZXB0aW9uLXR5cGU+Ci0gICAgICAgIDxsb2NhdGlvbj5sb2NhdGlvbl8yPC9sb2NhdGlvbj4KLSAgICA8L2Vycm9yLXBhZ2U+Ci0gICAgPHRhZ2xpYj4KLSAgICAgICAgPHRhZ2xpYi11cmk+dGFnbGliVVJJXzA8L3RhZ2xpYi11cmk+Ci0gICAgICAgIDx0YWdsaWItbG9jYXRpb24+dGFnbGliTG9jYXRpb25fMDwvdGFnbGliLWxvY2F0aW9uPgotICAgIDwvdGFnbGliPgotICAgIDx0YWdsaWI+Ci0gICAgICAgIDx0YWdsaWItdXJpPnRhZ2xpYlVSSV8xPC90YWdsaWItdXJpPgotICAgICAgICA8dGFnbGliLWxvY2F0aW9uPnRhZ2xpYkxvY2F0aW9uXzE8L3RhZ2xpYi1sb2NhdGlvbj4KLSAgICA8L3RhZ2xpYj4KLSAgICA8dGFnbGliPgotICAgICAgICA8dGFnbGliLXVyaT50YWdsaWJVUklfMjwvdGFnbGliLXVyaT4KLSAgICAgICAgPHRhZ2xpYi1sb2NhdGlvbj50YWdsaWJMb2NhdGlvbl8yPC90YWdsaWItbG9jYXRpb24+Ci0gICAgPC90YWdsaWI+Ci0gICAgPHRhZ2xpYj4KLSAgICAgICAgPHRhZ2xpYi11cmk+dGFnbGliVVJJXzM8L3RhZ2xpYi11cmk+Ci0gICAgICAgIDx0YWdsaWItbG9jYXRpb24+dGFnbGliTG9jYXRpb25fMzwvdGFnbGliLWxvY2F0aW9uPgotICAgIDwvdGFnbGliPgotICAgIDx0YWdsaWI+Ci0gICAgICAgIDx0YWdsaWItdXJpPnRhZ2xpYlVSSV80PC90YWdsaWItdXJpPgotICAgICAgICA8dGFnbGliLWxvY2F0aW9uPnRhZ2xpYkxvY2F0aW9uXzQ8L3RhZ2xpYi1sb2NhdGlvbj4KLSAgICA8L3RhZ2xpYj4KLSAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzE8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuTGlzdDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzM8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5TdHJpbmc8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMDwvcmVzLXJlZi1uYW1lPgotICAgICAgICA8cmVzLXR5cGU+dHlwZV8wPC9yZXMtdHlwZT4KLSAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgIDwvcmVzb3VyY2UtcmVmPgotICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzE8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgPHJlcy10eXBlPnR5cGVfMTwvcmVzLXR5cGU+Ci0gICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjwvcmVzLXJlZi1uYW1lPgotICAgICAgICA8cmVzLXR5cGU+dHlwZV8yPC9yZXMtdHlwZT4KLSAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgIDwvcmVzb3VyY2UtcmVmPgotICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzM8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgPHJlcy10eXBlPnR5cGVfMzwvcmVzLXR5cGU+Ci0gICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNDwvcmVzLXJlZi1uYW1lPgotICAgICAgICA8cmVzLXR5cGU+dHlwZV80PC9yZXMtdHlwZT4KLSAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgIDwvcmVzb3VyY2UtcmVmPgotICAgIDxzZWN1cml0eS1jb25zdHJhaW50PgotICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzA8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV8wPC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzA8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8yPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzM8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+R0VUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QT1NUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QVVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkRFTEVURTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+SEVBRDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT53ZWJSZXNvdXJjZU5hbWVfMTwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl81PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzY8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl84PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzk8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPk9QVElPTlM8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlRSQUNFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5HRVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBPU1Q8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBVVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT53ZWJSZXNvdXJjZU5hbWVfMjwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xNDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+REVMRVRFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5IRUFEPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5PUFRJT05TPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5UUkFDRTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+R0VUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV8zPC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzE1PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzE2PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzE3PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzE4PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzE5PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QT1NUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QVVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkRFTEVURTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+SEVBRDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+T1BUSU9OUzwvaHR0cC1tZXRob2Q+Ci0gICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT53ZWJSZXNvdXJjZU5hbWVfNDwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8yMDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8yMTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8yMjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8yMzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8yNDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+VFJBQ0U8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkdFVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UE9TVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UFVUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5ERUxFVEU8L2h0dHAtbWV0aG9kPgotICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICA8YXV0aC1jb25zdHJhaW50PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc18wPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzE8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZXNfMjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc18zPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzQ8L3JvbGUtbmFtZT4KLSAgICAgICAgPC9hdXRoLWNvbnN0cmFpbnQ+Ci0gICAgICAgIDx1c2VyLWRhdGEtY29uc3RyYWludD4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx0cmFuc3BvcnQtZ3VhcmFudGVlPk5PTkU8L3RyYW5zcG9ydC1ndWFyYW50ZWU+Ci0gICAgICAgIDwvdXNlci1kYXRhLWNvbnN0cmFpbnQ+Ci0gICAgPC9zZWN1cml0eS1jb25zdHJhaW50PgotICAgIDxzZWN1cml0eS1jb25zdHJhaW50PgotICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzE8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV81PC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzI1PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzI2PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzI3PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzI4PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzI5PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5IRUFEPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5PUFRJT05TPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5UUkFDRTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+R0VUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QT1NUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV82PC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzMwPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzMxPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzMyPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzMzPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzM0PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QVVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkRFTEVURTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+SEVBRDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+T1BUSU9OUzwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+VFJBQ0U8L2h0dHAtbWV0aG9kPgotICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzc8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMzU8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMzY8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMzc8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMzg8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMzk8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkdFVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UE9TVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UFVUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5ERUxFVEU8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkhFQUQ8L2h0dHAtbWV0aG9kPgotICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzg8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNDA8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNDE8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNDI8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNDM8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNDQ8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPk9QVElPTlM8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlRSQUNFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5HRVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBPU1Q8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBVVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT53ZWJSZXNvdXJjZU5hbWVfOTwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl80NTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl80NjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl80NzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl80ODwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl80OTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+REVMRVRFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5IRUFEPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5PUFRJT05TPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5UUkFDRTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+R0VUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgPGF1dGgtY29uc3RyYWludD4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZXNfNTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc182PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzc8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZXNfODwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc185PC9yb2xlLW5hbWU+Ci0gICAgICAgIDwvYXV0aC1jb25zdHJhaW50PgotICAgICAgICA8dXNlci1kYXRhLWNvbnN0cmFpbnQ+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dHJhbnNwb3J0LWd1YXJhbnRlZT5JTlRFR1JBTDwvdHJhbnNwb3J0LWd1YXJhbnRlZT4KLSAgICAgICAgPC91c2VyLWRhdGEtY29uc3RyYWludD4KLSAgICA8L3NlY3VyaXR5LWNvbnN0cmFpbnQ+Ci0gICAgPHNlY3VyaXR5LWNvbnN0cmFpbnQ+Ci0gICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMjwvZGlzcGxheS1uYW1lPgotICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzEwPC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl81MDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl81MTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl81MjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl81MzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl81NDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UE9TVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UFVUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5ERUxFVEU8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkhFQUQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPk9QVElPTlM8L2h0dHAtbWV0aG9kPgotICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzExPC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl81NTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl81NjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl81NzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl81ODwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl81OTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+VFJBQ0U8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkdFVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UE9TVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UFVUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5ERUxFVEU8L2h0dHAtbWV0aG9kPgotICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzEyPC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl82MDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl82MTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl82MjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl82MzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl82NDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+SEVBRDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+T1BUSU9OUzwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+VFJBQ0U8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkdFVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UE9TVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT53ZWJSZXNvdXJjZU5hbWVfMTM8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzY1PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzY2PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzY3PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzY4PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzY5PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QVVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkRFTEVURTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+SEVBRDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+T1BUSU9OUzwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+VFJBQ0U8L2h0dHAtbWV0aG9kPgotICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzE0PC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl83MDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl83MTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl83MjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl83MzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl83NDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+R0VUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QT1NUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QVVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkRFTEVURTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+SEVBRDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgIDxhdXRoLWNvbnN0cmFpbnQ+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzEwPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzExPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzEyPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzEzPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzE0PC9yb2xlLW5hbWU+Ci0gICAgICAgIDwvYXV0aC1jb25zdHJhaW50PgotICAgICAgICA8dXNlci1kYXRhLWNvbnN0cmFpbnQ+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dHJhbnNwb3J0LWd1YXJhbnRlZT5DT05GSURFTlRJQUw8L3RyYW5zcG9ydC1ndWFyYW50ZWU+Ci0gICAgICAgIDwvdXNlci1kYXRhLWNvbnN0cmFpbnQ+Ci0gICAgPC9zZWN1cml0eS1jb25zdHJhaW50PgotICAgIDxzZWN1cml0eS1jb25zdHJhaW50PgotICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzM8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV8xNTwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNzU8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNzY8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNzc8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNzg8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNzk8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPk9QVElPTlM8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlRSQUNFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5HRVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBPU1Q8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBVVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT53ZWJSZXNvdXJjZU5hbWVfMTY8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzgwPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzgxPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzgyPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzgzPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzg0PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5ERUxFVEU8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkhFQUQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPk9QVElPTlM8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlRSQUNFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5HRVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzE3PC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl84NTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl84NjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl84NzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl84ODwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl84OTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UE9TVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UFVUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5ERUxFVEU8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkhFQUQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPk9QVElPTlM8L2h0dHAtbWV0aG9kPgotICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzE4PC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl85MDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl85MTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl85MjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl85MzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl85NDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+VFJBQ0U8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkdFVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UE9TVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UFVUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5ERUxFVEU8L2h0dHAtbWV0aG9kPgotICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzE5PC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl85NTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl85NjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl85NzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl85ODwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl85OTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+SEVBRDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+T1BUSU9OUzwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+VFJBQ0U8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkdFVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UE9TVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgIDxhdXRoLWNvbnN0cmFpbnQ+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzE1PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzE2PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzE3PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzE4PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzE5PC9yb2xlLW5hbWU+Ci0gICAgICAgIDwvYXV0aC1jb25zdHJhaW50PgotICAgICAgICA8dXNlci1kYXRhLWNvbnN0cmFpbnQ+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dHJhbnNwb3J0LWd1YXJhbnRlZT5OT05FPC90cmFuc3BvcnQtZ3VhcmFudGVlPgotICAgICAgICA8L3VzZXItZGF0YS1jb25zdHJhaW50PgotICAgIDwvc2VjdXJpdHktY29uc3RyYWludD4KLSAgICA8c2VjdXJpdHktY29uc3RyYWludD4KLSAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV80PC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT53ZWJSZXNvdXJjZU5hbWVfMjA8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzEwMDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMDE8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTAyPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzEwMzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMDQ8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBVVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+REVMRVRFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5IRUFEPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5PUFRJT05TPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5UUkFDRTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT53ZWJSZXNvdXJjZU5hbWVfMjE8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzEwNTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMDY8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTA3PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzEwODwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMDk8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkdFVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UE9TVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UFVUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5ERUxFVEU8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkhFQUQ8L2h0dHAtbWV0aG9kPgotICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzIyPC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMTA8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTExPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzExMjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMTM8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTE0PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5PUFRJT05TPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5UUkFDRTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+R0VUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QT1NUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QVVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzIzPC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMTU8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTE2PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzExNzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMTg8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTE5PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5ERUxFVEU8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkhFQUQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPk9QVElPTlM8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlRSQUNFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5HRVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzI0PC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMjA8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTIxPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzEyMjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMjM8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTI0PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QT1NUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QVVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkRFTEVURTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+SEVBRDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+T1BUSU9OUzwvaHR0cC1tZXRob2Q+Ci0gICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgIDxhdXRoLWNvbnN0cmFpbnQ+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzIwPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzIxPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzIyPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzIzPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzI0PC9yb2xlLW5hbWU+Ci0gICAgICAgIDwvYXV0aC1jb25zdHJhaW50PgotICAgICAgICA8dXNlci1kYXRhLWNvbnN0cmFpbnQ+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dHJhbnNwb3J0LWd1YXJhbnRlZT5JTlRFR1JBTDwvdHJhbnNwb3J0LWd1YXJhbnRlZT4KLSAgICAgICAgPC91c2VyLWRhdGEtY29uc3RyYWludD4KLSAgICA8L3NlY3VyaXR5LWNvbnN0cmFpbnQ+Ci0gICAgPGxvZ2luLWNvbmZpZz4KLSAgICAgICAgPGF1dGgtbWV0aG9kPkJBU0lDPC9hdXRoLW1ldGhvZD4KLSAgICAgICAgPHJlYWxtLW5hbWU+cmVhbG1OYW1lXzA8L3JlYWxtLW5hbWU+Ci0gICAgICAgIDxmb3JtLWxvZ2luLWNvbmZpZz4KLSAgICAgICAgICAgIDxmb3JtLWxvZ2luLXBhZ2U+Zm9ybUxvZ2luUGFnZV8wPC9mb3JtLWxvZ2luLXBhZ2U+Ci0gICAgICAgICAgICA8Zm9ybS1lcnJvci1wYWdlPmZvcm1FcnJvclBhZ2VfMDwvZm9ybS1lcnJvci1wYWdlPgotICAgICAgICA8L2Zvcm0tbG9naW4tY29uZmlnPgotICAgIDwvbG9naW4tY29uZmlnPgotICAgIDxzZWN1cml0eS1yb2xlPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMDwvcm9sZS1uYW1lPgotICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgICA8c2VjdXJpdHktcm9sZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzE8L3JvbGUtbmFtZT4KLSAgICA8L3NlY3VyaXR5LXJvbGU+Ci0gICAgPHNlY3VyaXR5LXJvbGU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8yPC9yb2xlLW5hbWU+Ci0gICAgPC9zZWN1cml0eS1yb2xlPgotICAgIDxzZWN1cml0eS1yb2xlPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMzwvcm9sZS1uYW1lPgotICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgICA8c2VjdXJpdHktcm9sZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzQ8L3JvbGUtbmFtZT4KLSAgICA8L3NlY3VyaXR5LXJvbGU+Ci0gICAgPGVudi1lbnRyeT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8wPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8wPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9lbnYtZW50cnktdHlwZT4KLSAgICA8L2Vudi1lbnRyeT4KLSAgICA8ZW52LWVudHJ5PgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzE8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzE8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9lbnYtZW50cnktdHlwZT4KLSAgICA8L2Vudi1lbnRyeT4KLSAgICA8ZW52LWVudHJ5PgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzI8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzI8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KLSAgICA8L2Vudi1lbnRyeT4KLSAgICA8ZW52LWVudHJ5PgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzM8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzM8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Eb3VibGU8L2Vudi1lbnRyeS10eXBlPgotICAgIDwvZW52LWVudHJ5PgotICAgIDxlbnYtZW50cnk+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJ5dGU8L2Vudi1lbnRyeS10eXBlPgotICAgIDwvZW52LWVudHJ5PgotICAgIDxlamItcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8wPC9lamItcmVmLW5hbWU+Ci0gICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICA8aG9tZT5ob21lXzA8L2hvbWU+Ci0gICAgICAgIDxyZW1vdGU+cmVtb3RlXzA8L3JlbW90ZT4KLSAgICAgICAgPGVqYi1saW5rPmxpbmtfMDwvZWpiLWxpbms+Ci0gICAgPC9lamItcmVmPgotICAgIDxlamItcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xPC9lamItcmVmLW5hbWU+Ci0gICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgIDxob21lPmhvbWVfMTwvaG9tZT4KLSAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTwvcmVtb3RlPgotICAgICAgICA8ZWpiLWxpbms+bGlua18xPC9lamItbGluaz4KLSAgICA8L2VqYi1yZWY+Ci0gICAgPGVqYi1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgIDxob21lPmhvbWVfMjwvaG9tZT4KLSAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjwvcmVtb3RlPgotICAgICAgICA8ZWpiLWxpbms+bGlua18yPC9lamItbGluaz4KLSAgICA8L2VqYi1yZWY+Ci0gICAgPGVqYi1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgPGhvbWU+aG9tZV8zPC9ob21lPgotICAgICAgICA8cmVtb3RlPnJlbW90ZV8zPC9yZW1vdGU+Ci0gICAgICAgIDxlamItbGluaz5saW5rXzM8L2VqYi1saW5rPgotICAgIDwvZWpiLXJlZj4KLSAgICA8ZWpiLXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDwvZWpiLXJlZi1uYW1lPgotICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgPGhvbWU+aG9tZV80PC9ob21lPgotICAgICAgICA8cmVtb3RlPnJlbW90ZV80PC9yZW1vdGU+Ci0gICAgICAgIDxlamItbGluaz5saW5rXzQ8L2VqYi1saW5rPgotICAgIDwvZWpiLXJlZj4KLSAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMDwvZWpiLXJlZi1uYW1lPgotICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8wPC9sb2NhbC1ob21lPgotICAgICAgICA8bG9jYWw+cmVtb3RlXzA8L2xvY2FsPgotICAgICAgICA8ZWpiLWxpbms+bGlua18wPC9lamItbGluaz4KLSAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8xPC9sb2NhbC1ob21lPgotICAgICAgICA8bG9jYWw+cmVtb3RlXzE8L2xvY2FsPgotICAgICAgICA8ZWpiLWxpbms+bGlua18xPC9lamItbGluaz4KLSAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMjwvbG9jYWwtaG9tZT4KLSAgICAgICAgPGxvY2FsPnJlbW90ZV8yPC9sb2NhbD4KLSAgICAgICAgPGVqYi1saW5rPmxpbmtfMjwvZWpiLWxpbms+Ci0gICAgPC9lamItbG9jYWwtcmVmPgotICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zPC9lamItcmVmLW5hbWU+Ci0gICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMzwvbG9jYWwtaG9tZT4KLSAgICAgICAgPGxvY2FsPnJlbW90ZV8zPC9sb2NhbD4KLSAgICAgICAgPGVqYi1saW5rPmxpbmtfMzwvZWpiLWxpbms+Ci0gICAgPC9lamItbG9jYWwtcmVmPgotICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80PC9lamItcmVmLW5hbWU+Ci0gICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzQ8L2xvY2FsLWhvbWU+Ci0gICAgICAgIDxsb2NhbD5yZW1vdGVfNDwvbG9jYWw+Ci0gICAgICAgIDxlamItbGluaz5saW5rXzQ8L2VqYi1saW5rPgotICAgIDwvZWpiLWxvY2FsLXJlZj4KLTwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9FTUZUZXN0cy9hcHBsaWNhdGlvbi1jbGllbnQueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL0VNRlRlc3RzL2FwcGxpY2F0aW9uLWNsaWVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNTk2MGMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL0VNRlRlc3RzL2FwcGxpY2F0aW9uLWNsaWVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBhcHBsaWNhdGlvbi1jbGllbnQgUFVCTElDICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSjJFRSBBcHBsaWNhdGlvbiBDbGllbnQgMS4zLy9FTiIgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2FwcGxpY2F0aW9uLWNsaWVudF8xXzMuZHRkIj4KLQotICAgPGFwcGxpY2F0aW9uLWNsaWVudCBpZD0iQXBwbGljYXRpb24tY2xpZW50X0lEIj4KLSAgICAgIDxpY29uPgotICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzA8L3NtYWxsLWljb24+Ci0gICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMDwvbGFyZ2UtaWNvbj4KLSAgICAgIDwvaWNvbj4KLSAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMDwvZGlzcGxheS1uYW1lPgotICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgPGVudi1lbnRyeSBpZD0iRW52RW50cnlfMTA1MTYzOTc2MzIzOSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8wPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICA8ZW52LWVudHJ5IGlkPSJFbnZFbnRyeV8xMDUxNjM5NzYzMjQwIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzE8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICA8ZW52LWVudHJ5IGlkPSJFbnZFbnRyeV8xMDUxNjM5NzYzMjQxIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzI8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICA8ZW52LWVudHJ5IGlkPSJFbnZFbnRyeV8xMDUxNjM5NzYzMjU5Ij4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzM8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Eb3VibGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8zPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICA8L2Vudi1lbnRyeT4KLSAgICAgIDxlbnYtZW50cnkgaWQ9IkVudkVudHJ5XzEwNTE2Mzk3NjMyNjAiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJ5dGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV80PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICA8L2Vudi1lbnRyeT4KLSAgICAgIDxlamItcmVmIGlkPSJFamJSZWZfMTA1MTYzOTc2MzI3OSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICA8aG9tZT5ob21lXzA8L2hvbWU+Ci0gICAgICAgICA8cmVtb3RlPnJlbW90ZV8wPC9yZW1vdGU+Ci0gICAgICAgICA8ZWpiLWxpbms+bGlua18wPC9lamItbGluaz4KLSAgICAgIDwvZWpiLXJlZj4KLSAgICAgIDxlamItcmVmIGlkPSJFamJSZWZfMTA1MTYzOTc2MzI4MCI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgIDxob21lPmhvbWVfMTwvaG9tZT4KLSAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzE8L3JlbW90ZT4KLSAgICAgICAgIDxlamItbGluaz5saW5rXzE8L2VqYi1saW5rPgotICAgICAgPC9lamItcmVmPgotICAgICAgPGVqYi1yZWYgaWQ9IkVqYlJlZl8xMDUxNjM5NzYzMjgxIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgIDxob21lPmhvbWVfMjwvaG9tZT4KLSAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzI8L3JlbW90ZT4KLSAgICAgICAgIDxlamItbGluaz5saW5rXzI8L2VqYi1saW5rPgotICAgICAgPC9lamItcmVmPgotICAgICAgPGVqYi1yZWYgaWQ9IkVqYlJlZl8xMDUxNjM5NzYzMjgyIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgPGhvbWU+aG9tZV8zPC9ob21lPgotICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzwvcmVtb3RlPgotICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzwvZWpiLWxpbms+Ci0gICAgICA8L2VqYi1yZWY+Ci0gICAgICA8ZWpiLXJlZiBpZD0iRWpiUmVmXzEwNTE2Mzk3NjMyODMiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgPGhvbWU+aG9tZV80PC9ob21lPgotICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNDwvcmVtb3RlPgotICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDwvZWpiLWxpbms+Ci0gICAgICA8L2VqYi1yZWY+Ci0gICAgICA8cmVzb3VyY2UtcmVmIGlkPSJSZXNvdXJjZVJlZl8xMDUxNjM5NzYzMjk5Ij4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8wPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICA8cmVzLXR5cGU+dHlwZV8wPC9yZXMtdHlwZT4KLSAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgIDxyZXNvdXJjZS1yZWYgaWQ9IlJlc291cmNlUmVmXzEwNTE2Mzk3NjMzMDAiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzE8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgIDxyZXMtdHlwZT50eXBlXzE8L3Jlcy10eXBlPgotICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgIDxyZXNvdXJjZS1yZWYgaWQ9IlJlc291cmNlUmVmXzEwNTE2Mzk3NjMzMDEiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzI8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgIDxyZXMtdHlwZT50eXBlXzI8L3Jlcy10eXBlPgotICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgPHJlc291cmNlLXJlZiBpZD0iUmVzb3VyY2VSZWZfMTA1MTYzOTc2MzMwMiI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgPHJlcy10eXBlPnR5cGVfMzwvcmVzLXR5cGU+Ci0gICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgPHJlc291cmNlLXJlZiBpZD0iUmVzb3VyY2VSZWZfMTA1MTYzOTc2MzMwMyI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNDwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgPHJlcy10eXBlPnR5cGVfNDwvcmVzLXR5cGU+Ci0gICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICA8cmVzb3VyY2UtZW52LXJlZiBpZD0iUmVzb3VyY2VFbnZSZWZfMTA1MTYzOTc2MzMxOSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICA8cmVzb3VyY2UtZW52LXJlZiBpZD0iUmVzb3VyY2VFbnZSZWZfMTA1MTYzOTc2MzM0OSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuTGlzdDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgPHJlc291cmNlLWVudi1yZWYgaWQ9IlJlc291cmNlRW52UmVmXzEwNTE2Mzk3NjMzNTAiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzI8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5zcWwuRGF0YTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgPHJlc291cmNlLWVudi1yZWYgaWQ9IlJlc291cmNlRW52UmVmXzEwNTE2Mzk3NjMzNTEiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzM8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgIDxyZXNvdXJjZS1lbnYtcmVmIGlkPSJSZXNvdXJjZUVudlJlZl8xMDUxNjM5NzYzMzUyIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV80PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5TdHJpbmc8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgIDxjYWxsYmFjay1oYW5kbGVyPmphdmEudXRpbC5IYXNoVGFibGU8L2NhbGxiYWNrLWhhbmRsZXI+Ci0gICA8L2FwcGxpY2F0aW9uLWNsaWVudD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9FTUZUZXN0cy9hcHBsaWNhdGlvbi54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvRU1GVGVzdHMvYXBwbGljYXRpb24ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWY0NmJkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9FTUZUZXN0cy9hcHBsaWNhdGlvbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGFwcGxpY2F0aW9uIFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEoyRUUgQXBwbGljYXRpb24gMS4zLy9FTiIgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2FwcGxpY2F0aW9uXzFfMy5kdGQiPgotCi0gICA8YXBwbGljYXRpb24gaWQ9IkFwcGxpY2F0aW9uX0lEIj4KLSAgICAgIDxpY29uPgotICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzA8L3NtYWxsLWljb24+Ci0gICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMDwvbGFyZ2UtaWNvbj4KLSAgICAgIDwvaWNvbj4KLSAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMDwvZGlzcGxheS1uYW1lPgotICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgPG1vZHVsZSBpZD0iSmF2YUNsaWVudE1vZHVsZV8xMDUxNjM5Nzc4MTYwIj4KLSAgICAgICAgIDxqYXZhPnVyaV8wPC9qYXZhPgotICAgICAgICAgPGFsdC1kZD5hbHRERF8wPC9hbHQtZGQ+Ci0gICAgICA8L21vZHVsZT4KLSAgICAgIDxtb2R1bGUgaWQ9IkVqYk1vZHVsZV8xMDUxNjM5Nzc4MTYwIj4KLSAgICAgICAgIDxlamI+dXJpXzE8L2VqYj4KLSAgICAgICAgIDxhbHQtZGQ+YWx0RERfMTwvYWx0LWRkPgotICAgICAgPC9tb2R1bGU+Ci0gICAgICA8bW9kdWxlIGlkPSJXZWJNb2R1bGVfMTA1MTYzOTc3ODE2MCI+Ci0gICAgICAgICA8d2ViPgotICAgICAgICAgICAgPHdlYi11cmk+dXJpXzI8L3dlYi11cmk+Ci0gICAgICAgICAgICA8Y29udGV4dC1yb290PmNvbnRleHRSb290XzA8L2NvbnRleHQtcm9vdD4KLSAgICAgICAgIDwvd2ViPgotICAgICAgICAgPGFsdC1kZD5hbHRERF8yPC9hbHQtZGQ+Ci0gICAgICA8L21vZHVsZT4KLSAgICAgIDxtb2R1bGUgaWQ9IkNvbm5lY3Rvck1vZHVsZV8xMDUxNjM5Nzc4MTYwIj4KLSAgICAgICAgIDxjb25uZWN0b3I+dXJpXzM8L2Nvbm5lY3Rvcj4KLSAgICAgICAgIDxhbHQtZGQ+YWx0RERfMzwvYWx0LWRkPgotICAgICAgPC9tb2R1bGU+Ci0gICAgICA8bW9kdWxlIGlkPSJKYXZhQ2xpZW50TW9kdWxlXzEwNTE2Mzk3NzgxNjEiPgotICAgICAgICAgPGphdmE+dXJpXzQ8L2phdmE+Ci0gICAgICAgICA8YWx0LWRkPmFsdEREXzQ8L2FsdC1kZD4KLSAgICAgIDwvbW9kdWxlPgotICAgICAgPHNlY3VyaXR5LXJvbGUgaWQ9IlNlY3VyaXR5Um9sZV8xMDUxNjM5Nzc4MTcwIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMDwvcm9sZS1uYW1lPgotICAgICAgPC9zZWN1cml0eS1yb2xlPgotICAgICAgPHNlY3VyaXR5LXJvbGUgaWQ9IlNlY3VyaXR5Um9sZV8xMDUxNjM5Nzc4MTkwIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMTwvcm9sZS1uYW1lPgotICAgICAgPC9zZWN1cml0eS1yb2xlPgotICAgICAgPHNlY3VyaXR5LXJvbGUgaWQ9IlNlY3VyaXR5Um9sZV8xMDUxNjM5Nzc4MTkxIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMjwvcm9sZS1uYW1lPgotICAgICAgPC9zZWN1cml0eS1yb2xlPgotICAgICAgPHNlY3VyaXR5LXJvbGUgaWQ9IlNlY3VyaXR5Um9sZV8xMDUxNjM5Nzc4MTkyIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMzwvcm9sZS1uYW1lPgotICAgICAgPC9zZWN1cml0eS1yb2xlPgotICAgICAgPHNlY3VyaXR5LXJvbGUgaWQ9IlNlY3VyaXR5Um9sZV8xMDUxNjM5Nzc4MTkzIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfNDwvcm9sZS1uYW1lPgotICAgICAgPC9zZWN1cml0eS1yb2xlPgotICAgPC9hcHBsaWNhdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9FTUZUZXN0cy9lamItamFyLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9FTUZUZXN0cy9lamItamFyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg3NWVhZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvRU1GVGVzdHMvZWpiLWphci54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxODY0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgZWpiLWphciBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBFbnRlcnByaXNlIEphdmFCZWFucyAyLjAvL0VOIiAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvZWpiLWphcl8yXzAuZHRkIj4KLQotICAgPGVqYi1qYXIgaWQ9ImVqYi1qYXJfSUQiPgotICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8wPC9kaXNwbGF5LW5hbWU+Ci0gICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMDwvc21hbGwtaWNvbj4KLSAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8wPC9sYXJnZS1pY29uPgotICAgICAgPGVudGVycHJpc2UtYmVhbnM+Ci0gICAgICAgICA8ZW50aXR5IGlkPSJFbnRpdHlfMTA1MTYzOTc4ODY0NSI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzA8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8wPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzA8L2xhcmdlLWljb24+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8wPC9lamItbmFtZT4KLSAgICAgICAgICAgIDxob21lPmphdmEudXRpbC5MaXN0PC9ob21lPgotICAgICAgICAgICAgPHJlbW90ZT5qYXZhLnNxbC5EYXRhPC9yZW1vdGU+Ci0gICAgICAgICAgICA8bG9jYWwtaG9tZT5qYXZhLmxhbmcuSW50ZWdlcjwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgIDxsb2NhbD5qYXZhLmxhbmcuU3RyaW5nPC9sb2NhbD4KLSAgICAgICAgICAgIDxlamItY2xhc3M+amF2YS51dGlsLkhhc2hUYWJsZTwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXR5cGU+QmVhbjwvcGVyc2lzdGVuY2UtdHlwZT4KLSAgICAgICAgICAgIDxwcmltLWtleS1jbGFzcz5qYXZhLnV0aWwuSGFzaFRhYmxlPC9wcmltLWtleS1jbGFzcz4KLSAgICAgICAgICAgIDxyZWVudHJhbnQ+VHJ1ZTwvcmVlbnRyYW50PgotICAgICAgICAgICAgPGVudi1lbnRyeSBpZD0iRW52RW50cnlfMTA1MTYzOTc4ODY5NSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8wPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5IGlkPSJFbnZFbnRyeV8xMDUxNjM5Nzg4NzA1Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzE8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5IGlkPSJFbnZFbnRyeV8xMDUxNjM5Nzg4NzA2Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzI8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5IGlkPSJFbnZFbnRyeV8xMDUxNjM5Nzg4NzA3Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzM8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Eb3VibGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8zPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnkgaWQ9IkVudkVudHJ5XzEwNTE2Mzk3ODg3MTUiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJ5dGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV80PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlamItcmVmIGlkPSJFamJSZWZfMTA1MTYzOTc4ODcyNSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzA8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8wPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18wPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmIGlkPSJFamJSZWZfMTA1MTYzOTc4ODcyNiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMTwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzE8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWYgaWQ9IkVqYlJlZl8xMDUxNjM5Nzg4NzI3Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMjwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzI8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWYgaWQ9IkVqYlJlZl8xMDUxNjM5Nzg4NzI4Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8zPC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZiBpZD0iRWpiUmVmXzEwNTE2Mzk3ODg3MjkiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV80PC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNDwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZiBpZD0iRUpCTG9jYWxSZWZfMTA1MTYzOTc4ODc0NSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNTwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua181PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmIGlkPSJFSkJMb2NhbFJlZl8xMDUxNjM5Nzg4NzQ2Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV82PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNjwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNjwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua182PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmIGlkPSJFSkJMb2NhbFJlZl8xMDUxNjM5Nzg4NzQ3Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV83PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV83PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV83PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzc8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWYgaWQ9IkVKQkxvY2FsUmVmXzEwNTE2Mzk3ODg3NDgiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzg8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV84PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV84PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzg8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWYgaWQ9IkVKQkxvY2FsUmVmXzEwNTE2Mzk3ODg3NDkiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzk8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzk8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzk8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfOTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjM5Nzg4Nzc1Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8wPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMDwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2Mzk3ODg3NzYiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzE8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTYzOTc4ODc3NyI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzI8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjM5Nzg4Nzc4Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8zPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMzwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2Mzk3ODg3NzkiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzQ8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua180PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJ1bi1hcyBpZD0iUnVuQXNTcGVjaWZpZWRJZGVudGl0eV8xMDUxNjM5Nzg4Nzc1Ij4KLSAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPC9ydW4tYXM+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgPHJlc291cmNlLXJlZiBpZD0iUmVzb3VyY2VSZWZfMTA1MTYzOTc4ODc4NSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMDwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMDwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmIGlkPSJSZXNvdXJjZVJlZl8xMDUxNjM5Nzg4Nzg2Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8xPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmIGlkPSJSZXNvdXJjZVJlZl8xMDUxNjM5Nzg4Nzg3Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8yPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8yPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWYgaWQ9IlJlc291cmNlUmVmXzEwNTE2Mzk3ODg3ODgiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzM8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzM8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWYgaWQ9IlJlc291cmNlUmVmXzEwNTE2Mzk3ODg3OTUiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzQ8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzQ8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYgaWQ9IlJlc291cmNlRW52UmVmXzEwNTE2Mzk3ODg4MDUiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzA8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmIGlkPSJSZXNvdXJjZUVudlJlZl8xMDUxNjM5Nzg4ODA2Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5TdHJpbmc8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmIGlkPSJSZXNvdXJjZUVudlJlZl8xMDUxNjM5Nzg4ODA3Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8yPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmIGlkPSJSZXNvdXJjZUVudlJlZl8xMDUxNjM5Nzg4ODA4Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8zPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5MaXN0PC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZiBpZD0iUmVzb3VyY2VFbnZSZWZfMTA1MTYzOTc4ODgwOSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnNxbC5EYXRhPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICA8L2VudGl0eT4KLSAgICAgICAgIDxlbnRpdHkgaWQ9IkVudGl0eV8xMDUxNjM5Nzg4ODA1Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMTwvZGlzcGxheS1uYW1lPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzE8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMTwvbGFyZ2UtaWNvbj4KLSAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzE8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGhvbWU+amF2YS5zcWwuRGF0YTwvaG9tZT4KLSAgICAgICAgICAgIDxyZW1vdGU+amF2YS5sYW5nLkludGVnZXI8L3JlbW90ZT4KLSAgICAgICAgICAgIDxsb2NhbC1ob21lPmphdmEubGFuZy5TdHJpbmc8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICA8bG9jYWw+amF2YS51dGlsLkhhc2hUYWJsZTwvbG9jYWw+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmphdmEudXRpbC5MaXN0PC9lamItY2xhc3M+Ci0gICAgICAgICAgICA8cGVyc2lzdGVuY2UtdHlwZT5CZWFuPC9wZXJzaXN0ZW5jZS10eXBlPgotICAgICAgICAgICAgPHByaW0ta2V5LWNsYXNzPmphdmEudXRpbC5MaXN0PC9wcmltLWtleS1jbGFzcz4KLSAgICAgICAgICAgIDxyZWVudHJhbnQ+RmFsc2U8L3JlZW50cmFudD4KLSAgICAgICAgICAgIDxlbnYtZW50cnkgaWQ9IkVudkVudHJ5XzEwNTE2Mzk3ODg4MDUiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlNob3J0PC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5IGlkPSJFbnZFbnRyeV8xMDUxNjM5Nzg4ODE1Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzY8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Mb25nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNjwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5IGlkPSJFbnZFbnRyeV8xMDUxNjM5Nzg4ODE2Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzc8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5GbG9hdDwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzc8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeSBpZD0iRW52RW50cnlfMTA1MTYzOTc4ODgxNyI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV84PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQ2hhcmFjdGVyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfODwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5IGlkPSJFbnZFbnRyeV8xMDUxNjM5Nzg4ODE4Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzk8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TdHJpbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV85PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlamItcmVmIGlkPSJFamJSZWZfMTA1MTYzOTc4ODgxNSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzEwPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMTA8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8xMDwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTA8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWYgaWQ9IkVqYlJlZl8xMDUxNjM5Nzg4ODE2Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTE8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzExPC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTE8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzExPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmIGlkPSJFamJSZWZfMTA1MTYzOTc4ODgxNyI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzEyPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMTI8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8xMjwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTI8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWYgaWQ9IkVqYlJlZl8xMDUxNjM5Nzg4ODE4Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzEzPC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTM8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzEzPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmIGlkPSJFamJSZWZfMTA1MTYzOTc4ODgxOSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE0PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMTQ8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8xNDwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTQ8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWYgaWQ9IkVKQkxvY2FsUmVmXzEwNTE2Mzk3ODg4MTUiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xNTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMTU8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzE1PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE1PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmIGlkPSJFSkJMb2NhbFJlZl8xMDUxNjM5Nzg4ODE2Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTY8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8xNjwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMTY8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTY8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWYgaWQ9IkVKQkxvY2FsUmVmXzEwNTE2Mzk3ODg4MTciPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xNzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMTc8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzE3PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE3PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmIGlkPSJFSkJMb2NhbFJlZl8xMDUxNjM5Nzg4ODE4Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTg8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8xODwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMTg8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTg8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWYgaWQ9IkVKQkxvY2FsUmVmXzEwNTE2Mzk3ODg4MTkiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xOTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMTk8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzE5PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE5PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2Mzk3ODg4MjUiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzU8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua181PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTYzOTc4ODgyNiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzY8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjM5Nzg4ODI3Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV83PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNzwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2Mzk3ODg4MjgiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzg8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua184PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTYzOTc4ODgyOSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfOTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzk8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8dXNlLWNhbGxlci1pZGVudGl0eSBpZD0iVXNlQ2FsbGVySWRlbnRpdHlfMTA1MTYzOTc4ODgyNSI+PC91c2UtY2FsbGVyLWlkZW50aXR5PgotICAgICAgICAgICAgPC9zZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWYgaWQ9IlJlc291cmNlUmVmXzEwNTE2Mzk3ODg4MjUiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzU8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzU8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWYgaWQ9IlJlc291cmNlUmVmXzEwNTE2Mzk3ODg4MjYiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzY8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzY8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZiBpZD0iUmVzb3VyY2VSZWZfMTA1MTYzOTc4ODgyNyI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNzwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNzwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZiBpZD0iUmVzb3VyY2VSZWZfMTA1MTYzOTc4ODgyOCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfODwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfODwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmIGlkPSJSZXNvdXJjZVJlZl8xMDUxNjM5Nzg4ODI5Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV85PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV85PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZiBpZD0iUmVzb3VyY2VFbnZSZWZfMTA1MTYzOTc4ODgyNSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZiBpZD0iUmVzb3VyY2VFbnZSZWZfMTA1MTYzOTc4ODgyNiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNjwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZiBpZD0iUmVzb3VyY2VFbnZSZWZfMTA1MTYzOTc4ODgyNyI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNzwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuTGlzdDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYgaWQ9IlJlc291cmNlRW52UmVmXzEwNTE2Mzk3ODg4MjgiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzg8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5zcWwuRGF0YTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYgaWQ9IlJlc291cmNlRW52UmVmXzEwNTE2Mzk3ODg4MjkiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzk8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgIDwvZW50aXR5PgotICAgICAgICAgPGVudGl0eSBpZD0iQ29udGFpbmVyTWFuYWdlZEVudGl0eV8xMDUxNjM5Nzg4ODI1Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMjwvZGlzcGxheS1uYW1lPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzI8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMjwvbGFyZ2UtaWNvbj4KLSAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzI8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGhvbWU+amF2YS5sYW5nLkludGVnZXI8L2hvbWU+Ci0gICAgICAgICAgICA8cmVtb3RlPmphdmEubGFuZy5TdHJpbmc8L3JlbW90ZT4KLSAgICAgICAgICAgIDxsb2NhbC1ob21lPmphdmEudXRpbC5IYXNoVGFibGU8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICA8bG9jYWw+amF2YS51dGlsLkxpc3Q8L2xvY2FsPgotICAgICAgICAgICAgPGVqYi1jbGFzcz5qYXZhLnNxbC5EYXRhPC9lamItY2xhc3M+Ci0gICAgICAgICAgICA8cGVyc2lzdGVuY2UtdHlwZT5Db250YWluZXI8L3BlcnNpc3RlbmNlLXR5cGU+Ci0gICAgICAgICAgICA8cHJpbS1rZXktY2xhc3M+amF2YS5zcWwuRGF0YTwvcHJpbS1rZXktY2xhc3M+Ci0gICAgICAgICAgICA8cmVlbnRyYW50PlRydWU8L3JlZW50cmFudD4KLSAgICAgICAgICAgIDxjbXAtdmVyc2lvbj4yLjA8L2NtcC12ZXJzaW9uPgotICAgICAgICAgICAgPGFic3RyYWN0LXNjaGVtYS1uYW1lPmFic3RyYWN0U2NoZW1hTmFtZV8wPC9hYnN0cmFjdC1zY2hlbWEtbmFtZT4KLSAgICAgICAgICAgIDxjbXAtZmllbGQgaWQ9IkNNUEF0dHJpYnV0ZV8xMDUxNjM5Nzg4ODQ1Ij4KLSAgICAgICAgICAgICAgIDxmaWVsZC1uYW1lPm5hbWVfMzwvZmllbGQtbmFtZT4KLSAgICAgICAgICAgIDwvY21wLWZpZWxkPgotICAgICAgICAgICAgPGNtcC1maWVsZCBpZD0iQ01QQXR0cmlidXRlXzEwNTE2Mzk3ODg4NDYiPgotICAgICAgICAgICAgICAgPGZpZWxkLW5hbWU+bmFtZV80PC9maWVsZC1uYW1lPgotICAgICAgICAgICAgPC9jbXAtZmllbGQ+Ci0gICAgICAgICAgICA8Y21wLWZpZWxkIGlkPSJDTVBBdHRyaWJ1dGVfMTA1MTYzOTc4ODg0NyI+Ci0gICAgICAgICAgICAgICA8ZmllbGQtbmFtZT5uYW1lXzU8L2ZpZWxkLW5hbWU+Ci0gICAgICAgICAgICA8L2NtcC1maWVsZD4KLSAgICAgICAgICAgIDxjbXAtZmllbGQgaWQ9IkNNUEF0dHJpYnV0ZV8xMDUxNjM5Nzg4ODQ4Ij4KLSAgICAgICAgICAgICAgIDxmaWVsZC1uYW1lPm5hbWVfNjwvZmllbGQtbmFtZT4KLSAgICAgICAgICAgIDwvY21wLWZpZWxkPgotICAgICAgICAgICAgPGNtcC1maWVsZCBpZD0iQ01QQXR0cmlidXRlXzEwNTE2Mzk3ODg4NDkiPgotICAgICAgICAgICAgICAgPGZpZWxkLW5hbWU+bmFtZV83PC9maWVsZC1uYW1lPgotICAgICAgICAgICAgPC9jbXAtZmllbGQ+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5IGlkPSJFbnZFbnRyeV8xMDUxNjM5Nzg4ODg1Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xMDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkludGVnZXI8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xMDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5IGlkPSJFbnZFbnRyeV8xMDUxNjM5Nzg4ODg2Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xMTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJvb2xlYW48L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xMTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5IGlkPSJFbnZFbnRyeV8xMDUxNjM5Nzg4ODg3Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xMjwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkRvdWJsZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzEyPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnkgaWQ9IkVudkVudHJ5XzEwNTE2Mzk3ODg4ODgiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzEzPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQnl0ZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzEzPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnkgaWQ9IkVudkVudHJ5XzEwNTE2Mzk3ODg4ODkiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzE0PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU2hvcnQ8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xNDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZWpiLXJlZiBpZD0iRWpiUmVmXzEwNTE2Mzk3ODg4ODUiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yMDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzIwPC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjA8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzIwPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmIGlkPSJFamJSZWZfMTA1MTYzOTc4ODg4NiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzIxPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8yMTwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzIxPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yMTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZiBpZD0iRWpiUmVmXzEwNTE2Mzk3ODg4ODciPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yMjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzIyPC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjI8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzIyPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmIGlkPSJFamJSZWZfMTA1MTYzOTc4ODg4OCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzIzPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8yMzwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzIzPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yMzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZiBpZD0iRWpiUmVmXzEwNTE2Mzk3ODg4ODkiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yNDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzI0PC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjQ8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI0PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmIGlkPSJFSkJMb2NhbFJlZl8xMDUxNjM5Nzg4ODk1Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjU8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzI1PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8yNTwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yNTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZiBpZD0iRUpCTG9jYWxSZWZfMTA1MTYzOTc4ODg5NiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI2PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMjY8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzI2PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI2PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmIGlkPSJFSkJMb2NhbFJlZl8xMDUxNjM5Nzg4ODk3Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjc8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzI3PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8yNzwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yNzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZiBpZD0iRUpCTG9jYWxSZWZfMTA1MTYzOTc4ODg5OCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI4PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMjg8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzI4PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI4PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmIGlkPSJFSkJMb2NhbFJlZl8xMDUxNjM5Nzg4ODk5Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjk8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzI5PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8yOTwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yOTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjM5Nzg4ODk1Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTA8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xMDwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2Mzk3ODg4OTYiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzExPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xMTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzExPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTYzOTc4ODg5NyI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzEyPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTI8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjM5Nzg4ODk4Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTM8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xMzwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2Mzk3ODg4OTkiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xNDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzE0PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJ1bi1hcyBpZD0iUnVuQXNTcGVjaWZpZWRJZGVudGl0eV8xMDUxNjM5Nzg4ODk1Ij4KLSAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPC9ydW4tYXM+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgPHJlc291cmNlLXJlZiBpZD0iUmVzb3VyY2VSZWZfMTA1MTYzOTc4ODg5NSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzEwPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8xMDwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmIGlkPSJSZXNvdXJjZVJlZl8xMDUxNjM5Nzg4ODk2Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTE8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzExPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmIGlkPSJSZXNvdXJjZVJlZl8xMDUxNjM5Nzg4ODk3Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTI8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzEyPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWYgaWQ9IlJlc291cmNlUmVmXzEwNTE2Mzk3ODg4OTgiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xMzwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMTM8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWYgaWQ9IlJlc291cmNlUmVmXzEwNTE2Mzk3ODg5MDUiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xNDwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMTQ8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYgaWQ9IlJlc291cmNlRW52UmVmXzEwNTE2Mzk3ODg5MDUiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xMDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZiBpZD0iUmVzb3VyY2VFbnZSZWZfMTA1MTYzOTc4ODkwNiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzExPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5MaXN0PC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZiBpZD0iUmVzb3VyY2VFbnZSZWZfMTA1MTYzOTc4ODkwNyI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzEyPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmIGlkPSJSZXNvdXJjZUVudlJlZl8xMDUxNjM5Nzg4OTA4Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTM8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmIGlkPSJSZXNvdXJjZUVudlJlZl8xMDUxNjM5Nzg4OTA5Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTQ8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHF1ZXJ5IGlkPSJRdWVyeV8xMDUxNjM5Nzg4OTM2Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxxdWVyeS1tZXRob2QgaWQ9IlF1ZXJ5TWV0aG9kXzEwNTE2Mzk3ODg5MzYiPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNTU8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICA8L3F1ZXJ5LW1ldGhvZD4KLSAgICAgICAgICAgICAgIDxyZXN1bHQtdHlwZS1tYXBwaW5nPlJlbW90ZTwvcmVzdWx0LXR5cGUtbWFwcGluZz4KLSAgICAgICAgICAgICAgIDxlamItcWw+ZWpiUUxfMDwvZWpiLXFsPgotICAgICAgICAgICAgPC9xdWVyeT4KLSAgICAgICAgICAgIDxxdWVyeSBpZD0iUXVlcnlfMTA1MTYzOTc4ODkzNyI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cXVlcnktbWV0aG9kIGlkPSJRdWVyeU1ldGhvZF8xMDUxNjM5Nzg4OTM3Ij4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzU2PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc182NjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgPC9xdWVyeS1tZXRob2Q+Ci0gICAgICAgICAgICAgICA8cmVzdWx0LXR5cGUtbWFwcGluZz5Mb2NhbDwvcmVzdWx0LXR5cGUtbWFwcGluZz4KLSAgICAgICAgICAgICAgIDxlamItcWw+ZWpiUUxfMTwvZWpiLXFsPgotICAgICAgICAgICAgPC9xdWVyeT4KLSAgICAgICAgICAgIDxxdWVyeSBpZD0iUXVlcnlfMTA1MTYzOTc4ODkzOCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cXVlcnktbWV0aG9kIGlkPSJRdWVyeU1ldGhvZF8xMDUxNjM5Nzg4OTM4Ij4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzU3PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc182NzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc182ODwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgPC9xdWVyeS1tZXRob2Q+Ci0gICAgICAgICAgICAgICA8cmVzdWx0LXR5cGUtbWFwcGluZz5SZW1vdGU8L3Jlc3VsdC10eXBlLW1hcHBpbmc+Ci0gICAgICAgICAgICAgICA8ZWpiLXFsPmVqYlFMXzI8L2VqYi1xbD4KLSAgICAgICAgICAgIDwvcXVlcnk+Ci0gICAgICAgICAgICA8cXVlcnkgaWQ9IlF1ZXJ5XzEwNTE2Mzk3ODg5MzkiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHF1ZXJ5LW1ldGhvZCBpZD0iUXVlcnlNZXRob2RfMTA1MTYzOTc4ODkzOSI+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV81ODwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNjk8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNzA8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNzE8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgIDwvcXVlcnktbWV0aG9kPgotICAgICAgICAgICAgICAgPHJlc3VsdC10eXBlLW1hcHBpbmc+TG9jYWw8L3Jlc3VsdC10eXBlLW1hcHBpbmc+Ci0gICAgICAgICAgICAgICA8ZWpiLXFsPmVqYlFMXzM8L2VqYi1xbD4KLSAgICAgICAgICAgIDwvcXVlcnk+Ci0gICAgICAgICAgICA8cXVlcnkgaWQ9IlF1ZXJ5XzEwNTE2Mzk3ODg5NDAiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHF1ZXJ5LW1ldGhvZCBpZD0iUXVlcnlNZXRob2RfMTA1MTYzOTc4ODk0MCI+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV81OTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgIDwvcXVlcnktbWV0aG9kPgotICAgICAgICAgICAgICAgPHJlc3VsdC10eXBlLW1hcHBpbmc+UmVtb3RlPC9yZXN1bHQtdHlwZS1tYXBwaW5nPgotICAgICAgICAgICAgICAgPGVqYi1xbD5lamJRTF80PC9lamItcWw+Ci0gICAgICAgICAgICA8L3F1ZXJ5PgotICAgICAgICAgPC9lbnRpdHk+Ci0gICAgICAgICA8c2Vzc2lvbiBpZD0iU2Vzc2lvbl8xMDUxNjM5Nzg4OTQ2Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMzwvZGlzcGxheS1uYW1lPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzM8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMzwvbGFyZ2UtaWNvbj4KLSAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzg8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGhvbWU+amF2YS5sYW5nLlN0cmluZzwvaG9tZT4KLSAgICAgICAgICAgIDxyZW1vdGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVtb3RlPgotICAgICAgICAgICAgPGxvY2FsLWhvbWU+amF2YS51dGlsLkxpc3Q8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICA8bG9jYWw+amF2YS5zcWwuRGF0YTwvbG9jYWw+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmphdmEubGFuZy5JbnRlZ2VyPC9lamItY2xhc3M+Ci0gICAgICAgICAgICA8c2Vzc2lvbi10eXBlPlN0YXRlZnVsPC9zZXNzaW9uLXR5cGU+Ci0gICAgICAgICAgICA8dHJhbnNhY3Rpb24tdHlwZT5CZWFuPC90cmFuc2FjdGlvbi10eXBlPgotICAgICAgICAgICAgPGVudi1lbnRyeSBpZD0iRW52RW50cnlfMTA1MTYzOTc4ODk0NiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTU8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Mb25nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTU8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeSBpZD0iRW52RW50cnlfMTA1MTYzOTc4ODk0NyI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTY8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5GbG9hdDwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzE2PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnkgaWQ9IkVudkVudHJ5XzEwNTE2Mzk3ODg5NDgiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzE3PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQ2hhcmFjdGVyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTc8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeSBpZD0iRW52RW50cnlfMTA1MTYzOTc4ODk0OSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTg8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TdHJpbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xODwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5IGlkPSJFbnZFbnRyeV8xMDUxNjM5Nzg4OTUwIj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xOTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkludGVnZXI8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xOTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZWpiLXJlZiBpZD0iRWpiUmVmXzEwNTE2Mzk3ODg5NDYiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zMDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzMwPC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzA8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzMwPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmIGlkPSJFamJSZWZfMTA1MTYzOTc4ODk0NyI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzMxPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8zMTwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzMxPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zMTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZiBpZD0iRWpiUmVmXzEwNTE2Mzk3ODg5NDgiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zMjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzMyPC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzI8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzMyPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmIGlkPSJFamJSZWZfMTA1MTYzOTc4ODk0OSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzMzPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8zMzwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzMzPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zMzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZiBpZD0iRWpiUmVmXzEwNTE2Mzk3ODg5NTAiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zNDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzM0PC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzQ8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM0PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmIGlkPSJFSkJMb2NhbFJlZl8xMDUxNjM5Nzg4OTQ2Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzU8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzM1PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8zNTwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zNTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZiBpZD0iRUpCTG9jYWxSZWZfMTA1MTYzOTc4ODk0NyI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM2PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMzY8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzM2PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM2PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmIGlkPSJFSkJMb2NhbFJlZl8xMDUxNjM5Nzg4OTQ4Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzc8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzM3PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8zNzwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zNzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZiBpZD0iRUpCTG9jYWxSZWZfMTA1MTYzOTc4ODk0OSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM4PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMzg8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzM4PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM4PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmIGlkPSJFSkJMb2NhbFJlZl8xMDUxNjM5Nzg4OTUwIj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzk8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzM5PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8zOTwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zOTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjM5Nzg4OTQ2Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTU8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xNTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2Mzk3ODg5NDciPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xNjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzE2PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTYzOTc4ODk0OCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzE3PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTc8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjM5Nzg4OTQ5Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTg8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xODwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2Mzk3ODg5NTAiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xOTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzE5PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHVzZS1jYWxsZXItaWRlbnRpdHkgaWQ9IlVzZUNhbGxlcklkZW50aXR5XzEwNTE2Mzk3ODg5NDYiPjwvdXNlLWNhbGxlci1pZGVudGl0eT4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmIGlkPSJSZXNvdXJjZVJlZl8xMDUxNjM5Nzg4OTQ2Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTU8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzE1PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmIGlkPSJSZXNvdXJjZVJlZl8xMDUxNjM5Nzg4OTQ3Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTY8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzE2PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWYgaWQ9IlJlc291cmNlUmVmXzEwNTE2Mzk3ODg5NDgiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xNzwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMTc8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWYgaWQ9IlJlc291cmNlUmVmXzEwNTE2Mzk3ODg5NDkiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xODwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMTg8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZiBpZD0iUmVzb3VyY2VSZWZfMTA1MTYzOTc4ODk1NiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzE5PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8xOTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYgaWQ9IlJlc291cmNlRW52UmVmXzEwNTE2Mzk3ODg5NTYiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xNTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuTGlzdDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYgaWQ9IlJlc291cmNlRW52UmVmXzEwNTE2Mzk3ODg5NTciPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xNjwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnNxbC5EYXRhPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZiBpZD0iUmVzb3VyY2VFbnZSZWZfMTA1MTYzOTc4ODk1OCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzE3PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZiBpZD0iUmVzb3VyY2VFbnZSZWZfMTA1MTYzOTc4ODk1OSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzE4PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5TdHJpbmc8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmIGlkPSJSZXNvdXJjZUVudlJlZl8xMDUxNjM5Nzg4OTYwIj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTk8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgPC9zZXNzaW9uPgotICAgICAgICAgPGVudGl0eSBpZD0iRW50aXR5XzEwNTE2Mzk3ODg5NTYiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV80PC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fNDwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl80PC9sYXJnZS1pY29uPgotICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfOTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICA8aG9tZT5qYXZhLmxhbmcuU3RyaW5nPC9ob21lPgotICAgICAgICAgICAgPHJlbW90ZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZW1vdGU+Ci0gICAgICAgICAgICA8bG9jYWwtaG9tZT5qYXZhLnV0aWwuTGlzdDwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgIDxsb2NhbD5qYXZhLnNxbC5EYXRhPC9sb2NhbD4KLSAgICAgICAgICAgIDxlamItY2xhc3M+amF2YS5sYW5nLkludGVnZXI8L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS10eXBlPkJlYW48L3BlcnNpc3RlbmNlLXR5cGU+Ci0gICAgICAgICAgICA8cHJpbS1rZXktY2xhc3M+amF2YS5sYW5nLkludGVnZXI8L3ByaW0ta2V5LWNsYXNzPgotICAgICAgICAgICAgPHJlZW50cmFudD5GYWxzZTwvcmVlbnRyYW50PgotICAgICAgICAgICAgPGVudi1lbnRyeSBpZD0iRW52RW50cnlfMTA1MTYzOTc4ODk1NiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjA8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjA8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeSBpZD0iRW52RW50cnlfMTA1MTYzOTc4ODk1NyI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjE8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Eb3VibGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8yMTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5IGlkPSJFbnZFbnRyeV8xMDUxNjM5Nzg4OTU4Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yMjwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJ5dGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8yMjwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5IGlkPSJFbnZFbnRyeV8xMDUxNjM5Nzg4OTU5Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yMzwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlNob3J0PC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjM8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeSBpZD0iRW52RW50cnlfMTA1MTYzOTc4ODk2MCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjQ8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Mb25nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjQ8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVqYi1yZWYgaWQ9IkVqYlJlZl8xMDUxNjM5Nzg4OTU2Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDA8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV80MDwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzQwPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180MDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZiBpZD0iRWpiUmVmXzEwNTE2Mzk3ODg5NTciPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80MTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfNDE8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV80MTwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDE8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWYgaWQ9IkVqYlJlZl8xMDUxNjM5Nzg4OTU4Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV80MjwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzQyPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180MjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZiBpZD0iRWpiUmVmXzEwNTE2Mzk3ODg5NTkiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80MzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfNDM8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV80MzwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDM8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWYgaWQ9IkVqYlJlZl8xMDUxNjM5Nzg4OTYwIj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDQ8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV80NDwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzQ0PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180NDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZiBpZD0iRUpCTG9jYWxSZWZfMTA1MTYzOTc4ODk1NiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ1PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV80NTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNDU8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDU8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWYgaWQ9IkVKQkxvY2FsUmVmXzEwNTE2Mzk3ODg5NTciPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80NjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzQ2PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV80NjwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180NjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZiBpZD0iRUpCTG9jYWxSZWZfMTA1MTYzOTc4ODk1OCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ3PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV80NzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNDc8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDc8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWYgaWQ9IkVKQkxvY2FsUmVmXzEwNTE2Mzk3ODg5NTkiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80ODwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzQ4PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV80ODwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180ODwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZiBpZD0iRUpCTG9jYWxSZWZfMTA1MTYzOTc4ODk2MCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ5PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV80OTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNDk8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDk8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTYzOTc4ODk1NiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzIwPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjA8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjM5Nzg4OTU3Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjE8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yMTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2Mzk3ODg5NTgiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yMjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzIyPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTYzOTc4ODk1OSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzIzPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjM8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjM5Nzg4OTYwIj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjQ8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yNDwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxydW4tYXMgaWQ9IlJ1bkFzU3BlY2lmaWVkSWRlbnRpdHlfMTA1MTYzOTc4ODk1NiI+Ci0gICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzI8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDwvcnVuLWFzPgotICAgICAgICAgICAgPC9zZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWYgaWQ9IlJlc291cmNlUmVmXzEwNTE2Mzk3ODg5NTciPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8yMDwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMjA8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZiBpZD0iUmVzb3VyY2VSZWZfMTA1MTYzOTc4ODk1OCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzIxPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8yMTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZiBpZD0iUmVzb3VyY2VSZWZfMTA1MTYzOTc4ODk1OSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzIyPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8yMjwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmIGlkPSJSZXNvdXJjZVJlZl8xMDUxNjM5Nzg4OTYwIj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjM8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzIzPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmIGlkPSJSZXNvdXJjZVJlZl8xMDUxNjM5Nzg4OTYxIj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjQ8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzI0PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmIGlkPSJSZXNvdXJjZUVudlJlZl8xMDUxNjM5Nzg4OTYxIj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjA8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmIGlkPSJSZXNvdXJjZUVudlJlZl8xMDUxNjM5Nzg4OTYyIj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjE8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5zcWwuRGF0YTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYgaWQ9IlJlc291cmNlRW52UmVmXzEwNTE2Mzk3ODg5NjMiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8yMjwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYgaWQ9IlJlc291cmNlRW52UmVmXzEwNTE2Mzk3ODg5NjQiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8yMzwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZiBpZD0iUmVzb3VyY2VFbnZSZWZfMTA1MTYzOTc4ODk2NSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzI0PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgIDwvZW50aXR5PgotICAgICAgPC9lbnRlcnByaXNlLWJlYW5zPgotICAgICAgPHJlbGF0aW9uc2hpcHMgaWQ9IlJlbGF0aW9uc2hpcHNfMTA1MTYzOTc4ODk1NiI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8ZWpiLXJlbGF0aW9uIGlkPSJFSkJSZWxhdGlvbl8xMDUxNjM5Nzg4OTk2Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb24tbmFtZT5uYW1lXzA8L2VqYi1yZWxhdGlvbi1uYW1lPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZSBpZD0iRUpCUmVsYXRpb25zaGlwUm9sZV8xMDUxNjM5Nzg4OTk2Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV8wPC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+T25lPC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICA8Y2FzY2FkZS1kZWxldGU+PC9jYXNjYWRlLWRlbGV0ZT4KLSAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UgaWQ9IlJvbGVTb3VyY2VfMTA1MTYzOTc4ODk5NiI+Ci0gICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8wPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgPGNtci1maWVsZCBpZD0iQ01SRmllbGRfMTA1MTYzOTc4ODk5NiI+Ci0gICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLW5hbWU+bmFtZV8xMDwvY21yLWZpZWxkLW5hbWU+Ci0gICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvY21yLWZpZWxkLXR5cGU+Ci0gICAgICAgICAgICAgICA8L2Ntci1maWVsZD4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZSBpZD0iRUpCUmVsYXRpb25zaGlwUm9sZV8xMDUxNjM5Nzg4OTk3Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV8xPC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+TWFueTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBpZD0iUm9sZVNvdXJjZV8xMDUxNjM5Nzg4OTk3Ij4KLSAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzE8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICA8Y21yLWZpZWxkIGlkPSJDTVJGaWVsZF8xMDUxNjM5Nzg4OTk3Ij4KLSAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtbmFtZT5uYW1lXzExPC9jbXItZmllbGQtbmFtZT4KLSAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9jbXItZmllbGQtdHlwZT4KLSAgICAgICAgICAgICAgIDwvY21yLWZpZWxkPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICA8L2VqYi1yZWxhdGlvbj4KLSAgICAgICAgIDxlamItcmVsYXRpb24gaWQ9IkVKQlJlbGF0aW9uXzEwNTE2Mzk3ODg5OTciPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbi1uYW1lPm5hbWVfMTwvZWpiLXJlbGF0aW9uLW5hbWU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlIGlkPSJFSkJSZWxhdGlvbnNoaXBSb2xlXzEwNTE2Mzk3ODg5OTgiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzU8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5NYW55PC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlIGlkPSJSb2xlU291cmNlXzEwNTE2Mzk3ODg5OTgiPgotICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgIDxjbXItZmllbGQgaWQ9IkNNUkZpZWxkXzEwNTE2Mzk3ODg5OTgiPgotICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC1uYW1lPm5hbWVfMTU8L2Ntci1maWVsZC1uYW1lPgotICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC10eXBlPmphdmEubGFuZy5TdHJpbmc8L2Ntci1maWVsZC10eXBlPgotICAgICAgICAgICAgICAgPC9jbXItZmllbGQ+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUgaWQ9IkVKQlJlbGF0aW9uc2hpcFJvbGVfMTA1MTYzOTc4ODk5OSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfNjwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk9uZTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgPGNhc2NhZGUtZGVsZXRlPjwvY2FzY2FkZS1kZWxldGU+Ci0gICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlIGlkPSJSb2xlU291cmNlXzEwNTE2Mzk3ODg5OTkiPgotICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMjwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgIDxjbXItZmllbGQgaWQ9IkNNUkZpZWxkXzEwNTE2Mzk3ODg5OTkiPgotICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC1uYW1lPm5hbWVfMTY8L2Ntci1maWVsZC1uYW1lPgotICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L2Ntci1maWVsZC10eXBlPgotICAgICAgICAgICAgICAgPC9jbXItZmllbGQ+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgIDwvZWpiLXJlbGF0aW9uPgotICAgICAgICAgPGVqYi1yZWxhdGlvbiBpZD0iRUpCUmVsYXRpb25fMTA1MTYzOTc4OTAwNiI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uLW5hbWU+bmFtZV8yPC9lamItcmVsYXRpb24tbmFtZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUgaWQ9IkVKQlJlbGF0aW9uc2hpcFJvbGVfMTA1MTYzOTc4OTAwNiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzEwPC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+T25lPC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICA8Y2FzY2FkZS1kZWxldGU+PC9jYXNjYWRlLWRlbGV0ZT4KLSAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UgaWQ9IlJvbGVTb3VyY2VfMTA1MTYzOTc4OTAwNiI+Ci0gICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMjwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgIDxjbXItZmllbGQgaWQ9IkNNUkZpZWxkXzEwNTE2Mzk3ODkwMDYiPgotICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtbmFtZT5uYW1lXzIwPC9jbXItZmllbGQtbmFtZT4KLSAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9jbXItZmllbGQtdHlwZT4KLSAgICAgICAgICAgICAgIDwvY21yLWZpZWxkPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlIGlkPSJFSkJSZWxhdGlvbnNoaXBSb2xlXzEwNTE2Mzk3ODkwMDciPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzExPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV8xMTwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk1hbnk8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UgaWQ9IlJvbGVTb3VyY2VfMTA1MTYzOTc4OTAwNyI+Ci0gICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfOTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgIDxjbXItZmllbGQgaWQ9IkNNUkZpZWxkXzEwNTE2Mzk3ODkwMDciPgotICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzExPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtbmFtZT5uYW1lXzIxPC9jbXItZmllbGQtbmFtZT4KLSAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9jbXItZmllbGQtdHlwZT4KLSAgICAgICAgICAgICAgIDwvY21yLWZpZWxkPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICA8L2VqYi1yZWxhdGlvbj4KLSAgICAgICAgIDxlamItcmVsYXRpb24gaWQ9IkVKQlJlbGF0aW9uXzEwNTE2Mzk3ODkwMDciPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbi1uYW1lPm5hbWVfMzwvZWpiLXJlbGF0aW9uLW5hbWU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlIGlkPSJFSkJSZWxhdGlvbnNoaXBSb2xlXzEwNTE2Mzk3ODkwMDgiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV8xNTwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk1hbnk8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UgaWQ9IlJvbGVTb3VyY2VfMTA1MTYzOTc4OTAwOCI+Ci0gICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfOTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgIDxjbXItZmllbGQgaWQ9IkNNUkZpZWxkXzEwNTE2Mzk3ODkwMDgiPgotICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtbmFtZT5uYW1lXzI1PC9jbXItZmllbGQtbmFtZT4KLSAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9jbXItZmllbGQtdHlwZT4KLSAgICAgICAgICAgICAgIDwvY21yLWZpZWxkPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlIGlkPSJFSkJSZWxhdGlvbnNoaXBSb2xlXzEwNTE2Mzk3ODkwMDkiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV8xNjwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk9uZTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgPGNhc2NhZGUtZGVsZXRlPjwvY2FzY2FkZS1kZWxldGU+Ci0gICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlIGlkPSJSb2xlU291cmNlXzEwNTE2Mzk3ODkwMDkiPgotICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzA8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICA8Y21yLWZpZWxkIGlkPSJDTVJGaWVsZF8xMDUxNjM5Nzg5MDA5Ij4KLSAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLW5hbWU+bmFtZV8yNjwvY21yLWZpZWxkLW5hbWU+Ci0gICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvY21yLWZpZWxkLXR5cGU+Ci0gICAgICAgICAgICAgICA8L2Ntci1maWVsZD4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgPC9lamItcmVsYXRpb24+Ci0gICAgICAgICA8ZWpiLXJlbGF0aW9uIGlkPSJFSkJSZWxhdGlvbl8xMDUxNjM5Nzg5MDA4Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb24tbmFtZT5uYW1lXzQ8L2VqYi1yZWxhdGlvbi1uYW1lPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZSBpZD0iRUpCUmVsYXRpb25zaGlwUm9sZV8xMDUxNjM5Nzg5MDEwIj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfMjA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5PbmU8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgIDxjYXNjYWRlLWRlbGV0ZT48L2Nhc2NhZGUtZGVsZXRlPgotICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBpZD0iUm9sZVNvdXJjZV8xMDUxNjM5Nzg5MDEwIj4KLSAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8wPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgPGNtci1maWVsZCBpZD0iQ01SRmllbGRfMTA1MTYzOTc4OTAxMCI+Ci0gICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC1uYW1lPm5hbWVfMzA8L2Ntci1maWVsZC1uYW1lPgotICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC10eXBlPmphdmEubGFuZy5TdHJpbmc8L2Ntci1maWVsZC10eXBlPgotICAgICAgICAgICAgICAgPC9jbXItZmllbGQ+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUgaWQ9IkVKQlJlbGF0aW9uc2hpcFJvbGVfMTA1MTYzOTc4OTAxMSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzIxPC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+TWFueTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBpZD0iUm9sZVNvdXJjZV8xMDUxNjM5Nzg5MDExIj4KLSAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8xPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgPGNtci1maWVsZCBpZD0iQ01SRmllbGRfMTA1MTYzOTc4OTAxMSI+Ci0gICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC1uYW1lPm5hbWVfMzE8L2Ntci1maWVsZC1uYW1lPgotICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L2Ntci1maWVsZC10eXBlPgotICAgICAgICAgICAgICAgPC9jbXItZmllbGQ+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgIDwvZWpiLXJlbGF0aW9uPgotICAgICAgPC9yZWxhdGlvbnNoaXBzPgotICAgICAgPGFzc2VtYmx5LWRlc2NyaXB0b3IgaWQ9IkFzc2VtYmx5RGVzY3JpcHRvcl8xMDUxNjM5Nzg5MDE2Ij4KLSAgICAgICAgIDxzZWN1cml0eS1yb2xlIGlkPSJTZWN1cml0eVJvbGVfMTA1MTYzOTc4OTAzNiI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzA8L3JvbGUtbmFtZT4KLSAgICAgICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgICAgICAgIDxzZWN1cml0eS1yb2xlIGlkPSJTZWN1cml0eVJvbGVfMTA1MTYzOTc4OTAzNyI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzE8L3JvbGUtbmFtZT4KLSAgICAgICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgICAgICAgIDxzZWN1cml0eS1yb2xlIGlkPSJTZWN1cml0eVJvbGVfMTA1MTYzOTc4OTA0NiI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzI8L3JvbGUtbmFtZT4KLSAgICAgICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgICAgICAgIDxzZWN1cml0eS1yb2xlIGlkPSJTZWN1cml0eVJvbGVfMTA1MTYzOTc4OTA0NyI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzM8L3JvbGUtbmFtZT4KLSAgICAgICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgICAgICAgIDxzZWN1cml0eS1yb2xlIGlkPSJTZWN1cml0eVJvbGVfMTA1MTYzOTc4OTA0OCI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzQ8L3JvbGUtbmFtZT4KLSAgICAgICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgICAgICAgIDxtZXRob2QtcGVybWlzc2lvbiBpZD0iTWV0aG9kUGVybWlzc2lvbl8xMDUxNjM5Nzg5MDU2Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTEwNiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8wPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzA8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxMDciPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzE8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTEwOCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8yPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzI8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzA8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTA5Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzg8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzM8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzE8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxMTAiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfOTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQ8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzM8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgIDwvbWV0aG9kLXBlcm1pc3Npb24+Ci0gICAgICAgICA8bWV0aG9kLXBlcm1pc3Npb24gaWQ9Ik1ldGhvZFBlcm1pc3Npb25fMTA1MTYzOTc4OTExNiI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxMTYiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMDwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV81PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTE3Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzE8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV82PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxMTgiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMjwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV83PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc182PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTExOSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV84PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV84PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc183PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzg8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTIwIj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzk8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV85PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc185PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzEwPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzExPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgIDwvbWV0aG9kLXBlcm1pc3Npb24+Ci0gICAgICAgICA8bWV0aG9kLXBlcm1pc3Npb24gaWQ9Ik1ldGhvZFBlcm1pc3Npb25fMTA1MTYzOTc4OTExNyI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxMjEiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzA8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTA8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxMjIiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzExPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzE8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xMTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTIzIj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8yPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzEyPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xMjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxMjQiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzg8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzEzPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xMzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xNDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxMjUiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzk8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xNDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTU8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTY8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTc8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgPC9tZXRob2QtcGVybWlzc2lvbj4KLSAgICAgICAgIDxtZXRob2QtcGVybWlzc2lvbiBpZD0iTWV0aG9kUGVybWlzc2lvbl8xMDUxNjM5Nzg5MTI2Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTEyNiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMDwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xNTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTEyNyI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzE2PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxMjgiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzI8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTc8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzE4PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTEyOSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfODwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTg8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzE5PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzIwPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTEzMCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfOTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzE5PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yMTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yMjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yMzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICA8L21ldGhvZC1wZXJtaXNzaW9uPgotICAgICAgICAgPG1ldGhvZC1wZXJtaXNzaW9uIGlkPSJNZXRob2RQZXJtaXNzaW9uXzEwNTE2Mzk3ODkxMjciPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTMxIj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8wPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzIwPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTMyIj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8xPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjE8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTEzMyI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMjwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yMjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjQ8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTM0Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV84PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yMzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjU8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjY8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTM1Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV85PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjQ8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzI3PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzI4PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzI5PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgIDwvbWV0aG9kLXBlcm1pc3Npb24+Ci0gICAgICAgICA8Y29udGFpbmVyLXRyYW5zYWN0aW9uIGlkPSJNZXRob2RUcmFuc2FjdGlvbl8xMDUxNjM5Nzg5MTQ2Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTE0NiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMDwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yNTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTE0NyI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzI2PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxNDgiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzI8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjc8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzMwPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTE0OSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfODwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjg8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzMxPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzMyPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTE1MCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfOTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzI5PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zMzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zNDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zNTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8dHJhbnMtYXR0cmlidXRlPk5vdFN1cHBvcnRlZDwvdHJhbnMtYXR0cmlidXRlPgotICAgICAgICAgPC9jb250YWluZXItdHJhbnNhY3Rpb24+Ci0gICAgICAgICA8Y29udGFpbmVyLXRyYW5zYWN0aW9uIGlkPSJNZXRob2RUcmFuc2FjdGlvbl8xMDUxNjM5Nzg5MTQ3Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTE1MSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMDwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zMDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTE1MiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzMxPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxNTMiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzI8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzI8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzM2PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTE1NCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfODwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzM8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzM3PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzM4PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTE1NiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfOTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzM0PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zOTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180MDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180MTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8dHJhbnMtYXR0cmlidXRlPlN1cHBvcnRzPC90cmFucy1hdHRyaWJ1dGU+Ci0gICAgICAgICA8L2NvbnRhaW5lci10cmFuc2FjdGlvbj4KLSAgICAgICAgIDxjb250YWluZXItdHJhbnNhY3Rpb24gaWQ9Ik1ldGhvZFRyYW5zYWN0aW9uXzEwNTE2Mzk3ODkxNTYiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTU3Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8wPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzM1PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTU4Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8xPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzY8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTE1OSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMjwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zNzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDI8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTYwIj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV84PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zODwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDM8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDQ8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTYxIj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV85PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzk8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQ1PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQ2PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQ3PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDx0cmFucy1hdHRyaWJ1dGU+UmVxdWlyZWQ8L3RyYW5zLWF0dHJpYnV0ZT4KLSAgICAgICAgIDwvY29udGFpbmVyLXRyYW5zYWN0aW9uPgotICAgICAgICAgPGNvbnRhaW5lci10cmFuc2FjdGlvbiBpZD0iTWV0aG9kVHJhbnNhY3Rpb25fMTA1MTYzOTc4OTE1NyI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxNjIiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzA8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDA8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxNjMiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzE8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80MTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTY0Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8yPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQyPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180ODwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxNjUiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzg8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQzPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180OTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181MDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxNjYiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzk8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80NDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTE8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTI8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTM8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPHRyYW5zLWF0dHJpYnV0ZT5SZXF1aXJlc05ldzwvdHJhbnMtYXR0cmlidXRlPgotICAgICAgICAgPC9jb250YWluZXItdHJhbnNhY3Rpb24+Ci0gICAgICAgICA8Y29udGFpbmVyLXRyYW5zYWN0aW9uIGlkPSJNZXRob2RUcmFuc2FjdGlvbl8xMDUxNjM5Nzg5MTU4Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTE2NyI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMDwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80NTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTE2OCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQ2PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxNjkiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzI8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDc8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzU0PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTE3MCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfODwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDg8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzU1PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzU2PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTE3MSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfOTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQ5PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181NzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181ODwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181OTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8dHJhbnMtYXR0cmlidXRlPk1hbmRhdG9yeTwvdHJhbnMtYXR0cmlidXRlPgotICAgICAgICAgPC9jb250YWluZXItdHJhbnNhY3Rpb24+Ci0gICAgICAgICA8ZXhjbHVkZS1saXN0IGlkPSJFeGNsdWRlTGlzdF8xMDUxNjM5Nzg5MTY2Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTE3MiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMDwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV81MDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTE3NiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzUxPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxNzciPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzUyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzI8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNTI8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzYwPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTE3OCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfODwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNTM8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzYxPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzYyPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTE3OSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfOTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzU0PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc182MzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc182NDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc182NTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICA8L2V4Y2x1ZGUtbGlzdD4KLSAgICAgIDwvYXNzZW1ibHktZGVzY3JpcHRvcj4KLSAgICAgIDxlamItY2xpZW50LWphcj5lamJDbGllbnRKYXJfMDwvZWpiLWNsaWVudC1qYXI+Ci0gICA8L2VqYi1qYXI+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvRU1GVGVzdHMvZWpiLWphcjEtMS54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvRU1GVGVzdHMvZWpiLWphcjEtMS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3MGQyZDQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL0VNRlRlc3RzL2VqYi1qYXIxLTEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjgzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGVqYi1qYXIgUFVCTElDICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgRW50ZXJwcmlzZSBKYXZhQmVhbnMgMS4xLy9FTiIgImh0dHA6Ly9qYXZhLnN1bi5jb20vajJlZS9kdGRzL2VqYi1qYXJfMV8xLmR0ZCI+Ci08ZWpiLWphciBpZD0iZWpiLWphcl9JRCI+Ci0gICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMDwvZGlzcGxheS1uYW1lPgotICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8wPC9zbWFsbC1pY29uPgotICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8wPC9sYXJnZS1pY29uPgotICAgIDxlbnRlcnByaXNlLWJlYW5zPgotICAgICAgICA8ZW50aXR5IGlkPSJNeUNNUCI+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+TXlDTVA8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGhvbWU+Y29tLmlibS50ZXN0LmVqYi5NeUNNUEhvbWU8L2hvbWU+Ci0gICAgICAgICAgICA8cmVtb3RlPmNvbS5pYm0udGVzdC5lamIuTXlDTVA8L3JlbW90ZT4KLSAgICAgICAgICAgIDxlamItY2xhc3M+Y29tLmlibS50ZXN0LmVqYi5NeUNNUEJlYW48L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS10eXBlPkNvbnRhaW5lcjwvcGVyc2lzdGVuY2UtdHlwZT4KLSAgICAgICAgICAgIDxwcmltLWtleS1jbGFzcz5jb20uaWJtLnRlc3QuZWpiLk15Q01QS2V5PC9wcmltLWtleS1jbGFzcz4KLSAgICAgICAgICAgIDxyZWVudHJhbnQ+RmFsc2U8L3JlZW50cmFudD4KLSAgICAgICAgICAgIDxjbXAtZmllbGQ+Ci0gICAgICAgICAgICAgICAgPGZpZWxkLW5hbWU+azE8L2ZpZWxkLW5hbWU+Ci0gICAgICAgICAgICA8L2NtcC1maWVsZD4KLSAgICAgICAgPC9lbnRpdHk+Ci0gICAgICAgIDxlbnRpdHkgaWQ9Ik15Q01QMSI+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+TXlDTVAxPC9lamItbmFtZT4KLSAgICAgICAgICAgIDxob21lPmNvbS5pYm0udGVzdC5lamIuTXlDTVAxSG9tZTwvaG9tZT4KLSAgICAgICAgICAgIDxyZW1vdGU+Y29tLmlibS50ZXN0LmVqYi5NeUNNUDE8L3JlbW90ZT4KLSAgICAgICAgICAgIDxlamItY2xhc3M+Y29tLmlibS50ZXN0LmVqYi5NeUNNUDFCZWFuPC9lamItY2xhc3M+Ci0gICAgICAgICAgICA8cGVyc2lzdGVuY2UtdHlwZT5Db250YWluZXI8L3BlcnNpc3RlbmNlLXR5cGU+Ci0gICAgICAgICAgICA8cHJpbS1rZXktY2xhc3M+Y29tLmlibS50ZXN0LmVqYi5NeUNNUDFLZXk8L3ByaW0ta2V5LWNsYXNzPgotICAgICAgICAgICAgPHJlZW50cmFudD5GYWxzZTwvcmVlbnRyYW50PgotICAgICAgICAgICAgPGNtcC1maWVsZD4KLSAgICAgICAgICAgICAgICA8ZmllbGQtbmFtZT5rMTwvZmllbGQtbmFtZT4KLSAgICAgICAgICAgIDwvY21wLWZpZWxkPgotICAgICAgICA8L2VudGl0eT4KLSAgICAgICAgPGVudGl0eSBpZD0iTXlDTVAyIj4KLSAgICAgICAgICAgIDxlamItbmFtZT5NeUNNUDI8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGhvbWU+Y29tLmlibS50ZXN0LmVqYi5NeUNNUDJIb21lPC9ob21lPgotICAgICAgICAgICAgPHJlbW90ZT5jb20uaWJtLnRlc3QuZWpiLk15Q01QMjwvcmVtb3RlPgotICAgICAgICAgICAgPGVqYi1jbGFzcz5jb20uaWJtLnRlc3QuZWpiLk15Q01QMkJlYW48L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS10eXBlPkNvbnRhaW5lcjwvcGVyc2lzdGVuY2UtdHlwZT4KLSAgICAgICAgICAgIDxwcmltLWtleS1jbGFzcz5jb20uaWJtLnRlc3QuZWpiLk15Q01QMktleTwvcHJpbS1rZXktY2xhc3M+Ci0gICAgICAgICAgICA8cmVlbnRyYW50PkZhbHNlPC9yZWVudHJhbnQ+Ci0gICAgICAgICAgICA8Y21wLWZpZWxkPgotICAgICAgICAgICAgICAgIDxmaWVsZC1uYW1lPmsxPC9maWVsZC1uYW1lPgotICAgICAgICAgICAgPC9jbXAtZmllbGQ+Ci0gICAgICAgIDwvZW50aXR5PgotICAgICAgICA8ZW50aXR5PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8wPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMDwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8wPC9sYXJnZS1pY29uPgotICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMDwvZWpiLW5hbWU+Ci0gICAgICAgICAgICA8aG9tZT5qYXZhLnV0aWwuTGlzdDwvaG9tZT4KLSAgICAgICAgICAgIDxyZW1vdGU+amF2YS5zcWwuRGF0YTwvcmVtb3RlPgotICAgICAgICAgICAgPGxvY2FsLWhvbWU+amF2YS5sYW5nLkludGVnZXI8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICA8bG9jYWw+amF2YS5sYW5nLlN0cmluZzwvbG9jYWw+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmphdmEudXRpbC5IYXNoVGFibGU8L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS10eXBlPkJlYW48L3BlcnNpc3RlbmNlLXR5cGU+Ci0gICAgICAgICAgICA8cHJpbS1rZXktY2xhc3M+amF2YS51dGlsLkhhc2hUYWJsZTwvcHJpbS1rZXktY2xhc3M+Ci0gICAgICAgICAgICA8cmVlbnRyYW50PlRydWU8L3JlZW50cmFudD4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzA8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzA8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzE8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzI8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMzwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Eb3VibGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMzwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV80PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJ5dGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzA8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzA8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMDwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzA8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzE8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8yPC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzI8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8zPC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzM8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfNDwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV80PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzA8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfMDwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfMDwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV8xPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5sb2NhbF8xPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV8yPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5sb2NhbF8yPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+bG9jYWxIb21lXzM8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzM8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+bG9jYWxIb21lXzQ8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzQ8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18wPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18zPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua180PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cnVuLWFzPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDwvcnVuLWFzPgotICAgICAgICAgICAgPC9zZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8wPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMDwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzI8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5TRVJWTEVUPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzM8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8zPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNDwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzQ8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuTGlzdDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8yPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnNxbC5EYXRhPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzM8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQ8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5TdHJpbmc8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgPC9lbnRpdHk+Ci0gICAgICAgIDxlbnRpdHk+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzE8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8xPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzE8L2xhcmdlLWljb24+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8xPC9lamItbmFtZT4KLSAgICAgICAgICAgIDxob21lPmphdmEuc3FsLkRhdGE8L2hvbWU+Ci0gICAgICAgICAgICA8cmVtb3RlPmphdmEubGFuZy5JbnRlZ2VyPC9yZW1vdGU+Ci0gICAgICAgICAgICA8bG9jYWwtaG9tZT5qYXZhLmxhbmcuU3RyaW5nPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgPGxvY2FsPmphdmEudXRpbC5IYXNoVGFibGU8L2xvY2FsPgotICAgICAgICAgICAgPGVqYi1jbGFzcz5qYXZhLnV0aWwuTGlzdDwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXR5cGU+QmVhbjwvcGVyc2lzdGVuY2UtdHlwZT4KLSAgICAgICAgICAgIDxwcmltLWtleS1jbGFzcz5qYXZhLnV0aWwuTGlzdDwvcHJpbS1rZXktY2xhc3M+Ci0gICAgICAgICAgICA8cmVlbnRyYW50PkZhbHNlPC9yZWVudHJhbnQ+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV81PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlNob3J0PC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzU8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNjwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Mb25nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzY8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNzwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5GbG9hdDwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV83PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzg8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQ2hhcmFjdGVyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzg8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfOTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TdHJpbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfOTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzU8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfNTwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV81PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzY8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzY8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNjwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzY8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV83PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzc8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNzwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzc8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV84PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV84PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzg8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua184PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfOTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV85PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzk8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua185PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+bG9jYWxIb21lXzU8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzU8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzU8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV82PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+bG9jYWxIb21lXzY8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzY8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzY8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV83PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfNzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfNzwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzg8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfODwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfODwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfODwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzk8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV85PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5sb2NhbF85PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua185PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzU8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzY8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNjwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzc8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNzwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzg8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfODwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzk8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfOTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHVzZS1jYWxsZXItaWRlbnRpdHkvPgotICAgICAgICAgICAgPC9zZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV81PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPlNFUlZMRVQ8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV82PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNjwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV83PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNzwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfODwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzg8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5TRVJWTEVUPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzk8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV85PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzU8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5MaXN0PC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzY8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNzwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfODwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV85PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgIDwvZW50aXR5PgotICAgICAgICA8ZW50aXR5PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8yPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMjwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8yPC9sYXJnZS1pY29uPgotICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMjwvZWpiLW5hbWU+Ci0gICAgICAgICAgICA8aG9tZT5qYXZhLmxhbmcuSW50ZWdlcjwvaG9tZT4KLSAgICAgICAgICAgIDxyZW1vdGU+amF2YS5sYW5nLlN0cmluZzwvcmVtb3RlPgotICAgICAgICAgICAgPGxvY2FsLWhvbWU+amF2YS51dGlsLkhhc2hUYWJsZTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgIDxsb2NhbD5qYXZhLnV0aWwuTGlzdDwvbG9jYWw+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmphdmEuc3FsLkRhdGE8L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS10eXBlPkJlYW48L3BlcnNpc3RlbmNlLXR5cGU+Ci0gICAgICAgICAgICA8cHJpbS1rZXktY2xhc3M+amF2YS5zcWwuRGF0YTwvcHJpbS1rZXktY2xhc3M+Ci0gICAgICAgICAgICA8cmVlbnRyYW50PlRydWU8L3JlZW50cmFudD4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xMDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzEwPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzExPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xMTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzExPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xMjwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Eb3VibGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTI8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzEzPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJ5dGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTM8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzE0PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlNob3J0PC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzE0PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzEwPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8xMDwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8xMDwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzEwPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzExPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzExPC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzExPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTE8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzEyPC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzEyPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTI8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMTM8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTM8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xMzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xNDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMTQ8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTQ8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xNDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xMDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV8xMDwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfMTA8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzEwPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzExPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfMTE8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzExPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xMTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xMjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV8xMjwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfMTI8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzEyPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzEzPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfMTM8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzEzPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xMzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xNDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV8xNDwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfMTQ8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE0PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xMDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xMDwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xMTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xMTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xMjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xMjwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xMzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xMzwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xNDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xNDwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJ1bi1hcz4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzE8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8L3J1bi1hcz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzEwPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMTA8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzExPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTE8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8xMTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPlNFUlZMRVQ8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTI8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8xMjwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTM8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8xMzwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzE0PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMTQ8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5TRVJWTEVUPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTA8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzExPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTI8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5TdHJpbmc8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzEzPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xNDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgPC9lbnRpdHk+Ci0gICAgICAgIDxlbnRpdHk+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzM8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8zPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzM8L2xhcmdlLWljb24+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8zPC9lamItbmFtZT4KLSAgICAgICAgICAgIDxob21lPmphdmEubGFuZy5TdHJpbmc8L2hvbWU+Ci0gICAgICAgICAgICA8cmVtb3RlPmphdmEudXRpbC5IYXNoVGFibGU8L3JlbW90ZT4KLSAgICAgICAgICAgIDxsb2NhbC1ob21lPmphdmEudXRpbC5MaXN0PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgPGxvY2FsPmphdmEuc3FsLkRhdGE8L2xvY2FsPgotICAgICAgICAgICAgPGVqYi1jbGFzcz5qYXZhLmxhbmcuSW50ZWdlcjwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXR5cGU+QmVhbjwvcGVyc2lzdGVuY2UtdHlwZT4KLSAgICAgICAgICAgIDxwcmltLWtleS1jbGFzcz5qYXZhLmxhbmcuSW50ZWdlcjwvcHJpbS1rZXktY2xhc3M+Ci0gICAgICAgICAgICA8cmVlbnRyYW50PkZhbHNlPC9yZWVudHJhbnQ+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTU8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuTG9uZzwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xNTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTY8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuRmxvYXQ8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTY8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzE3PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkNoYXJhY3RlcjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xNzwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTg8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzE4PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xOTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzE5PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE1PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzE1PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzE1PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTU8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTY8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzE2PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzE2PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTY8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTc8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMTc8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTc8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xNzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xODwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMTg8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTg8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xODwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xOTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8xOTwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8xOTwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE5PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE1PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfMTU8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzE1PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xNTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xNjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV8xNjwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfMTY8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE2PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE3PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfMTc8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzE3PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xNzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xODwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV8xODwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfMTg8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE4PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE5PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfMTk8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzE5PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xOTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTU8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTU8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTY8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTY8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTc8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTc8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTg8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTg8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTk8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTk8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDx1c2UtY2FsbGVyLWlkZW50aXR5Lz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzE1PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMTU8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTY8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8xNjwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xNzwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzE3PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+U0VSVkxFVDwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xODwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzE4PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xOTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzE5PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzE1PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTY8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5TdHJpbmc8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzE3PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xODwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzE5PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnNxbC5EYXRhPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgIDwvZW50aXR5PgotICAgICAgICA8ZW50aXR5PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV80PC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fNDwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl80PC9sYXJnZS1pY29uPgotICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfNDwvZWpiLW5hbWU+Ci0gICAgICAgICAgICA8aG9tZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9ob21lPgotICAgICAgICAgICAgPHJlbW90ZT5qYXZhLnV0aWwuTGlzdDwvcmVtb3RlPgotICAgICAgICAgICAgPGxvY2FsLWhvbWU+amF2YS5zcWwuRGF0YTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgIDxsb2NhbD5qYXZhLmxhbmcuSW50ZWdlcjwvbG9jYWw+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmphdmEubGFuZy5TdHJpbmc8L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS10eXBlPkJlYW48L3BlcnNpc3RlbmNlLXR5cGU+Ci0gICAgICAgICAgICA8cHJpbS1rZXktY2xhc3M+amF2YS5sYW5nLlN0cmluZzwvcHJpbS1rZXktY2xhc3M+Ci0gICAgICAgICAgICA8cmVlbnRyYW50PlRydWU8L3JlZW50cmFudD4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yMDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzIwPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yMTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Eb3VibGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjE8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzIyPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJ5dGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjI8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzIzPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlNob3J0PC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzIzPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yNDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Mb25nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzI0PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzIwPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8yMDwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8yMDwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzIwPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzIxPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzIxPC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzIxPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjE8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzIyPC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzIyPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjI8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMjM8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjM8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yMzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yNDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMjQ8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjQ8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yNDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yMDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV8yMDwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfMjA8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzIwPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzIxPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfMjE8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzIxPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yMTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yMjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV8yMjwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfMjI8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzIyPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzIzPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfMjM8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzIzPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yMzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yNDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV8yNDwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfMjQ8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI0PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yMDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yMDwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yMTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yMTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yMjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yMjwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yMzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yMzwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yNDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yNDwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJ1bi1hcz4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzI8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8L3J1bi1hcz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzIwPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMjA8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5TRVJWTEVUPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8yMTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzIxPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzIyPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMjI8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjM8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8yMzwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPlNFUlZMRVQ8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjQ8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8yNDwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzIwPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8yMTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjI8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5MaXN0PC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8yMzwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5zcWwuRGF0YTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjQ8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgIDwvZW50aXR5PgotICAgICAgICA8ZW50aXR5PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV81PC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fNTwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl81PC9sYXJnZS1pY29uPgotICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfNTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICA8aG9tZT5qYXZhLnV0aWwuTGlzdDwvaG9tZT4KLSAgICAgICAgICAgIDxyZW1vdGU+amF2YS5zcWwuRGF0YTwvcmVtb3RlPgotICAgICAgICAgICAgPGxvY2FsLWhvbWU+amF2YS5sYW5nLkludGVnZXI8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICA8bG9jYWw+amF2YS5sYW5nLlN0cmluZzwvbG9jYWw+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmphdmEudXRpbC5IYXNoVGFibGU8L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS10eXBlPkJlYW48L3BlcnNpc3RlbmNlLXR5cGU+Ci0gICAgICAgICAgICA8cHJpbS1rZXktY2xhc3M+amF2YS51dGlsLkhhc2hUYWJsZTwvcHJpbS1rZXktY2xhc3M+Ci0gICAgICAgICAgICA8cmVlbnRyYW50PkZhbHNlPC9yZWVudHJhbnQ+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjU8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuRmxvYXQ8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjU8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzI2PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkNoYXJhY3RlcjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8yNjwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjc8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzI3PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yODwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzI4PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yOTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzI5PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI1PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzI1PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzI1PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjU8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjY8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzI2PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzI2PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjY8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjc8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMjc8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjc8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yNzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yODwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMjg8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjg8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yODwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yOTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8yOTwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8yOTwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI5PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI1PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfMjU8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzI1PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yNTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yNjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV8yNjwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfMjY8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI2PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI3PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfMjc8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzI3PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yNzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yODwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV8yODwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfMjg8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI4PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI5PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfMjk8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzI5PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yOTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjU8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjU8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjY8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjY8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjc8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjc8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjg8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjg8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjk8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjk8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDx1c2UtY2FsbGVyLWlkZW50aXR5Lz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzI1PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMjU8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8yNjwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzI2PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+U0VSVkxFVDwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjc8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8yNzwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8yODwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzI4PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzI5PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMjk8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5TRVJWTEVUPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8yNTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjY8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5MaXN0PC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8yNzwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5zcWwuRGF0YTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjg8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8yOTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICA8L2VudGl0eT4KLSAgICAgICAgPGVudGl0eT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfNjwvZGlzcGxheS1uYW1lPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzY8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fNjwvbGFyZ2UtaWNvbj4KLSAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzY8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGhvbWU+amF2YS5zcWwuRGF0YTwvaG9tZT4KLSAgICAgICAgICAgIDxyZW1vdGU+amF2YS5sYW5nLkludGVnZXI8L3JlbW90ZT4KLSAgICAgICAgICAgIDxsb2NhbC1ob21lPmphdmEubGFuZy5TdHJpbmc8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICA8bG9jYWw+amF2YS51dGlsLkhhc2hUYWJsZTwvbG9jYWw+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmphdmEudXRpbC5MaXN0PC9lamItY2xhc3M+Ci0gICAgICAgICAgICA8cGVyc2lzdGVuY2UtdHlwZT5CZWFuPC9wZXJzaXN0ZW5jZS10eXBlPgotICAgICAgICAgICAgPHByaW0ta2V5LWNsYXNzPmphdmEudXRpbC5MaXN0PC9wcmltLWtleS1jbGFzcz4KLSAgICAgICAgICAgIDxyZWVudHJhbnQ+VHJ1ZTwvcmVlbnRyYW50PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzMwPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkRvdWJsZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8zMDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMzE8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQnl0ZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8zMTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMzI8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU2hvcnQ8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMzI8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzMzPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkxvbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMzM8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzM0PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkZsb2F0PC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzM0PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzMwPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8zMDwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8zMDwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzMwPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzMxPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzMxPC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzMxPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzE8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzMyPC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzMyPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzI8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMzM8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzM8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zMzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zNDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMzQ8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzQ8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zNDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zMDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV8zMDwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfMzA8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzMwPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzMxPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfMzE8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzMxPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zMTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zMjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV8zMjwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfMzI8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzMyPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzMzPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfMzM8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzMzPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zMzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zNDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV8zNDwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfMzQ8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM0PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8zMDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18zMDwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8zMTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18zMTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8zMjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18zMjwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8zMzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18zMzwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8zNDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18zNDwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJ1bi1hcz4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzM8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8L3J1bi1hcz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzMwPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMzA8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzMxPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMzE8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zMjwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzMyPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+U0VSVkxFVDwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzM8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8zMzwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zNDwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzM0PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8zMDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzMxPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnNxbC5EYXRhPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8zMjwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzMzPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8zNDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICA8L2VudGl0eT4KLSAgICAgICAgPGVudGl0eT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfNzwvZGlzcGxheS1uYW1lPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzc8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fNzwvbGFyZ2UtaWNvbj4KLSAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzc8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGhvbWU+amF2YS5sYW5nLkludGVnZXI8L2hvbWU+Ci0gICAgICAgICAgICA8cmVtb3RlPmphdmEubGFuZy5TdHJpbmc8L3JlbW90ZT4KLSAgICAgICAgICAgIDxsb2NhbC1ob21lPmphdmEudXRpbC5IYXNoVGFibGU8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICA8bG9jYWw+amF2YS51dGlsLkxpc3Q8L2xvY2FsPgotICAgICAgICAgICAgPGVqYi1jbGFzcz5qYXZhLnNxbC5EYXRhPC9lamItY2xhc3M+Ci0gICAgICAgICAgICA8cGVyc2lzdGVuY2UtdHlwZT5CZWFuPC9wZXJzaXN0ZW5jZS10eXBlPgotICAgICAgICAgICAgPHByaW0ta2V5LWNsYXNzPmphdmEuc3FsLkRhdGE8L3ByaW0ta2V5LWNsYXNzPgotICAgICAgICAgICAgPHJlZW50cmFudD5GYWxzZTwvcmVlbnRyYW50PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzM1PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkNoYXJhY3RlcjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8zNTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMzY8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzM2PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8zNzwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzM3PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8zODwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzM4PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8zOTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Eb3VibGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMzk8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzU8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMzU8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzU8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zNTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zNjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMzY8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzY8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zNjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zNzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8zNzwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8zNzwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM3PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM4PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8zODwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8zODwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM4PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM5PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzM5PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzM5PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzk8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzU8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV8zNTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfMzU8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM1PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM2PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+bG9jYWxIb21lXzM2PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5sb2NhbF8zNjwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzY8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzc8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV8zNzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfMzc8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM3PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM4PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+bG9jYWxIb21lXzM4PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5sb2NhbF8zODwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzg8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzk8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV8zOTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfMzk8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM5PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8zNTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18zNTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8zNjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18zNjwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8zNzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18zNzwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8zODwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18zODwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8zOTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18zOTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHVzZS1jYWxsZXItaWRlbnRpdHkvPgotICAgICAgICAgICAgPC9zZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzU8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8zNTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPlNFUlZMRVQ8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzY8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8zNjwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzc8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8zNzwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzM4PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMzg8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5TRVJWTEVUPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zOTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzM5PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8zNTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5zcWwuRGF0YTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMzY8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8zNzwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMzg8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzM5PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuTGlzdDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICA8L2VudGl0eT4KLSAgICAgICAgPGVudGl0eT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfODwvZGlzcGxheS1uYW1lPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzg8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fODwvbGFyZ2UtaWNvbj4KLSAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzg8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGhvbWU+amF2YS5sYW5nLlN0cmluZzwvaG9tZT4KLSAgICAgICAgICAgIDxyZW1vdGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVtb3RlPgotICAgICAgICAgICAgPGxvY2FsLWhvbWU+amF2YS51dGlsLkxpc3Q8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICA8bG9jYWw+amF2YS5zcWwuRGF0YTwvbG9jYWw+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmphdmEubGFuZy5JbnRlZ2VyPC9lamItY2xhc3M+Ci0gICAgICAgICAgICA8cGVyc2lzdGVuY2UtdHlwZT5CZWFuPC9wZXJzaXN0ZW5jZS10eXBlPgotICAgICAgICAgICAgPHByaW0ta2V5LWNsYXNzPmphdmEubGFuZy5JbnRlZ2VyPC9wcmltLWtleS1jbGFzcz4KLSAgICAgICAgICAgIDxyZWVudHJhbnQ+VHJ1ZTwvcmVlbnRyYW50PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzQwPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJ5dGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNDA8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzQxPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlNob3J0PC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzQxPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV80MjwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Mb25nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzQyPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV80MzwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5GbG9hdDwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV80MzwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNDQ8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQ2hhcmFjdGVyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzQ0PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQwPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV80MDwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV80MDwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQwPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQxPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzQxPC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzQxPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDE8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzQyPC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzQyPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDI8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfNDM8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNDM8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180MzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80NDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfNDQ8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNDQ8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180NDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80MDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV80MDwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfNDA8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQwPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQxPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfNDE8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzQxPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180MTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80MjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV80MjwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfNDI8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQyPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQzPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfNDM8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzQzPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180MzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80NDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV80NDwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfNDQ8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ0PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV80MDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua180MDwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV80MTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua180MTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV80Mjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua180Mjwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV80Mzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua180Mzwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV80NDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua180NDwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJ1bi1hcz4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzQ8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8L3J1bi1hcz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzQwPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNDA8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNDE8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV80MTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPlNFUlZMRVQ8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNDI8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV80MjwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNDM8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV80MzwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzQ0PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNDQ8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5TRVJWTEVUPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDA8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV80MTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDI8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQzPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuTGlzdDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDQ8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgPC9lbnRpdHk+Ci0gICAgICAgIDxlbnRpdHk+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzk8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl85PC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzk8L2xhcmdlLWljb24+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV85PC9lamItbmFtZT4KLSAgICAgICAgICAgIDxob21lPmphdmEudXRpbC5IYXNoVGFibGU8L2hvbWU+Ci0gICAgICAgICAgICA8cmVtb3RlPmphdmEudXRpbC5MaXN0PC9yZW1vdGU+Ci0gICAgICAgICAgICA8bG9jYWwtaG9tZT5qYXZhLnNxbC5EYXRhPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgPGxvY2FsPmphdmEubGFuZy5JbnRlZ2VyPC9sb2NhbD4KLSAgICAgICAgICAgIDxlamItY2xhc3M+amF2YS5sYW5nLlN0cmluZzwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXR5cGU+QmVhbjwvcGVyc2lzdGVuY2UtdHlwZT4KLSAgICAgICAgICAgIDxwcmltLWtleS1jbGFzcz5qYXZhLmxhbmcuU3RyaW5nPC9wcmltLWtleS1jbGFzcz4KLSAgICAgICAgICAgIDxyZWVudHJhbnQ+RmFsc2U8L3JlZW50cmFudD4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV80NTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TdHJpbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNDU8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzQ2PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkludGVnZXI8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNDY8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzQ3PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJvb2xlYW48L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNDc8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzQ4PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkRvdWJsZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV80ODwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80OTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNDk8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQnl0ZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV80OTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80NTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV80NTwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV80NTwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ1PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ2PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV80NjwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV80NjwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ2PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ3PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzQ3PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzQ3PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDc8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDg8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzQ4PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzQ4PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDg8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDk8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfNDk8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNDk8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180OTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80NTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+bG9jYWxIb21lXzQ1PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5sb2NhbF80NTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDU8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDY8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfNDY8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzQ2PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180NjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80NzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+bG9jYWxIb21lXzQ3PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5sb2NhbF80NzwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDc8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDg8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfNDg8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzQ4PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180ODwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80OTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+bG9jYWxIb21lXzQ5PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5sb2NhbF80OTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDk8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzQ1PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzQ1PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzQ2PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzQ2PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzQ3PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzQ3PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80ODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzQ4PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzQ4PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80OTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzQ5PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzQ5PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8dXNlLWNhbGxlci1pZGVudGl0eS8+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV80NTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzQ1PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzQ2PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNDY8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNDc8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV80NzwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPlNFUlZMRVQ8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNDg8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV80ODwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNDk8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV80OTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV80NTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDY8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQ3PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuTGlzdDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDg8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80OTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQ5PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICA8L2VudGl0eT4KLSAgICA8L2VudGVycHJpc2UtYmVhbnM+Ci0gICAgPHJlbGF0aW9uc2hpcHM+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGVqYi1yZWxhdGlvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb24tbmFtZT5uYW1lXzA8L2VqYi1yZWxhdGlvbi1uYW1lPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+T25lPC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICAgPGNhc2NhZGUtZGVsZXRlLz4KLSAgICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGNtci1maWVsZD4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLW5hbWU+bmFtZV8wPC9jbXItZmllbGQtbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L2Ntci1maWVsZC10eXBlPgotICAgICAgICAgICAgICAgIDwvY21yLWZpZWxkPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfMTwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5NYW55PC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgIDxjbXItZmllbGQ+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC1uYW1lPm5hbWVfMTwvY21yLWZpZWxkLW5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtdHlwZT5qYXZhLnV0aWwuTGlzdDwvY21yLWZpZWxkLXR5cGU+Ci0gICAgICAgICAgICAgICAgPC9jbXItZmllbGQ+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgPC9lamItcmVsYXRpb24+Ci0gICAgICAgIDxlamItcmVsYXRpb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uLW5hbWU+bmFtZV8xPC9lamItcmVsYXRpb24tbmFtZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV8yPC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk9uZTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgIDxjYXNjYWRlLWRlbGV0ZS8+Ci0gICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgIDxjbXItZmllbGQ+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC1uYW1lPm5hbWVfMjwvY21yLWZpZWxkLW5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtdHlwZT5qYXZhLnNxbC5EYXRhPC9jbXItZmllbGQtdHlwZT4KLSAgICAgICAgICAgICAgICA8L2Ntci1maWVsZD4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzM8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+TWFueTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8Y21yLWZpZWxkPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtbmFtZT5uYW1lXzM8L2Ntci1maWVsZC1uYW1lPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L2Ntci1maWVsZC10eXBlPgotICAgICAgICAgICAgICAgIDwvY21yLWZpZWxkPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgIDwvZWpiLXJlbGF0aW9uPgotICAgICAgICA8ZWpiLXJlbGF0aW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbi1uYW1lPm5hbWVfMjwvZWpiLXJlbGF0aW9uLW5hbWU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfNDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5PbmU8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgICA8Y2FzY2FkZS1kZWxldGUvPgotICAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8Y21yLWZpZWxkPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtbmFtZT5uYW1lXzQ8L2Ntci1maWVsZC1uYW1lPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvY21yLWZpZWxkLXR5cGU+Ci0gICAgICAgICAgICAgICAgPC9jbXItZmllbGQ+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV81PC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk1hbnk8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGNtci1maWVsZD4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLW5hbWU+bmFtZV81PC9jbXItZmllbGQtbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L2Ntci1maWVsZC10eXBlPgotICAgICAgICAgICAgICAgIDwvY21yLWZpZWxkPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgIDwvZWpiLXJlbGF0aW9uPgotICAgICAgICA8ZWpiLXJlbGF0aW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbi1uYW1lPm5hbWVfMzwvZWpiLXJlbGF0aW9uLW5hbWU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfNjwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5PbmU8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgICA8Y2FzY2FkZS1kZWxldGUvPgotICAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8Y21yLWZpZWxkPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtbmFtZT5uYW1lXzY8L2Ntci1maWVsZC1uYW1lPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLXR5cGU+amF2YS51dGlsLkxpc3Q8L2Ntci1maWVsZC10eXBlPgotICAgICAgICAgICAgICAgIDwvY21yLWZpZWxkPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfNzwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5NYW55PC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgIDxjbXItZmllbGQ+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC1uYW1lPm5hbWVfNzwvY21yLWZpZWxkLW5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtdHlwZT5qYXZhLnNxbC5EYXRhPC9jbXItZmllbGQtdHlwZT4KLSAgICAgICAgICAgICAgICA8L2Ntci1maWVsZD4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICA8L2VqYi1yZWxhdGlvbj4KLSAgICAgICAgPGVqYi1yZWxhdGlvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb24tbmFtZT5uYW1lXzQ8L2VqYi1yZWxhdGlvbi1uYW1lPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzg8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+T25lPC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICAgPGNhc2NhZGUtZGVsZXRlLz4KLSAgICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGNtci1maWVsZD4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLW5hbWU+bmFtZV84PC9jbXItZmllbGQtbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9jbXItZmllbGQtdHlwZT4KLSAgICAgICAgICAgICAgICA8L2Ntci1maWVsZD4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzk8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+TWFueTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8Y21yLWZpZWxkPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtbmFtZT5uYW1lXzk8L2Ntci1maWVsZC1uYW1lPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvY21yLWZpZWxkLXR5cGU+Ci0gICAgICAgICAgICAgICAgPC9jbXItZmllbGQ+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgPC9lamItcmVsYXRpb24+Ci0gICAgPC9yZWxhdGlvbnNoaXBzPgotICAgIDxhc3NlbWJseS1kZXNjcmlwdG9yPgotICAgICAgICA8c2VjdXJpdHktcm9sZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfNTwvcm9sZS1uYW1lPgotICAgICAgICA8L3NlY3VyaXR5LXJvbGU+Ci0gICAgICAgIDxzZWN1cml0eS1yb2xlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV82PC9yb2xlLW5hbWU+Ci0gICAgICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgICAgICAgPHNlY3VyaXR5LXJvbGU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzc8L3JvbGUtbmFtZT4KLSAgICAgICAgPC9zZWN1cml0eS1yb2xlPgotICAgICAgICA8c2VjdXJpdHktcm9sZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfODwvcm9sZS1uYW1lPgotICAgICAgICA8L3NlY3VyaXR5LXJvbGU+Ci0gICAgICAgIDxzZWN1cml0eS1yb2xlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV85PC9yb2xlLW5hbWU+Ci0gICAgICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgICAgICAgPG1ldGhvZC1wZXJtaXNzaW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVuY2hlY2tlZC8+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8wPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXMvPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQ8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgIDwvbWV0aG9kLXBlcm1pc3Npb24+Ci0gICAgICAgIDxtZXRob2QtcGVybWlzc2lvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5TZXJ2aWNlRW5kcG9pbnQ8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzU8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV82PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcy8+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzc8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzY8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV84PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc183PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfODwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV85PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc185PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTA8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xMTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICA8L21ldGhvZC1wZXJtaXNzaW9uPgotICAgICAgICA8bWV0aG9kLXBlcm1pc3Npb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dW5jaGVja2VkLz4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xMDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzExPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+U2VydmljZUVuZHBvaW50PC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xMTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXMvPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTI8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzEyPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTM8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzEzPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTQ8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTQ8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzE1PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTY8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xNzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICA8L21ldGhvZC1wZXJtaXNzaW9uPgotICAgICAgICA8bWV0aG9kLXBlcm1pc3Npb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xNTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xNjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXMvPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlNlcnZpY2VFbmRwb2ludDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTc8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzE4PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTg8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzE5PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjA8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xOTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjE8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yMjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzIzPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgIDwvbWV0aG9kLXBlcm1pc3Npb24+Ci0gICAgICAgIDxtZXRob2QtcGVybWlzc2lvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1bmNoZWNrZWQvPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yMDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzIxPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcy8+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yMjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjQ8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+U2VydmljZUVuZHBvaW50PC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yMzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjU8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yNjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzI0PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yNzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzI4PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjk8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgPC9tZXRob2QtcGVybWlzc2lvbj4KLSAgICAgICAgPGNvbnRhaW5lci10cmFuc2FjdGlvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yNTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjY8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zLz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjc8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzMwPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjg8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzMxPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMzI8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+U2VydmljZUVuZHBvaW50PC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yOTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMzM8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zNDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzM1PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8dHJhbnMtYXR0cmlidXRlPk5vdFN1cHBvcnRlZDwvdHJhbnMtYXR0cmlidXRlPgotICAgICAgICA8L2NvbnRhaW5lci10cmFuc2FjdGlvbj4KLSAgICAgICAgPGNvbnRhaW5lci10cmFuc2FjdGlvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zMDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zMTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXMvPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzMyPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zNjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzM8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzM3PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMzg8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zNDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMzk8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180MDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQxPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8dHJhbnMtYXR0cmlidXRlPlN1cHBvcnRzPC90cmFucy1hdHRyaWJ1dGU+Ci0gICAgICAgIDwvY29udGFpbmVyLXRyYW5zYWN0aW9uPgotICAgICAgICA8Y29udGFpbmVyLXRyYW5zYWN0aW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5TZXJ2aWNlRW5kcG9pbnQ8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzM1PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzM2PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcy8+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zNzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDI8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzg8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQzPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDQ8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzM5PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180NTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQ2PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDc8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDx0cmFucy1hdHRyaWJ1dGU+UmVxdWlyZWQ8L3RyYW5zLWF0dHJpYnV0ZT4KLSAgICAgICAgPC9jb250YWluZXItdHJhbnNhY3Rpb24+Ci0gICAgICAgIDxjb250YWluZXItdHJhbnNhY3Rpb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDA8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlNlcnZpY2VFbmRwb2ludDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDE8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zLz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQyPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180ODwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQzPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180OTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzUwPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQ0PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181MTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzUyPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTM8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDx0cmFucy1hdHRyaWJ1dGU+UmVxdWlyZXNOZXc8L3RyYW5zLWF0dHJpYnV0ZT4KLSAgICAgICAgPC9jb250YWluZXItdHJhbnNhY3Rpb24+Ci0gICAgICAgIDxjb250YWluZXItdHJhbnNhY3Rpb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80NTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80NjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXMvPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlNlcnZpY2VFbmRwb2ludDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDc8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzU0PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80ODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDg8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzU1PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTY8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80OTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTc8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181ODwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzU5PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8dHJhbnMtYXR0cmlidXRlPk1hbmRhdG9yeTwvdHJhbnMtYXR0cmlidXRlPgotICAgICAgICA8L2NvbnRhaW5lci10cmFuc2FjdGlvbj4KLSAgICAgICAgPGV4Y2x1ZGUtbGlzdD4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzUwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNTA8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81MTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV81MTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXMvPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81MjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNTI8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzYwPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81MzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlNlcnZpY2VFbmRwb2ludDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNTM8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzYxPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNjI8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV81NDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNjM8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc182NDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzY1PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgIDwvZXhjbHVkZS1saXN0PgotICAgIDwvYXNzZW1ibHktZGVzY3JpcHRvcj4KLSAgICA8ZWpiLWNsaWVudC1qYXI+ZWpiQ2xpZW50SmFyXzA8L2VqYi1jbGllbnQtamFyPgotPC9lamItamFyPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9FTUZUZXN0cy9lamItamFyMi0wLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9FTUZUZXN0cy9lamItamFyMi0wLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE4ZGMwZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvRU1GVGVzdHMvZWpiLWphcjItMC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyODYzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgZWpiLWphciBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBFbnRlcnByaXNlIEphdmFCZWFucyAyLjAvL0VOIiAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvZWpiLWphcl8yXzAuZHRkIj4KLTxlamItamFyIGlkPSJlamItamFyX0lEIj4KLSAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0JPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8wPC9kaXNwbGF5LW5hbWU+Ci0gICAgPHNtYWxsLWljb24+c21hbGxJY29uXzA8L3NtYWxsLWljb24+Ci0gICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzA8L2xhcmdlLWljb24+Ci0JPGVudGVycHJpc2UtYmVhbnM+Ci0JCTxlbnRpdHkgaWQ9IkNNUDEiPgotCQkJPGVqYi1uYW1lPkNNUDE8L2VqYi1uYW1lPgotCQkJPGxvY2FsLWhvbWU+ZWpicy5DTVAxTG9jYWxIb21lPC9sb2NhbC1ob21lPgotCQkJPGxvY2FsPmVqYnMuQ01QMUxvY2FsPC9sb2NhbD4KLQkJCTxlamItY2xhc3M+ZWpicy5DTVAxQmVhbjwvZWpiLWNsYXNzPgotCQkJPHBlcnNpc3RlbmNlLXR5cGU+Q29udGFpbmVyPC9wZXJzaXN0ZW5jZS10eXBlPgotCQkJPHByaW0ta2V5LWNsYXNzPmVqYnMuQ01QMUtleTwvcHJpbS1rZXktY2xhc3M+Ci0JCQk8cmVlbnRyYW50PkZhbHNlPC9yZWVudHJhbnQ+Ci0JCQk8Y21wLXZlcnNpb24+Mi54PC9jbXAtdmVyc2lvbj4KLQkJCTxhYnN0cmFjdC1zY2hlbWEtbmFtZT5DTVAxPC9hYnN0cmFjdC1zY2hlbWEtbmFtZT4KLQkJCTxjbXAtZmllbGQ+Ci0JCQkJPGZpZWxkLW5hbWU+aWQ8L2ZpZWxkLW5hbWU+Ci0JCQk8L2NtcC1maWVsZD4KLQkJPC9lbnRpdHk+Ci0JCTxlbnRpdHkgaWQ9IkNNUDIiPgotCQkJPGVqYi1uYW1lPkNNUDI8L2VqYi1uYW1lPgotCQkJPGxvY2FsLWhvbWU+ZWpicy5DTVAyTG9jYWxIb21lPC9sb2NhbC1ob21lPgotCQkJPGxvY2FsPmVqYnMuQ01QMkxvY2FsPC9sb2NhbD4KLQkJCTxlamItY2xhc3M+ZWpicy5DTVAyQmVhbjwvZWpiLWNsYXNzPgotCQkJPHBlcnNpc3RlbmNlLXR5cGU+Q29udGFpbmVyPC9wZXJzaXN0ZW5jZS10eXBlPgotCQkJPHByaW0ta2V5LWNsYXNzPmVqYnMuQ01QMktleTwvcHJpbS1rZXktY2xhc3M+Ci0JCQk8cmVlbnRyYW50PkZhbHNlPC9yZWVudHJhbnQ+Ci0JCQk8Y21wLXZlcnNpb24+Mi54PC9jbXAtdmVyc2lvbj4KLQkJCTxhYnN0cmFjdC1zY2hlbWEtbmFtZT5DTVAyPC9hYnN0cmFjdC1zY2hlbWEtbmFtZT4KLQkJCTxjbXAtZmllbGQ+Ci0JCQkJPGZpZWxkLW5hbWU+aWQ8L2ZpZWxkLW5hbWU+Ci0JCQk8L2NtcC1maWVsZD4KLQkJPC9lbnRpdHk+Ci0gICAgICAgIDxlbnRpdHk+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzA8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8wPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzA8L2xhcmdlLWljb24+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8wPC9lamItbmFtZT4KLSAgICAgICAgICAgIDxob21lPmphdmEudXRpbC5MaXN0PC9ob21lPgotICAgICAgICAgICAgPHJlbW90ZT5qYXZhLnNxbC5EYXRhPC9yZW1vdGU+Ci0gICAgICAgICAgICA8bG9jYWwtaG9tZT5qYXZhLmxhbmcuSW50ZWdlcjwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgIDxsb2NhbD5qYXZhLmxhbmcuU3RyaW5nPC9sb2NhbD4KLSAgICAgICAgICAgIDxlamItY2xhc3M+amF2YS51dGlsLkhhc2hUYWJsZTwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXR5cGU+QmVhbjwvcGVyc2lzdGVuY2UtdHlwZT4KLSAgICAgICAgICAgIDxwcmltLWtleS1jbGFzcz5qYXZhLnV0aWwuSGFzaFRhYmxlPC9wcmltLWtleS1jbGFzcz4KLSAgICAgICAgICAgIDxyZWVudHJhbnQ+VHJ1ZTwvcmVlbnRyYW50PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TdHJpbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkludGVnZXI8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJvb2xlYW48L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8zPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkRvdWJsZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8zPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzQ8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQnl0ZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV80PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMDwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8wPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMTwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8xPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzI8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzM8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV80PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzQ8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzE8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzA8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzM8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8zPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzU8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzc8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV83PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfOTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzk8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgCTxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18wPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgCTxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgCTxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgCTxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18zPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua180PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cnVuLWFzPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDwvcnVuLWFzPgotICAgICAgICAgICAgPC9zZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8wPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMDwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzI8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5TRVJWTEVUPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzM8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8zPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNDwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzQ8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuTGlzdDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8yPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnNxbC5EYXRhPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzM8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQ8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5TdHJpbmc8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgPC9lbnRpdHk+Ci0gICAgICAgIDxlbnRpdHk+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzE8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8xPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzE8L2xhcmdlLWljb24+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8xPC9lamItbmFtZT4KLSAgICAgICAgICAgIDxob21lPmphdmEuc3FsLkRhdGE8L2hvbWU+Ci0gICAgICAgICAgICA8cmVtb3RlPmphdmEubGFuZy5JbnRlZ2VyPC9yZW1vdGU+Ci0gICAgICAgICAgICA8bG9jYWwtaG9tZT5qYXZhLmxhbmcuU3RyaW5nPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgPGxvY2FsPmphdmEudXRpbC5IYXNoVGFibGU8L2xvY2FsPgotICAgICAgICAgICAgPGVqYi1jbGFzcz5qYXZhLnV0aWwuTGlzdDwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXR5cGU+QmVhbjwvcGVyc2lzdGVuY2UtdHlwZT4KLSAgICAgICAgICAgIDxwcmltLWtleS1jbGFzcz5qYXZhLnV0aWwuTGlzdDwvcHJpbS1rZXktY2xhc3M+Ci0gICAgICAgICAgICA8cmVlbnRyYW50PkZhbHNlPC9yZWVudHJhbnQ+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV81PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlNob3J0PC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzU8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNjwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Mb25nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzY8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNzwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5GbG9hdDwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV83PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzg8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQ2hhcmFjdGVyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzg8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfOTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TdHJpbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfOTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzU8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfNTwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV81PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzY8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzY8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNjwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzY8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV83PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzc8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNzwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzc8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV84PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV84PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzg8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua184PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfOTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV85PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzk8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua185PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8xMTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzExPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua181PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMTM8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8xMzwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzc8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMTU8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8xNTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzg8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzE3PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMTc8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzg8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV85PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzE5PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMTk8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzk8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgCTxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua181PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgCTxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua182PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgCTxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua183PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgCTxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfODwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua184PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgCTxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfOTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua185PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8dXNlLWNhbGxlci1pZGVudGl0eT48L3VzZS1jYWxsZXItaWRlbnRpdHk+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzU8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV81PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+U0VSVkxFVDwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzY8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV82PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzc8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV83PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV84PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfODwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPlNFUlZMRVQ8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfOTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzk8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNjwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5zcWwuRGF0YTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV83PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV84PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzk8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgPC9lbnRpdHk+Ci0gICAgICAgIDxlbnRpdHk+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzA8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8wPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzA8L2xhcmdlLWljb24+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8wPC9lamItbmFtZT4KLSAgICAgICAgICAgIDxob21lPmphdmEubGFuZy5JbnRlZ2VyPC9ob21lPgotICAgICAgICAgICAgPHJlbW90ZT5qYXZhLmxhbmcuU3RyaW5nPC9yZW1vdGU+Ci0gICAgICAgICAgICA8bG9jYWwtaG9tZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgPGxvY2FsPmphdmEudXRpbC5MaXN0PC9sb2NhbD4KLSAgICAgICAgICAgIDxlamItY2xhc3M+amF2YS5zcWwuRGF0YTwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXR5cGU+Q29udGFpbmVyPC9wZXJzaXN0ZW5jZS10eXBlPgotICAgICAgICAgICAgPHByaW0ta2V5LWNsYXNzPmphdmEuc3FsLkRhdGE8L3ByaW0ta2V5LWNsYXNzPgotICAgICAgICAgICAgPHJlZW50cmFudD5UcnVlPC9yZWVudHJhbnQ+Ci0gICAgICAgICAgICA8Y21wLXZlcnNpb24+Mi54PC9jbXAtdmVyc2lvbj4KLSAgICAgICAgICAgIDxhYnN0cmFjdC1zY2hlbWEtbmFtZT5hYnN0cmFjdFNjaGVtYU5hbWVfMDwvYWJzdHJhY3Qtc2NoZW1hLW5hbWU+Ci0gICAgICAgICAgICA8Y21wLWZpZWxkPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZmllbGQtbmFtZT5uYW1lXzE8L2ZpZWxkLW5hbWU+Ci0gICAgICAgICAgICA8L2NtcC1maWVsZD4KLSAgICAgICAgICAgIDxjbXAtZmllbGQ+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxmaWVsZC1uYW1lPm5hbWVfMzwvZmllbGQtbmFtZT4KLSAgICAgICAgICAgIDwvY21wLWZpZWxkPgotICAgICAgICAgICAgPGNtcC1maWVsZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGZpZWxkLW5hbWU+bmFtZV80PC9maWVsZC1uYW1lPgotICAgICAgICAgICAgPC9jbXAtZmllbGQ+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTA8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xMDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTE8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQm9vbGVhbjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xMTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTI8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuRG91YmxlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzEyPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xMzwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5CeXRlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzEzPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xNDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TaG9ydDwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xNDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xMDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMTA8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTA8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xMDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xMTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8xMTwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8xMTwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzExPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzEyPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8xMjwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8xMjwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzEyPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzEzPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzEzPC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzEzPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTM8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTQ8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzE0PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzE0PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTQ8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTA8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzIxPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMjE8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzEwPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzExPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzIzPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMjM8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzExPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzEyPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8yNTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzI1PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xMjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xMzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8yNzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzI3PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xMzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xNDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMjk8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8yOTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTQ8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgCTxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzEwPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzEwPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgCTxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzExPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzExPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgCTxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzEyPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzEyPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgCTxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzEzPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzEzPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgCTxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzE0PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzE0PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cnVuLWFzPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDwvcnVuLWFzPgotICAgICAgICAgICAgPC9zZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTA8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8xMDwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xMTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzExPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+U0VSVkxFVDwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xMjwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzEyPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xMzwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzEzPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTQ8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8xNDwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPlNFUlZMRVQ8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xMDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5zcWwuRGF0YTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzExPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTE8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xMjwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTM8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzE0PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuTGlzdDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHF1ZXJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cXVlcnktbWV0aG9kPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8wPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8L3F1ZXJ5LW1ldGhvZD4KLSAgICAgICAgICAgICAgICA8cmVzdWx0LXR5cGUtbWFwcGluZz5Mb2NhbDwvcmVzdWx0LXR5cGUtbWFwcGluZz4KLSAgICAgICAgICAgICAgICA8ZWpiLXFsPmVqYlFMXzA8L2VqYi1xbD4KLSAgICAgICAgICAgIDwvcXVlcnk+Ci0gICAgICAgICAgICA8cXVlcnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxxdWVyeS1tZXRob2Q+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzE8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcy8+Ci0gICAgICAgICAgICAgICAgPC9xdWVyeS1tZXRob2Q+Ci0gICAgICAgICAgICAgICAgPHJlc3VsdC10eXBlLW1hcHBpbmc+UmVtb3RlPC9yZXN1bHQtdHlwZS1tYXBwaW5nPgotICAgICAgICAgICAgICAgIDxlamItcWw+ZWpiUUxfMTwvZWpiLXFsPgotICAgICAgICAgICAgPC9xdWVyeT4KLSAgICAgICAgICAgIDxxdWVyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHF1ZXJ5LW1ldGhvZD4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18wPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICA8L3F1ZXJ5LW1ldGhvZD4KLSAgICAgICAgICAgICAgICA8cmVzdWx0LXR5cGUtbWFwcGluZz5Mb2NhbDwvcmVzdWx0LXR5cGUtbWFwcGluZz4KLSAgICAgICAgICAgICAgICA8ZWpiLXFsPmVqYlFMXzI8L2VqYi1xbD4KLSAgICAgICAgICAgIDwvcXVlcnk+Ci0gICAgICAgICAgICA8cXVlcnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxxdWVyeS1tZXRob2Q+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzM8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICA8L3F1ZXJ5LW1ldGhvZD4KLSAgICAgICAgICAgICAgICA8cmVzdWx0LXR5cGUtbWFwcGluZz5SZW1vdGU8L3Jlc3VsdC10eXBlLW1hcHBpbmc+Ci0gICAgICAgICAgICAgICAgPGVqYi1xbD5lamJRTF8zPC9lamItcWw+Ci0gICAgICAgICAgICA8L3F1ZXJ5PgotICAgICAgICAgICAgPHF1ZXJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cXVlcnktbWV0aG9kPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzM8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICA8L3F1ZXJ5LW1ldGhvZD4KLSAgICAgICAgICAgICAgICA8cmVzdWx0LXR5cGUtbWFwcGluZz5Mb2NhbDwvcmVzdWx0LXR5cGUtbWFwcGluZz4KLSAgICAgICAgICAgICAgICA8ZWpiLXFsPmVqYlFMXzQ8L2VqYi1xbD4KLSAgICAgICAgICAgIDwvcXVlcnk+Ci0gICAgICAgIDwvZW50aXR5PgotICAgICAgICA8c2Vzc2lvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMDwvZGlzcGxheS1uYW1lPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzA8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMDwvbGFyZ2UtaWNvbj4KLSAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzA8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGhvbWU+amF2YS5sYW5nLlN0cmluZzwvaG9tZT4KLSAgICAgICAgICAgIDxyZW1vdGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVtb3RlPgotICAgICAgICAgICAgPGxvY2FsLWhvbWU+amF2YS51dGlsLkxpc3Q8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICA8bG9jYWw+amF2YS5zcWwuRGF0YTwvbG9jYWw+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmphdmEubGFuZy5JbnRlZ2VyPC9lamItY2xhc3M+Ci0gICAgICAgICAgICA8c2Vzc2lvbi10eXBlPlN0YXRlZnVsPC9zZXNzaW9uLXR5cGU+Ci0gICAgICAgICAgICA8dHJhbnNhY3Rpb24tdHlwZT5CZWFuPC90cmFuc2FjdGlvbi10eXBlPgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzE1PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkxvbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTU8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzE2PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkZsb2F0PC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzE2PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xNzwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5DaGFyYWN0ZXI8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTc8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzE4PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlN0cmluZzwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xODwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTk8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xOTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xNTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8xNTwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8xNTwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE1PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE2PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8xNjwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8xNjwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE2PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE3PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzE3PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzE3PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTc8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTg8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzE4PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzE4PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTg8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTk8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMTk8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTk8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xOTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xNTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8zMTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzMxPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xNTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xNjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMzM8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8zMzwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTY8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTc8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMzU8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8zNTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTc8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTg8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzM3PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMzc8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE4PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE5PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzM5PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMzk8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE5PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIAk8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xNTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xNTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIAk8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xNjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xNjwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIAk8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xNzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xNzwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIAk8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xODwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xODwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIAk8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xOTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xOTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHVzZS1jYWxsZXItaWRlbnRpdHk+PC91c2UtY2FsbGVyLWlkZW50aXR5PgotICAgICAgICAgICAgPC9zZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTU8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8xNTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xNjwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzE2PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzE3PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMTc8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5TRVJWTEVUPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzE4PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMTg8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzE5PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMTk8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTU8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xNjwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTc8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzE4PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuTGlzdDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTk8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgPC9zZXNzaW9uPgotICAgICAgICA8ZW50aXR5PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8yPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMjwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8yPC9sYXJnZS1pY29uPgotICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMjwvZWpiLW5hbWU+Ci0gICAgICAgICAgICA8aG9tZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9ob21lPgotICAgICAgICAgICAgPHJlbW90ZT5qYXZhLnV0aWwuTGlzdDwvcmVtb3RlPgotICAgICAgICAgICAgPGxvY2FsLWhvbWU+amF2YS5zcWwuRGF0YTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgIDxsb2NhbD5qYXZhLmxhbmcuSW50ZWdlcjwvbG9jYWw+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmphdmEubGFuZy5TdHJpbmc8L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS10eXBlPkJlYW48L3BlcnNpc3RlbmNlLXR5cGU+Ci0gICAgICAgICAgICA8cHJpbS1rZXktY2xhc3M+amF2YS5sYW5nLlN0cmluZzwvcHJpbS1rZXktY2xhc3M+Ci0gICAgICAgICAgICA8cmVlbnRyYW50PlRydWU8L3JlZW50cmFudD4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yMDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzIwPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yMTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Eb3VibGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjE8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzIyPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJ5dGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjI8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzIzPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlNob3J0PC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzIzPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yNDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Mb25nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzI0PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzIwPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8yMDwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8yMDwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzIwPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzIxPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzIxPC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzIxPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjE8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzIyPC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzIyPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjI8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMjM8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjM8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yMzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yNDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMjQ8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjQ8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yNDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yMDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNDE8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV80MTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjA8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjE8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNDM8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV80MzwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjE8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzQ1PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNDU8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzIyPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzIzPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzQ3PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNDc8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzIzPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI0PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV80OTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzQ5PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yNDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAJPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjA8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjA8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAJPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjE8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjE8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAJPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjI8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjI8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAJPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjM8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjM8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAJPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjQ8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjQ8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxydW4tYXM+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8yPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPC9ydW4tYXM+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8yMDwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzIwPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+U0VSVkxFVDwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjE8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8yMTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8yMjwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzIyPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzIzPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMjM8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5TRVJWTEVUPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzI0PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMjQ8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8yMDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjE8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzIyPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuTGlzdDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjM8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzI0PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICA8L2VudGl0eT4KLSAgICAgICAgPGVudGl0eT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMzwvZGlzcGxheS1uYW1lPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzM8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMzwvbGFyZ2UtaWNvbj4KLSAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzM8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGhvbWU+amF2YS51dGlsLkxpc3Q8L2hvbWU+Ci0gICAgICAgICAgICA8cmVtb3RlPmphdmEuc3FsLkRhdGE8L3JlbW90ZT4KLSAgICAgICAgICAgIDxsb2NhbC1ob21lPmphdmEubGFuZy5JbnRlZ2VyPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgPGxvY2FsPmphdmEubGFuZy5TdHJpbmc8L2xvY2FsPgotICAgICAgICAgICAgPGVqYi1jbGFzcz5qYXZhLnV0aWwuSGFzaFRhYmxlPC9lamItY2xhc3M+Ci0gICAgICAgICAgICA8cGVyc2lzdGVuY2UtdHlwZT5CZWFuPC9wZXJzaXN0ZW5jZS10eXBlPgotICAgICAgICAgICAgPHByaW0ta2V5LWNsYXNzPmphdmEudXRpbC5IYXNoVGFibGU8L3ByaW0ta2V5LWNsYXNzPgotICAgICAgICAgICAgPHJlZW50cmFudD5GYWxzZTwvcmVlbnRyYW50PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzI1PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkZsb2F0PC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzI1PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yNjwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5DaGFyYWN0ZXI8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjY8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzI3PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlN0cmluZzwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8yNzwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjg8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8yODwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjk8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQm9vbGVhbjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8yOTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yNTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8yNTwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8yNTwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI1PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI2PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8yNjwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8yNjwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI2PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI3PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzI3PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzI3PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjc8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjg8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzI4PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzI4PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjg8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjk8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMjk8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjk8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yOTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yNTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV81MTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzUxPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yNTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yNjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNTM8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV81MzwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjY8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjc8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNTU8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV81NTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjc8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjg8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzU3PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNTc8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI4PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI5PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzU5PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNTk8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI5PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIAk8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yNTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yNTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIAk8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yNjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yNjwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIAk8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yNzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yNzwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIAk8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yODwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yODwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIAk8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yOTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yOTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHVzZS1jYWxsZXItaWRlbnRpdHk+PC91c2UtY2FsbGVyLWlkZW50aXR5PgotICAgICAgICAgICAgPC9zZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjU8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8yNTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzI2PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMjY8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5TRVJWTEVUPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8yNzwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzI3PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzI4PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMjg8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjk8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8yOTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPlNFUlZMRVQ8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzI1PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8yNjwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzI3PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnNxbC5EYXRhPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8yODwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzI5PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgIDwvZW50aXR5PgotICAgICAgICA8bWVzc2FnZS1kcml2ZW4+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzA8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8wPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzA8L2xhcmdlLWljb24+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8wPC9lamItbmFtZT4KLSAgICAgICAgICAgIDxlamItY2xhc3M+amF2YS51dGlsLkxpc3Q8L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDx0cmFuc2FjdGlvbi10eXBlPkJlYW48L3RyYW5zYWN0aW9uLXR5cGU+Ci0gICAgICAgICAgICA8bWVzc2FnZS1zZWxlY3Rvcj5tZXNzYWdlU2VsZWN0b3JfMDwvbWVzc2FnZS1zZWxlY3Rvcj4KLSAgICAgICAgICAgIDxhY2tub3dsZWRnZS1tb2RlPkF1dG8tYWNrbm93bGVkZ2U8L2Fja25vd2xlZGdlLW1vZGU+Ci0gICAgICAgICAgICA8bWVzc2FnZS1kcml2ZW4tZGVzdGluYXRpb24+Ci0gICAgICAgICAgICAgICAgPGRlc3RpbmF0aW9uLXR5cGU+amF2YXguam1zLlF1ZXVlPC9kZXN0aW5hdGlvbi10eXBlPgotICAgICAgICAgICAgICAgIDxzdWJzY3JpcHRpb24tZHVyYWJpbGl0eT5EdXJhYmxlPC9zdWJzY3JpcHRpb24tZHVyYWJpbGl0eT4KLSAgICAgICAgICAgIDwvbWVzc2FnZS1kcml2ZW4tZGVzdGluYXRpb24+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMzA8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuRG91YmxlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzMwPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8zMTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5CeXRlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzMxPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8zMjwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TaG9ydDwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8zMjwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMzM8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuTG9uZzwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8zMzwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMzQ8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuRmxvYXQ8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMzQ8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzA8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzMwPC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzMwPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzA8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzE8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMzE8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzE8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zMTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zMjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMzI8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzI8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zMjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zMzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8zMzwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8zMzwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzMzPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM0PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8zNDwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8zNDwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM0PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzMwPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV82MTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzYxPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zMDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zMTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV82MzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzYzPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zMTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zMjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNjU8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV82NTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzI8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNjc8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV82NzwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzM8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzQ8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzY5PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNjk8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM0PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJ1bi1hcz4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzM8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8L3J1bi1hcz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzMwPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMzA8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzMxPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMzE8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zMjwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzMyPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+U0VSVkxFVDwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzM8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8zMzwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zNDwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzM0PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8zMDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzMxPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnNxbC5EYXRhPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8zMjwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzMzPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8zNDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICA8L21lc3NhZ2UtZHJpdmVuPgotICAgICAgICA8c2Vzc2lvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMTwvZGlzcGxheS1uYW1lPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzE8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMTwvbGFyZ2UtaWNvbj4KLSAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzE8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGhvbWU+amF2YS5sYW5nLlN0cmluZzwvaG9tZT4KLSAgICAgICAgICAgIDxyZW1vdGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVtb3RlPgotICAgICAgICAgICAgPGxvY2FsLWhvbWU+amF2YS51dGlsLkxpc3Q8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICA8bG9jYWw+amF2YS5zcWwuRGF0YTwvbG9jYWw+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmphdmEubGFuZy5JbnRlZ2VyPC9lamItY2xhc3M+Ci0gICAgICAgICAgICA8c2Vzc2lvbi10eXBlPlN0YXRlbGVzczwvc2Vzc2lvbi10eXBlPgotICAgICAgICAgICAgPHRyYW5zYWN0aW9uLXR5cGU+Q29udGFpbmVyPC90cmFuc2FjdGlvbi10eXBlPgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzM1PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkNoYXJhY3RlcjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8zNTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMzY8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzM2PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8zNzwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzM3PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8zODwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzM4PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8zOTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Eb3VibGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMzk8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzU8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMzU8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzU8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zNTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zNjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMzY8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzY8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zNjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zNzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8zNzwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8zNzwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM3PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM4PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8zODwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8zODwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM4PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM5PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzM5PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzM5PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzk8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzU8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNzE8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV83MTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzU8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzY8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzczPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNzM8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM2PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM3PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzc1PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNzU8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM3PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM4PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV83NzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzc3PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zODwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zOTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV83OTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzc5PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zOTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAJPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMzU8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMzU8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAJPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMzY8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMzY8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAJPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMzc8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMzc8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAJPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMzg8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMzg8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAJPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMzk8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMzk8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDx1c2UtY2FsbGVyLWlkZW50aXR5PjwvdXNlLWNhbGxlci1pZGVudGl0eT4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzM1PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMzU8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5TRVJWTEVUPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzM2PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMzY8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzM3PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMzc8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zODwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzM4PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+U0VSVkxFVDwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzk8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8zOTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMzU8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8zNjwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMzc8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzM4PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuTGlzdDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMzk8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgPC9zZXNzaW9uPgotICAgICAgICA8ZW50aXR5PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV80PC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fNDwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl80PC9sYXJnZS1pY29uPgotICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfNDwvZWpiLW5hbWU+Ci0gICAgICAgICAgICA8aG9tZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9ob21lPgotICAgICAgICAgICAgPHJlbW90ZT5qYXZhLnV0aWwuTGlzdDwvcmVtb3RlPgotICAgICAgICAgICAgPGxvY2FsLWhvbWU+amF2YS5zcWwuRGF0YTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgIDxsb2NhbD5qYXZhLmxhbmcuSW50ZWdlcjwvbG9jYWw+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmphdmEubGFuZy5TdHJpbmc8L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS10eXBlPkJlYW48L3BlcnNpc3RlbmNlLXR5cGU+Ci0gICAgICAgICAgICA8cHJpbS1rZXktY2xhc3M+amF2YS5sYW5nLlN0cmluZzwvcHJpbS1rZXktY2xhc3M+Ci0gICAgICAgICAgICA8cmVlbnRyYW50PlRydWU8L3JlZW50cmFudD4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV80MDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5CeXRlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzQwPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV80MTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TaG9ydDwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV80MTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNDI8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuTG9uZzwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV80MjwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNDM8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuRmxvYXQ8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNDM8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzQ0PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkNoYXJhY3RlcjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV80NDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80MDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfNDA8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNDA8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180MDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80MTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV80MTwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV80MTwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQxPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQyPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV80MjwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV80MjwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQyPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQzPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzQzPC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzQzPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDM8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDQ8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzQ0PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzQ0PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDQ8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDA8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzgxPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfODE8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQwPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQxPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzgzPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfODM8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQxPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQyPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV84NTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzg1PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180MjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80MzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV84NzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzg3PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180MzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80NDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfODk8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV84OTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDQ8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgCTxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzQwPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzQwPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgCTxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzQxPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzQxPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgCTxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzQyPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzQyPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgCTxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzQzPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzQzPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgCTxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzQ0PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzQ0PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cnVuLWFzPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfNDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDwvcnVuLWFzPgotICAgICAgICAgICAgPC9zZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNDA8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV80MDwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV80MTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzQxPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+U0VSVkxFVDwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV80MjwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzQyPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV80MzwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzQzPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNDQ8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV80NDwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPlNFUlZMRVQ8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV80MDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDE8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQyPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuTGlzdDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDM8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQ0PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICA8L2VudGl0eT4KLSAgICAgICAgPGVudGl0eT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfNTwvZGlzcGxheS1uYW1lPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzU8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fNTwvbGFyZ2UtaWNvbj4KLSAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzU8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGhvbWU+amF2YS51dGlsLkxpc3Q8L2hvbWU+Ci0gICAgICAgICAgICA8cmVtb3RlPmphdmEuc3FsLkRhdGE8L3JlbW90ZT4KLSAgICAgICAgICAgIDxsb2NhbC1ob21lPmphdmEubGFuZy5JbnRlZ2VyPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgPGxvY2FsPmphdmEubGFuZy5TdHJpbmc8L2xvY2FsPgotICAgICAgICAgICAgPGVqYi1jbGFzcz5qYXZhLnV0aWwuSGFzaFRhYmxlPC9lamItY2xhc3M+Ci0gICAgICAgICAgICA8cGVyc2lzdGVuY2UtdHlwZT5CZWFuPC9wZXJzaXN0ZW5jZS10eXBlPgotICAgICAgICAgICAgPHByaW0ta2V5LWNsYXNzPmphdmEudXRpbC5IYXNoVGFibGU8L3ByaW0ta2V5LWNsYXNzPgotICAgICAgICAgICAgPHJlZW50cmFudD5GYWxzZTwvcmVlbnRyYW50PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzQ1PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlN0cmluZzwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV80NTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNDY8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV80NjwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNDc8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQm9vbGVhbjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV80NzwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80ODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNDg8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuRG91YmxlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzQ4PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV80OTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5CeXRlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzQ5PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ1PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzQ1PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzQ1PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDU8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDY8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzQ2PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzQ2PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDY8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDc8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfNDc8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNDc8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180NzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80ODwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfNDg8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNDg8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180ODwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80OTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV80OTwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV80OTwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ5PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ1PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzkxPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfOTE8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ1PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ2PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV85MzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzkzPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180NjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80NzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV85NTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzk1PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180NzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80ODwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfOTc8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV85NzwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDg8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDk8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfOTk8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV85OTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDk8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgCTxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzQ1PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzQ1PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgCTxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzQ2PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzQ2PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgCTxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzQ3PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzQ3PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgCTxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80ODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzQ4PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzQ4PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgCTxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80OTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzQ5PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzQ5PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8dXNlLWNhbGxlci1pZGVudGl0eT48L3VzZS1jYWxsZXItaWRlbnRpdHk+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV80NTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzQ1PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzQ2PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNDY8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNDc8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV80NzwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPlNFUlZMRVQ8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNDg8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV80ODwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNDk8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV80OTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV80NTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDY8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5MaXN0PC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV80NzwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5zcWwuRGF0YTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDg8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV80OTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICA8L2VudGl0eT4KLQk8L2VudGVycHJpc2UtYmVhbnM+Ci0gICAgPHJlbGF0aW9uc2hpcHM+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGVqYi1yZWxhdGlvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb24tbmFtZT5uYW1lXzA8L2VqYi1yZWxhdGlvbi1uYW1lPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+T25lPC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICAgPGNhc2NhZGUtZGVsZXRlPjwvY2FzY2FkZS1kZWxldGU+Ci0gICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgIDxjbXItZmllbGQ+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC1uYW1lPm5hbWVfMDwvY21yLWZpZWxkLW5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtdHlwZT5qYXZhLnV0aWwuTGlzdDwvY21yLWZpZWxkLXR5cGU+Ci0gICAgICAgICAgICAgICAgPC9jbXItZmllbGQ+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV8xPC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk1hbnk8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGNtci1maWVsZD4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLW5hbWU+bmFtZV8xPC9jbXItZmllbGQtbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC10eXBlPmphdmEuc3FsLkRhdGE8L2Ntci1maWVsZC10eXBlPgotICAgICAgICAgICAgICAgIDwvY21yLWZpZWxkPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgIDwvZWpiLXJlbGF0aW9uPgotICAgICAgICA8ZWpiLXJlbGF0aW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbi1uYW1lPm5hbWVfMTwvZWpiLXJlbGF0aW9uLW5hbWU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfMjwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5PbmU8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgICA8Y2FzY2FkZS1kZWxldGU+PC9jYXNjYWRlLWRlbGV0ZT4KLSAgICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGNtci1maWVsZD4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLW5hbWU+bmFtZV8yPC9jbXItZmllbGQtbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9jbXItZmllbGQtdHlwZT4KLSAgICAgICAgICAgICAgICA8L2Ntci1maWVsZD4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzM8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+TWFueTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8Y21yLWZpZWxkPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtbmFtZT5uYW1lXzM8L2Ntci1maWVsZC1uYW1lPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvY21yLWZpZWxkLXR5cGU+Ci0gICAgICAgICAgICAgICAgPC9jbXItZmllbGQ+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgPC9lamItcmVsYXRpb24+Ci0gICAgICAgIDxlamItcmVsYXRpb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uLW5hbWU+bmFtZV8yPC9lamItcmVsYXRpb24tbmFtZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV80PC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk9uZTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgIDxjYXNjYWRlLWRlbGV0ZT48L2Nhc2NhZGUtZGVsZXRlPgotICAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8Y21yLWZpZWxkPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtbmFtZT5uYW1lXzQ8L2Ntci1maWVsZC1uYW1lPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvY21yLWZpZWxkLXR5cGU+Ci0gICAgICAgICAgICAgICAgPC9jbXItZmllbGQ+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV81PC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk1hbnk8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGNtci1maWVsZD4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLW5hbWU+bmFtZV81PC9jbXItZmllbGQtbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC10eXBlPmphdmEudXRpbC5MaXN0PC9jbXItZmllbGQtdHlwZT4KLSAgICAgICAgICAgICAgICA8L2Ntci1maWVsZD4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICA8L2VqYi1yZWxhdGlvbj4KLSAgICAgICAgPGVqYi1yZWxhdGlvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb24tbmFtZT5uYW1lXzM8L2VqYi1yZWxhdGlvbi1uYW1lPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzY8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+T25lPC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICAgPGNhc2NhZGUtZGVsZXRlPjwvY2FzY2FkZS1kZWxldGU+Ci0gICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgIDxjbXItZmllbGQ+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC1uYW1lPm5hbWVfNjwvY21yLWZpZWxkLW5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtdHlwZT5qYXZhLnNxbC5EYXRhPC9jbXItZmllbGQtdHlwZT4KLSAgICAgICAgICAgICAgICA8L2Ntci1maWVsZD4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzc8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+TWFueTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8Y21yLWZpZWxkPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtbmFtZT5uYW1lXzc8L2Ntci1maWVsZC1uYW1lPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L2Ntci1maWVsZC10eXBlPgotICAgICAgICAgICAgICAgIDwvY21yLWZpZWxkPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgIDwvZWpiLXJlbGF0aW9uPgotICAgICAgICA8ZWpiLXJlbGF0aW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbi1uYW1lPm5hbWVfNDwvZWpiLXJlbGF0aW9uLW5hbWU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfODwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5PbmU8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgICA8Y2FzY2FkZS1kZWxldGU+PC9jYXNjYWRlLWRlbGV0ZT4KLSAgICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGNtci1maWVsZD4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLW5hbWU+bmFtZV84PC9jbXItZmllbGQtbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC10eXBlPmphdmEubGFuZy5TdHJpbmc8L2Ntci1maWVsZC10eXBlPgotICAgICAgICAgICAgICAgIDwvY21yLWZpZWxkPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfOTwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5NYW55PC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgIDxjbXItZmllbGQ+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC1uYW1lPm5hbWVfOTwvY21yLWZpZWxkLW5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9jbXItZmllbGQtdHlwZT4KLSAgICAgICAgICAgICAgICA8L2Ntci1maWVsZD4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICA8L2VqYi1yZWxhdGlvbj4KLSAgICA8L3JlbGF0aW9uc2hpcHM+Ci0gICAgPGFzc2VtYmx5LWRlc2NyaXB0b3I+Ci0gICAgICAgIDxzZWN1cml0eS1yb2xlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV81PC9yb2xlLW5hbWU+Ci0gICAgICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgICAgICAgPHNlY3VyaXR5LXJvbGU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzY8L3JvbGUtbmFtZT4KLSAgICAgICAgPC9zZWN1cml0eS1yb2xlPgotICAgICAgICA8c2VjdXJpdHktcm9sZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfNzwvcm9sZS1uYW1lPgotICAgICAgICA8L3NlY3VyaXR5LXJvbGU+Ci0gICAgICAgIDxzZWN1cml0eS1yb2xlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV84PC9yb2xlLW5hbWU+Ci0gICAgICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgICAgICAgPHNlY3VyaXR5LXJvbGU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzk8L3JvbGUtbmFtZT4KLSAgICAgICAgPC9zZWN1cml0eS1yb2xlPgotICAgICAgICA8bWV0aG9kLXBlcm1pc3Npb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dW5jaGVja2VkPjwvdW5jaGVja2VkPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzE8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zLz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzI8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzA8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzI8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQ8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzM8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICA8L21ldGhvZC1wZXJtaXNzaW9uPgotICAgICAgICA8bWV0aG9kLXBlcm1pc3Npb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+U2VydmljZUVuZHBvaW50PC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV81PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXMvPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV83PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc182PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfODwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzg8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfOTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfOTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzEwPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTE8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgPC9tZXRob2QtcGVybWlzc2lvbj4KLSAgICAgICAgPG1ldGhvZC1wZXJtaXNzaW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVuY2hlY2tlZD48L3VuY2hlY2tlZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xMDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzExPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+U2VydmljZUVuZHBvaW50PC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xMTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXMvPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTI8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzEyPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTM8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzEzPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTQ8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTQ8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzE1PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTY8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xNzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICA8L21ldGhvZC1wZXJtaXNzaW9uPgotICAgICAgICA8bWV0aG9kLXBlcm1pc3Npb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xNTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xNjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXMvPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlNlcnZpY2VFbmRwb2ludDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTc8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzE4PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTg8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzE5PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjA8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xOTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjE8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yMjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzIzPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgIDwvbWV0aG9kLXBlcm1pc3Npb24+Ci0gICAgICAgIDxtZXRob2QtcGVybWlzc2lvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1bmNoZWNrZWQ+PC91bmNoZWNrZWQ+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzIwPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjE8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zLz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzIyPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yNDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5TZXJ2aWNlRW5kcG9pbnQ8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzIzPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yNTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzI2PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjQ8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzI3PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjg8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yOTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICA8L21ldGhvZC1wZXJtaXNzaW9uPgotICAgICAgICA8Y29udGFpbmVyLXRyYW5zYWN0aW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzI1PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yNjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXMvPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yNzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMzA8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yODwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMzE8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zMjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5TZXJ2aWNlRW5kcG9pbnQ8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzI5PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zMzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzM0PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMzU8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDx0cmFucy1hdHRyaWJ1dGU+Tm90U3VwcG9ydGVkPC90cmFucy1hdHRyaWJ1dGU+Ci0gICAgICAgIDwvY29udGFpbmVyLXRyYW5zYWN0aW9uPgotICAgICAgICA8Y29udGFpbmVyLXRyYW5zYWN0aW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzMwPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzMxPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcy8+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzI8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzM2PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zMzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMzc8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zODwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzM0PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zOTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQwPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDE8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDx0cmFucy1hdHRyaWJ1dGU+U3VwcG9ydHM8L3RyYW5zLWF0dHJpYnV0ZT4KLSAgICAgICAgPC9jb250YWluZXItdHJhbnNhY3Rpb24+Ci0gICAgICAgIDxjb250YWluZXItdHJhbnNhY3Rpb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlNlcnZpY2VFbmRwb2ludDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzU8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzY8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zLz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzM3PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180MjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zODwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDM8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180NDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzk8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQ1PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDY8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180NzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPHRyYW5zLWF0dHJpYnV0ZT5SZXF1aXJlZDwvdHJhbnMtYXR0cmlidXRlPgotICAgICAgICA8L2NvbnRhaW5lci10cmFuc2FjdGlvbj4KLSAgICAgICAgPGNvbnRhaW5lci10cmFuc2FjdGlvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80MDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+U2VydmljZUVuZHBvaW50PC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80MTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXMvPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDI8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQ4PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDM8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQ5PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTA8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDQ8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzUxPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTI8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181MzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPHRyYW5zLWF0dHJpYnV0ZT5SZXF1aXJlc05ldzwvdHJhbnMtYXR0cmlidXRlPgotICAgICAgICA8L2NvbnRhaW5lci10cmFuc2FjdGlvbj4KLSAgICAgICAgPGNvbnRhaW5lci10cmFuc2FjdGlvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQ1PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQ2PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcy8+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+U2VydmljZUVuZHBvaW50PC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80NzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTQ8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80ODwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTU8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181NjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQ5PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181NzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzU4PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTk8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDx0cmFucy1hdHRyaWJ1dGU+TWFuZGF0b3J5PC90cmFucy1hdHRyaWJ1dGU+Ci0gICAgICAgIDwvY29udGFpbmVyLXRyYW5zYWN0aW9uPgotICAgICAgICA8ZXhjbHVkZS1saXN0PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV81MDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzUxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzUxPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcy8+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzUyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV81MjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNjA8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzUzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+U2VydmljZUVuZHBvaW50PC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV81MzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNjE8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc182MjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzU0PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc182MzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzY0PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNjU8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgPC9leGNsdWRlLWxpc3Q+Ci0gICAgPC9hc3NlbWJseS1kZXNjcmlwdG9yPgotICAgIDxlamItY2xpZW50LWphcj5lamJDbGllbnRKYXJfMDwvZWpiLWNsaWVudC1qYXI+Ci08L2VqYi1qYXI+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvRU1GVGVzdHMvZWpiLWphcjItMHNheC54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvRU1GVGVzdHMvZWpiLWphcjItMHNheC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1OTcyNDIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL0VNRlRlc3RzL2VqYi1qYXIyLTBzYXgueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjg1OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGVqYi1qYXIgUFVCTElDICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgRW50ZXJwcmlzZSBKYXZhQmVhbnMgMi4wLy9FTiIgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2VqYi1qYXJfMl8wLmR0ZCI+Ci08ZWpiLWphciBpZD0iZWpiLWphcl9JRCI+Ci0gICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMDwvZGlzcGxheS1uYW1lPgotICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8wPC9zbWFsbC1pY29uPgotICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8wPC9sYXJnZS1pY29uPgotICAgIDxlbnRlcnByaXNlLWJlYW5zPgotICAgICAgICA8ZW50aXR5IGlkPSJDTVAxIj4KLSAgICAgICAgICAgIDxlamItbmFtZT5DTVAxPC9lamItbmFtZT4KLSAgICAgICAgICAgIDxsb2NhbC1ob21lPmVqYnMuQ01QMUxvY2FsSG9tZTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgIDxsb2NhbD5lamJzLkNNUDFMb2NhbDwvbG9jYWw+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmVqYnMuQ01QMUJlYW48L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS10eXBlPkNvbnRhaW5lcjwvcGVyc2lzdGVuY2UtdHlwZT4KLSAgICAgICAgICAgIDxwcmltLWtleS1jbGFzcz5lamJzLkNNUDFLZXk8L3ByaW0ta2V5LWNsYXNzPgotICAgICAgICAgICAgPHJlZW50cmFudD5GYWxzZTwvcmVlbnRyYW50PgotICAgICAgICAgICAgPGNtcC12ZXJzaW9uPjIueDwvY21wLXZlcnNpb24+Ci0gICAgICAgICAgICA8YWJzdHJhY3Qtc2NoZW1hLW5hbWU+Q01QMTwvYWJzdHJhY3Qtc2NoZW1hLW5hbWU+Ci0gICAgICAgICAgICA8Y21wLWZpZWxkPgotICAgICAgICAgICAgICAgIDxmaWVsZC1uYW1lPmlkPC9maWVsZC1uYW1lPgotICAgICAgICAgICAgPC9jbXAtZmllbGQ+Ci0gICAgICAgIDwvZW50aXR5PgotICAgICAgICA8ZW50aXR5IGlkPSJDTVAyIj4KLSAgICAgICAgICAgIDxlamItbmFtZT5DTVAyPC9lamItbmFtZT4KLSAgICAgICAgICAgIDxsb2NhbC1ob21lPmVqYnMuQ01QMkxvY2FsSG9tZTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgIDxsb2NhbD5lamJzLkNNUDJMb2NhbDwvbG9jYWw+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmVqYnMuQ01QMkJlYW48L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS10eXBlPkNvbnRhaW5lcjwvcGVyc2lzdGVuY2UtdHlwZT4KLSAgICAgICAgICAgIDxwcmltLWtleS1jbGFzcz5lamJzLkNNUDJLZXk8L3ByaW0ta2V5LWNsYXNzPgotICAgICAgICAgICAgPHJlZW50cmFudD5GYWxzZTwvcmVlbnRyYW50PgotICAgICAgICAgICAgPGNtcC12ZXJzaW9uPjIueDwvY21wLXZlcnNpb24+Ci0gICAgICAgICAgICA8YWJzdHJhY3Qtc2NoZW1hLW5hbWU+Q01QMjwvYWJzdHJhY3Qtc2NoZW1hLW5hbWU+Ci0gICAgICAgICAgICA8Y21wLWZpZWxkPgotICAgICAgICAgICAgICAgIDxmaWVsZC1uYW1lPmlkPC9maWVsZC1uYW1lPgotICAgICAgICAgICAgPC9jbXAtZmllbGQ+Ci0gICAgICAgIDwvZW50aXR5PgotICAgICAgICA8ZW50aXR5PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8wPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMDwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8wPC9sYXJnZS1pY29uPgotICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMDwvZWpiLW5hbWU+Ci0gICAgICAgICAgICA8aG9tZT5qYXZhLnV0aWwuTGlzdDwvaG9tZT4KLSAgICAgICAgICAgIDxyZW1vdGU+amF2YS5zcWwuRGF0YTwvcmVtb3RlPgotICAgICAgICAgICAgPGxvY2FsLWhvbWU+amF2YS5sYW5nLkludGVnZXI8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICA8bG9jYWw+amF2YS5sYW5nLlN0cmluZzwvbG9jYWw+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmphdmEudXRpbC5IYXNoVGFibGU8L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS10eXBlPkJlYW48L3BlcnNpc3RlbmNlLXR5cGU+Ci0gICAgICAgICAgICA8cHJpbS1rZXktY2xhc3M+amF2YS51dGlsLkhhc2hUYWJsZTwvcHJpbS1rZXktY2xhc3M+Ci0gICAgICAgICAgICA8cmVlbnRyYW50PlRydWU8L3JlZW50cmFudD4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzA8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzA8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzE8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzI8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMzwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Eb3VibGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMzwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV80PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJ5dGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzA8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzA8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMDwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzA8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzE8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8yPC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzI8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8zPC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzM8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfNDwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV80PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzA8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzE8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8xPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18wPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8zPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMzwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzU8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV81PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV83PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNzwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzk8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV85PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzA8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMDwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzE8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzI8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzM8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMzwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzQ8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNDwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJ1bi1hcz4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzA8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8L3J1bi1hcz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMDwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzA8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzE8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzI8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8yPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+U0VSVkxFVDwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMzwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzQ8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV80PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzA8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5zcWwuRGF0YTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8zPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV80PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgIDwvZW50aXR5PgotICAgICAgICA8ZW50aXR5PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8xPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMTwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8xPC9sYXJnZS1pY29uPgotICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICA8aG9tZT5qYXZhLnNxbC5EYXRhPC9ob21lPgotICAgICAgICAgICAgPHJlbW90ZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVtb3RlPgotICAgICAgICAgICAgPGxvY2FsLWhvbWU+amF2YS5sYW5nLlN0cmluZzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgIDxsb2NhbD5qYXZhLnV0aWwuSGFzaFRhYmxlPC9sb2NhbD4KLSAgICAgICAgICAgIDxlamItY2xhc3M+amF2YS51dGlsLkxpc3Q8L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS10eXBlPkJlYW48L3BlcnNpc3RlbmNlLXR5cGU+Ci0gICAgICAgICAgICA8cHJpbS1rZXktY2xhc3M+amF2YS51dGlsLkxpc3Q8L3ByaW0ta2V5LWNsYXNzPgotICAgICAgICAgICAgPHJlZW50cmFudD5GYWxzZTwvcmVlbnRyYW50PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TaG9ydDwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV81PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzY8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuTG9uZzwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV82PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzc8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuRmxvYXQ8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNzwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV84PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkNoYXJhY3RlcjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV84PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzk8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzk8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV81PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzU8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNTwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzU8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV82PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV82PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzY8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua182PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV83PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzc8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua183PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfODwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfODwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV84PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfODwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzk8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfOTwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV85PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfOTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzU8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMTE8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8xMTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzY8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzEzPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMTM8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzY8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV83PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzE1PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMTU8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzc8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV84PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8xNzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzE3PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua184PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfOTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8xOTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzE5PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua185PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzU8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzY8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNjwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzc8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNzwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzg8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfODwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzk8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfOTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHVzZS1jYWxsZXItaWRlbnRpdHkvPgotICAgICAgICAgICAgPC9zZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV81PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPlNFUlZMRVQ8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV82PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNjwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV83PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNzwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfODwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzg8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5TRVJWTEVUPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzk8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV85PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzU8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5MaXN0PC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzY8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNzwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfODwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV85PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgIDwvZW50aXR5PgotICAgICAgICA8ZW50aXR5PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8wPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMDwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8wPC9sYXJnZS1pY29uPgotICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMDwvZWpiLW5hbWU+Ci0gICAgICAgICAgICA8aG9tZT5qYXZhLmxhbmcuSW50ZWdlcjwvaG9tZT4KLSAgICAgICAgICAgIDxyZW1vdGU+amF2YS5sYW5nLlN0cmluZzwvcmVtb3RlPgotICAgICAgICAgICAgPGxvY2FsLWhvbWU+amF2YS51dGlsLkhhc2hUYWJsZTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgIDxsb2NhbD5qYXZhLnV0aWwuTGlzdDwvbG9jYWw+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmphdmEuc3FsLkRhdGE8L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS10eXBlPkNvbnRhaW5lcjwvcGVyc2lzdGVuY2UtdHlwZT4KLSAgICAgICAgICAgIDxwcmltLWtleS1jbGFzcz5qYXZhLnNxbC5EYXRhPC9wcmltLWtleS1jbGFzcz4KLSAgICAgICAgICAgIDxyZWVudHJhbnQ+VHJ1ZTwvcmVlbnRyYW50PgotICAgICAgICAgICAgPGNtcC12ZXJzaW9uPjIueDwvY21wLXZlcnNpb24+Ci0gICAgICAgICAgICA8YWJzdHJhY3Qtc2NoZW1hLW5hbWU+YWJzdHJhY3RTY2hlbWFOYW1lXzA8L2Fic3RyYWN0LXNjaGVtYS1uYW1lPgotICAgICAgICAgICAgPGNtcC1maWVsZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGZpZWxkLW5hbWU+bmFtZV8xPC9maWVsZC1uYW1lPgotICAgICAgICAgICAgPC9jbXAtZmllbGQ+Ci0gICAgICAgICAgICA8Y21wLWZpZWxkPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZmllbGQtbmFtZT5uYW1lXzM8L2ZpZWxkLW5hbWU+Ci0gICAgICAgICAgICA8L2NtcC1maWVsZD4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xMDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzEwPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzExPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xMTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzExPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xMjwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Eb3VibGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTI8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzEzPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJ5dGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTM8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzE0PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlNob3J0PC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzE0PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzEwPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8xMDwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8xMDwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzEwPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzExPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzExPC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzExPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTE8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzEyPC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzEyPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTI8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMTM8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTM8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xMzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xNDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMTQ8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTQ8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xNDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xMDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMjE8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8yMTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTA8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzExPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTE8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMjM8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8yMzwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTE8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzI1PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMjU8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzEyPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzEzPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzI3PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMjc8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzEzPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE0PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8yOTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzI5PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xNDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTA8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTA8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzExPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTE8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTE8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTI8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTI8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTM8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTM8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTQ8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTQ8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxydW4tYXM+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8xPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPC9ydW4tYXM+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xMDwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzEwPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzExPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMTE8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5TRVJWTEVUPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzEyPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMTI8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzEzPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMTM8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xNDwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzE0PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+U0VSVkxFVDwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzEwPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnNxbC5EYXRhPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xMTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzEyPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xMzwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTQ8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5MaXN0PC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cXVlcnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxxdWVyeS1tZXRob2Q+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzA8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDwvcXVlcnktbWV0aG9kPgotICAgICAgICAgICAgICAgIDxyZXN1bHQtdHlwZS1tYXBwaW5nPkxvY2FsPC9yZXN1bHQtdHlwZS1tYXBwaW5nPgotICAgICAgICAgICAgICAgIDxlamItcWw+ZWpiUUxfMDwvZWpiLXFsPgotICAgICAgICAgICAgPC9xdWVyeT4KLSAgICAgICAgICAgIDxxdWVyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHF1ZXJ5LW1ldGhvZD4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zLz4KLSAgICAgICAgICAgICAgICA8L3F1ZXJ5LW1ldGhvZD4KLSAgICAgICAgICAgICAgICA8cmVzdWx0LXR5cGUtbWFwcGluZz5SZW1vdGU8L3Jlc3VsdC10eXBlLW1hcHBpbmc+Ci0gICAgICAgICAgICAgICAgPGVqYi1xbD5lamJRTF8xPC9lamItcWw+Ci0gICAgICAgICAgICA8L3F1ZXJ5PgotICAgICAgICAgICAgPHF1ZXJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cXVlcnktbWV0aG9kPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzA8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgIDwvcXVlcnktbWV0aG9kPgotICAgICAgICAgICAgICAgIDxyZXN1bHQtdHlwZS1tYXBwaW5nPkxvY2FsPC9yZXN1bHQtdHlwZS1tYXBwaW5nPgotICAgICAgICAgICAgICAgIDxlamItcWw+ZWpiUUxfMjwvZWpiLXFsPgotICAgICAgICAgICAgPC9xdWVyeT4KLSAgICAgICAgICAgIDxxdWVyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHF1ZXJ5LW1ldGhvZD4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzI8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgIDwvcXVlcnktbWV0aG9kPgotICAgICAgICAgICAgICAgIDxyZXN1bHQtdHlwZS1tYXBwaW5nPlJlbW90ZTwvcmVzdWx0LXR5cGUtbWFwcGluZz4KLSAgICAgICAgICAgICAgICA8ZWpiLXFsPmVqYlFMXzM8L2VqYi1xbD4KLSAgICAgICAgICAgIDwvcXVlcnk+Ci0gICAgICAgICAgICA8cXVlcnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxxdWVyeS1tZXRob2Q+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQ8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzU8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgIDwvcXVlcnktbWV0aG9kPgotICAgICAgICAgICAgICAgIDxyZXN1bHQtdHlwZS1tYXBwaW5nPkxvY2FsPC9yZXN1bHQtdHlwZS1tYXBwaW5nPgotICAgICAgICAgICAgICAgIDxlamItcWw+ZWpiUUxfNDwvZWpiLXFsPgotICAgICAgICAgICAgPC9xdWVyeT4KLSAgICAgICAgPC9lbnRpdHk+Ci0gICAgICAgIDxzZXNzaW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8wPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMDwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8wPC9sYXJnZS1pY29uPgotICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMDwvZWpiLW5hbWU+Ci0gICAgICAgICAgICA8aG9tZT5qYXZhLmxhbmcuU3RyaW5nPC9ob21lPgotICAgICAgICAgICAgPHJlbW90ZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZW1vdGU+Ci0gICAgICAgICAgICA8bG9jYWwtaG9tZT5qYXZhLnV0aWwuTGlzdDwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgIDxsb2NhbD5qYXZhLnNxbC5EYXRhPC9sb2NhbD4KLSAgICAgICAgICAgIDxlamItY2xhc3M+amF2YS5sYW5nLkludGVnZXI8L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDxzZXNzaW9uLXR5cGU+U3RhdGVmdWw8L3Nlc3Npb24tdHlwZT4KLSAgICAgICAgICAgIDx0cmFuc2FjdGlvbi10eXBlPkJlYW48L3RyYW5zYWN0aW9uLXR5cGU+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTU8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuTG9uZzwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xNTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTY8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuRmxvYXQ8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTY8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzE3PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkNoYXJhY3RlcjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xNzwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTg8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzE4PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xOTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzE5PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE1PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzE1PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzE1PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTU8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTY8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzE2PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzE2PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTY8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTc8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMTc8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTc8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xNzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xODwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMTg8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTg8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xODwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xOTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8xOTwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8xOTwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE5PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE1PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzMxPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMzE8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE1PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE2PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8zMzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzMzPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xNjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xNzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8zNTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzM1PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xNzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xODwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMzc8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8zNzwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTg8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTk8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMzk8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8zOTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTk8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzE1PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzE1PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzE2PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzE2PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzE3PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzE3PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzE4PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzE4PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzE5PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzE5PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8dXNlLWNhbGxlci1pZGVudGl0eS8+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xNTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzE1PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzE2PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMTY8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTc8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8xNzwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPlNFUlZMRVQ8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTg8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8xODwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTk8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8xOTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xNTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzE2PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xNzwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTg8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5MaXN0PC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xOTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5zcWwuRGF0YTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICA8L3Nlc3Npb24+Ci0gICAgICAgIDxlbnRpdHk+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzI8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8yPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzI8L2xhcmdlLWljb24+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8yPC9lamItbmFtZT4KLSAgICAgICAgICAgIDxob21lPmphdmEudXRpbC5IYXNoVGFibGU8L2hvbWU+Ci0gICAgICAgICAgICA8cmVtb3RlPmphdmEudXRpbC5MaXN0PC9yZW1vdGU+Ci0gICAgICAgICAgICA8bG9jYWwtaG9tZT5qYXZhLnNxbC5EYXRhPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgPGxvY2FsPmphdmEubGFuZy5JbnRlZ2VyPC9sb2NhbD4KLSAgICAgICAgICAgIDxlamItY2xhc3M+amF2YS5sYW5nLlN0cmluZzwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXR5cGU+QmVhbjwvcGVyc2lzdGVuY2UtdHlwZT4KLSAgICAgICAgICAgIDxwcmltLWtleS1jbGFzcz5qYXZhLmxhbmcuU3RyaW5nPC9wcmltLWtleS1jbGFzcz4KLSAgICAgICAgICAgIDxyZWVudHJhbnQ+VHJ1ZTwvcmVlbnRyYW50PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzIwPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJvb2xlYW48L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjA8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzIxPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkRvdWJsZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8yMTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjI8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQnl0ZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8yMjwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjM8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU2hvcnQ8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjM8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzI0PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkxvbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjQ8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjA8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzIwPC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzIwPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjA8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjE8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMjE8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjE8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yMTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yMjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMjI8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjI8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yMjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yMzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8yMzwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8yMzwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzIzPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI0PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8yNDwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8yNDwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI0PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzIwPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV80MTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzQxPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yMDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yMTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV80MzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzQzPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yMTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yMjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNDU8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV80NTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjI8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNDc8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV80NzwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjM8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjQ8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzQ5PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNDk8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI0PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yMDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yMDwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yMTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yMTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yMjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yMjwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yMzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yMzwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yNDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yNDwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJ1bi1hcz4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzI8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8L3J1bi1hcz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzIwPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMjA8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5TRVJWTEVUPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8yMTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzIxPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzIyPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMjI8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjM8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8yMzwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPlNFUlZMRVQ8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjQ8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8yNDwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzIwPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8yMTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjI8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5MaXN0PC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8yMzwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5zcWwuRGF0YTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjQ8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgIDwvZW50aXR5PgotICAgICAgICA8ZW50aXR5PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8zPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMzwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8zPC9sYXJnZS1pY29uPgotICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMzwvZWpiLW5hbWU+Ci0gICAgICAgICAgICA8aG9tZT5qYXZhLnV0aWwuTGlzdDwvaG9tZT4KLSAgICAgICAgICAgIDxyZW1vdGU+amF2YS5zcWwuRGF0YTwvcmVtb3RlPgotICAgICAgICAgICAgPGxvY2FsLWhvbWU+amF2YS5sYW5nLkludGVnZXI8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICA8bG9jYWw+amF2YS5sYW5nLlN0cmluZzwvbG9jYWw+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmphdmEudXRpbC5IYXNoVGFibGU8L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS10eXBlPkJlYW48L3BlcnNpc3RlbmNlLXR5cGU+Ci0gICAgICAgICAgICA8cHJpbS1rZXktY2xhc3M+amF2YS51dGlsLkhhc2hUYWJsZTwvcHJpbS1rZXktY2xhc3M+Ci0gICAgICAgICAgICA8cmVlbnRyYW50PkZhbHNlPC9yZWVudHJhbnQ+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjU8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuRmxvYXQ8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjU8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzI2PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkNoYXJhY3RlcjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8yNjwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjc8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzI3PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yODwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzI4PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yOTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzI5PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI1PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzI1PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzI1PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjU8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjY8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzI2PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzI2PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjY8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjc8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMjc8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjc8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yNzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yODwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMjg8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjg8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yODwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yOTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8yOTwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8yOTwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI5PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI1PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzUxPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNTE8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI1PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI2PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV81MzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzUzPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yNjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yNzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV81NTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzU1PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yNzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yODwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNTc8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV81NzwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjg8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjk8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNTk8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV81OTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjk8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzI1PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzI1PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzI2PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzI2PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzI3PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzI3PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzI4PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzI4PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzI5PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzI5PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8dXNlLWNhbGxlci1pZGVudGl0eS8+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8yNTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzI1PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjY8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8yNjwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPlNFUlZMRVQ8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzI3PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMjc8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjg8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8yODwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8yOTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzI5PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+U0VSVkxFVDwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjU8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzI2PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuTGlzdDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjc8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzI4PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjk8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5TdHJpbmc8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgPC9lbnRpdHk+Ci0gICAgICAgIDxtZXNzYWdlLWRyaXZlbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMDwvZGlzcGxheS1uYW1lPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzA8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMDwvbGFyZ2UtaWNvbj4KLSAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzA8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGVqYi1jbGFzcz5qYXZhLnV0aWwuTGlzdDwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHRyYW5zYWN0aW9uLXR5cGU+QmVhbjwvdHJhbnNhY3Rpb24tdHlwZT4KLSAgICAgICAgICAgIDxtZXNzYWdlLXNlbGVjdG9yPm1lc3NhZ2VTZWxlY3Rvcl8wPC9tZXNzYWdlLXNlbGVjdG9yPgotICAgICAgICAgICAgPGFja25vd2xlZGdlLW1vZGU+QXV0by1hY2tub3dsZWRnZTwvYWNrbm93bGVkZ2UtbW9kZT4KLSAgICAgICAgICAgIDxtZXNzYWdlLWRyaXZlbi1kZXN0aW5hdGlvbj4KLSAgICAgICAgICAgICAgICA8ZGVzdGluYXRpb24tdHlwZT5qYXZheC5qbXMuUXVldWU8L2Rlc3RpbmF0aW9uLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHN1YnNjcmlwdGlvbi1kdXJhYmlsaXR5PkR1cmFibGU8L3N1YnNjcmlwdGlvbi1kdXJhYmlsaXR5PgotICAgICAgICAgICAgPC9tZXNzYWdlLWRyaXZlbi1kZXN0aW5hdGlvbj4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8zMDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Eb3VibGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMzA8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzMxPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJ5dGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMzE8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzMyPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlNob3J0PC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzMyPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8zMzwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Mb25nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzMzPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8zNDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5GbG9hdDwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8zNDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zMDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMzA8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzA8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zMDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zMTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8zMTwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8zMTwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzMxPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzMyPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8zMjwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8zMjwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzMyPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzMzPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzMzPC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzMzPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzM8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzQ8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzM0PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzM0PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzQ8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzA8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzYxPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNjE8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzMwPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzMxPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzYzPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNjM8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzMxPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzMyPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV82NTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzY1PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zMjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zMzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV82NzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzY3PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zMzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zNDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNjk8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV82OTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzQ8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cnVuLWFzPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDwvcnVuLWFzPgotICAgICAgICAgICAgPC9zZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzA8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8zMDwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzE8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8zMTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzMyPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMzI8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5TRVJWTEVUPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zMzwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzMzPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzM0PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMzQ8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzMwPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuTGlzdDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMzE8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzMyPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMzM8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5TdHJpbmc8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzM0PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgIDwvbWVzc2FnZS1kcml2ZW4+Ci0gICAgICAgIDxzZXNzaW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8xPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMTwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8xPC9sYXJnZS1pY29uPgotICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICA8aG9tZT5qYXZhLmxhbmcuU3RyaW5nPC9ob21lPgotICAgICAgICAgICAgPHJlbW90ZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZW1vdGU+Ci0gICAgICAgICAgICA8bG9jYWwtaG9tZT5qYXZhLnV0aWwuTGlzdDwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgIDxsb2NhbD5qYXZhLnNxbC5EYXRhPC9sb2NhbD4KLSAgICAgICAgICAgIDxlamItY2xhc3M+amF2YS5sYW5nLkludGVnZXI8L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDxzZXNzaW9uLXR5cGU+U3RhdGVsZXNzPC9zZXNzaW9uLXR5cGU+Ci0gICAgICAgICAgICA8dHJhbnNhY3Rpb24tdHlwZT5Db250YWluZXI8L3RyYW5zYWN0aW9uLXR5cGU+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMzU8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQ2hhcmFjdGVyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzM1PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8zNjwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TdHJpbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMzY8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzM3PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkludGVnZXI8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMzc8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzM4PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJvb2xlYW48L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMzg8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzM5PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkRvdWJsZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8zOTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zNTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8zNTwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8zNTwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM1PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM2PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8zNjwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8zNjwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM2PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM3PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzM3PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzM3PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzc8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzg8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzM4PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzM4PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzg8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzk8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMzk8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzk8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zOTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zNTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV83MTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzcxPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zNTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zNjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNzM8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV83MzwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzY8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzc8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNzU8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV83NTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzc8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzg8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzc3PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNzc8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM4PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM5PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzc5PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNzk8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM5PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8zNTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18zNTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8zNjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18zNjwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8zNzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18zNzwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8zODwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18zODwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8zOTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18zOTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHVzZS1jYWxsZXItaWRlbnRpdHkvPgotICAgICAgICAgICAgPC9zZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzU8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8zNTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPlNFUlZMRVQ8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzY8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8zNjwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzc8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8zNzwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzM4PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMzg8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5TRVJWTEVUPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zOTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzM5PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8zNTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzM2PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8zNzwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMzg8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5MaXN0PC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8zOTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5zcWwuRGF0YTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICA8L3Nlc3Npb24+Ci0gICAgICAgIDxlbnRpdHk+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzQ8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl80PC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzQ8L2xhcmdlLWljb24+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV80PC9lamItbmFtZT4KLSAgICAgICAgICAgIDxob21lPmphdmEudXRpbC5IYXNoVGFibGU8L2hvbWU+Ci0gICAgICAgICAgICA8cmVtb3RlPmphdmEudXRpbC5MaXN0PC9yZW1vdGU+Ci0gICAgICAgICAgICA8bG9jYWwtaG9tZT5qYXZhLnNxbC5EYXRhPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgPGxvY2FsPmphdmEubGFuZy5JbnRlZ2VyPC9sb2NhbD4KLSAgICAgICAgICAgIDxlamItY2xhc3M+amF2YS5sYW5nLlN0cmluZzwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXR5cGU+QmVhbjwvcGVyc2lzdGVuY2UtdHlwZT4KLSAgICAgICAgICAgIDxwcmltLWtleS1jbGFzcz5qYXZhLmxhbmcuU3RyaW5nPC9wcmltLWtleS1jbGFzcz4KLSAgICAgICAgICAgIDxyZWVudHJhbnQ+VHJ1ZTwvcmVlbnRyYW50PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzQwPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJ5dGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNDA8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzQxPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlNob3J0PC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzQxPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV80MjwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Mb25nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzQyPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV80MzwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5GbG9hdDwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV80MzwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNDQ8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQ2hhcmFjdGVyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzQ0PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQwPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV80MDwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV80MDwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQwPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQxPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzQxPC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzQxPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDE8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzQyPC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzQyPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDI8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfNDM8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNDM8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180MzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80NDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfNDQ8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNDQ8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180NDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80MDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfODE8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV84MTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDA8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDE8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfODM8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV84MzwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDE8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzg1PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfODU8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQyPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQzPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzg3PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfODc8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQzPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ0PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV84OTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzg5PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180NDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNDA8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNDA8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNDE8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNDE8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNDI8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNDI8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNDM8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNDM8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNDQ8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNDQ8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxydW4tYXM+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV80PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPC9ydW4tYXM+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV80MDwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzQwPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzQxPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNDE8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5TRVJWTEVUPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzQyPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNDI8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzQzPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNDM8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV80NDwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzQ0PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+U0VSVkxFVDwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQwPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV80MTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDI8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5MaXN0PC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV80MzwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5zcWwuRGF0YTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDQ8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgIDwvZW50aXR5PgotICAgICAgICA8ZW50aXR5PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV81PC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fNTwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl81PC9sYXJnZS1pY29uPgotICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfNTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICA8aG9tZT5qYXZhLnV0aWwuTGlzdDwvaG9tZT4KLSAgICAgICAgICAgIDxyZW1vdGU+amF2YS5zcWwuRGF0YTwvcmVtb3RlPgotICAgICAgICAgICAgPGxvY2FsLWhvbWU+amF2YS5sYW5nLkludGVnZXI8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICA8bG9jYWw+amF2YS5sYW5nLlN0cmluZzwvbG9jYWw+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmphdmEudXRpbC5IYXNoVGFibGU8L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS10eXBlPkJlYW48L3BlcnNpc3RlbmNlLXR5cGU+Ci0gICAgICAgICAgICA8cHJpbS1rZXktY2xhc3M+amF2YS51dGlsLkhhc2hUYWJsZTwvcHJpbS1rZXktY2xhc3M+Ci0gICAgICAgICAgICA8cmVlbnRyYW50PkZhbHNlPC9yZWVudHJhbnQ+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNDU8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzQ1PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV80NjwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzQ2PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV80NzwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzQ3PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV80ODwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Eb3VibGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNDg8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzQ5PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJ5dGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNDk8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDU8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfNDU8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNDU8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180NTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80NjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfNDY8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNDY8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180NjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80NzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV80NzwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV80NzwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ3PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80ODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ4PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV80ODwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV80ODwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ4PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80OTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ5PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzQ5PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzQ5PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDk8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDU8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfOTE8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV85MTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDU8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDY8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzkzPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfOTM8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ2PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ3PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzk1PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfOTU8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ3PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80ODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ4PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV85NzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzk3PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180ODwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80OTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV85OTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzk5PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180OTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNDU8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNDU8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNDY8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNDY8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNDc8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNDc8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNDg8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNDg8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNDk8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNDk8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDx1c2UtY2FsbGVyLWlkZW50aXR5Lz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzQ1PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNDU8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNDY8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV80NjwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV80NzwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzQ3PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+U0VSVkxFVDwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV80ODwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzQ4PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV80OTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzQ5PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQ1PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV80NjwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQ3PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnNxbC5EYXRhPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV80ODwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80OTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQ5PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgIDwvZW50aXR5PgotICAgIDwvZW50ZXJwcmlzZS1iZWFucz4KLSAgICA8cmVsYXRpb25zaGlwcz4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8ZWpiLXJlbGF0aW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbi1uYW1lPm5hbWVfMDwvZWpiLXJlbGF0aW9uLW5hbWU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfMDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5PbmU8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgICA8Y2FzY2FkZS1kZWxldGUvPgotICAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8Y21yLWZpZWxkPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtbmFtZT5uYW1lXzA8L2Ntci1maWVsZC1uYW1lPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLXR5cGU+amF2YS51dGlsLkxpc3Q8L2Ntci1maWVsZC10eXBlPgotICAgICAgICAgICAgICAgIDwvY21yLWZpZWxkPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfMTwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5NYW55PC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgIDxjbXItZmllbGQ+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC1uYW1lPm5hbWVfMTwvY21yLWZpZWxkLW5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtdHlwZT5qYXZhLnNxbC5EYXRhPC9jbXItZmllbGQtdHlwZT4KLSAgICAgICAgICAgICAgICA8L2Ntci1maWVsZD4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICA8L2VqYi1yZWxhdGlvbj4KLSAgICAgICAgPGVqYi1yZWxhdGlvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb24tbmFtZT5uYW1lXzE8L2VqYi1yZWxhdGlvbi1uYW1lPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzI8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+T25lPC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICAgPGNhc2NhZGUtZGVsZXRlLz4KLSAgICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGNtci1maWVsZD4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLW5hbWU+bmFtZV8yPC9jbXItZmllbGQtbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9jbXItZmllbGQtdHlwZT4KLSAgICAgICAgICAgICAgICA8L2Ntci1maWVsZD4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzM8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+TWFueTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8Y21yLWZpZWxkPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtbmFtZT5uYW1lXzM8L2Ntci1maWVsZC1uYW1lPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvY21yLWZpZWxkLXR5cGU+Ci0gICAgICAgICAgICAgICAgPC9jbXItZmllbGQ+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgPC9lamItcmVsYXRpb24+Ci0gICAgICAgIDxlamItcmVsYXRpb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uLW5hbWU+bmFtZV8yPC9lamItcmVsYXRpb24tbmFtZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV80PC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk9uZTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgIDxjYXNjYWRlLWRlbGV0ZS8+Ci0gICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgIDxjbXItZmllbGQ+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC1uYW1lPm5hbWVfNDwvY21yLWZpZWxkLW5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9jbXItZmllbGQtdHlwZT4KLSAgICAgICAgICAgICAgICA8L2Ntci1maWVsZD4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzU8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+TWFueTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8Y21yLWZpZWxkPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtbmFtZT5uYW1lXzU8L2Ntci1maWVsZC1uYW1lPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLXR5cGU+amF2YS51dGlsLkxpc3Q8L2Ntci1maWVsZC10eXBlPgotICAgICAgICAgICAgICAgIDwvY21yLWZpZWxkPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgIDwvZWpiLXJlbGF0aW9uPgotICAgICAgICA8ZWpiLXJlbGF0aW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbi1uYW1lPm5hbWVfMzwvZWpiLXJlbGF0aW9uLW5hbWU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfNjwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5PbmU8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgICA8Y2FzY2FkZS1kZWxldGUvPgotICAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8Y21yLWZpZWxkPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtbmFtZT5uYW1lXzY8L2Ntci1maWVsZC1uYW1lPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLXR5cGU+amF2YS5zcWwuRGF0YTwvY21yLWZpZWxkLXR5cGU+Ci0gICAgICAgICAgICAgICAgPC9jbXItZmllbGQ+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV83PC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk1hbnk8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGNtci1maWVsZD4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLW5hbWU+bmFtZV83PC9jbXItZmllbGQtbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9jbXItZmllbGQtdHlwZT4KLSAgICAgICAgICAgICAgICA8L2Ntci1maWVsZD4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICA8L2VqYi1yZWxhdGlvbj4KLSAgICAgICAgPGVqYi1yZWxhdGlvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb24tbmFtZT5uYW1lXzQ8L2VqYi1yZWxhdGlvbi1uYW1lPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzg8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+T25lPC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICAgPGNhc2NhZGUtZGVsZXRlLz4KLSAgICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGNtci1maWVsZD4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLW5hbWU+bmFtZV84PC9jbXItZmllbGQtbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC10eXBlPmphdmEubGFuZy5TdHJpbmc8L2Ntci1maWVsZC10eXBlPgotICAgICAgICAgICAgICAgIDwvY21yLWZpZWxkPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfOTwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5NYW55PC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgIDxjbXItZmllbGQ+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC1uYW1lPm5hbWVfOTwvY21yLWZpZWxkLW5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9jbXItZmllbGQtdHlwZT4KLSAgICAgICAgICAgICAgICA8L2Ntci1maWVsZD4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICA8L2VqYi1yZWxhdGlvbj4KLSAgICA8L3JlbGF0aW9uc2hpcHM+Ci0gICAgPGFzc2VtYmx5LWRlc2NyaXB0b3I+Ci0gICAgICAgIDxzZWN1cml0eS1yb2xlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV81PC9yb2xlLW5hbWU+Ci0gICAgICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgICAgICAgPHNlY3VyaXR5LXJvbGU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzY8L3JvbGUtbmFtZT4KLSAgICAgICAgPC9zZWN1cml0eS1yb2xlPgotICAgICAgICA8c2VjdXJpdHktcm9sZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfNzwvcm9sZS1uYW1lPgotICAgICAgICA8L3NlY3VyaXR5LXJvbGU+Ci0gICAgICAgIDxzZWN1cml0eS1yb2xlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV84PC9yb2xlLW5hbWU+Ci0gICAgICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgICAgICAgPHNlY3VyaXR5LXJvbGU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzk8L3JvbGUtbmFtZT4KLSAgICAgICAgPC9zZWN1cml0eS1yb2xlPgotICAgICAgICA8bWV0aG9kLXBlcm1pc3Npb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dW5jaGVja2VkLz4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzA8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcy8+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18wPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzM8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzE8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzU8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgPC9tZXRob2QtcGVybWlzc2lvbj4KLSAgICAgICAgPG1ldGhvZC1wZXJtaXNzaW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlNlcnZpY2VFbmRwb2ludDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzY8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zLz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzg8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzc8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc184PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzk8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzk8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xMDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzExPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgIDwvbWV0aG9kLXBlcm1pc3Npb24+Ci0gICAgICAgIDxtZXRob2QtcGVybWlzc2lvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1bmNoZWNrZWQvPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzEwPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5TZXJ2aWNlRW5kcG9pbnQ8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzExPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcy8+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xMjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTI8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xMzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTM8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xNDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xNDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTU8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xNjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzE3PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgIDwvbWV0aG9kLXBlcm1pc3Npb24+Ci0gICAgICAgIDxtZXRob2QtcGVybWlzc2lvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzE1PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzE2PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcy8+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+U2VydmljZUVuZHBvaW50PC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xNzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTg8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xODwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTk8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yMDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzE5PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yMTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzIyPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjM8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgPC9tZXRob2QtcGVybWlzc2lvbj4KLSAgICAgICAgPG1ldGhvZC1wZXJtaXNzaW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVuY2hlY2tlZC8+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzIwPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjE8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zLz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzIyPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yNDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5TZXJ2aWNlRW5kcG9pbnQ8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzIzPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yNTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzI2PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjQ8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzI3PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjg8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yOTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICA8L21ldGhvZC1wZXJtaXNzaW9uPgotICAgICAgICA8Y29udGFpbmVyLXRyYW5zYWN0aW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzI1PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yNjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXMvPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yNzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMzA8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yODwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMzE8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zMjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5TZXJ2aWNlRW5kcG9pbnQ8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzI5PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zMzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzM0PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMzU8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDx0cmFucy1hdHRyaWJ1dGU+Tm90U3VwcG9ydGVkPC90cmFucy1hdHRyaWJ1dGU+Ci0gICAgICAgIDwvY29udGFpbmVyLXRyYW5zYWN0aW9uPgotICAgICAgICA8Y29udGFpbmVyLXRyYW5zYWN0aW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzMwPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzMxPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcy8+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzI8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzM2PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zMzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMzc8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zODwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzM0PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zOTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQwPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDE8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDx0cmFucy1hdHRyaWJ1dGU+U3VwcG9ydHM8L3RyYW5zLWF0dHJpYnV0ZT4KLSAgICAgICAgPC9jb250YWluZXItdHJhbnNhY3Rpb24+Ci0gICAgICAgIDxjb250YWluZXItdHJhbnNhY3Rpb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlNlcnZpY2VFbmRwb2ludDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzU8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzY8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zLz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzM3PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180MjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zODwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDM8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180NDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzk8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQ1PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDY8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180NzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPHRyYW5zLWF0dHJpYnV0ZT5SZXF1aXJlZDwvdHJhbnMtYXR0cmlidXRlPgotICAgICAgICA8L2NvbnRhaW5lci10cmFuc2FjdGlvbj4KLSAgICAgICAgPGNvbnRhaW5lci10cmFuc2FjdGlvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80MDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+U2VydmljZUVuZHBvaW50PC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80MTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXMvPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDI8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQ4PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDM8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQ5PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTA8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDQ8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzUxPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTI8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181MzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPHRyYW5zLWF0dHJpYnV0ZT5SZXF1aXJlc05ldzwvdHJhbnMtYXR0cmlidXRlPgotICAgICAgICA8L2NvbnRhaW5lci10cmFuc2FjdGlvbj4KLSAgICAgICAgPGNvbnRhaW5lci10cmFuc2FjdGlvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQ1PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQ2PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcy8+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+U2VydmljZUVuZHBvaW50PC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80NzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTQ8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80ODwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTU8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181NjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQ5PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181NzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzU4PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTk8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDx0cmFucy1hdHRyaWJ1dGU+TWFuZGF0b3J5PC90cmFucy1hdHRyaWJ1dGU+Ci0gICAgICAgIDwvY29udGFpbmVyLXRyYW5zYWN0aW9uPgotICAgICAgICA8ZXhjbHVkZS1saXN0PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV81MDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzUxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzUxPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcy8+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzUyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV81MjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNjA8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzUzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+U2VydmljZUVuZHBvaW50PC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV81MzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNjE8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc182MjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzU0PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc182MzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzY0PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNjU8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgPC9leGNsdWRlLWxpc3Q+Ci0gICAgPC9hc3NlbWJseS1kZXNjcmlwdG9yPgotICAgIDxlamItY2xpZW50LWphcj5lamJDbGllbnRKYXJfMDwvZWpiLWNsaWVudC1qYXI+Ci08L2VqYi1qYXI+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvRU1GVGVzdHMvcmEueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL0VNRlRlc3RzL3JhLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA4MTZhZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvRU1GVGVzdHMvcmEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgY29ubmVjdG9yIFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIENvbm5lY3RvciAxLjAvL0VOIiAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvY29ubmVjdG9yXzFfMC5kdGQiPgotCi0gICA8Y29ubmVjdG9yIGlkPSJDb25uZWN0b3JfSUQiPgotICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8wPC9kaXNwbGF5LW5hbWU+Ci0gICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICA8aWNvbj4KLSAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8wPC9zbWFsbC1pY29uPgotICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzA8L2xhcmdlLWljb24+Ci0gICAgICA8L2ljb24+Ci0gICAgICA8dmVuZG9yLW5hbWU+dmVuZG9yTmFtZV8wPC92ZW5kb3ItbmFtZT4KLSAgICAgIDxzcGVjLXZlcnNpb24+MS4wPC9zcGVjLXZlcnNpb24+Ci0gICAgICA8ZWlzLXR5cGU+ZWlzVHlwZV8wPC9laXMtdHlwZT4KLSAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgICAgIDxsaWNlbnNlPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGxpY2Vuc2UtcmVxdWlyZWQ+dHJ1ZTwvbGljZW5zZS1yZXF1aXJlZD4KLSAgICAgIDwvbGljZW5zZT4KLSAgICAgIDxyZXNvdXJjZWFkYXB0ZXIgaWQ9IlJlc291cmNlQWRhcHRlcl8xMDUxNjM5NzY5MDg3Ij4KLSAgICAgICAgIDxtYW5hZ2VkY29ubmVjdGlvbmZhY3RvcnktY2xhc3M+bWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3NfMDwvbWFuYWdlZGNvbm5lY3Rpb25mYWN0b3J5LWNsYXNzPgotICAgICAgICAgPGNvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZT5jb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZV8wPC9jb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2U+Ci0gICAgICAgICA8Y29ubmVjdGlvbmZhY3RvcnktaW1wbC1jbGFzcz5jb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzc18wPC9jb25uZWN0aW9uZmFjdG9yeS1pbXBsLWNsYXNzPgotICAgICAgICAgPGNvbm5lY3Rpb24taW50ZXJmYWNlPmNvbm5lY3Rpb25JbnRlcmZhY2VfMDwvY29ubmVjdGlvbi1pbnRlcmZhY2U+Ci0gICAgICAgICA8Y29ubmVjdGlvbi1pbXBsLWNsYXNzPmNvbm5lY3Rpb25JbXBsQ2xhc3NfMDwvY29ubmVjdGlvbi1pbXBsLWNsYXNzPgotICAgICAgICAgPHRyYW5zYWN0aW9uLXN1cHBvcnQ+Tm9UcmFuc2FjdGlvbjwvdHJhbnNhY3Rpb24tc3VwcG9ydD4KLSAgICAgICAgIDxjb25maWctcHJvcGVydHkgaWQ9IkNvbmZpZ1Byb3BlcnR5XzEwNTE2Mzk3NjkxMjciPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS1uYW1lPm5hbWVfMDwvY29uZmlnLXByb3BlcnR5LW5hbWU+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5LXR5cGU+dHlwZV8wPC9jb25maWctcHJvcGVydHktdHlwZT4KLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydHktdmFsdWU+dmFsdWVfMDwvY29uZmlnLXByb3BlcnR5LXZhbHVlPgotICAgICAgICAgPC9jb25maWctcHJvcGVydHk+Ci0gICAgICAgICA8Y29uZmlnLXByb3BlcnR5IGlkPSJDb25maWdQcm9wZXJ0eV8xMDUxNjM5NzY5MTI4Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydHktbmFtZT5uYW1lXzE8L2NvbmZpZy1wcm9wZXJ0eS1uYW1lPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS10eXBlPnR5cGVfMTwvY29uZmlnLXByb3BlcnR5LXR5cGU+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5LXZhbHVlPnZhbHVlXzE8L2NvbmZpZy1wcm9wZXJ0eS12YWx1ZT4KLSAgICAgICAgIDwvY29uZmlnLXByb3BlcnR5PgotICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eSBpZD0iQ29uZmlnUHJvcGVydHlfMTA1MTYzOTc2OTEyOSI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5LW5hbWU+bmFtZV8yPC9jb25maWctcHJvcGVydHktbmFtZT4KLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydHktdHlwZT50eXBlXzI8L2NvbmZpZy1wcm9wZXJ0eS10eXBlPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS12YWx1ZT52YWx1ZV8yPC9jb25maWctcHJvcGVydHktdmFsdWU+Ci0gICAgICAgICA8L2NvbmZpZy1wcm9wZXJ0eT4KLSAgICAgICAgIDxjb25maWctcHJvcGVydHkgaWQ9IkNvbmZpZ1Byb3BlcnR5XzEwNTE2Mzk3NjkxMzAiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS1uYW1lPm5hbWVfMzwvY29uZmlnLXByb3BlcnR5LW5hbWU+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5LXR5cGU+dHlwZV8zPC9jb25maWctcHJvcGVydHktdHlwZT4KLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydHktdmFsdWU+dmFsdWVfMzwvY29uZmlnLXByb3BlcnR5LXZhbHVlPgotICAgICAgICAgPC9jb25maWctcHJvcGVydHk+Ci0gICAgICAgICA8Y29uZmlnLXByb3BlcnR5IGlkPSJDb25maWdQcm9wZXJ0eV8xMDUxNjM5NzY5MTMxIj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydHktbmFtZT5uYW1lXzQ8L2NvbmZpZy1wcm9wZXJ0eS1uYW1lPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS10eXBlPnR5cGVfNDwvY29uZmlnLXByb3BlcnR5LXR5cGU+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5LXZhbHVlPnZhbHVlXzQ8L2NvbmZpZy1wcm9wZXJ0eS12YWx1ZT4KLSAgICAgICAgIDwvY29uZmlnLXByb3BlcnR5PgotICAgICAgICAgPGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbSBpZD0iQXV0aGVudGljYXRpb25NZWNoYW5pc21fMTA1MTYzOTc2OTE0NyI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8YXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+QmFzaWNQYXNzd29yZDwvYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+Ci0gICAgICAgICAgICA8Y3JlZGVudGlhbC1pbnRlcmZhY2U+Y3JlZGVudGlhbEludGVyZmFjZV8wPC9jcmVkZW50aWFsLWludGVyZmFjZT4KLSAgICAgICAgIDwvYXV0aGVudGljYXRpb24tbWVjaGFuaXNtPgotICAgICAgICAgPGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbSBpZD0iQXV0aGVudGljYXRpb25NZWNoYW5pc21fMTA1MTYzOTc2OTE0OCI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8YXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+S2VyYnY1PC9hdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT4KLSAgICAgICAgICAgIDxjcmVkZW50aWFsLWludGVyZmFjZT5jcmVkZW50aWFsSW50ZXJmYWNlXzE8L2NyZWRlbnRpYWwtaW50ZXJmYWNlPgotICAgICAgICAgPC9hdXRoZW50aWNhdGlvbi1tZWNoYW5pc20+Ci0gICAgICAgICA8YXV0aGVudGljYXRpb24tbWVjaGFuaXNtIGlkPSJBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV8xMDUxNjM5NzY5MTQ5Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT5CYXNpY1Bhc3N3b3JkPC9hdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT4KLSAgICAgICAgICAgIDxjcmVkZW50aWFsLWludGVyZmFjZT5jcmVkZW50aWFsSW50ZXJmYWNlXzI8L2NyZWRlbnRpYWwtaW50ZXJmYWNlPgotICAgICAgICAgPC9hdXRoZW50aWNhdGlvbi1tZWNoYW5pc20+Ci0gICAgICAgICA8YXV0aGVudGljYXRpb24tbWVjaGFuaXNtIGlkPSJBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV8xMDUxNjM5NzY5MTUwIj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT5LZXJidjU8L2F1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPgotICAgICAgICAgICAgPGNyZWRlbnRpYWwtaW50ZXJmYWNlPmNyZWRlbnRpYWxJbnRlcmZhY2VfMzwvY3JlZGVudGlhbC1pbnRlcmZhY2U+Ci0gICAgICAgICA8L2F1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbT4KLSAgICAgICAgIDxhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20gaWQ9IkF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtXzEwNTE2Mzk3NjkxNTEiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPkJhc2ljUGFzc3dvcmQ8L2F1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPgotICAgICAgICAgICAgPGNyZWRlbnRpYWwtaW50ZXJmYWNlPmNyZWRlbnRpYWxJbnRlcmZhY2VfNDwvY3JlZGVudGlhbC1pbnRlcmZhY2U+Ci0gICAgICAgICA8L2F1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbT4KLSAgICAgICAgIDxyZWF1dGhlbnRpY2F0aW9uLXN1cHBvcnQ+dHJ1ZTwvcmVhdXRoZW50aWNhdGlvbi1zdXBwb3J0PgotICAgICAgICAgPHNlY3VyaXR5LXBlcm1pc3Npb24gaWQ9IlNlY3VyaXR5UGVybWlzc2lvbl8xMDUxNjM5NzY5MTY3Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1wZXJtaXNzaW9uLXNwZWM+c3BlY2lmaWNhdGlvbl8wPC9zZWN1cml0eS1wZXJtaXNzaW9uLXNwZWM+Ci0gICAgICAgICA8L3NlY3VyaXR5LXBlcm1pc3Npb24+Ci0gICAgICAgICA8c2VjdXJpdHktcGVybWlzc2lvbiBpZD0iU2VjdXJpdHlQZXJtaXNzaW9uXzEwNTE2Mzk3NjkxNzciPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHNlY3VyaXR5LXBlcm1pc3Npb24tc3BlYz5zcGVjaWZpY2F0aW9uXzE8L3NlY3VyaXR5LXBlcm1pc3Npb24tc3BlYz4KLSAgICAgICAgIDwvc2VjdXJpdHktcGVybWlzc2lvbj4KLSAgICAgICAgIDxzZWN1cml0eS1wZXJtaXNzaW9uIGlkPSJTZWN1cml0eVBlcm1pc3Npb25fMTA1MTYzOTc2OTE3OCI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcGVybWlzc2lvbi1zcGVjPnNwZWNpZmljYXRpb25fMjwvc2VjdXJpdHktcGVybWlzc2lvbi1zcGVjPgotICAgICAgICAgPC9zZWN1cml0eS1wZXJtaXNzaW9uPgotICAgICAgICAgPHNlY3VyaXR5LXBlcm1pc3Npb24gaWQ9IlNlY3VyaXR5UGVybWlzc2lvbl8xMDUxNjM5NzY5MTc5Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1wZXJtaXNzaW9uLXNwZWM+c3BlY2lmaWNhdGlvbl8zPC9zZWN1cml0eS1wZXJtaXNzaW9uLXNwZWM+Ci0gICAgICAgICA8L3NlY3VyaXR5LXBlcm1pc3Npb24+Ci0gICAgICAgICA8c2VjdXJpdHktcGVybWlzc2lvbiBpZD0iU2VjdXJpdHlQZXJtaXNzaW9uXzEwNTE2Mzk3NjkxODAiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHNlY3VyaXR5LXBlcm1pc3Npb24tc3BlYz5zcGVjaWZpY2F0aW9uXzQ8L3NlY3VyaXR5LXBlcm1pc3Npb24tc3BlYz4KLSAgICAgICAgIDwvc2VjdXJpdHktcGVybWlzc2lvbj4KLSAgICAgIDwvcmVzb3VyY2VhZGFwdGVyPgotICAgPC9jb25uZWN0b3I+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvRU1GVGVzdHMvd2ViLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9FTUZUZXN0cy93ZWIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzgzMWIwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9FTUZUZXN0cy93ZWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTI4NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIHdlYi1hcHAgUFVCTElDICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgV2ViIEFwcGxpY2F0aW9uIDIuMy8vRU4iICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC93ZWItYXBwXzJfMy5kdGQiPgotCi0gICA8d2ViLWFwcCBpZD0iV2ViQXBwX0lEIj4KLSAgICAgIDxpY29uPgotICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzA8L3NtYWxsLWljb24+Ci0gICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMDwvbGFyZ2UtaWNvbj4KLSAgICAgIDwvaWNvbj4KLSAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMDwvZGlzcGxheS1uYW1lPgotICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgPGRpc3RyaWJ1dGFibGU+PC9kaXN0cmlidXRhYmxlPgotICAgICAgPGNvbnRleHQtcGFyYW0gaWQ9IkNvbnRleHRQYXJhbV8xMDUxNjQzNDk5ODUyIj4KLSAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8wPC9wYXJhbS1uYW1lPgotICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMDwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgICA8Y29udGV4dC1wYXJhbSBpZD0iQ29udGV4dFBhcmFtXzEwNTE2NDM0OTk4NTMiPgotICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzE8L3BhcmFtLW5hbWU+Ci0gICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8xPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICAgIDxjb250ZXh0LXBhcmFtIGlkPSJDb250ZXh0UGFyYW1fMTA1MTY0MzQ5OTg2MiI+Ci0gICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMjwvcGFyYW0tbmFtZT4KLSAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzI8L3BhcmFtLXZhbHVlPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9jb250ZXh0LXBhcmFtPgotICAgICAgPGNvbnRleHQtcGFyYW0gaWQ9IkNvbnRleHRQYXJhbV8xMDUxNjQzNDk5ODYzIj4KLSAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8zPC9wYXJhbS1uYW1lPgotICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMzwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgICA8Y29udGV4dC1wYXJhbSBpZD0iQ29udGV4dFBhcmFtXzEwNTE2NDM0OTk4NzIiPgotICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV80PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICAgIDxmaWx0ZXIgaWQ9IkZpbHRlcl8xMDUxNjQzNDk5OTAyIj4KLSAgICAgICAgIDxpY29uPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzA8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMDwvbGFyZ2UtaWNvbj4KLSAgICAgICAgIDwvaWNvbj4KLSAgICAgICAgIDxmaWx0ZXItbmFtZT5uYW1lXzA8L2ZpbHRlci1uYW1lPgotICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8wPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8ZmlsdGVyLWNsYXNzPmphdmEubGFuZy5JbnRlZ2VyPC9maWx0ZXItY2xhc3M+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAwMDIiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzI1PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMjU8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDAwMyI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMjY8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8yNjwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMDA0Ij4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8yNzwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzI3PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAwMDUiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzI4PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMjg8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDAwNiI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMjk8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8yOTwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgPC9maWx0ZXI+Ci0gICAgICA8ZmlsdGVyIGlkPSJGaWx0ZXJfMTA1MTY0MzUwMDAwMiI+Ci0gICAgICAgICA8aWNvbj4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8xPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzE8L2xhcmdlLWljb24+Ci0gICAgICAgICA8L2ljb24+Ci0gICAgICAgICA8ZmlsdGVyLW5hbWU+bmFtZV8xPC9maWx0ZXItbmFtZT4KLSAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMTwvZGlzcGxheS1uYW1lPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGZpbHRlci1jbGFzcz5qYXZhLmxhbmcuU3RyaW5nPC9maWx0ZXItY2xhc3M+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAwMDciPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzMwPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMzA8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDAxMiI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMzE8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8zMTwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMDEzIj4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8zMjwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzMyPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAwMTQiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzMzPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMzM8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDAxNSI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMzQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8zNDwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgPC9maWx0ZXI+Ci0gICAgICA8ZmlsdGVyIGlkPSJGaWx0ZXJfMTA1MTY0MzUwMDAxMiI+Ci0gICAgICAgICA8aWNvbj4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8yPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzI8L2xhcmdlLWljb24+Ci0gICAgICAgICA8L2ljb24+Ci0gICAgICAgICA8ZmlsdGVyLW5hbWU+bmFtZV8yPC9maWx0ZXItbmFtZT4KLSAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMjwvZGlzcGxheS1uYW1lPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGZpbHRlci1jbGFzcz5qYXZhLnV0aWwuSGFzaFRhYmxlPC9maWx0ZXItY2xhc3M+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAwMTYiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzM1PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMzU8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDAxNyI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMzY8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8zNjwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMDE4Ij4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8zNzwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzM3PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAwMTkiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzM4PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMzg8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDAyMCI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMzk8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8zOTwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgPC9maWx0ZXI+Ci0gICAgICA8ZmlsdGVyIGlkPSJGaWx0ZXJfMTA1MTY0MzUwMDAxMyI+Ci0gICAgICAgICA8aWNvbj4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8zPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzM8L2xhcmdlLWljb24+Ci0gICAgICAgICA8L2ljb24+Ci0gICAgICAgICA8ZmlsdGVyLW5hbWU+bmFtZV8zPC9maWx0ZXItbmFtZT4KLSAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMzwvZGlzcGxheS1uYW1lPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGZpbHRlci1jbGFzcz5qYXZhLnV0aWwuTGlzdDwvZmlsdGVyLWNsYXNzPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMDIxIj4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV80MDwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzQwPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAwMjIiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzQxPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfNDE8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDAzMiI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfNDI8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV80MjwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMDMzIj4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV80MzwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzQzPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAwMzQiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzQ0PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfNDQ8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgIDwvZmlsdGVyPgotICAgICAgPGZpbHRlciBpZD0iRmlsdGVyXzEwNTE2NDM1MDAwMzIiPgotICAgICAgICAgPGljb24+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fNDwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl80PC9sYXJnZS1pY29uPgotICAgICAgICAgPC9pY29uPgotICAgICAgICAgPGZpbHRlci1uYW1lPm5hbWVfNDwvZmlsdGVyLW5hbWU+Ci0gICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzQ8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxmaWx0ZXItY2xhc3M+amF2YS5zcWwuRGF0YTwvZmlsdGVyLWNsYXNzPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMDM1Ij4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV80NTwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzQ1PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAwMzYiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzQ2PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfNDY8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDAzNyI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfNDc8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV80NzwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMDM4Ij4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV80ODwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzQ4PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80ODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAwNDIiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzQ5PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfNDk8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgIDwvZmlsdGVyPgotICAgICAgPGZpbHRlci1tYXBwaW5nIGlkPSJGaWx0ZXJNYXBwaW5nXzEwNTE2NDM1MDAwODIiPgotICAgICAgICAgPGZpbHRlci1uYW1lPm5hbWVfMDwvZmlsdGVyLW5hbWU+Ci0gICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8wPC91cmwtcGF0dGVybj4KLSAgICAgIDwvZmlsdGVyLW1hcHBpbmc+Ci0gICAgICA8ZmlsdGVyLW1hcHBpbmcgaWQ9IkZpbHRlck1hcHBpbmdfMTA1MTY0MzUwMDA4MyI+Ci0gICAgICAgICA8ZmlsdGVyLW5hbWU+bmFtZV8xPC9maWx0ZXItbmFtZT4KLSAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzE8L3VybC1wYXR0ZXJuPgotICAgICAgPC9maWx0ZXItbWFwcGluZz4KLSAgICAgIDxmaWx0ZXItbWFwcGluZyBpZD0iRmlsdGVyTWFwcGluZ18xMDUxNjQzNTAwMDg0Ij4KLSAgICAgICAgIDxmaWx0ZXItbmFtZT5uYW1lXzI8L2ZpbHRlci1uYW1lPgotICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMjwvdXJsLXBhdHRlcm4+Ci0gICAgICA8L2ZpbHRlci1tYXBwaW5nPgotICAgICAgPGZpbHRlci1tYXBwaW5nIGlkPSJGaWx0ZXJNYXBwaW5nXzEwNTE2NDM1MDAwODUiPgotICAgICAgICAgPGZpbHRlci1uYW1lPm5hbWVfMzwvZmlsdGVyLW5hbWU+Ci0gICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8zPC91cmwtcGF0dGVybj4KLSAgICAgIDwvZmlsdGVyLW1hcHBpbmc+Ci0gICAgICA8ZmlsdGVyLW1hcHBpbmcgaWQ9IkZpbHRlck1hcHBpbmdfMTA1MTY0MzUwMDA4NiI+Ci0gICAgICAgICA8ZmlsdGVyLW5hbWU+bmFtZV80PC9maWx0ZXItbmFtZT4KLSAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzQ8L3VybC1wYXR0ZXJuPgotICAgICAgPC9maWx0ZXItbWFwcGluZz4KLSAgICAgIDxsaXN0ZW5lciBpZD0iTGlzdGVuZXJfMTA1MTY0MzUwMDExMiI+Ci0gICAgICAgICA8bGlzdGVuZXItY2xhc3M+amF2YS5sYW5nLkludGVnZXI8L2xpc3RlbmVyLWNsYXNzPgotICAgICAgPC9saXN0ZW5lcj4KLSAgICAgIDxsaXN0ZW5lciBpZD0iTGlzdGVuZXJfMTA1MTY0MzUwMDExMyI+Ci0gICAgICAgICA8bGlzdGVuZXItY2xhc3M+amF2YS5sYW5nLlN0cmluZzwvbGlzdGVuZXItY2xhc3M+Ci0gICAgICA8L2xpc3RlbmVyPgotICAgICAgPGxpc3RlbmVyIGlkPSJMaXN0ZW5lcl8xMDUxNjQzNTAwMTE0Ij4KLSAgICAgICAgIDxsaXN0ZW5lci1jbGFzcz5qYXZhLnV0aWwuSGFzaFRhYmxlPC9saXN0ZW5lci1jbGFzcz4KLSAgICAgIDwvbGlzdGVuZXI+Ci0gICAgICA8bGlzdGVuZXIgaWQ9Ikxpc3RlbmVyXzEwNTE2NDM1MDAxMTUiPgotICAgICAgICAgPGxpc3RlbmVyLWNsYXNzPmphdmEudXRpbC5MaXN0PC9saXN0ZW5lci1jbGFzcz4KLSAgICAgIDwvbGlzdGVuZXI+Ci0gICAgICA8bGlzdGVuZXIgaWQ9Ikxpc3RlbmVyXzEwNTE2NDM1MDAxMTYiPgotICAgICAgICAgPGxpc3RlbmVyLWNsYXNzPmphdmEuc3FsLkRhdGE8L2xpc3RlbmVyLWNsYXNzPgotICAgICAgPC9saXN0ZW5lcj4KLSAgICAgIDxzZXJ2bGV0IGlkPSJTZXJ2bGV0XzEwNTE2NDM1MDAyMTIiPgotICAgICAgICAgPGljb24+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMDwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8wPC9sYXJnZS1pY29uPgotICAgICAgICAgPC9pY29uPgotICAgICAgICAgPHNlcnZsZXQtbmFtZT5zZXJ2bGV0TmFtZV8wPC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzA8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxqc3AtZmlsZT5qc3BGaWxlXzA8L2pzcC1maWxlPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMjMyIj4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8wPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMDwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAyMzMiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzE8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8xPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDIzNCI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMjwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzI8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMjM1Ij4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8zPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMzwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAyMzYiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV80PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MDwvbG9hZC1vbi1zdGFydHVwPgotICAgICAgICAgPHJ1bi1hcyBpZD0iUnVuQXNTcGVjaWZpZWRJZGVudGl0eV8xMDUxNjQzNTAwMjMyIj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMDwvcm9sZS1uYW1lPgotICAgICAgICAgPC9ydW4tYXM+Ci0gICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjQzNTAwMjcyIj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8wPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMDwvcm9sZS1saW5rPgotICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2NDM1MDAyNzMiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzE8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xPC9yb2xlLWxpbms+Ci0gICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTY0MzUwMDI3NCI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzI8L3JvbGUtbGluaz4KLSAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjQzNTAwMjc1Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8zPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMzwvcm9sZS1saW5rPgotICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2NDM1MDAyNzYiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzQ8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua180PC9yb2xlLWxpbms+Ci0gICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgPC9zZXJ2bGV0PgotICAgICAgPHNlcnZsZXQgaWQ9IlNlcnZsZXRfMTA1MTY0MzUwMDI3MiI+Ci0gICAgICAgICA8aWNvbj4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8xPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzE8L2xhcmdlLWljb24+Ci0gICAgICAgICA8L2ljb24+Ci0gICAgICAgICA8c2VydmxldC1uYW1lPnNlcnZsZXROYW1lXzE8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMTwvZGlzcGxheS1uYW1lPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHNlcnZsZXQtY2xhc3M+Y2xhc3NOYW1lXzA8L3NlcnZsZXQtY2xhc3M+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAyNzIiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzU8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV81PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDI3MyI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfNjwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzY8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMjc0Ij4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV83PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfNzwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAyNzUiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzg8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV84PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDI3NiI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfOTwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzk8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+Ci0gICAgICAgICA8cnVuLWFzIGlkPSJSdW5Bc1NwZWNpZmllZElkZW50aXR5XzEwNTE2NDM1MDAyNzIiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8xPC9yb2xlLW5hbWU+Ci0gICAgICAgICA8L3J1bi1hcz4KLSAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2NDM1MDAyNzciPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzU8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua181PC9yb2xlLWxpbms+Ci0gICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTY0MzUwMDI3OCI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzY8L3JvbGUtbGluaz4KLSAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjQzNTAwMjgyIj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV83PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNzwvcm9sZS1saW5rPgotICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2NDM1MDAyODMiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzg8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua184PC9yb2xlLWxpbms+Ci0gICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTY0MzUwMDI4NCI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfOTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzk8L3JvbGUtbGluaz4KLSAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICA8L3NlcnZsZXQ+Ci0gICAgICA8c2VydmxldCBpZD0iU2VydmxldF8xMDUxNjQzNTAwMjgyIj4KLSAgICAgICAgIDxpY29uPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzI8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMjwvbGFyZ2UtaWNvbj4KLSAgICAgICAgIDwvaWNvbj4KLSAgICAgICAgIDxzZXJ2bGV0LW5hbWU+c2VydmxldE5hbWVfMjwvc2VydmxldC1uYW1lPgotICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8yPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8anNwLWZpbGU+anNwRmlsZV8xPC9qc3AtZmlsZT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDI4MiI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMTA8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8xMDwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMjgzIj4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8xMTwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzExPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAyODQiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzEyPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMTI8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDI4NSI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMTM8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8xMzwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMjg2Ij4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8xNDwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzE0PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjI8L2xvYWQtb24tc3RhcnR1cD4KLSAgICAgICAgIDxydW4tYXMgaWQ9IlJ1bkFzU3BlY2lmaWVkSWRlbnRpdHlfMTA1MTY0MzUwMDI4MiI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzI8L3JvbGUtbmFtZT4KLSAgICAgICAgIDwvcnVuLWFzPgotICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTY0MzUwMDI4NSI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzEwPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTA8L3JvbGUtbGluaz4KLSAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjQzNTAwMjg2Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTE8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xMTwvcm9sZS1saW5rPgotICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2NDM1MDAyODciPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xMjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzEyPC9yb2xlLWxpbms+Ci0gICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTY0MzUwMDI4OCI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzEzPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTM8L3JvbGUtbGluaz4KLSAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjQzNTAwMjg5Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTQ8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xNDwvcm9sZS1saW5rPgotICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgIDwvc2VydmxldD4KLSAgICAgIDxzZXJ2bGV0IGlkPSJTZXJ2bGV0XzEwNTE2NDM1MDAyODMiPgotICAgICAgICAgPGljb24+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMzwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8zPC9sYXJnZS1pY29uPgotICAgICAgICAgPC9pY29uPgotICAgICAgICAgPHNlcnZsZXQtbmFtZT5zZXJ2bGV0TmFtZV8zPC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzM8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxzZXJ2bGV0LWNsYXNzPmNsYXNzTmFtZV8xPC9zZXJ2bGV0LWNsYXNzPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMjg3Ij4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8xNTwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzE1PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAyODgiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzE2PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMTY8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDI5MiI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMTc8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8xNzwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMjkzIj4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8xODwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzE4PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAyOTQiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzE5PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMTk8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MzwvbG9hZC1vbi1zdGFydHVwPgotICAgICAgICAgPHJ1bi1hcyBpZD0iUnVuQXNTcGVjaWZpZWRJZGVudGl0eV8xMDUxNjQzNTAwMjkyIj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMzwvcm9sZS1uYW1lPgotICAgICAgICAgPC9ydW4tYXM+Ci0gICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjQzNTAwMjkyIj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTU8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xNTwvcm9sZS1saW5rPgotICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2NDM1MDAyOTMiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xNjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzE2PC9yb2xlLWxpbms+Ci0gICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTY0MzUwMDI5NCI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzE3PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTc8L3JvbGUtbGluaz4KLSAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjQzNTAwMjk1Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTg8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xODwvcm9sZS1saW5rPgotICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2NDM1MDAyOTYiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xOTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzE5PC9yb2xlLWxpbms+Ci0gICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgPC9zZXJ2bGV0PgotICAgICAgPHNlcnZsZXQgaWQ9IlNlcnZsZXRfMTA1MTY0MzUwMDI5MiI+Ci0gICAgICAgICA8aWNvbj4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl80PC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzQ8L2xhcmdlLWljb24+Ci0gICAgICAgICA8L2ljb24+Ci0gICAgICAgICA8c2VydmxldC1uYW1lPnNlcnZsZXROYW1lXzQ8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfNDwvZGlzcGxheS1uYW1lPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGpzcC1maWxlPmpzcEZpbGVfMjwvanNwLWZpbGU+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAyOTUiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzIwPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMjA8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDI5NiI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMjE8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8yMTwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMjk3Ij4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8yMjwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzIyPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAyOTgiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzIzPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMjM8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDI5OSI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMjQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8yNDwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICAgPGxvYWQtb24tc3RhcnR1cD40PC9sb2FkLW9uLXN0YXJ0dXA+Ci0gICAgICAgICA8cnVuLWFzIGlkPSJSdW5Bc1NwZWNpZmllZElkZW50aXR5XzEwNTE2NDM1MDAyOTMiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV80PC9yb2xlLW5hbWU+Ci0gICAgICAgICA8L3J1bi1hcz4KLSAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2NDM1MDAyOTciPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yMDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzIwPC9yb2xlLWxpbms+Ci0gICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTY0MzUwMDI5OCI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzIxPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjE8L3JvbGUtbGluaz4KLSAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjQzNTAwMjk5Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjI8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yMjwvcm9sZS1saW5rPgotICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2NDM1MDAzMDAiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yMzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzIzPC9yb2xlLWxpbms+Ci0gICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTY0MzUwMDMwMSI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzI0PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjQ8L3JvbGUtbGluaz4KLSAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICA8L3NlcnZsZXQ+Ci0gICAgICA8c2VydmxldC1tYXBwaW5nIGlkPSJTZXJ2bGV0TWFwcGluZ18xMDUxNjQzNTAwMzEyIj4KLSAgICAgICAgIDxzZXJ2bGV0LW5hbWU+c2VydmxldE5hbWVfMDwvc2VydmxldC1uYW1lPgotICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMDwvdXJsLXBhdHRlcm4+Ci0gICAgICA8L3NlcnZsZXQtbWFwcGluZz4KLSAgICAgIDxzZXJ2bGV0LW1hcHBpbmcgaWQ9IlNlcnZsZXRNYXBwaW5nXzEwNTE2NDM1MDAzMTMiPgotICAgICAgICAgPHNlcnZsZXQtbmFtZT5zZXJ2bGV0TmFtZV8xPC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xPC91cmwtcGF0dGVybj4KLSAgICAgIDwvc2VydmxldC1tYXBwaW5nPgotICAgICAgPHNlcnZsZXQtbWFwcGluZyBpZD0iU2VydmxldE1hcHBpbmdfMTA1MTY0MzUwMDMxNCI+Ci0gICAgICAgICA8c2VydmxldC1uYW1lPnNlcnZsZXROYW1lXzI8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzI8L3VybC1wYXR0ZXJuPgotICAgICAgPC9zZXJ2bGV0LW1hcHBpbmc+Ci0gICAgICA8c2VydmxldC1tYXBwaW5nIGlkPSJTZXJ2bGV0TWFwcGluZ18xMDUxNjQzNTAwMzE1Ij4KLSAgICAgICAgIDxzZXJ2bGV0LW5hbWU+c2VydmxldE5hbWVfMzwvc2VydmxldC1uYW1lPgotICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMzwvdXJsLXBhdHRlcm4+Ci0gICAgICA8L3NlcnZsZXQtbWFwcGluZz4KLSAgICAgIDxzZXJ2bGV0LW1hcHBpbmcgaWQ9IlNlcnZsZXRNYXBwaW5nXzEwNTE2NDM1MDAzMTYiPgotICAgICAgICAgPHNlcnZsZXQtbmFtZT5zZXJ2bGV0TmFtZV80PC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl80PC91cmwtcGF0dGVybj4KLSAgICAgIDwvc2VydmxldC1tYXBwaW5nPgotICAgICAgPHNlc3Npb24tY29uZmlnIGlkPSJTZXNzaW9uQ29uZmlnXzEwNTE2NDM1MDAzMTIiPgotICAgICAgICAgPHNlc3Npb24tdGltZW91dD4wPC9zZXNzaW9uLXRpbWVvdXQ+Ci0gICAgICA8L3Nlc3Npb24tY29uZmlnPgotICAgICAgPG1pbWUtbWFwcGluZyBpZD0iTWltZU1hcHBpbmdfMTA1MTY0MzUwMDMzMiI+Ci0gICAgICAgICA8ZXh0ZW5zaW9uPmV4dGVuc2lvbl8wPC9leHRlbnNpb24+Ci0gICAgICAgICA8bWltZS10eXBlPm1pbWVUeXBlXzA8L21pbWUtdHlwZT4KLSAgICAgIDwvbWltZS1tYXBwaW5nPgotICAgICAgPG1pbWUtbWFwcGluZyBpZD0iTWltZU1hcHBpbmdfMTA1MTY0MzUwMDMzMyI+Ci0gICAgICAgICA8ZXh0ZW5zaW9uPmV4dGVuc2lvbl8xPC9leHRlbnNpb24+Ci0gICAgICAgICA8bWltZS10eXBlPm1pbWVUeXBlXzE8L21pbWUtdHlwZT4KLSAgICAgIDwvbWltZS1tYXBwaW5nPgotICAgICAgPG1pbWUtbWFwcGluZyBpZD0iTWltZU1hcHBpbmdfMTA1MTY0MzUwMDMzNCI+Ci0gICAgICAgICA8ZXh0ZW5zaW9uPmV4dGVuc2lvbl8yPC9leHRlbnNpb24+Ci0gICAgICAgICA8bWltZS10eXBlPm1pbWVUeXBlXzI8L21pbWUtdHlwZT4KLSAgICAgIDwvbWltZS1tYXBwaW5nPgotICAgICAgPG1pbWUtbWFwcGluZyBpZD0iTWltZU1hcHBpbmdfMTA1MTY0MzUwMDMzNSI+Ci0gICAgICAgICA8ZXh0ZW5zaW9uPmV4dGVuc2lvbl8zPC9leHRlbnNpb24+Ci0gICAgICAgICA8bWltZS10eXBlPm1pbWVUeXBlXzM8L21pbWUtdHlwZT4KLSAgICAgIDwvbWltZS1tYXBwaW5nPgotICAgICAgPG1pbWUtbWFwcGluZyBpZD0iTWltZU1hcHBpbmdfMTA1MTY0MzUwMDMzNiI+Ci0gICAgICAgICA8ZXh0ZW5zaW9uPmV4dGVuc2lvbl80PC9leHRlbnNpb24+Ci0gICAgICAgICA8bWltZS10eXBlPm1pbWVUeXBlXzQ8L21pbWUtdHlwZT4KLSAgICAgIDwvbWltZS1tYXBwaW5nPgotICAgICAgPHdlbGNvbWUtZmlsZS1saXN0IGlkPSJXZWxjb21lRmlsZUxpc3RfMTA1MTY0MzUwMDMzMiI+Ci0gICAgICAgICA8d2VsY29tZS1maWxlPndlbGNvbWVGaWxlXzA8L3dlbGNvbWUtZmlsZT4KLSAgICAgICAgIDx3ZWxjb21lLWZpbGU+d2VsY29tZUZpbGVfMTwvd2VsY29tZS1maWxlPgotICAgICAgICAgPHdlbGNvbWUtZmlsZT53ZWxjb21lRmlsZV8yPC93ZWxjb21lLWZpbGU+Ci0gICAgICAgICA8d2VsY29tZS1maWxlPndlbGNvbWVGaWxlXzM8L3dlbGNvbWUtZmlsZT4KLSAgICAgICAgIDx3ZWxjb21lLWZpbGU+d2VsY29tZUZpbGVfNDwvd2VsY29tZS1maWxlPgotICAgICAgPC93ZWxjb21lLWZpbGUtbGlzdD4KLSAgICAgIDxlcnJvci1wYWdlIGlkPSJFeGNlcHRpb25UeXBlRXJyb3JQYWdlXzEwNTE2NDM1MDAzNDIiPgotICAgICAgICAgPGV4Y2VwdGlvbi10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L2V4Y2VwdGlvbi10eXBlPgotICAgICAgICAgPGxvY2F0aW9uPmxvY2F0aW9uXzA8L2xvY2F0aW9uPgotICAgICAgPC9lcnJvci1wYWdlPgotICAgICAgPGVycm9yLXBhZ2UgaWQ9IkVycm9yQ29kZUVycm9yUGFnZV8xMDUxNjQzNTAwMzQyIj4KLSAgICAgICAgIDxlcnJvci1jb2RlPmVycm9yQ29kZV8wPC9lcnJvci1jb2RlPgotICAgICAgICAgPGxvY2F0aW9uPmxvY2F0aW9uXzE8L2xvY2F0aW9uPgotICAgICAgPC9lcnJvci1wYWdlPgotICAgICAgPGVycm9yLXBhZ2UgaWQ9IkV4Y2VwdGlvblR5cGVFcnJvclBhZ2VfMTA1MTY0MzUwMDM0MyI+Ci0gICAgICAgICA8ZXhjZXB0aW9uLXR5cGU+amF2YS51dGlsLkxpc3Q8L2V4Y2VwdGlvbi10eXBlPgotICAgICAgICAgPGxvY2F0aW9uPmxvY2F0aW9uXzI8L2xvY2F0aW9uPgotICAgICAgPC9lcnJvci1wYWdlPgotICAgICAgPGVycm9yLXBhZ2UgaWQ9IkVycm9yQ29kZUVycm9yUGFnZV8xMDUxNjQzNTAwMzQzIj4KLSAgICAgICAgIDxlcnJvci1jb2RlPmVycm9yQ29kZV8xPC9lcnJvci1jb2RlPgotICAgICAgICAgPGxvY2F0aW9uPmxvY2F0aW9uXzM8L2xvY2F0aW9uPgotICAgICAgPC9lcnJvci1wYWdlPgotICAgICAgPGVycm9yLXBhZ2UgaWQ9IkV4Y2VwdGlvblR5cGVFcnJvclBhZ2VfMTA1MTY0MzUwMDM1MiI+Ci0gICAgICAgICA8ZXhjZXB0aW9uLXR5cGU+amF2YS5zcWwuRGF0YTwvZXhjZXB0aW9uLXR5cGU+Ci0gICAgICAgICA8bG9jYXRpb24+bG9jYXRpb25fNDwvbG9jYXRpb24+Ci0gICAgICA8L2Vycm9yLXBhZ2U+Ci0gICAgICA8dGFnbGliIGlkPSJUYWdMaWJSZWZfMTA1MTY0MzUwMDM2MiI+Ci0gICAgICAgICA8dGFnbGliLXVyaT50YWdsaWJVUklfMDwvdGFnbGliLXVyaT4KLSAgICAgICAgIDx0YWdsaWItbG9jYXRpb24+dGFnbGliTG9jYXRpb25fMDwvdGFnbGliLWxvY2F0aW9uPgotICAgICAgPC90YWdsaWI+Ci0gICAgICA8dGFnbGliIGlkPSJUYWdMaWJSZWZfMTA1MTY0MzUwMDM2MyI+Ci0gICAgICAgICA8dGFnbGliLXVyaT50YWdsaWJVUklfMTwvdGFnbGliLXVyaT4KLSAgICAgICAgIDx0YWdsaWItbG9jYXRpb24+dGFnbGliTG9jYXRpb25fMTwvdGFnbGliLWxvY2F0aW9uPgotICAgICAgPC90YWdsaWI+Ci0gICAgICA8dGFnbGliIGlkPSJUYWdMaWJSZWZfMTA1MTY0MzUwMDM2NCI+Ci0gICAgICAgICA8dGFnbGliLXVyaT50YWdsaWJVUklfMjwvdGFnbGliLXVyaT4KLSAgICAgICAgIDx0YWdsaWItbG9jYXRpb24+dGFnbGliTG9jYXRpb25fMjwvdGFnbGliLWxvY2F0aW9uPgotICAgICAgPC90YWdsaWI+Ci0gICAgICA8dGFnbGliIGlkPSJUYWdMaWJSZWZfMTA1MTY0MzUwMDM2NSI+Ci0gICAgICAgICA8dGFnbGliLXVyaT50YWdsaWJVUklfMzwvdGFnbGliLXVyaT4KLSAgICAgICAgIDx0YWdsaWItbG9jYXRpb24+dGFnbGliTG9jYXRpb25fMzwvdGFnbGliLWxvY2F0aW9uPgotICAgICAgPC90YWdsaWI+Ci0gICAgICA8dGFnbGliIGlkPSJUYWdMaWJSZWZfMTA1MTY0MzUwMDM2NiI+Ci0gICAgICAgICA8dGFnbGliLXVyaT50YWdsaWJVUklfNDwvdGFnbGliLXVyaT4KLSAgICAgICAgIDx0YWdsaWItbG9jYXRpb24+dGFnbGliTG9jYXRpb25fNDwvdGFnbGliLWxvY2F0aW9uPgotICAgICAgPC90YWdsaWI+Ci0gICAgICA8cmVzb3VyY2UtZW52LXJlZiBpZD0iUmVzb3VyY2VFbnZSZWZfMTA1MTY0MzUwMDM4MiI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgPHJlc291cmNlLWVudi1yZWYgaWQ9IlJlc291cmNlRW52UmVmXzEwNTE2NDM1MDAzODMiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzE8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgPHJlc291cmNlLWVudi1yZWYgaWQ9IlJlc291cmNlRW52UmVmXzEwNTE2NDM1MDAzODQiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzI8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgPHJlc291cmNlLWVudi1yZWYgaWQ9IlJlc291cmNlRW52UmVmXzEwNTE2NDM1MDAzODUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzM8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgIDxyZXNvdXJjZS1lbnYtcmVmIGlkPSJSZXNvdXJjZUVudlJlZl8xMDUxNjQzNTAwMzg2Ij4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV80PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgIDxyZXNvdXJjZS1yZWYgaWQ9IlJlc291cmNlUmVmXzEwNTE2NDM1MDA0MDIiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzA8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgIDxyZXMtdHlwZT50eXBlXzA8L3Jlcy10eXBlPgotICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgPHJlc291cmNlLXJlZiBpZD0iUmVzb3VyY2VSZWZfMTA1MTY0MzUwMDQwMyI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgPHJlcy10eXBlPnR5cGVfMTwvcmVzLXR5cGU+Ci0gICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgPHJlc291cmNlLXJlZiBpZD0iUmVzb3VyY2VSZWZfMTA1MTY0MzUwMDQwNCI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgPHJlcy10eXBlPnR5cGVfMjwvcmVzLXR5cGU+Ci0gICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICA8cmVzb3VyY2UtcmVmIGlkPSJSZXNvdXJjZVJlZl8xMDUxNjQzNTAwNDA1Ij4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICA8cmVzLXR5cGU+dHlwZV8zPC9yZXMtdHlwZT4KLSAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICA8cmVzb3VyY2UtcmVmIGlkPSJSZXNvdXJjZVJlZl8xMDUxNjQzNTAwNDA2Ij4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV80PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICA8cmVzLXR5cGU+dHlwZV80PC9yZXMtdHlwZT4KLSAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgIDxzZWN1cml0eS1jb25zdHJhaW50IGlkPSJTZWN1cml0eUNvbnN0cmFpbnRfMTA1MTY0MzUwMDQzMiI+Ci0gICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzA8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbiBpZD0iV2ViUmVzb3VyY2VDb2xsZWN0aW9uXzEwNTE2NDM1MDA0NTIiPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV8wPC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzA8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8yPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzM8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+R0VUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QT1NUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QVVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkRFTEVURTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+SEVBRDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIGlkPSJXZWJSZXNvdXJjZUNvbGxlY3Rpb25fMTA1MTY0MzUwMDQ1MyI+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzE8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl82PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzc8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fODwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl85PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5PUFRJT05TPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5UUkFDRTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+R0VUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QT1NUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QVVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbiBpZD0iV2ViUmVzb3VyY2VDb2xsZWN0aW9uXzEwNTE2NDM1MDA0NTQiPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV8yPC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzEwPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzExPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzEyPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzEzPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzE0PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5ERUxFVEU8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkhFQUQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPk9QVElPTlM8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlRSQUNFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5HRVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbiBpZD0iV2ViUmVzb3VyY2VDb2xsZWN0aW9uXzEwNTE2NDM1MDA0NTUiPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV8zPC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzE1PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzE2PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzE3PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzE4PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzE5PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QT1NUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QVVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkRFTEVURTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+SEVBRDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+T1BUSU9OUzwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIGlkPSJXZWJSZXNvdXJjZUNvbGxlY3Rpb25fMTA1MTY0MzUwMDQ2MiI+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzQ8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMjA8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMjE8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMjI8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMjM8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMjQ8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlRSQUNFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5HRVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBPU1Q8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBVVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+REVMRVRFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICA8YXV0aC1jb25zdHJhaW50IGlkPSJBdXRoQ29uc3RyYWludF8xMDUxNjQzNTAwNDYyIj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZXNfMDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc18xPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzI8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZXNfMzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc180PC9yb2xlLW5hbWU+Ci0gICAgICAgICA8L2F1dGgtY29uc3RyYWludD4KLSAgICAgICAgIDx1c2VyLWRhdGEtY29uc3RyYWludCBpZD0iVXNlckRhdGFDb25zdHJhaW50XzEwNTE2NDM1MDA0NjIiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHRyYW5zcG9ydC1ndWFyYW50ZWU+Tk9ORTwvdHJhbnNwb3J0LWd1YXJhbnRlZT4KLSAgICAgICAgIDwvdXNlci1kYXRhLWNvbnN0cmFpbnQ+Ci0gICAgICA8L3NlY3VyaXR5LWNvbnN0cmFpbnQ+Ci0gICAgICA8c2VjdXJpdHktY29uc3RyYWludCBpZD0iU2VjdXJpdHlDb25zdHJhaW50XzEwNTE2NDM1MDA0NjIiPgotICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8xPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24gaWQ9IldlYlJlc291cmNlQ29sbGVjdGlvbl8xMDUxNjQzNTAwNDYzIj4KLSAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT53ZWJSZXNvdXJjZU5hbWVfNTwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8yNTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8yNjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8yNzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8yODwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8yOTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+SEVBRDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+T1BUSU9OUzwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+VFJBQ0U8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkdFVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UE9TVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIGlkPSJXZWJSZXNvdXJjZUNvbGxlY3Rpb25fMTA1MTY0MzUwMDQ2NCI+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzY8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMzA8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMzE8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMzI8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMzM8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMzQ8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBVVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+REVMRVRFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5IRUFEPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5PUFRJT05TPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5UUkFDRTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIGlkPSJXZWJSZXNvdXJjZUNvbGxlY3Rpb25fMTA1MTY0MzUwMDQ2NSI+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzc8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMzU8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMzY8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMzc8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMzg8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMzk8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkdFVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UE9TVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UFVUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5ERUxFVEU8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkhFQUQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbiBpZD0iV2ViUmVzb3VyY2VDb2xsZWN0aW9uXzEwNTE2NDM1MDA0NjYiPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV84PC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzQwPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzQxPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzQyPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzQzPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzQ0PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5PUFRJT05TPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5UUkFDRTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+R0VUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QT1NUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QVVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbiBpZD0iV2ViUmVzb3VyY2VDb2xsZWN0aW9uXzEwNTE2NDM1MDA0NjciPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV85PC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzQ1PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzQ2PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzQ3PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzQ4PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzQ5PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5ERUxFVEU8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkhFQUQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPk9QVElPTlM8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlRSQUNFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5HRVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgIDxhdXRoLWNvbnN0cmFpbnQgaWQ9IkF1dGhDb25zdHJhaW50XzEwNTE2NDM1MDA0NjMiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc181PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzY8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZXNfNzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc184PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzk8L3JvbGUtbmFtZT4KLSAgICAgICAgIDwvYXV0aC1jb25zdHJhaW50PgotICAgICAgICAgPHVzZXItZGF0YS1jb25zdHJhaW50IGlkPSJVc2VyRGF0YUNvbnN0cmFpbnRfMTA1MTY0MzUwMDQ2MyI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dHJhbnNwb3J0LWd1YXJhbnRlZT5JTlRFR1JBTDwvdHJhbnNwb3J0LWd1YXJhbnRlZT4KLSAgICAgICAgIDwvdXNlci1kYXRhLWNvbnN0cmFpbnQ+Ci0gICAgICA8L3NlY3VyaXR5LWNvbnN0cmFpbnQ+Ci0gICAgICA8c2VjdXJpdHktY29uc3RyYWludCBpZD0iU2VjdXJpdHlDb25zdHJhaW50XzEwNTE2NDM1MDA0NjMiPgotICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8yPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24gaWQ9IldlYlJlc291cmNlQ29sbGVjdGlvbl8xMDUxNjQzNTAwNDY4Ij4KLSAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT53ZWJSZXNvdXJjZU5hbWVfMTA8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzUwPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzUxPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzUyPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzUzPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzU0PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QT1NUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QVVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkRFTEVURTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+SEVBRDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+T1BUSU9OUzwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIGlkPSJXZWJSZXNvdXJjZUNvbGxlY3Rpb25fMTA1MTY0MzUwMDQ2OSI+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzExPC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl81NTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl81NjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl81NzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl81ODwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl81OTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+VFJBQ0U8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkdFVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UE9TVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UFVUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5ERUxFVEU8L2h0dHAtbWV0aG9kPgotICAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbiBpZD0iV2ViUmVzb3VyY2VDb2xsZWN0aW9uXzEwNTE2NDM1MDA0NzAiPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV8xMjwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNjA8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNjE8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNjI8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNjM8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNjQ8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkhFQUQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPk9QVElPTlM8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlRSQUNFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5HRVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBPU1Q8L2h0dHAtbWV0aG9kPgotICAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbiBpZD0iV2ViUmVzb3VyY2VDb2xsZWN0aW9uXzEwNTE2NDM1MDA0NzEiPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV8xMzwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNjU8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNjY8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNjc8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNjg8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNjk8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBVVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+REVMRVRFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5IRUFEPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5PUFRJT05TPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5UUkFDRTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIGlkPSJXZWJSZXNvdXJjZUNvbGxlY3Rpb25fMTA1MTY0MzUwMDQ3MiI+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzE0PC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl83MDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl83MTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl83MjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl83MzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl83NDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+R0VUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QT1NUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QVVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkRFTEVURTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+SEVBRDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgPGF1dGgtY29uc3RyYWludCBpZD0iQXV0aENvbnN0cmFpbnRfMTA1MTY0MzUwMDQ2NCI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzEwPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzExPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzEyPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzEzPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzE0PC9yb2xlLW5hbWU+Ci0gICAgICAgICA8L2F1dGgtY29uc3RyYWludD4KLSAgICAgICAgIDx1c2VyLWRhdGEtY29uc3RyYWludCBpZD0iVXNlckRhdGFDb25zdHJhaW50XzEwNTE2NDM1MDA0NjQiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHRyYW5zcG9ydC1ndWFyYW50ZWU+Q09ORklERU5USUFMPC90cmFuc3BvcnQtZ3VhcmFudGVlPgotICAgICAgICAgPC91c2VyLWRhdGEtY29uc3RyYWludD4KLSAgICAgIDwvc2VjdXJpdHktY29uc3RyYWludD4KLSAgICAgIDxzZWN1cml0eS1jb25zdHJhaW50IGlkPSJTZWN1cml0eUNvbnN0cmFpbnRfMTA1MTY0MzUwMDQ2NCI+Ci0gICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzM8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbiBpZD0iV2ViUmVzb3VyY2VDb2xsZWN0aW9uXzEwNTE2NDM1MDA0NzMiPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV8xNTwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNzU8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNzY8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNzc8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNzg8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNzk8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPk9QVElPTlM8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlRSQUNFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5HRVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBPU1Q8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBVVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIGlkPSJXZWJSZXNvdXJjZUNvbGxlY3Rpb25fMTA1MTY0MzUwMDQ3NCI+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzE2PC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl84MDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl84MTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl84MjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl84MzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl84NDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+REVMRVRFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5IRUFEPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5PUFRJT05TPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5UUkFDRTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+R0VUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24gaWQ9IldlYlJlc291cmNlQ29sbGVjdGlvbl8xMDUxNjQzNTAwNDc1Ij4KLSAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT53ZWJSZXNvdXJjZU5hbWVfMTc8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzg1PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzg2PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzg3PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzg4PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzg5PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QT1NUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QVVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkRFTEVURTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+SEVBRDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+T1BUSU9OUzwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIGlkPSJXZWJSZXNvdXJjZUNvbGxlY3Rpb25fMTA1MTY0MzUwMDQ3NiI+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzE4PC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl85MDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl85MTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl85MjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl85MzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl85NDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+VFJBQ0U8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkdFVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UE9TVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UFVUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5ERUxFVEU8L2h0dHAtbWV0aG9kPgotICAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbiBpZD0iV2ViUmVzb3VyY2VDb2xsZWN0aW9uXzEwNTE2NDM1MDA0NzciPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV8xOTwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fOTU8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fOTY8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fOTc8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fOTg8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fOTk8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkhFQUQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPk9QVElPTlM8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlRSQUNFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5HRVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBPU1Q8L2h0dHAtbWV0aG9kPgotICAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgIDxhdXRoLWNvbnN0cmFpbnQgaWQ9IkF1dGhDb25zdHJhaW50XzEwNTE2NDM1MDA0NzIiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc18xNTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc18xNjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc18xNzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc18xODwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc18xOTwvcm9sZS1uYW1lPgotICAgICAgICAgPC9hdXRoLWNvbnN0cmFpbnQ+Ci0gICAgICAgICA8dXNlci1kYXRhLWNvbnN0cmFpbnQgaWQ9IlVzZXJEYXRhQ29uc3RyYWludF8xMDUxNjQzNTAwNDcyIj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx0cmFuc3BvcnQtZ3VhcmFudGVlPk5PTkU8L3RyYW5zcG9ydC1ndWFyYW50ZWU+Ci0gICAgICAgICA8L3VzZXItZGF0YS1jb25zdHJhaW50PgotICAgICAgPC9zZWN1cml0eS1jb25zdHJhaW50PgotICAgICAgPHNlY3VyaXR5LWNvbnN0cmFpbnQgaWQ9IlNlY3VyaXR5Q29uc3RyYWludF8xMDUxNjQzNTAwNDcyIj4KLSAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfNDwvZGlzcGxheS1uYW1lPgotICAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIGlkPSJXZWJSZXNvdXJjZUNvbGxlY3Rpb25fMTA1MTY0MzUwMDQ3OCI+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzIwPC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMDA8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTAxPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzEwMjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMDM8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTA0PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QVVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkRFTEVURTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+SEVBRDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+T1BUSU9OUzwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+VFJBQ0U8L2h0dHAtbWV0aG9kPgotICAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbiBpZD0iV2ViUmVzb3VyY2VDb2xsZWN0aW9uXzEwNTE2NDM1MDA0NzkiPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV8yMTwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTA1PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzEwNjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMDc8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTA4PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzEwOTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+R0VUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QT1NUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QVVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkRFTEVURTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+SEVBRDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIGlkPSJXZWJSZXNvdXJjZUNvbGxlY3Rpb25fMTA1MTY0MzUwMDQ4MCI+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzIyPC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMTA8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTExPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzExMjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMTM8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTE0PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5PUFRJT05TPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5UUkFDRTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+R0VUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QT1NUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QVVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbiBpZD0iV2ViUmVzb3VyY2VDb2xsZWN0aW9uXzEwNTE2NDM1MDA0ODEiPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV8yMzwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTE1PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzExNjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMTc8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTE4PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzExOTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+REVMRVRFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5IRUFEPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5PUFRJT05TPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5UUkFDRTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+R0VUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24gaWQ9IldlYlJlc291cmNlQ29sbGVjdGlvbl8xMDUxNjQzNTAwNDgyIj4KLSAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT53ZWJSZXNvdXJjZU5hbWVfMjQ8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzEyMDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMjE8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTIyPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzEyMzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMjQ8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBPU1Q8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBVVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+REVMRVRFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5IRUFEPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5PUFRJT05TPC9odHRwLW1ldGhvZD4KLSAgICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICA8YXV0aC1jb25zdHJhaW50IGlkPSJBdXRoQ29uc3RyYWludF8xMDUxNjQzNTAwNDczIj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZXNfMjA8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZXNfMjE8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZXNfMjI8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZXNfMjM8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZXNfMjQ8L3JvbGUtbmFtZT4KLSAgICAgICAgIDwvYXV0aC1jb25zdHJhaW50PgotICAgICAgICAgPHVzZXItZGF0YS1jb25zdHJhaW50IGlkPSJVc2VyRGF0YUNvbnN0cmFpbnRfMTA1MTY0MzUwMDQ3MyI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dHJhbnNwb3J0LWd1YXJhbnRlZT5JTlRFR1JBTDwvdHJhbnNwb3J0LWd1YXJhbnRlZT4KLSAgICAgICAgIDwvdXNlci1kYXRhLWNvbnN0cmFpbnQ+Ci0gICAgICA8L3NlY3VyaXR5LWNvbnN0cmFpbnQ+Ci0gICAgICA8bG9naW4tY29uZmlnIGlkPSJMb2dpbkNvbmZpZ18xMDUxNjQzNTAwNDgyIj4KLSAgICAgICAgIDxhdXRoLW1ldGhvZD5CQVNJQzwvYXV0aC1tZXRob2Q+Ci0gICAgICAgICA8cmVhbG0tbmFtZT5yZWFsbU5hbWVfMDwvcmVhbG0tbmFtZT4KLSAgICAgICAgIDxmb3JtLWxvZ2luLWNvbmZpZyBpZD0iRm9ybUxvZ2luQ29uZmlnXzEwNTE2NDM1MDA0ODIiPgotICAgICAgICAgICAgPGZvcm0tbG9naW4tcGFnZT5mb3JtTG9naW5QYWdlXzA8L2Zvcm0tbG9naW4tcGFnZT4KLSAgICAgICAgICAgIDxmb3JtLWVycm9yLXBhZ2U+Zm9ybUVycm9yUGFnZV8wPC9mb3JtLWVycm9yLXBhZ2U+Ci0gICAgICAgICA8L2Zvcm0tbG9naW4tY29uZmlnPgotICAgICAgPC9sb2dpbi1jb25maWc+Ci0gICAgICA8c2VjdXJpdHktcm9sZSBpZD0iU2VjdXJpdHlSb2xlXzEwNTE2NDM1MDA0OTIiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8wPC9yb2xlLW5hbWU+Ci0gICAgICA8L3NlY3VyaXR5LXJvbGU+Ci0gICAgICA8c2VjdXJpdHktcm9sZSBpZD0iU2VjdXJpdHlSb2xlXzEwNTE2NDM1MDA0OTMiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8xPC9yb2xlLW5hbWU+Ci0gICAgICA8L3NlY3VyaXR5LXJvbGU+Ci0gICAgICA8c2VjdXJpdHktcm9sZSBpZD0iU2VjdXJpdHlSb2xlXzEwNTE2NDM1MDA0OTQiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8yPC9yb2xlLW5hbWU+Ci0gICAgICA8L3NlY3VyaXR5LXJvbGU+Ci0gICAgICA8c2VjdXJpdHktcm9sZSBpZD0iU2VjdXJpdHlSb2xlXzEwNTE2NDM1MDA0OTUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8zPC9yb2xlLW5hbWU+Ci0gICAgICA8L3NlY3VyaXR5LXJvbGU+Ci0gICAgICA8c2VjdXJpdHktcm9sZSBpZD0iU2VjdXJpdHlSb2xlXzEwNTE2NDM1MDA0OTYiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV80PC9yb2xlLW5hbWU+Ci0gICAgICA8L3NlY3VyaXR5LXJvbGU+Ci0gICAgICA8ZW52LWVudHJ5IGlkPSJFbnZFbnRyeV8xMDUxNjQzNTAwNTEzIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzA8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8wPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlN0cmluZzwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICA8L2Vudi1lbnRyeT4KLSAgICAgIDxlbnYtZW50cnkgaWQ9IkVudkVudHJ5XzEwNTE2NDM1MDA1MTQiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzE8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICA8L2Vudi1lbnRyeT4KLSAgICAgIDxlbnYtZW50cnkgaWQ9IkVudkVudHJ5XzEwNTE2NDM1MDA1MTUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzI8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQm9vbGVhbjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICA8L2Vudi1lbnRyeT4KLSAgICAgIDxlbnYtZW50cnkgaWQ9IkVudkVudHJ5XzEwNTE2NDM1MDA1MTYiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMzwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzM8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuRG91YmxlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgIDwvZW52LWVudHJ5PgotICAgICAgPGVudi1lbnRyeSBpZD0iRW52RW50cnlfMTA1MTY0MzUwMDUxNyI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV80PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5CeXRlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgIDwvZW52LWVudHJ5PgotICAgICAgPGVqYi1yZWYgaWQ9IkVqYlJlZl8xMDUxNjQzNTAwNTMzIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8wPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgIDxob21lPmhvbWVfMDwvaG9tZT4KLSAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzA8L3JlbW90ZT4KLSAgICAgICAgIDxlamItbGluaz5saW5rXzA8L2VqYi1saW5rPgotICAgICAgPC9lamItcmVmPgotICAgICAgPGVqYi1yZWYgaWQ9IkVqYlJlZl8xMDUxNjQzNTAwNTM0Ij4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgPGhvbWU+aG9tZV8xPC9ob21lPgotICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTwvcmVtb3RlPgotICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTwvZWpiLWxpbms+Ci0gICAgICA8L2VqYi1yZWY+Ci0gICAgICA8ZWpiLXJlZiBpZD0iRWpiUmVmXzEwNTE2NDM1MDA1MzUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgPGhvbWU+aG9tZV8yPC9ob21lPgotICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjwvcmVtb3RlPgotICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjwvZWpiLWxpbms+Ci0gICAgICA8L2VqYi1yZWY+Ci0gICAgICA8ZWpiLXJlZiBpZD0iRWpiUmVmXzEwNTE2NDM1MDA1MzYiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICA8aG9tZT5ob21lXzM8L2hvbWU+Ci0gICAgICAgICA8cmVtb3RlPnJlbW90ZV8zPC9yZW1vdGU+Ci0gICAgICAgICA8ZWpiLWxpbms+bGlua18zPC9lamItbGluaz4KLSAgICAgIDwvZWpiLXJlZj4KLSAgICAgIDxlamItcmVmIGlkPSJFamJSZWZfMTA1MTY0MzUwMDUzNyI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICA8aG9tZT5ob21lXzQ8L2hvbWU+Ci0gICAgICAgICA8cmVtb3RlPnJlbW90ZV80PC9yZW1vdGU+Ci0gICAgICAgICA8ZWpiLWxpbms+bGlua180PC9lamItbGluaz4KLSAgICAgIDwvZWpiLXJlZj4KLSAgICAgIDxlamItbG9jYWwtcmVmIGlkPSJFSkJMb2NhbFJlZl8xMDUxNjQzNTAwNTUzIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV81PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV81PC9sb2NhbC1ob21lPgotICAgICAgICAgPGxvY2FsPnJlbW90ZV81PC9sb2NhbD4KLSAgICAgICAgIDxlamItbGluaz5saW5rXzU8L2VqYi1saW5rPgotICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgPGVqYi1sb2NhbC1yZWYgaWQ9IkVKQkxvY2FsUmVmXzEwNTE2NDM1MDA1NTQiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzY8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV82PC9sb2NhbC1ob21lPgotICAgICAgICAgPGxvY2FsPnJlbW90ZV82PC9sb2NhbD4KLSAgICAgICAgIDxlamItbGluaz5saW5rXzY8L2VqYi1saW5rPgotICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgPGVqYi1sb2NhbC1yZWYgaWQ9IkVKQkxvY2FsUmVmXzEwNTE2NDM1MDA1NTUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzc8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzc8L2xvY2FsLWhvbWU+Ci0gICAgICAgICA8bG9jYWw+cmVtb3RlXzc8L2xvY2FsPgotICAgICAgICAgPGVqYi1saW5rPmxpbmtfNzwvZWpiLWxpbms+Ci0gICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICA8ZWpiLWxvY2FsLXJlZiBpZD0iRUpCTG9jYWxSZWZfMTA1MTY0MzUwMDU1NiI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfODwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzg8L2xvY2FsLWhvbWU+Ci0gICAgICAgICA8bG9jYWw+cmVtb3RlXzg8L2xvY2FsPgotICAgICAgICAgPGVqYi1saW5rPmxpbmtfODwvZWpiLWxpbms+Ci0gICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICA8ZWpiLWxvY2FsLXJlZiBpZD0iRUpCTG9jYWxSZWZfMTA1MTY0MzUwMDU1NyI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfOTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfOTwvbG9jYWwtaG9tZT4KLSAgICAgICAgIDxsb2NhbD5yZW1vdGVfOTwvbG9jYWw+Ci0gICAgICAgICA8ZWpiLWxpbms+bGlua185PC9lamItbGluaz4KLSAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgIDwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlLy5tZXRhZGF0YS8ucGx1Z2lucy9jb20uaWJtLmV0b29scy5qMmVlL2xvb3NlQXBwLnhtaSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlLy5tZXRhZGF0YS8ucGx1Z2lucy9jb20uaWJtLmV0b29scy5qMmVlL2xvb3NlQXBwLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUzYWUwYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS8ubWV0YWRhdGEvLnBsdWdpbnMvY29tLmlibS5ldG9vbHMuajJlZS9sb29zZUFwcC54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IkFTQ0lJIj8+DQotPG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnOkxvb3NlQXBwbGljYXRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZz0iY29tbW9uYXJjaGl2ZS5sb29zZWNvbmZpZy54bWkiIHVyaT0iXGQ6XHdvcmtcV1RQXG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHNcY29tbW9uQXJjaGl2ZVJlc291cmNlc1xsb29zZV9tb2R1bGVfd29ya3NwYWNlXExvb3NlRUFSIiBiaW5hcmllc1BhdGg9IlxkOlx3b3JrXFdUUFxvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzXGNvbW1vbkFyY2hpdmVSZXNvdXJjZXNcbG9vc2VfbW9kdWxlX3dvcmtzcGFjZVxMb29zZUVBUiIgcmVzb3VyY2VzUGF0aD0iXGQ6XHdvcmtcV1RQXG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHNcY29tbW9uQXJjaGl2ZVJlc291cmNlc1xsb29zZV9tb2R1bGVfd29ya3NwYWNlXExvb3NlRUFSIj4NCi0gIDxsb29zZUFyY2hpdmVzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZzpMb29zZU1vZHVsZSIgdXJpPSJMb29zZUVBUkVqYi5qYXIiIGJpbmFyaWVzUGF0aD0iL2Q6L3dvcmsvV1RQL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlc1xsb29zZV9tb2R1bGVfd29ya3NwYWNlXExvb3NlRUFSRWpiXGJpbiIgcmVzb3VyY2VzUGF0aD0iL2Q6L3dvcmsvV1RQL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlc1xsb29zZV9tb2R1bGVfd29ya3NwYWNlXExvb3NlRUFSRWpiXGJpbiIvPg0KLSAgPGxvb3NlQXJjaGl2ZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnOkxvb3NlV0FSRmlsZSIgdXJpPSJMb29zZUVBUldlYi53YXIiIGJpbmFyaWVzUGF0aD0iL2Q6L3dvcmsvV1RQL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlc1xsb29zZV9tb2R1bGVfd29ya3NwYWNlXExvb3NlRUFSV2ViXHdlYkFwcGxpY2F0aW9uIiByZXNvdXJjZXNQYXRoPSIvZDovd29yay9XVFAvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzXGxvb3NlX21vZHVsZV93b3Jrc3BhY2VcTG9vc2VFQVJXZWJcd2ViQXBwbGljYXRpb24iPg0KLSAgICA8bG9vc2VMaWJzIHVyaT0iV0VCLUlORi9saWIvbGlicmFyeS5qYXIiIGJpbmFyaWVzUGF0aD0iL2Q6L3dvcmsvV1RQL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlc1xsb29zZV9tb2R1bGVfd29ya3NwYWNlXExvb3NlSmF2YVdlYkxpYlxiaW4iIHJlc291cmNlc1BhdGg9Ii9kOi93b3JrL1dUUC9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXNcbG9vc2VfbW9kdWxlX3dvcmtzcGFjZVxMb29zZUphdmFXZWJMaWJcYmluIi8+DQotICA8L2xvb3NlQXJjaGl2ZXM+DQotICA8bG9vc2VBcmNoaXZlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWc6TG9vc2VMaWJyYXJ5IiB1cmk9InV0aWwuamFyIiBiaW5hcmllc1BhdGg9Ii9kOi93b3JrL1dUUC9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXNcbG9vc2VfbW9kdWxlX3dvcmtzcGFjZVxMb29zZUphdmFVdGlsXGJpbiIgcmVzb3VyY2VzUGF0aD0iL2Q6L3dvcmsvV1RQL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlc1xsb29zZV9tb2R1bGVfd29ya3NwYWNlXExvb3NlSmF2YVV0aWxcYmluIi8+DQotPC9vcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZzpMb29zZUFwcGxpY2F0aW9uPg0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlLy5tZXRhZGF0YS8ucGx1Z2lucy9jb20uaWJtLmV0b29scy5qMmVlL2xvb3NlQ29uZmlnLnhtaSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlLy5tZXRhZGF0YS8ucGx1Z2lucy9jb20uaWJtLmV0b29scy5qMmVlL2xvb3NlQ29uZmlnLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRmZmFmNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS8ubWV0YWRhdGEvLnBsdWdpbnMvY29tLmlibS5ldG9vbHMuajJlZS9sb29zZUNvbmZpZy54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJBU0NJSSI/Pg0KLTxvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZzpMb29zZUNvbmZpZ3VyYXRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZz0iY29tbW9uYXJjaGl2ZS5sb29zZWNvbmZpZy54bWkiPg0KLSAgPGFwcGxpY2F0aW9ucyB1cmk9IlxkOlx3b3JrXFdUUFxvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzXGNvbW1vbkFyY2hpdmVSZXNvdXJjZXNcbG9vc2VfbW9kdWxlX3dvcmtzcGFjZVxMb29zZUVBUiIgYmluYXJpZXNQYXRoPSJcZDpcd29ya1xXVFBcb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0c1xjb21tb25BcmNoaXZlUmVzb3VyY2VzXGxvb3NlX21vZHVsZV93b3Jrc3BhY2VcTG9vc2VFQVIiIHJlc291cmNlc1BhdGg9IlxkOlx3b3JrXFdUUFxvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzXGNvbW1vbkFyY2hpdmVSZXNvdXJjZXNcbG9vc2VfbW9kdWxlX3dvcmtzcGFjZVxMb29zZUVBUiI+DQotICAgIDxsb29zZUFyY2hpdmVzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZzpMb29zZU1vZHVsZSIgdXJpPSJMb29zZUVBUkVqYi5qYXIiIGJpbmFyaWVzUGF0aD0iL2Q6L3dvcmsvV1RQL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlc1xsb29zZV9tb2R1bGVfd29ya3NwYWNlXExvb3NlRUFSRWpiXGJpbiIgcmVzb3VyY2VzUGF0aD0iL2Q6L3dvcmsvV1RQL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlc1xsb29zZV9tb2R1bGVfd29ya3NwYWNlXExvb3NlRUFSRWpiXGJpbiIvPg0KLSAgICA8bG9vc2VBcmNoaXZlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWc6TG9vc2VXQVJGaWxlIiB1cmk9Ikxvb3NlRUFSV2ViLndhciIgYmluYXJpZXNQYXRoPSIvZDovd29yay9XVFAvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzXGxvb3NlX21vZHVsZV93b3Jrc3BhY2VcTG9vc2VFQVJXZWJcd2ViQXBwbGljYXRpb24iIHJlc291cmNlc1BhdGg9Ii9kOi93b3JrL1dUUC9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXNcbG9vc2VfbW9kdWxlX3dvcmtzcGFjZVxMb29zZUVBUldlYlx3ZWJBcHBsaWNhdGlvbiI+DQotICAgICAgPGxvb3NlTGlicyB1cmk9IldFQi1JTkYvbGliL2xpYnJhcnkuamFyIiBiaW5hcmllc1BhdGg9Ii9kOi93b3JrL1dUUC9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXNcbG9vc2VfbW9kdWxlX3dvcmtzcGFjZVxMb29zZUphdmFXZWJMaWJcYmluIiByZXNvdXJjZXNQYXRoPSIvZDovd29yay9XVFAvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzXGxvb3NlX21vZHVsZV93b3Jrc3BhY2VcTG9vc2VKYXZhV2ViTGliXGJpbiIvPg0KLSAgICA8L2xvb3NlQXJjaGl2ZXM+DQotICAgIDxsb29zZUFyY2hpdmVzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZzpMb29zZUxpYnJhcnkiIHVyaT0idXRpbC5qYXIiIGJpbmFyaWVzUGF0aD0iL2Q6L3dvcmsvV1RQL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlc1xsb29zZV9tb2R1bGVfd29ya3NwYWNlXExvb3NlSmF2YVV0aWxcYmluIiByZXNvdXJjZXNQYXRoPSIvZDovd29yay9XVFAvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzXGxvb3NlX21vZHVsZV93b3Jrc3BhY2VcTG9vc2VKYXZhVXRpbFxiaW4iLz4NCi0gIDwvYXBwbGljYXRpb25zPg0KLTwvb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWc6TG9vc2VDb25maWd1cmF0aW9uPg0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlQ29ubmVjdG9yL01FVEEtSU5GL01BTklGRVNULk1GIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VDb25uZWN0b3IvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NDk5YmMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VDb25uZWN0b3IvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUNvbm5lY3Rvci9NRVRBLUlORi9hcHBsaWNhdGlvbi54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUNvbm5lY3Rvci9NRVRBLUlORi9hcHBsaWNhdGlvbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMWNkNmYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VDb25uZWN0b3IvTUVUQS1JTkYvYXBwbGljYXRpb24ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGFwcGxpY2F0aW9uIGlkPSJBcHBsaWNhdGlvbl9JRCIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9hcHBsaWNhdGlvbl8xXzQueHNkIj4KLSAgICA8bW9kdWxlPgotICAgICAgICA8Y29ubmVjdG9yPmZvb1JBUjwvY29ubmVjdG9yPgotICAgIDwvbW9kdWxlPgotPC9hcHBsaWNhdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlQ29ubmVjdG9yL2Zvb1JBUi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlQ29ubmVjdG9yL2Zvb1JBUi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk0OTliYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUNvbm5lY3Rvci9mb29SQVIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUNvbm5lY3Rvci9mb29SQVIvTUVUQS1JTkYvcmEueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VDb25uZWN0b3IvZm9vUkFSL01FVEEtSU5GL3JhLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM0MWM1My4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUNvbm5lY3Rvci9mb29SQVIvTUVUQS1JTkYvcmEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgY29ubmVjdG9yIFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIENvbm5lY3RvciAxLjAvL0VOIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2Nvbm5lY3Rvcl8xXzAuZHRkIj4KLTxjb25uZWN0b3I+Ci0gICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8wPC9kaXNwbGF5LW5hbWU+Ci0gICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgIDxpY29uPgotICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMDwvc21hbGwtaWNvbj4KLSAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzA8L2xhcmdlLWljb24+Ci0gICAgPC9pY29uPgotICAgIDx2ZW5kb3ItbmFtZT52ZW5kb3JOYW1lXzA8L3ZlbmRvci1uYW1lPgotICAgIDxzcGVjLXZlcnNpb24+MS4wPC9zcGVjLXZlcnNpb24+Ci0gICAgPGVpcy10eXBlPmVpc1R5cGVfMDwvZWlzLXR5cGU+Ci0gICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICAgIDxsaWNlbnNlPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsaWNlbnNlLXJlcXVpcmVkPnRydWU8L2xpY2Vuc2UtcmVxdWlyZWQ+Ci0gICAgPC9saWNlbnNlPgotICAgIDxyZXNvdXJjZWFkYXB0ZXI+Ci0gICAgICAgIDxtYW5hZ2VkY29ubmVjdGlvbmZhY3RvcnktY2xhc3M+bWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3NfMDwvbWFuYWdlZGNvbm5lY3Rpb25mYWN0b3J5LWNsYXNzPgotICAgICAgICA8Y29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlPmNvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlXzA8L2Nvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZT4KLSAgICAgICAgPGNvbm5lY3Rpb25mYWN0b3J5LWltcGwtY2xhc3M+Y29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3NfMDwvY29ubmVjdGlvbmZhY3RvcnktaW1wbC1jbGFzcz4KLSAgICAgICAgPGNvbm5lY3Rpb24taW50ZXJmYWNlPmNvbm5lY3Rpb25JbnRlcmZhY2VfMDwvY29ubmVjdGlvbi1pbnRlcmZhY2U+Ci0gICAgICAgIDxjb25uZWN0aW9uLWltcGwtY2xhc3M+Y29ubmVjdGlvbkltcGxDbGFzc18wPC9jb25uZWN0aW9uLWltcGwtY2xhc3M+Ci0gICAgICAgIDx0cmFuc2FjdGlvbi1zdXBwb3J0Pk5vVHJhbnNhY3Rpb248L3RyYW5zYWN0aW9uLXN1cHBvcnQ+Ci0gICAgICAgIDxjb25maWctcHJvcGVydHk+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5LW5hbWU+bmFtZV8wPC9jb25maWctcHJvcGVydHktbmFtZT4KLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydHktdHlwZT50eXBlXzA8L2NvbmZpZy1wcm9wZXJ0eS10eXBlPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS12YWx1ZT52YWx1ZV8wPC9jb25maWctcHJvcGVydHktdmFsdWU+Ci0gICAgICAgIDwvY29uZmlnLXByb3BlcnR5PgotICAgICAgICA8Y29uZmlnLXByb3BlcnR5PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS1uYW1lPm5hbWVfMTwvY29uZmlnLXByb3BlcnR5LW5hbWU+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5LXR5cGU+dHlwZV8xPC9jb25maWctcHJvcGVydHktdHlwZT4KLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydHktdmFsdWU+dmFsdWVfMTwvY29uZmlnLXByb3BlcnR5LXZhbHVlPgotICAgICAgICA8L2NvbmZpZy1wcm9wZXJ0eT4KLSAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydHktbmFtZT5uYW1lXzI8L2NvbmZpZy1wcm9wZXJ0eS1uYW1lPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS10eXBlPnR5cGVfMjwvY29uZmlnLXByb3BlcnR5LXR5cGU+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5LXZhbHVlPnZhbHVlXzI8L2NvbmZpZy1wcm9wZXJ0eS12YWx1ZT4KLSAgICAgICAgPC9jb25maWctcHJvcGVydHk+Ci0gICAgICAgIDxjb25maWctcHJvcGVydHk+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5LW5hbWU+bmFtZV8zPC9jb25maWctcHJvcGVydHktbmFtZT4KLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydHktdHlwZT50eXBlXzM8L2NvbmZpZy1wcm9wZXJ0eS10eXBlPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS12YWx1ZT52YWx1ZV8zPC9jb25maWctcHJvcGVydHktdmFsdWU+Ci0gICAgICAgIDwvY29uZmlnLXByb3BlcnR5PgotICAgICAgICA8Y29uZmlnLXByb3BlcnR5PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS1uYW1lPm5hbWVfNDwvY29uZmlnLXByb3BlcnR5LW5hbWU+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5LXR5cGU+dHlwZV80PC9jb25maWctcHJvcGVydHktdHlwZT4KLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydHktdmFsdWU+dmFsdWVfNDwvY29uZmlnLXByb3BlcnR5LXZhbHVlPgotICAgICAgICA8L2NvbmZpZy1wcm9wZXJ0eT4KLSAgICAgICAgPGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT5CYXNpY1Bhc3N3b3JkPC9hdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT4KLSAgICAgICAgICAgIDxjcmVkZW50aWFsLWludGVyZmFjZT5jcmVkZW50aWFsSW50ZXJmYWNlXzA8L2NyZWRlbnRpYWwtaW50ZXJmYWNlPgotICAgICAgICA8L2F1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbT4KLSAgICAgICAgPGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT5LZXJidjU8L2F1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPgotICAgICAgICAgICAgPGNyZWRlbnRpYWwtaW50ZXJmYWNlPmNyZWRlbnRpYWxJbnRlcmZhY2VfMTwvY3JlZGVudGlhbC1pbnRlcmZhY2U+Ci0gICAgICAgIDwvYXV0aGVudGljYXRpb24tbWVjaGFuaXNtPgotICAgICAgICA8YXV0aGVudGljYXRpb24tbWVjaGFuaXNtPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPkJhc2ljUGFzc3dvcmQ8L2F1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPgotICAgICAgICAgICAgPGNyZWRlbnRpYWwtaW50ZXJmYWNlPmNyZWRlbnRpYWxJbnRlcmZhY2VfMjwvY3JlZGVudGlhbC1pbnRlcmZhY2U+Ci0gICAgICAgIDwvYXV0aGVudGljYXRpb24tbWVjaGFuaXNtPgotICAgICAgICA8YXV0aGVudGljYXRpb24tbWVjaGFuaXNtPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPktlcmJ2NTwvYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+Ci0gICAgICAgICAgICA8Y3JlZGVudGlhbC1pbnRlcmZhY2U+Y3JlZGVudGlhbEludGVyZmFjZV8zPC9jcmVkZW50aWFsLWludGVyZmFjZT4KLSAgICAgICAgPC9hdXRoZW50aWNhdGlvbi1tZWNoYW5pc20+Ci0gICAgICAgIDxhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8YXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+QmFzaWNQYXNzd29yZDwvYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+Ci0gICAgICAgICAgICA8Y3JlZGVudGlhbC1pbnRlcmZhY2U+Y3JlZGVudGlhbEludGVyZmFjZV80PC9jcmVkZW50aWFsLWludGVyZmFjZT4KLSAgICAgICAgPC9hdXRoZW50aWNhdGlvbi1tZWNoYW5pc20+Ci0gICAgICAgIDxyZWF1dGhlbnRpY2F0aW9uLXN1cHBvcnQ+dHJ1ZTwvcmVhdXRoZW50aWNhdGlvbi1zdXBwb3J0PgotICAgICAgICA8c2VjdXJpdHktcGVybWlzc2lvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1wZXJtaXNzaW9uLXNwZWM+c3BlY2lmaWNhdGlvbl8wPC9zZWN1cml0eS1wZXJtaXNzaW9uLXNwZWM+Ci0gICAgICAgIDwvc2VjdXJpdHktcGVybWlzc2lvbj4KLSAgICAgICAgPHNlY3VyaXR5LXBlcm1pc3Npb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcGVybWlzc2lvbi1zcGVjPnNwZWNpZmljYXRpb25fMTwvc2VjdXJpdHktcGVybWlzc2lvbi1zcGVjPgotICAgICAgICA8L3NlY3VyaXR5LXBlcm1pc3Npb24+Ci0gICAgICAgIDxzZWN1cml0eS1wZXJtaXNzaW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHNlY3VyaXR5LXBlcm1pc3Npb24tc3BlYz5zcGVjaWZpY2F0aW9uXzI8L3NlY3VyaXR5LXBlcm1pc3Npb24tc3BlYz4KLSAgICAgICAgPC9zZWN1cml0eS1wZXJtaXNzaW9uPgotICAgICAgICA8c2VjdXJpdHktcGVybWlzc2lvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1wZXJtaXNzaW9uLXNwZWM+c3BlY2lmaWNhdGlvbl8zPC9zZWN1cml0eS1wZXJtaXNzaW9uLXNwZWM+Ci0gICAgICAgIDwvc2VjdXJpdHktcGVybWlzc2lvbj4KLSAgICAgICAgPHNlY3VyaXR5LXBlcm1pc3Npb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcGVybWlzc2lvbi1zcGVjPnNwZWNpZmljYXRpb25fNDwvc2VjdXJpdHktcGVybWlzc2lvbi1zcGVjPgotICAgICAgICA8L3NlY3VyaXR5LXBlcm1pc3Npb24+Ci0gICAgPC9yZXNvdXJjZWFkYXB0ZXI+Ci08L2Nvbm5lY3Rvcj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSL01FVEEtSU5GLy5tb2R1bGVtYXBzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVIvTUVUQS1JTkYvLm1vZHVsZW1hcHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMjBhOTcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVIvTUVUQS1JTkYvLm1vZHVsZW1hcHMKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPG1vZHVsZW1hcDpFQVJQcm9qZWN0TWFwIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6bW9kdWxlbWFwPSJtb2R1bGVtYXAueG1pIiB4bWxuczphcHBsaWNhdGlvbj0iYXBwbGljYXRpb24ueG1pIiB4bWk6aWQ9IkVBUlByb2plY3RNYXBfMSI+DQotICA8bWFwcGluZ3MgeG1pOmlkPSJNb2R1bGVNYXBwaW5nXzEiIHByb2plY3ROYW1lPSJMb29zZUVBUkVqYiI+DQotICAgIDxtb2R1bGUgeG1pOnR5cGU9ImFwcGxpY2F0aW9uOkVqYk1vZHVsZSIgaHJlZj0iTUVUQS1JTkYvYXBwbGljYXRpb24ueG1sI0VqYk1vZHVsZV8xIi8+DQotICA8L21hcHBpbmdzPg0KLSAgPG1hcHBpbmdzIHhtaTppZD0iTW9kdWxlTWFwcGluZ18yIiBwcm9qZWN0TmFtZT0iTG9vc2VFQVJXZWIiPg0KLSAgICA8bW9kdWxlIHhtaTp0eXBlPSJhcHBsaWNhdGlvbjpXZWJNb2R1bGUiIGhyZWY9Ik1FVEEtSU5GL2FwcGxpY2F0aW9uLnhtbCNXZWJNb2R1bGVfMSIvPg0KLSAgPC9tYXBwaW5ncz4NCi08L21vZHVsZW1hcDpFQVJQcm9qZWN0TWFwPg0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSL01FVEEtSU5GL2FwcGxpY2F0aW9uLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSL01FVEEtSU5GL2FwcGxpY2F0aW9uLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYwNjdmNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUi9NRVRBLUlORi9hcHBsaWNhdGlvbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGFwcGxpY2F0aW9uIFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEoyRUUgQXBwbGljYXRpb24gMS4yLy9FTiIgImh0dHA6Ly9qYXZhLnN1bi5jb20vajJlZS9kdGRzL2FwcGxpY2F0aW9uXzFfMi5kdGQiPgotPGFwcGxpY2F0aW9uIGlkPSJBcHBsaWNhdGlvbl9JRCI+Ci0JPGRpc3BsYXktbmFtZT5Mb29zZUVBUjwvZGlzcGxheS1uYW1lPgotCTxtb2R1bGUgaWQ9IkVqYk1vZHVsZV8xIj4KLQkJPGVqYj5Mb29zZUVBUkVqYi5qYXI8L2VqYj4KLQk8L21vZHVsZT4KLQk8bW9kdWxlIGlkPSJXZWJNb2R1bGVfMSI+Ci0JCTx3ZWI+Ci0JCQk8d2ViLXVyaT5Mb29zZUVBUldlYi53YXI8L3dlYi11cmk+Ci0JCQk8Y29udGV4dC1yb290Pkxvb3NlRUFSV2ViPC9jb250ZXh0LXJvb3Q+PC93ZWI+Ci0JPC9tb2R1bGU+Ci08L2FwcGxpY2F0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVIvTUVUQS1JTkYvaWJtLWFwcGxpY2F0aW9uLWV4dC54bWkgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUi9NRVRBLUlORi9pYm0tYXBwbGljYXRpb24tZXh0LnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNmYmQwZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUi9NRVRBLUlORi9pYm0tYXBwbGljYXRpb24tZXh0LnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGFwcGxpY2F0aW9uZXh0OkFwcGxpY2F0aW9uRXh0ZW5zaW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6YXBwbGljYXRpb25leHQ9ImFwcGxpY2F0aW9uZXh0LnhtaSIgeG1sbnM6YXBwbGljYXRpb249ImFwcGxpY2F0aW9uLnhtaSIgeG1pOmlkPSJBcHBsaWNhdGlvbl9JRF9FeHQiPg0KLSAgPG1vZHVsZUV4dGVuc2lvbnMgeG1pOnR5cGU9ImFwcGxpY2F0aW9uZXh0OkVqYk1vZHVsZUV4dGVuc2lvbiIgeG1pOmlkPSJFamJNb2R1bGVfMV9FeHQiIGFic29sdXRlUGF0aD0iRDpcV1NBRF9ERVZcZWNsaXBzZVx3b3Jrc3BhY2VcTG9vc2VFQVJFamJcYmluIj4NCi0gICAgPG1vZHVsZSB4bWk6dHlwZT0iYXBwbGljYXRpb246RWpiTW9kdWxlIiBocmVmPSJNRVRBLUlORi9hcHBsaWNhdGlvbi54bWwjRWpiTW9kdWxlXzEiLz4NCi0gIDwvbW9kdWxlRXh0ZW5zaW9ucz4NCi0gIDxtb2R1bGVFeHRlbnNpb25zIHhtaTp0eXBlPSJhcHBsaWNhdGlvbmV4dDpXZWJNb2R1bGVFeHRlbnNpb24iIHhtaTppZD0iV2ViTW9kdWxlXzFfRXh0IiBhYnNvbHV0ZVBhdGg9IkQ6XFdTQURfREVWXGVjbGlwc2Vcd29ya3NwYWNlXExvb3NlRUFSV2ViXHdlYkFwcGxpY2F0aW9uIj4NCi0gICAgPG1vZHVsZSB4bWk6dHlwZT0iYXBwbGljYXRpb246V2ViTW9kdWxlIiBocmVmPSJNRVRBLUlORi9hcHBsaWNhdGlvbi54bWwjV2ViTW9kdWxlXzEiLz4NCi0gIDwvbW9kdWxlRXh0ZW5zaW9ucz4NCi0gIDxhcHBsaWNhdGlvbiBocmVmPSJNRVRBLUlORi9hcHBsaWNhdGlvbi54bWwjQXBwbGljYXRpb25fSUQiLz4NCi08L2FwcGxpY2F0aW9uZXh0OkFwcGxpY2F0aW9uRXh0ZW5zaW9uPg0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSQXBwL01FVEEtSU5GL01BTklGRVNULk1GIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJBcHAvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NDk5YmMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJBcHAvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkFwcC9NRVRBLUlORi9hcHBsaWNhdGlvbi54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkFwcC9NRVRBLUlORi9hcHBsaWNhdGlvbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NGQ5MWUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJBcHAvTUVUQS1JTkYvYXBwbGljYXRpb24ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGFwcGxpY2F0aW9uIGlkPSJBcHBsaWNhdGlvbl9JRCIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9hcHBsaWNhdGlvbl8xXzQueHNkIj4KLSAgICA8bW9kdWxlPgotICAgICAgICA8amF2YT5mb29BUFA8L2phdmE+Ci0gICAgPC9tb2R1bGU+Ci08L2FwcGxpY2F0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJBcHAvZm9vQVBQL01FVEEtSU5GL01BTklGRVNULk1GIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJBcHAvZm9vQVBQL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTQ5OWJjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSQXBwL2Zvb0FQUC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSQXBwL2Zvb0FQUC9NRVRBLUlORi9hcHBsaWNhdGlvbi1jbGllbnQueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJBcHAvZm9vQVBQL01FVEEtSU5GL2FwcGxpY2F0aW9uLWNsaWVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4YmVkNzYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJBcHAvZm9vQVBQL01FVEEtSU5GL2FwcGxpY2F0aW9uLWNsaWVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBhcHBsaWNhdGlvbi1jbGllbnQgUFVCTElDICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSjJFRSBBcHBsaWNhdGlvbiBDbGllbnQgMS4zLy9FTiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9hcHBsaWNhdGlvbi1jbGllbnRfMV8zLmR0ZCI+Ci08YXBwbGljYXRpb24tY2xpZW50IGlkPSJBcHBsaWNhdGlvbi1jbGllbnRfSUQiPgotICAgIDxpY29uPgotICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMDwvc21hbGwtaWNvbj4KLSAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzA8L2xhcmdlLWljb24+Ci0gICAgPC9pY29uPgotICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMDwvZGlzcGxheS1uYW1lPgotICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICA8ZW52LWVudHJ5PgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzA8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlN0cmluZzwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMDwvZW52LWVudHJ5LXZhbHVlPgotICAgIDwvZW52LWVudHJ5PgotICAgIDxlbnYtZW50cnk+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTwvZW52LWVudHJ5LXZhbHVlPgotICAgIDwvZW52LWVudHJ5PgotICAgIDxlbnYtZW50cnk+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQm9vbGVhbjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjwvZW52LWVudHJ5LXZhbHVlPgotICAgIDwvZW52LWVudHJ5PgotICAgIDxlbnYtZW50cnk+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMzwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuRG91YmxlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8zPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgPC9lbnYtZW50cnk+Ci0gICAgPGVudi1lbnRyeT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV80PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5CeXRlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV80PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgPC9lbnYtZW50cnk+Ci0gICAgPGVudi1lbnRyeT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8wPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TdHJpbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzA8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICA8L2Vudi1lbnRyeT4KLSAgICA8ZW52LWVudHJ5PgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzE8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkludGVnZXI8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzE8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICA8L2Vudi1lbnRyeT4KLSAgICA8ZW52LWVudHJ5PgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzI8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJvb2xlYW48L2Vudi1lbnRyeS10eXBlPgotICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzI8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICA8L2Vudi1lbnRyeT4KLSAgICA8ZW52LWVudHJ5PgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzM8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkRvdWJsZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMzwvZW52LWVudHJ5LXZhbHVlPgotICAgIDwvZW52LWVudHJ5PgotICAgIDxlbnYtZW50cnk+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQnl0ZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNDwvZW52LWVudHJ5LXZhbHVlPgotICAgIDwvZW52LWVudHJ5PgotICAgIDxlamItcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8wPC9lamItcmVmLW5hbWU+Ci0gICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICA8aG9tZT5ob21lXzA8L2hvbWU+Ci0gICAgICAgIDxyZW1vdGU+cmVtb3RlXzA8L3JlbW90ZT4KLSAgICAgICAgPGVqYi1saW5rPmxpbmtfMDwvZWpiLWxpbms+Ci0gICAgPC9lamItcmVmPgotICAgIDxlamItcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xPC9lamItcmVmLW5hbWU+Ci0gICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgIDxob21lPmhvbWVfMTwvaG9tZT4KLSAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTwvcmVtb3RlPgotICAgICAgICA8ZWpiLWxpbms+bGlua18xPC9lamItbGluaz4KLSAgICA8L2VqYi1yZWY+Ci0gICAgPGVqYi1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgIDxob21lPmhvbWVfMjwvaG9tZT4KLSAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjwvcmVtb3RlPgotICAgICAgICA8ZWpiLWxpbms+bGlua18yPC9lamItbGluaz4KLSAgICA8L2VqYi1yZWY+Ci0gICAgPGVqYi1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgPGhvbWU+aG9tZV8zPC9ob21lPgotICAgICAgICA8cmVtb3RlPnJlbW90ZV8zPC9yZW1vdGU+Ci0gICAgICAgIDxlamItbGluaz5saW5rXzM8L2VqYi1saW5rPgotICAgIDwvZWpiLXJlZj4KLSAgICA8ZWpiLXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDwvZWpiLXJlZi1uYW1lPgotICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgPGhvbWU+aG9tZV80PC9ob21lPgotICAgICAgICA8cmVtb3RlPnJlbW90ZV80PC9yZW1vdGU+Ci0gICAgICAgIDxlamItbGluaz5saW5rXzQ8L2VqYi1saW5rPgotICAgIDwvZWpiLXJlZj4KLSAgICA8ZWpiLXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMDwvZWpiLXJlZi1uYW1lPgotICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgPGhvbWU+aG9tZV8wPC9ob21lPgotICAgICAgICA8cmVtb3RlPnJlbW90ZV8wPC9yZW1vdGU+Ci0gICAgICAgIDxlamItbGluaz5saW5rXzA8L2VqYi1saW5rPgotICAgIDwvZWpiLXJlZj4KLSAgICA8ZWpiLXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTwvZWpiLXJlZi1uYW1lPgotICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICA8aG9tZT5ob21lXzE8L2hvbWU+Ci0gICAgICAgIDxyZW1vdGU+cmVtb3RlXzE8L3JlbW90ZT4KLSAgICAgICAgPGVqYi1saW5rPmxpbmtfMTwvZWpiLWxpbms+Ci0gICAgPC9lamItcmVmPgotICAgIDxlamItcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yPC9lamItcmVmLW5hbWU+Ci0gICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICA8aG9tZT5ob21lXzI8L2hvbWU+Ci0gICAgICAgIDxyZW1vdGU+cmVtb3RlXzI8L3JlbW90ZT4KLSAgICAgICAgPGVqYi1saW5rPmxpbmtfMjwvZWpiLWxpbms+Ci0gICAgPC9lamItcmVmPgotICAgIDxlamItcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zPC9lamItcmVmLW5hbWU+Ci0gICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgIDxob21lPmhvbWVfMzwvaG9tZT4KLSAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzwvcmVtb3RlPgotICAgICAgICA8ZWpiLWxpbms+bGlua18zPC9lamItbGluaz4KLSAgICA8L2VqYi1yZWY+Ci0gICAgPGVqYi1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgIDxob21lPmhvbWVfNDwvaG9tZT4KLSAgICAgICAgPHJlbW90ZT5yZW1vdGVfNDwvcmVtb3RlPgotICAgICAgICA8ZWpiLWxpbms+bGlua180PC9lamItbGluaz4KLSAgICA8L2VqYi1yZWY+Ci0gICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMDwvcmVzLXJlZi1uYW1lPgotICAgICAgICA8cmVzLXR5cGU+dHlwZV8wPC9yZXMtdHlwZT4KLSAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgIDwvcmVzb3VyY2UtcmVmPgotICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzE8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgPHJlcy10eXBlPnR5cGVfMTwvcmVzLXR5cGU+Ci0gICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgIDwvcmVzb3VyY2UtcmVmPgotICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzI8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgPHJlcy10eXBlPnR5cGVfMjwvcmVzLXR5cGU+Ci0gICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgIDwvcmVzb3VyY2UtcmVmPgotICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzM8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgPHJlcy10eXBlPnR5cGVfMzwvcmVzLXR5cGU+Ci0gICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNDwvcmVzLXJlZi1uYW1lPgotICAgICAgICA8cmVzLXR5cGU+dHlwZV80PC9yZXMtdHlwZT4KLSAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMDwvcmVzLXJlZi1uYW1lPgotICAgICAgICA8cmVzLXR5cGU+dHlwZV8wPC9yZXMtdHlwZT4KLSAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgIDwvcmVzb3VyY2UtcmVmPgotICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzE8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgPHJlcy10eXBlPnR5cGVfMTwvcmVzLXR5cGU+Ci0gICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjwvcmVzLXJlZi1uYW1lPgotICAgICAgICA8cmVzLXR5cGU+dHlwZV8yPC9yZXMtdHlwZT4KLSAgICAgICAgPHJlcy1hdXRoPlNFUlZMRVQ8L3Jlcy1hdXRoPgotICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICA8L3Jlc291cmNlLXJlZj4KLSAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgIDxyZXMtdHlwZT50eXBlXzM8L3Jlcy10eXBlPgotICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICA8L3Jlc291cmNlLXJlZj4KLSAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV80PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgIDxyZXMtdHlwZT50eXBlXzQ8L3Jlcy10eXBlPgotICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICA8L3Jlc291cmNlLXJlZj4KLSAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzE8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuTGlzdDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzM8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5TdHJpbmc8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzA8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzI8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnNxbC5EYXRhPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8zPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQ8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgIDxjYWxsYmFjay1oYW5kbGVyPmphdmEudXRpbC5IYXNoVGFibGU8L2NhbGxiYWNrLWhhbmRsZXI+Ci08L2FwcGxpY2F0aW9uLWNsaWVudD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiLy5jbGFzc3BhdGggYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjVjYWUyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImVqYk1vZHVsZSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvV2ViU3BoZXJlIEFwcGxpY2F0aW9uIFNlcnZlciB2Ni4wIEpSRSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9ImNvbS5pYm0ud3RwLnNlcnZlci5qYXZhLmNvcmUuY29udGFpbmVyL2NvbS5pYm0ud3MuYXN0LnN0LnJ1bnRpbWUuY29yZS5ydW50aW1lVGFyZ2V0LnY2MC9XZWJTcGhlcmUgQXBwbGljYXRpb24gU2VydmVyIHY2LjAiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJlamJNb2R1bGUiLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvLmoyZWUgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi8uajJlZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU5OTY5ZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi8uajJlZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08ajJlZXNldHRpbmdzIHZlcnNpb249IjYwMCI+DQotPG1vZHVsZXZlcnNpb24+MjA8L21vZHVsZXZlcnNpb24+DQotPC9qMmVlc2V0dGluZ3M+DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvLnByb2plY3QgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg0Zjc1MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPkxvb3NlRUFSRWpiPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+Y29tLmlibS53dHAubWlncmF0aW9uLk1pZ3JhdGlvbkJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+Y29tLmlibS5ldG9vbHMudmFsaWRhdGlvbi52YWxpZGF0aW9uYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5jb20uaWJtLnd0cC5qMmVlLkxpYkNvcHlCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPmNvbS5pYm0uZXRvb2xzLmoyZWUuTGliQ29weUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2guSmF2YUVNRk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPmNvbS5pYm0uZXRvb2xzLmoyZWUuRUpCMl8wTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+Y29tLmlibS53dHAuZWpiLkVKQk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8uQmVhbkluZm9OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiLy5ydW50aW1lIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvLnJ1bnRpbWUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkYzVkNDEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvLnJ1bnRpbWUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHJ1bnRpbWUgcnVudGltZS1pZD0iV2ViU3BoZXJlIEFwcGxpY2F0aW9uIFNlcnZlciB2Ni4wIi8+DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvYmluL01FVEEtSU5GL01BTklGRVNULk1GIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvYmluL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWJhZDI3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2Jpbi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1DbGFzcy1QYXRoOiB1dGlsLmphciAuLi9ib28uamFyCi0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2Jpbi9NRVRBLUlORi9lamItamFyLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2Jpbi9NRVRBLUlORi9lamItamFyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRjZTFlNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9iaW4vTUVUQS1JTkYvZWpiLWphci54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGVqYi1qYXIgUFVCTElDICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgRW50ZXJwcmlzZSBKYXZhQmVhbnMgMS4xLy9FTiIgImh0dHA6Ly9qYXZhLnN1bi5jb20vajJlZS9kdGRzL2VqYi1qYXJfMV8xLmR0ZCI+Ci08ZWpiLWphciBpZD0iZWpiLWphcl9JRCI+Ci0JPGRpc3BsYXktbmFtZT5Mb29zZUVBUkVqYjwvZGlzcGxheS1uYW1lPgotCTxlbnRlcnByaXNlLWJlYW5zPgotCQk8ZW50aXR5IGlkPSJNeUNNUCI+Ci0JCQk8ZWpiLW5hbWU+TXlDTVA8L2VqYi1uYW1lPgotCQkJPGhvbWU+Y29tLmlibS50ZXN0LmVqYi5NeUNNUEhvbWU8L2hvbWU+Ci0JCQk8cmVtb3RlPmNvbS5pYm0udGVzdC5lamIuTXlDTVA8L3JlbW90ZT4KLQkJCTxlamItY2xhc3M+Y29tLmlibS50ZXN0LmVqYi5NeUNNUEJlYW48L2VqYi1jbGFzcz4KLQkJCTxwZXJzaXN0ZW5jZS10eXBlPkNvbnRhaW5lcjwvcGVyc2lzdGVuY2UtdHlwZT4KLQkJCTxwcmltLWtleS1jbGFzcz5jb20uaWJtLnRlc3QuZWpiLk15Q01QS2V5PC9wcmltLWtleS1jbGFzcz4KLQkJCTxyZWVudHJhbnQ+RmFsc2U8L3JlZW50cmFudD4KLQkJCTxjbXAtZmllbGQ+Ci0JCQkJPGZpZWxkLW5hbWU+azE8L2ZpZWxkLW5hbWU+Ci0JCQk8L2NtcC1maWVsZD4KLQkJPC9lbnRpdHk+Ci0JPC9lbnRlcnByaXNlLWJlYW5zPgotPC9lamItamFyPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvYmluL01FVEEtSU5GL2libS1lamItamFyLWJuZC54bWkgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9iaW4vTUVUQS1JTkYvaWJtLWVqYi1qYXItYm5kLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTczYWY0ZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9iaW4vTUVUQS1JTkYvaWJtLWVqYi1qYXItYm5kLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08ZWpiYm5kOkVKQkphckJpbmRpbmcgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczplamJibmQ9ImVqYmJuZC54bWkiIHhtbG5zOmVqYj0iZWpiLnhtaSIgeG1pOmlkPSJlamItamFyX0lEX0JuZCI+DQotICA8ZWpiSmFyIGhyZWY9Ik1FVEEtSU5GL2VqYi1qYXIueG1sI2VqYi1qYXJfSUQiLz4NCi0gIDxlamJCaW5kaW5ncyB4bWk6aWQ9Ik15Q01QX0JuZCIgam5kaU5hbWU9ImVqYi9jb20vaWJtL3Rlc3QvZWpiL015Q01QSG9tZSI+DQotICAgIDxlbnRlcnByaXNlQmVhbiB4bWk6dHlwZT0iZWpiOkNvbnRhaW5lck1hbmFnZWRFbnRpdHkiIGhyZWY9Ik1FVEEtSU5GL2VqYi1qYXIueG1sI015Q01QIi8+DQotICA8L2VqYkJpbmRpbmdzPg0KLTwvZWpiYm5kOkVKQkphckJpbmRpbmc+DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvYmluL01FVEEtSU5GL2libS1lamItamFyLWV4dC54bWkgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9iaW4vTUVUQS1JTkYvaWJtLWVqYi1qYXItZXh0LnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZlNzBhOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9iaW4vTUVUQS1JTkYvaWJtLWVqYi1qYXItZXh0LnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08ZWpiZXh0OkVKQkphckV4dGVuc2lvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVqYmV4dD0iZWpiZXh0LnhtaSIgeG1sbnM6ZWpiPSJlamIueG1pIiB4bWk6aWQ9ImVqYi1qYXJfSUQiPg0KLSAgPGVqYkphciBocmVmPSJNRVRBLUlORi9lamItamFyLnhtbCNlamItamFyX0lEIi8+DQotPC9lamJleHQ6RUpCSmFyRXh0ZW5zaW9uPg0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2Jpbi9jb20vaWJtL3Rlc3QvZWpiL015Q01QLmNsYXNzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvYmluL2NvbS9pYm0vdGVzdC9lamIvTXlDTVAuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxZjcyNzcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvYmluL2NvbS9pYm0vdGVzdC9lamIvTXlDTVAuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9iaW4vY29tL2libS90ZXN0L2VqYi9NeUNNUEJlYW4uY2xhc3MgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9iaW4vY29tL2libS90ZXN0L2VqYi9NeUNNUEJlYW4uY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4Y2VkMmYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvYmluL2NvbS9pYm0vdGVzdC9lamIvTXlDTVBCZWFuLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvYmluL2NvbS9pYm0vdGVzdC9lamIvTXlDTVBIb21lLmNsYXNzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvYmluL2NvbS9pYm0vdGVzdC9lamIvTXlDTVBIb21lLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDkyNTkwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2Jpbi9jb20vaWJtL3Rlc3QvZWpiL015Q01QSG9tZS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2Jpbi9jb20vaWJtL3Rlc3QvZWpiL015Q01QS2V5LmNsYXNzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvYmluL2NvbS9pYm0vdGVzdC9lamIvTXlDTVBLZXkuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxYjY3MDIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvYmluL2NvbS9pYm0vdGVzdC9lamIvTXlDTVBLZXkuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NDk5YmMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvZWpiTW9kdWxlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvZWpiTW9kdWxlL01FVEEtSU5GL2VqYi1qYXIueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvZWpiTW9kdWxlL01FVEEtSU5GL2VqYi1qYXIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmJhZTkwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9NRVRBLUlORi9lamItamFyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgZWpiLWphciBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBFbnRlcnByaXNlIEphdmFCZWFucyAyLjAvL0VOIiAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvZWpiLWphcl8yXzAuZHRkIj4KLTxlamItamFyIGlkPSJlamItamFyX0lEIj4KLQk8ZGlzcGxheS1uYW1lPkxvb3NlRUFSRWpiPC9kaXNwbGF5LW5hbWU+Ci0JPGVudGVycHJpc2UtYmVhbnM+Ci0JCTxlbnRpdHkgaWQ9IkNNUDEiPgotCQkJPGVqYi1uYW1lPkNNUDE8L2VqYi1uYW1lPgotCQkJPGxvY2FsLWhvbWU+ZWpicy5DTVAxTG9jYWxIb21lPC9sb2NhbC1ob21lPgotCQkJPGxvY2FsPmVqYnMuQ01QMUxvY2FsPC9sb2NhbD4KLQkJCTxlamItY2xhc3M+ZWpicy5DTVAxQmVhbjwvZWpiLWNsYXNzPgotCQkJPHBlcnNpc3RlbmNlLXR5cGU+Q29udGFpbmVyPC9wZXJzaXN0ZW5jZS10eXBlPgotCQkJPHByaW0ta2V5LWNsYXNzPmVqYnMuQ01QMUtleTwvcHJpbS1rZXktY2xhc3M+Ci0JCQk8cmVlbnRyYW50PkZhbHNlPC9yZWVudHJhbnQ+Ci0JCQk8Y21wLXZlcnNpb24+Mi54PC9jbXAtdmVyc2lvbj4KLQkJCTxhYnN0cmFjdC1zY2hlbWEtbmFtZT5DTVAxPC9hYnN0cmFjdC1zY2hlbWEtbmFtZT4KLQkJCTxjbXAtZmllbGQ+Ci0JCQkJPGZpZWxkLW5hbWU+aWQ8L2ZpZWxkLW5hbWU+Ci0JCQk8L2NtcC1maWVsZD4KLQkJPC9lbnRpdHk+Ci0JCTxlbnRpdHkgaWQ9IkNNUDIiPgotCQkJPGVqYi1uYW1lPkNNUDI8L2VqYi1uYW1lPgotCQkJPGxvY2FsLWhvbWU+ZWpicy5DTVAyTG9jYWxIb21lPC9sb2NhbC1ob21lPgotCQkJPGxvY2FsPmVqYnMuQ01QMkxvY2FsPC9sb2NhbD4KLQkJCTxlamItY2xhc3M+ZWpicy5DTVAyQmVhbjwvZWpiLWNsYXNzPgotCQkJPHBlcnNpc3RlbmNlLXR5cGU+Q29udGFpbmVyPC9wZXJzaXN0ZW5jZS10eXBlPgotCQkJPHByaW0ta2V5LWNsYXNzPmVqYnMuQ01QMktleTwvcHJpbS1rZXktY2xhc3M+Ci0JCQk8cmVlbnRyYW50PkZhbHNlPC9yZWVudHJhbnQ+Ci0JCQk8Y21wLXZlcnNpb24+Mi54PC9jbXAtdmVyc2lvbj4KLQkJCTxhYnN0cmFjdC1zY2hlbWEtbmFtZT5DTVAyPC9hYnN0cmFjdC1zY2hlbWEtbmFtZT4KLQkJCTxjbXAtZmllbGQ+Ci0JCQkJPGZpZWxkLW5hbWU+aWQ8L2ZpZWxkLW5hbWU+Ci0JCQk8L2NtcC1maWVsZD4KLQkJPC9lbnRpdHk+Ci0JPC9lbnRlcnByaXNlLWJlYW5zPgotPC9lamItamFyPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvZWpiTW9kdWxlL01FVEEtSU5GL2libS1lamItamFyLWJuZC54bWkgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvTUVUQS1JTkYvaWJtLWVqYi1qYXItYm5kLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA4ZGY5OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvTUVUQS1JTkYvaWJtLWVqYi1qYXItYm5kLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGVqYmJuZDpFSkJKYXJCaW5kaW5nIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6ZWpiPSJlamIueG1pIiB4bWxuczplamJibmQ9ImVqYmJuZC54bWkiIHhtaTppZD0iRUpCSmFyQmluZGluZ18xMDk5MDc2Njk4NDgxIj4NCi0gIDxlamJKYXIgaHJlZj0iTUVUQS1JTkYvZWpiLWphci54bWwjZWpiLWphcl9JRCIvPg0KLSAgPGVqYkJpbmRpbmdzIHhtaTppZD0iRW50ZXJwcmlzZUJlYW5CaW5kaW5nXzEwOTkwNzY2OTg0OTEiIGpuZGlOYW1lPSJlamIvZWpicy9DTVAxTG9jYWxIb21lIj4NCi0gICAgPGVudGVycHJpc2VCZWFuIHhtaTp0eXBlPSJlamI6Q29udGFpbmVyTWFuYWdlZEVudGl0eSIgaHJlZj0iTUVUQS1JTkYvZWpiLWphci54bWwjQ01QMSIvPg0KLSAgPC9lamJCaW5kaW5ncz4NCi0gIDxlamJCaW5kaW5ncyB4bWk6aWQ9IkVudGVycHJpc2VCZWFuQmluZGluZ18xMDk5MDc2NzI5Mjk1IiBqbmRpTmFtZT0iZWpiL2VqYnMvQ01QMkxvY2FsSG9tZSI+DQotICAgIDxlbnRlcnByaXNlQmVhbiB4bWk6dHlwZT0iZWpiOkNvbnRhaW5lck1hbmFnZWRFbnRpdHkiIGhyZWY9Ik1FVEEtSU5GL2VqYi1qYXIueG1sI0NNUDIiLz4NCi0gIDwvZWpiQmluZGluZ3M+DQotICA8ZGVmYXVsdENNUENvbm5lY3Rpb25GYWN0b3J5IHhtaTppZD0iQ01QQ29ubmVjdGlvbkZhY3RvcnlCaW5kaW5nXzEwOTkwNzY2OTg0OTEiIGpuZGlOYW1lPSJqZGJjL0RlZmF1bHQiIHJlc0F1dGg9IlBlcl9Db25uZWN0aW9uX0ZhY3RvcnkiLz4NCi08L2VqYmJuZDpFSkJKYXJCaW5kaW5nPg0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9NRVRBLUlORi9pYm0tZWpiLWphci1leHQueG1pIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvZWpiTW9kdWxlL01FVEEtSU5GL2libS1lamItamFyLWV4dC54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2ZTcwYTguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvZWpiTW9kdWxlL01FVEEtSU5GL2libS1lamItamFyLWV4dC54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGVqYmV4dDpFSkJKYXJFeHRlbnNpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczplamJleHQ9ImVqYmV4dC54bWkiIHhtbG5zOmVqYj0iZWpiLnhtaSIgeG1pOmlkPSJlamItamFyX0lEIj4NCi0gIDxlamJKYXIgaHJlZj0iTUVUQS1JTkYvZWpiLWphci54bWwjZWpiLWphcl9JRCIvPg0KLTwvZWpiZXh0OkVKQkphckV4dGVuc2lvbj4NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvY29tL2libS90ZXN0L2VqYi9NeUNNUC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvZWpiTW9kdWxlL2NvbS9pYm0vdGVzdC9lamIvTXlDTVAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJiOGI3Yy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvY29tL2libS90ZXN0L2VqYi9NeUNNUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wYWNrYWdlIGNvbS5pYm0udGVzdC5lamI7Ci0vKioKLSAqIFJlbW90ZSBpbnRlcmZhY2UgZm9yIEVudGVycHJpc2UgQmVhbjogTXlDTVAKLSAqLwotcHVibGljIGludGVyZmFjZSBNeUNNUCBleHRlbmRzIGphdmF4LmVqYi5FSkJPYmplY3QgewotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvZWpiTW9kdWxlL2NvbS9pYm0vdGVzdC9lamIvTXlDTVBCZWFuLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvY29tL2libS90ZXN0L2VqYi9NeUNNUEJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNkYjA0NC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvY29tL2libS90ZXN0L2VqYi9NeUNNUEJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLXBhY2thZ2UgY29tLmlibS50ZXN0LmVqYjsKLS8qKgotICogQmVhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgRW50ZXJwcmlzZSBCZWFuOiBNeUNNUAotICovCi1wdWJsaWMgY2xhc3MgTXlDTVBCZWFuIGV4dGVuZHMgY29tLmlibS50ZXN0LkEgaW1wbGVtZW50cyBqYXZheC5lamIuRW50aXR5QmVhbiB7Ci0JcHJpdmF0ZSBqYXZheC5lamIuRW50aXR5Q29udGV4dCBteUVudGl0eUN0eDsKLQkvKioKLQkgKiBJbXBsZW1ldGF0aW9uIGZpZWxkIGZvciBwZXJzaXN0ZW50IGF0dHJpYnV0ZTogazEKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBrMTsKLQkvKioKLQkgKiBnZXRFbnRpdHlDb250ZXh0Ci0JICovCi0JcHVibGljIGphdmF4LmVqYi5FbnRpdHlDb250ZXh0IGdldEVudGl0eUNvbnRleHQoKSB7Ci0JCXJldHVybiBteUVudGl0eUN0eDsKLQl9Ci0JLyoqCi0JICogc2V0RW50aXR5Q29udGV4dAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVudGl0eUNvbnRleHQoamF2YXguZWpiLkVudGl0eUNvbnRleHQgY3R4KSB7Ci0JCW15RW50aXR5Q3R4ID0gY3R4OwotCX0KLQkvKioKLQkgKiB1bnNldEVudGl0eUNvbnRleHQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEVudGl0eUNvbnRleHQoKSB7Ci0JCW15RW50aXR5Q3R4ID0gbnVsbDsKLQl9Ci0JLyoqCi0JICogZWpiQWN0aXZhdGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBlamJBY3RpdmF0ZSgpIHsKLQkJX2luaXRMaW5rcygpOwotCX0KLQkvKioKLQkgKiBlamJDcmVhdGUgbWV0aG9kIGZvciBhIENNUCBlbnRpdHkgYmVhbi4KLQkgKi8KLQlwdWJsaWMgY29tLmlibS50ZXN0LmVqYi5NeUNNUEtleSBlamJDcmVhdGUoamF2YS5sYW5nLlN0cmluZyBrMSkgdGhyb3dzIGphdmF4LmVqYi5DcmVhdGVFeGNlcHRpb24gewotCQlfaW5pdExpbmtzKCk7Ci0JCXRoaXMuazEgPSBrMTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qKgotCSAqIGVqYkxvYWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlamJMb2FkKCkgewotCQlfaW5pdExpbmtzKCk7Ci0JfQotCS8qKgotCSAqIGVqYlBhc3NpdmF0ZQotCSAqLwotCXB1YmxpYyB2b2lkIGVqYlBhc3NpdmF0ZSgpIHsKLQl9Ci0JLyoqCi0JICogZWpiUG9zdENyZWF0ZQotCSAqLwotCXB1YmxpYyB2b2lkIGVqYlBvc3RDcmVhdGUoamF2YS5sYW5nLlN0cmluZyBrMSkgdGhyb3dzIGphdmF4LmVqYi5DcmVhdGVFeGNlcHRpb24gewotCX0KLQkvKioKLQkgKiBlamJSZW1vdmUKLQkgKi8KLQlwdWJsaWMgdm9pZCBlamJSZW1vdmUoKSB0aHJvd3MgamF2YXguZWpiLlJlbW92ZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlfcmVtb3ZlTGlua3MoKTsKLQkJfSBjYXRjaCAoamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBqYXZheC5lamIuUmVtb3ZlRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLQkvKioKLQkgKiBlamJTdG9yZQotCSAqLwotCXB1YmxpYyB2b2lkIGVqYlN0b3JlKCkgewotCX0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3YXMgZ2VuZXJhdGVkIGZvciBzdXBwb3J0aW5nIHRoZSBhc3NvY2lhdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgX2luaXRMaW5rcygpIHsKLQl9Ci0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2FzIGdlbmVyYXRlZCBmb3Igc3VwcG9ydGluZyB0aGUgYXNzb2NpYXRpb25zLgotCSAqLwotCXByb3RlY3RlZCBqYXZhLnV0aWwuVmVjdG9yIF9nZXRMaW5rcygpIHsKLQkJamF2YS51dGlsLlZlY3RvciBsaW5rcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JCXJldHVybiBsaW5rczsKLQl9Ci0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2FzIGdlbmVyYXRlZCBmb3Igc3VwcG9ydGluZyB0aGUgYXNzb2NpYXRpb25zLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIF9yZW1vdmVMaW5rcygpIHRocm93cyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24sIGphdmF4LmVqYi5SZW1vdmVFeGNlcHRpb24gewotCQlqYXZhLnV0aWwuTGlzdCBsaW5rcyA9IF9nZXRMaW5rcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpbmtzLnNpemUoKSA7IGkrKykgewotCQkJdHJ5IHsKLQkJCQkoKGNvbS5pYm0uaXZqLmVqYi5hc3NvY2lhdGlvbnMuaW50ZXJmYWNlcy5MaW5rKSBsaW5rcy5nZXQoaSkpLnJlbW92ZSgpOwotCQkJfSBjYXRjaCAoamF2YXguZWpiLkZpbmRlckV4Y2VwdGlvbiBlKSB7fSAvL0NvbnN1bWUgRmluZGVyIGVycm9yIHNpbmNlIEkgYW0gZ29pbmcgYXdheQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvZWpiTW9kdWxlL2NvbS9pYm0vdGVzdC9lamIvTXlDTVBIb21lLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvY29tL2libS90ZXN0L2VqYi9NeUNNUEhvbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MwOWYyMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvY29tL2libS90ZXN0L2VqYi9NeUNNUEhvbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLXBhY2thZ2UgY29tLmlibS50ZXN0LmVqYjsKLS8qKgotICogSG9tZSBpbnRlcmZhY2UgZm9yIEVudGVycHJpc2UgQmVhbjogTXlDTVAKLSAqLwotcHVibGljIGludGVyZmFjZSBNeUNNUEhvbWUgZXh0ZW5kcyBqYXZheC5lamIuRUpCSG9tZSB7Ci0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBmcm9tIGEga2V5IGZvciBFbnRpdHkgQmVhbjogTXlDTVAKLQkgKi8KLQlwdWJsaWMgY29tLmlibS50ZXN0LmVqYi5NeUNNUCBjcmVhdGUoamF2YS5sYW5nLlN0cmluZyBrMSkgdGhyb3dzIGphdmF4LmVqYi5DcmVhdGVFeGNlcHRpb24sIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbjsKLQkvKioKLQkgKiBGaW5kcyBhbiBpbnN0YW5jZSB1c2luZyBhIGtleSBmb3IgRW50aXR5IEJlYW46IE15Q01QCi0JICovCi0JcHVibGljIGNvbS5pYm0udGVzdC5lamIuTXlDTVAgZmluZEJ5UHJpbWFyeUtleShjb20uaWJtLnRlc3QuZWpiLk15Q01QS2V5IHByaW1hcnlLZXkpIHRocm93cyBqYXZheC5lamIuRmluZGVyRXhjZXB0aW9uLCBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvY29tL2libS90ZXN0L2VqYi9NeUNNUEtleS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvZWpiTW9kdWxlL2NvbS9pYm0vdGVzdC9lamIvTXlDTVBLZXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FhNmY3OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvY29tL2libS90ZXN0L2VqYi9NeUNNUEtleS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotcGFja2FnZSBjb20uaWJtLnRlc3QuZWpiOwotLyoqCi0gKiBLZXkgY2xhc3MgZm9yIEVudGl0eSBCZWFuOiBNeUNNUAotICovCi1wdWJsaWMgY2xhc3MgTXlDTVBLZXkgZXh0ZW5kcyBjb20uaWJtLnRlc3QuQSBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKLQotCXN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzMjA2MDkzNDU5NzYwODQ2MTYzTDsKLQkvKioKLQkgKiBJbXBsZW1ldGF0aW9uIGZpZWxkIGZvciBwZXJzaXN0ZW50IGF0dHJpYnV0ZTogazEKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBrMTsKLQkvKioKLQkgKiBDcmVhdGVzIGFuIGVtcHR5IGtleSBmb3IgRW50aXR5IEJlYW46IE15Q01QCi0JICovCi0JcHVibGljIE15Q01QS2V5KCkgewotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgYm90aCBrZXlzIGFyZSBlcXVhbC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoamF2YS5sYW5nLk9iamVjdCBvdGhlcktleSkgewotCQlpZiAob3RoZXJLZXkgaW5zdGFuY2VvZiBjb20uaWJtLnRlc3QuZWpiLk15Q01QS2V5KSB7Ci0JCQljb20uaWJtLnRlc3QuZWpiLk15Q01QS2V5IG8gPSAoY29tLmlibS50ZXN0LmVqYi5NeUNNUEtleSlvdGhlcktleTsKLQkJCXJldHVybiAoKHRoaXMuazEuZXF1YWxzKG8uazEpKSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBoYXNoIGNvZGUgZm9yIHRoZSBrZXkuCi0JICovCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIChrMS5oYXNoQ29kZSgpKTsKLQl9Ci0JLyoqCi0JICogQ3JlYXRlcyBhIGtleSBmb3IgRW50aXR5IEJlYW46IE15Q01QCi0JICovCi0JcHVibGljIE15Q01QS2V5KGphdmEubGFuZy5TdHJpbmcgazEpIHsKLQkJdGhpcy5rMSA9IGsxOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9lamJzL0NNUDFCZWFuLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvZWpicy9DTVAxQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTcyNzQ3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9lamJzL0NNUDFCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi1wYWNrYWdlIGVqYnM7Ci0vKioKLSAqIEJlYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIEVudGVycHJpc2UgQmVhbjogQ01QMQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ01QMUJlYW4gaW1wbGVtZW50cyBqYXZheC5lamIuRW50aXR5QmVhbiB7Ci0JcHJpdmF0ZSBqYXZheC5lamIuRW50aXR5Q29udGV4dCBteUVudGl0eUN0eDsKLQkvKioKLQkgKiBzZXRFbnRpdHlDb250ZXh0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RW50aXR5Q29udGV4dChqYXZheC5lamIuRW50aXR5Q29udGV4dCBjdHgpIHsKLQkJbXlFbnRpdHlDdHggPSBjdHg7Ci0JfQotCS8qKgotCSAqIGdldEVudGl0eUNvbnRleHQKLQkgKi8KLQlwdWJsaWMgamF2YXguZWpiLkVudGl0eUNvbnRleHQgZ2V0RW50aXR5Q29udGV4dCgpIHsKLQkJcmV0dXJuIG15RW50aXR5Q3R4OwotCX0KLQkvKioKLQkgKiB1bnNldEVudGl0eUNvbnRleHQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEVudGl0eUNvbnRleHQoKSB7Ci0JCW15RW50aXR5Q3R4ID0gbnVsbDsKLQl9Ci0JLyoqCi0JICogZWpiQ3JlYXRlCi0JICovCi0JcHVibGljIGVqYnMuQ01QMUtleSBlamJDcmVhdGUoamF2YS5sYW5nLkludGVnZXIgaWQpCi0JCXRocm93cyBqYXZheC5lamIuQ3JlYXRlRXhjZXB0aW9uIHsKLQkJc2V0SWQoaWQpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoqCi0JICogZWpiUG9zdENyZWF0ZQotCSAqLwotCXB1YmxpYyB2b2lkIGVqYlBvc3RDcmVhdGUoamF2YS5sYW5nLkludGVnZXIgaWQpCi0JCXRocm93cyBqYXZheC5lamIuQ3JlYXRlRXhjZXB0aW9uIHsKLQl9Ci0JLyoqCi0JICogZWpiQWN0aXZhdGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBlamJBY3RpdmF0ZSgpIHsKLQl9Ci0JLyoqCi0JICogZWpiTG9hZAotCSAqLwotCXB1YmxpYyB2b2lkIGVqYkxvYWQoKSB7Ci0JfQotCS8qKgotCSAqIGVqYlBhc3NpdmF0ZQotCSAqLwotCXB1YmxpYyB2b2lkIGVqYlBhc3NpdmF0ZSgpIHsKLQl9Ci0JLyoqCi0JICogZWpiUmVtb3ZlCi0JICovCi0JcHVibGljIHZvaWQgZWpiUmVtb3ZlKCkgdGhyb3dzIGphdmF4LmVqYi5SZW1vdmVFeGNlcHRpb24gewotCX0KLQkvKioKLQkgKiBlamJTdG9yZQotCSAqLwotCXB1YmxpYyB2b2lkIGVqYlN0b3JlKCkgewotCX0KLQkvKioKLQkgKiBHZXQgYWNjZXNzb3IgZm9yIHBlcnNpc3RlbnQgYXR0cmlidXRlOiBpZAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuSW50ZWdlciBnZXRJZCgpOwotCS8qKgotCSAqIFNldCBhY2Nlc3NvciBmb3IgcGVyc2lzdGVudCBhdHRyaWJ1dGU6IGlkCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgc2V0SWQoamF2YS5sYW5nLkludGVnZXIgbmV3SWQpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9lamJzL0NNUDFLZXkuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9lamJzL0NNUDFLZXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkyNDAxNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvZWpicy9DTVAxS2V5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi1wYWNrYWdlIGVqYnM7Ci0vKioKLSAqIEtleSBjbGFzcyBmb3IgRW50aXR5IEJlYW46IENNUDEKLSAqLwotcHVibGljIGNsYXNzIENNUDFLZXkgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7Ci0Jc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMyMDYwOTM0NTk3NjA4NDYxNjNMOwotCS8qKgotCSAqIEltcGxlbWVudGF0aW9uIGZpZWxkIGZvciBwZXJzaXN0ZW50IGF0dHJpYnV0ZTogaWQKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLkludGVnZXIgaWQ7Ci0JLyoqCi0JICogQ3JlYXRlcyBhbiBlbXB0eSBrZXkgZm9yIEVudGl0eSBCZWFuOiBDTVAxCi0JICovCi0JcHVibGljIENNUDFLZXkoKSB7Ci0JfQotCS8qKgotCSAqIENyZWF0ZXMgYSBrZXkgZm9yIEVudGl0eSBCZWFuOiBDTVAxCi0JICovCi0JcHVibGljIENNUDFLZXkoamF2YS5sYW5nLkludGVnZXIgaWQpIHsKLQkJdGhpcy5pZCA9IGlkOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgYm90aCBrZXlzIGFyZSBlcXVhbC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoamF2YS5sYW5nLk9iamVjdCBvdGhlcktleSkgewotCQlpZiAob3RoZXJLZXkgaW5zdGFuY2VvZiBlamJzLkNNUDFLZXkpIHsKLQkJCWVqYnMuQ01QMUtleSBvID0gKGVqYnMuQ01QMUtleSkgb3RoZXJLZXk7Ci0JCQlyZXR1cm4gKCh0aGlzLmlkLmVxdWFscyhvLmlkKSkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgaGFzaCBjb2RlIGZvciB0aGUga2V5LgotCSAqLwotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiAoaWQuaGFzaENvZGUoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9lamJzL0NNUDFMb2NhbC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvZWpiTW9kdWxlL2VqYnMvQ01QMUxvY2FsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZmRiNTkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvZWpiTW9kdWxlL2VqYnMvQ01QMUxvY2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXBhY2thZ2UgZWpiczsKLS8qKgotICogTG9jYWwgaW50ZXJmYWNlIGZvciBFbnRlcnByaXNlIEJlYW46IENNUDEKLSAqLwotcHVibGljIGludGVyZmFjZSBDTVAxTG9jYWwgZXh0ZW5kcyBqYXZheC5lamIuRUpCTG9jYWxPYmplY3QgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9lamJzL0NNUDFMb2NhbEhvbWUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9lamJzL0NNUDFMb2NhbEhvbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg1NmEzMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvZWpicy9DTVAxTG9jYWxIb21lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1wYWNrYWdlIGVqYnM7Ci0vKioKLSAqIExvY2FsIEhvbWUgaW50ZXJmYWNlIGZvciBFbnRlcnByaXNlIEJlYW46IENNUDEKLSAqLwotcHVibGljIGludGVyZmFjZSBDTVAxTG9jYWxIb21lIGV4dGVuZHMgamF2YXguZWpiLkVKQkxvY2FsSG9tZSB7Ci0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBmcm9tIGEga2V5IGZvciBFbnRpdHkgQmVhbjogQ01QMQotCSAqLwotCXB1YmxpYyBlamJzLkNNUDFMb2NhbCBjcmVhdGUoamF2YS5sYW5nLkludGVnZXIgaWQpCi0JCXRocm93cyBqYXZheC5lamIuQ3JlYXRlRXhjZXB0aW9uOwotCS8qKgotCSAqIEZpbmRzIGFuIGluc3RhbmNlIHVzaW5nIGEga2V5IGZvciBFbnRpdHkgQmVhbjogQ01QMQotCSAqLwotCXB1YmxpYyBlamJzLkNNUDFMb2NhbCBmaW5kQnlQcmltYXJ5S2V5KGVqYnMuQ01QMUtleSBwcmltYXJ5S2V5KQotCQl0aHJvd3MgamF2YXguZWpiLkZpbmRlckV4Y2VwdGlvbjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvZWpicy9DTVAyQmVhbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvZWpiTW9kdWxlL2VqYnMvQ01QMkJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY5YWJlMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvZWpicy9DTVAyQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotcGFja2FnZSBlamJzOwotLyoqCi0gKiBCZWFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBFbnRlcnByaXNlIEJlYW46IENNUDIKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENNUDJCZWFuIGltcGxlbWVudHMgamF2YXguZWpiLkVudGl0eUJlYW4gewotCXByaXZhdGUgamF2YXguZWpiLkVudGl0eUNvbnRleHQgbXlFbnRpdHlDdHg7Ci0JLyoqCi0JICogc2V0RW50aXR5Q29udGV4dAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVudGl0eUNvbnRleHQoamF2YXguZWpiLkVudGl0eUNvbnRleHQgY3R4KSB7Ci0JCW15RW50aXR5Q3R4ID0gY3R4OwotCX0KLQkvKioKLQkgKiBnZXRFbnRpdHlDb250ZXh0Ci0JICovCi0JcHVibGljIGphdmF4LmVqYi5FbnRpdHlDb250ZXh0IGdldEVudGl0eUNvbnRleHQoKSB7Ci0JCXJldHVybiBteUVudGl0eUN0eDsKLQl9Ci0JLyoqCi0JICogdW5zZXRFbnRpdHlDb250ZXh0Ci0JICovCi0JcHVibGljIHZvaWQgdW5zZXRFbnRpdHlDb250ZXh0KCkgewotCQlteUVudGl0eUN0eCA9IG51bGw7Ci0JfQotCS8qKgotCSAqIGVqYkNyZWF0ZQotCSAqLwotCXB1YmxpYyBlamJzLkNNUDJLZXkgZWpiQ3JlYXRlKGphdmEubGFuZy5JbnRlZ2VyIGlkKQotCQl0aHJvd3MgamF2YXguZWpiLkNyZWF0ZUV4Y2VwdGlvbiB7Ci0JCXNldElkKGlkKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qKgotCSAqIGVqYlBvc3RDcmVhdGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBlamJQb3N0Q3JlYXRlKGphdmEubGFuZy5JbnRlZ2VyIGlkKQotCQl0aHJvd3MgamF2YXguZWpiLkNyZWF0ZUV4Y2VwdGlvbiB7Ci0JfQotCS8qKgotCSAqIGVqYkFjdGl2YXRlCi0JICovCi0JcHVibGljIHZvaWQgZWpiQWN0aXZhdGUoKSB7Ci0JfQotCS8qKgotCSAqIGVqYkxvYWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlamJMb2FkKCkgewotCX0KLQkvKioKLQkgKiBlamJQYXNzaXZhdGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBlamJQYXNzaXZhdGUoKSB7Ci0JfQotCS8qKgotCSAqIGVqYlJlbW92ZQotCSAqLwotCXB1YmxpYyB2b2lkIGVqYlJlbW92ZSgpIHRocm93cyBqYXZheC5lamIuUmVtb3ZlRXhjZXB0aW9uIHsKLQl9Ci0JLyoqCi0JICogZWpiU3RvcmUKLQkgKi8KLQlwdWJsaWMgdm9pZCBlamJTdG9yZSgpIHsKLQl9Ci0JLyoqCi0JICogR2V0IGFjY2Vzc29yIGZvciBwZXJzaXN0ZW50IGF0dHJpYnV0ZTogaWQKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLkludGVnZXIgZ2V0SWQoKTsKLQkvKioKLQkgKiBTZXQgYWNjZXNzb3IgZm9yIHBlcnNpc3RlbnQgYXR0cmlidXRlOiBpZAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldElkKGphdmEubGFuZy5JbnRlZ2VyIG5ld0lkKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvZWpicy9DTVAyS2V5LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvZWpicy9DTVAyS2V5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4ZTliYzcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvZWpiTW9kdWxlL2VqYnMvQ01QMktleS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotcGFja2FnZSBlamJzOwotLyoqCi0gKiBLZXkgY2xhc3MgZm9yIEVudGl0eSBCZWFuOiBDTVAyCi0gKi8KLXB1YmxpYyBjbGFzcyBDTVAyS2V5IGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgewotCXN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzMjA2MDkzNDU5NzYwODQ2MTYzTDsKLQkvKioKLQkgKiBJbXBsZW1lbnRhdGlvbiBmaWVsZCBmb3IgcGVyc2lzdGVudCBhdHRyaWJ1dGU6IGlkCi0JICovCi0JcHVibGljIGphdmEubGFuZy5JbnRlZ2VyIGlkOwotCS8qKgotCSAqIENyZWF0ZXMgYW4gZW1wdHkga2V5IGZvciBFbnRpdHkgQmVhbjogQ01QMgotCSAqLwotCXB1YmxpYyBDTVAyS2V5KCkgewotCX0KLQkvKioKLQkgKiBDcmVhdGVzIGEga2V5IGZvciBFbnRpdHkgQmVhbjogQ01QMgotCSAqLwotCXB1YmxpYyBDTVAyS2V5KGphdmEubGFuZy5JbnRlZ2VyIGlkKSB7Ci0JCXRoaXMuaWQgPSBpZDsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIGJvdGgga2V5cyBhcmUgZXF1YWwuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKGphdmEubGFuZy5PYmplY3Qgb3RoZXJLZXkpIHsKLQkJaWYgKG90aGVyS2V5IGluc3RhbmNlb2YgZWpicy5DTVAyS2V5KSB7Ci0JCQllamJzLkNNUDJLZXkgbyA9IChlamJzLkNNUDJLZXkpIG90aGVyS2V5OwotCQkJcmV0dXJuICgodGhpcy5pZC5lcXVhbHMoby5pZCkpKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIGhhc2ggY29kZSBmb3IgdGhlIGtleS4KLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gKGlkLmhhc2hDb2RlKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvZWpicy9DTVAyTG9jYWwuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9lamJzL0NNUDJMb2NhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmFjNzMwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9lamJzL0NNUDJMb2NhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wYWNrYWdlIGVqYnM7Ci0vKioKLSAqIExvY2FsIGludGVyZmFjZSBmb3IgRW50ZXJwcmlzZSBCZWFuOiBDTVAyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ01QMkxvY2FsIGV4dGVuZHMgamF2YXguZWpiLkVKQkxvY2FsT2JqZWN0IHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvZWpicy9DTVAyTG9jYWxIb21lLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvZWpicy9DTVAyTG9jYWxIb21lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMWJkZjkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvZWpiTW9kdWxlL2VqYnMvQ01QMkxvY2FsSG9tZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotcGFja2FnZSBlamJzOwotLyoqCi0gKiBMb2NhbCBIb21lIGludGVyZmFjZSBmb3IgRW50ZXJwcmlzZSBCZWFuOiBDTVAyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ01QMkxvY2FsSG9tZSBleHRlbmRzIGphdmF4LmVqYi5FSkJMb2NhbEhvbWUgewotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UgZnJvbSBhIGtleSBmb3IgRW50aXR5IEJlYW46IENNUDIKLQkgKi8KLQlwdWJsaWMgZWpicy5DTVAyTG9jYWwgY3JlYXRlKGphdmEubGFuZy5JbnRlZ2VyIGlkKQotCQl0aHJvd3MgamF2YXguZWpiLkNyZWF0ZUV4Y2VwdGlvbjsKLQkvKioKLQkgKiBGaW5kcyBhbiBpbnN0YW5jZSB1c2luZyBhIGtleSBmb3IgRW50aXR5IEJlYW46IENNUDIKLQkgKi8KLQlwdWJsaWMgZWpicy5DTVAyTG9jYWwgZmluZEJ5UHJpbWFyeUtleShlamJzLkNNUDJLZXkgcHJpbWFyeUtleSkKLQkJdGhyb3dzIGphdmF4LmVqYi5GaW5kZXJFeGNlcHRpb247Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJXZWIvLmNsYXNzcGF0aCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSV2ViLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxYmIzOGIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJXZWIvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJ2YXIiIHBhdGg9IlNFUlZFUkpES19QTFVHSU5ESVIvanJlL2xpYi9ydC5qYXIiCi0gICAgICAgIHJvb3RwYXRoPSJzcmMiIHNvdXJjZXBhdGg9IlNFUlZFUkpES19QTFVHSU5ESVIvc3JjLmphciIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNvdXJjZSIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJ2YXIiIHBhdGg9IldBU19QTFVHSU5ESVIvbGliL2oyZWUuamFyIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InZhciIgcGF0aD0iV0FTX1BMVUdJTkRJUi9saWIvd2ViY29udGFpbmVyLmphciIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJ2YXIiIHBhdGg9IldBU19QTFVHSU5ESVIvbGliL2l2amVqYjM1LmphciIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJ2YXIiIHBhdGg9IldBU19QTFVHSU5ESVIvbGliL3dlYnNwaGVyZS5qYXIiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJ3ZWJBcHBsaWNhdGlvblxXRUItSU5GXGNsYXNzZXMiLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJXZWIvLndlYnNldHRpbmdzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJXZWIvLndlYnNldHRpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTViOWE4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSV2ViLy53ZWJzZXR0aW5ncworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3ZWJzZXR0aW5ncz4KLQk8Y29udGV4dC1yb290Pkxvb3NlRUFSV2ViPC9jb250ZXh0LXJvb3Q+Ci08L3dlYnNldHRpbmdzPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJXZWIvc291cmNlL2NvbS9pYm0vdGVzdC93ZWIvQy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJXZWIvc291cmNlL2NvbS9pYm0vdGVzdC93ZWIvQy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzFiMzk0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSV2ViL3NvdXJjZS9jb20vaWJtL3Rlc3Qvd2ViL0MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLXBhY2thZ2UgY29tLmlibS50ZXN0LndlYjsKLXB1YmxpYyBjbGFzcyBDIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBDCi0JICovCi0JcHVibGljIEMoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJXZWIvd2ViQXBwbGljYXRpb24vTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUldlYi93ZWJBcHBsaWNhdGlvbi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM1MTYwYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUldlYi93ZWJBcHBsaWNhdGlvbi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1DbGFzcy1QYXRoOiBMb29zZUVBUkVqYi5qYXIKLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJXZWIvd2ViQXBwbGljYXRpb24vV0VCLUlORi9jbGFzc2VzL2NvbS9pYm0vdGVzdC93ZWIvQy5jbGFzcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSV2ViL3dlYkFwcGxpY2F0aW9uL1dFQi1JTkYvY2xhc3Nlcy9jb20vaWJtL3Rlc3Qvd2ViL0MuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNTExMzEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJXZWIvd2ViQXBwbGljYXRpb24vV0VCLUlORi9jbGFzc2VzL2NvbS9pYm0vdGVzdC93ZWIvQy5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSV2ViL3dlYkFwcGxpY2F0aW9uL1dFQi1JTkYvaWJtLXdlYi1ibmQueG1pIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJXZWIvd2ViQXBwbGljYXRpb24vV0VCLUlORi9pYm0td2ViLWJuZC54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3NDg0NGIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJXZWIvd2ViQXBwbGljYXRpb24vV0VCLUlORi9pYm0td2ViLWJuZC54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLTx3ZWJhcHBibmQ6V2ViQXBwQmluZGluZyB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOndlYmFwcGJuZD0id2ViYXBwYm5kLnhtaSIgeG1sbnM6d2ViYXBwbGljYXRpb249IndlYmFwcGxpY2F0aW9uLnhtaSIgeG1pOmlkPSJXZWJBcHBCaW5kaW5nXzEiIHZpcnR1YWxIb3N0TmFtZT0iZGVmYXVsdF9ob3N0Ij4KLQk8d2ViYXBwIGhyZWY9IldFQi1JTkYvd2ViLnhtbCNXZWJBcHAiLz4KLTwvd2ViYXBwYm5kOldlYkFwcEJpbmRpbmc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJXZWIvd2ViQXBwbGljYXRpb24vV0VCLUlORi9pYm0td2ViLWV4dC54bWkgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUldlYi93ZWJBcHBsaWNhdGlvbi9XRUItSU5GL2libS13ZWItZXh0LnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJlYzI2Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUldlYi93ZWJBcHBsaWNhdGlvbi9XRUItSU5GL2libS13ZWItZXh0LnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLTx3ZWJhcHBleHQ6V2ViQXBwRXh0ZW5zaW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6d2ViYXBwZXh0PSJ3ZWJhcHBleHQueG1pIiB4bWxuczp3ZWJhcHBsaWNhdGlvbj0id2ViYXBwbGljYXRpb24ueG1pIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWk6aWQ9IldlYkFwcEV4dGVuc2lvbl8xIgotICByZWxvYWRJbnRlcnZhbD0iMyIKLSAgcmVsb2FkaW5nRW5hYmxlZD0idHJ1ZSIKLSAgZGVmYXVsdEVycm9yUGFnZT0iZXJyb3IuanNwIgotICBhZGRpdGlvbmFsQ2xhc3NQYXRoPSIiCi0gIGZpbGVTZXJ2aW5nRW5hYmxlZD0idHJ1ZSIKLSAgZGlyZWN0b3J5QnJvd3NpbmdFbmFibGVkPSJmYWxzZSIKLSAgc2VydmVTZXJ2bGV0c0J5Q2xhc3NuYW1lRW5hYmxlZD0idHJ1ZSI+Ci0JPHdlYkFwcCBocmVmPSJXRUItSU5GL3dlYi54bWwjV2ViQXBwIi8+Ci08L3dlYmFwcGV4dDpXZWJBcHBFeHRlbnNpb24+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJXZWIvd2ViQXBwbGljYXRpb24vV0VCLUlORi93ZWIueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJXZWIvd2ViQXBwbGljYXRpb24vV0VCLUlORi93ZWIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDEyZWZkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSV2ViL3dlYkFwcGxpY2F0aW9uL1dFQi1JTkYvd2ViLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgd2ViLWFwcCBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBXZWIgQXBwbGljYXRpb24gMi4yLy9FTiIgImh0dHA6Ly9qYXZhLnN1bi5jb20vajJlZS9kdGRzL3dlYi1hcHBfMl8yLmR0ZCI+Ci08d2ViLWFwcCBpZD0iV2ViQXBwIj4KLQk8ZGlzcGxheS1uYW1lPkxvb3NlRUFSV2ViPC9kaXNwbGF5LW5hbWU+Ci0JPHdlbGNvbWUtZmlsZS1saXN0PgotCQk8d2VsY29tZS1maWxlPmluZGV4Lmh0bWw8L3dlbGNvbWUtZmlsZT4KLQkJPHdlbGNvbWUtZmlsZT5pbmRleC5odG08L3dlbGNvbWUtZmlsZT4KLQkJPHdlbGNvbWUtZmlsZT5pbmRleC5qc3A8L3dlbGNvbWUtZmlsZT4KLQkJPHdlbGNvbWUtZmlsZT5kZWZhdWx0Lmh0bWw8L3dlbGNvbWUtZmlsZT4KLQkJPHdlbGNvbWUtZmlsZT5kZWZhdWx0Lmh0bTwvd2VsY29tZS1maWxlPgotCQk8d2VsY29tZS1maWxlPmRlZmF1bHQuanNwPC93ZWxjb21lLWZpbGU+Ci0JPC93ZWxjb21lLWZpbGUtbGlzdD4KLTwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlSmF2YVV0aWwvLmNsYXNzcGF0aCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlSmF2YVV0aWwvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhiM2ZhMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUphdmFVdGlsLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJ2YXIiIHBhdGg9IkpSRV9MSUIiIHJvb3RwYXRoPSJKUkVfU1JDUk9PVCIgc291cmNlcGF0aD0iSlJFX1NSQyIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUphdmFVdGlsL2Jpbi9jb20vaWJtL3Rlc3QvQS5jbGFzcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlSmF2YVV0aWwvYmluL2NvbS9pYm0vdGVzdC9BLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmNmZmYwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlSmF2YVV0aWwvYmluL2NvbS9pYm0vdGVzdC9BLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VKYXZhVXRpbC9zcmMvY29tL2libS90ZXN0L0EuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlSmF2YVV0aWwvc3JjL2NvbS9pYm0vdGVzdC9BLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3ZjA5YzEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VKYXZhVXRpbC9zcmMvY29tL2libS90ZXN0L0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLXBhY2thZ2UgY29tLmlibS50ZXN0OwotcHVibGljIGNsYXNzIEEgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEEKLQkgKi8KLQlwdWJsaWMgQSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JfQotfQotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUphdmFXZWJMaWIvLmNsYXNzcGF0aCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlSmF2YVdlYkxpYi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGIzZmEwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlSmF2YVdlYkxpYi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0idmFyIiBwYXRoPSJKUkVfTElCIiByb290cGF0aD0iSlJFX1NSQ1JPT1QiIHNvdXJjZXBhdGg9IkpSRV9TUkMiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VKYXZhV2ViTGliL2Jpbi9jb20vaWJtL3dlYi90ZXN0L0IuY2xhc3MgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUphdmFXZWJMaWIvYmluL2NvbS9pYm0vd2ViL3Rlc3QvQi5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNlZTU2NC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUphdmFXZWJMaWIvYmluL2NvbS9pYm0vd2ViL3Rlc3QvQi5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlSmF2YVdlYkxpYi9zcmMvY29tL2libS93ZWIvdGVzdC9CLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUphdmFXZWJMaWIvc3JjL2NvbS9pYm0vd2ViL3Rlc3QvQi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjE4NTMzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlSmF2YVdlYkxpYi9zcmMvY29tL2libS93ZWIvdGVzdC9CLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1wYWNrYWdlIGNvbS5pYm0ud2ViLnRlc3Q7Ci1wdWJsaWMgY2xhc3MgQiB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQgotCSAqLwotCXB1YmxpYyBCKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL2Jvby5qYXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9ib28uamFyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzQzZTNkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL2Jvby5qYXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQ2xhc3MtUGF0aDogdXRpbC5qYXIgTG9vc2VFQVJFamIvYmluIGZvb2Jhci5qYXIgCi0KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvZm9vYmFyLmphciBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL2Zvb2Jhci5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhNzY3OTguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvZm9vYmFyLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL3JlYWRtZS50eHQgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9yZWFkbWUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGQ1ZDE4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL3JlYWRtZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1UaGlzIGlzIG5vdCBhIGZ1bGwgICAgIHdvcmtzcGFjZTsgaXQgaXMganVzdCB0aGUgZmlsZXMgbmVjZXNzYXJ5IHRvIGVtdWxhdGUgb25lLCBmb3IgdW5pdCB0ZXN0aW5nIHRoZSBydW50aW1lClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9BbGxET01UZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9BbGxET01UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDQ5Yjk0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvQWxsRE9NVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIFNlcCA1LCAyMDAzCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuZW1mdGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkVNRjJET01SZW5kZXJlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXJGYWN0b3J5OwotCi0vKioKLSAqIEBhdXRob3IgQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgQWxsRE9NVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZXsKLQkKLQlwcml2YXRlIFJlbmRlcmVyRmFjdG9yeSBkZWZhdWx0UmVuZGVyZXJGYWN0b3J5OwotCi0gICAgcHVibGljIEFsbERPTVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgQWxsRE9NVGVzdHMoU3RyaW5nIG5hbWUsIFJlbmRlcmVyRmFjdG9yeSByZikgewotCQlzdXBlcihuYW1lKTsKLQkJdGhpcy5kZWZhdWx0UmVuZGVyZXJGYWN0b3J5ID0gcmY7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgiVGVzdCBmb3IgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5lbWZ0ZXN0Iik7Ci0JCS8vJEpVbml0LUJFR0lOJAotCQlzdWl0ZS5hZGRUZXN0KG5ldyBBbGxET01UZXN0cygidGVzdFN3aXRjaFJlbmRlcmVyIiwgUmVuZGVyZXJGYWN0b3J5LmdldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoKSkpOwotCQlzdWl0ZS5hZGRUZXN0KEFwcENsaWVudEVNRkVkaXRUZXN0LnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEFwcENsaWVudEVNRlRlc3Quc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoRWFyRU1GRWRpdFRlc3Quc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoRWFyRU1GVGVzdC5zdWl0ZSgpKTsgLy8KLQkJc3VpdGUuYWRkVGVzdChFamJFTUZFZGl0VGVzdC5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChFamJFTUZUZXN0LnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KFJhckVNRkVkaXRUZXN0LnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KFJhckVNRlRlc3Quc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoV2FyRU1GRWRpdFRlc3Quc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoV2FyRU1GVGVzdC5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChXZWJTZXJ2aWNlc0VNRlRlc3Quc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEFsbERPTVRlc3RzKCJ0ZXN0U3dpdGNoUmVuZGVyZXJCYWNrIiwgUmVuZGVyZXJGYWN0b3J5LmdldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoKSkpOwotIAotCQkvLyRKVW5pdC1FTkQkCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oamF2YS5sYW5nLlN0cmluZ1tdIGFyZ3MpIHsKLQkJIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLm1haW4obmV3IFN0cmluZ1tdIHsgQWxsRE9NVGVzdHMuY2xhc3MuZ2V0TmFtZSgpIH0pOwotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFN3aXRjaFJlbmRlcmVyKCkgewotCQlSZW5kZXJlckZhY3Rvcnkuc2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeShFTUYyRE9NUmVuZGVyZXJGYWN0b3J5LklOU1RBTkNFKTsKLQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3dpdGNoUmVuZGVyZXJCYWNrKCkgewotCQlSZW5kZXJlckZhY3Rvcnkuc2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeShkZWZhdWx0UmVuZGVyZXJGYWN0b3J5KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvQWxsU0FYVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvQWxsU0FYVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRjMzI2Zi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL0FsbFNBWFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBTZXAgNSwgMjAwMwotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLmVtZnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5FTUYyU0FYUmVuZGVyZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyRmFjdG9yeTsKLQotLyoqCi0gKiBAYXV0aG9yIEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEFsbFNBWFRlc3RzIGV4dGVuZHMgVGVzdENhc2V7Ci0KLQlwcml2YXRlIFJlbmRlcmVyRmFjdG9yeSBkZWZhdWx0UmVuZGVyZXJGYWN0b3J5OwotCQotCUFsbFRlc3RzIHRlc3RzID0gbmV3IEFsbFRlc3RzKCk7IC8vIGZvcmNlIHRoZSBjbGFzcyB0byBsb2FkIGlmIHRoaXMgdGVzdCBpcyBsb2FkZWQgCi0gIAotCXB1YmxpYyBBbGxTQVhUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9IAotCi0JcHVibGljIEFsbFNBWFRlc3RzKFN0cmluZyBuYW1lLCBSZW5kZXJlckZhY3RvcnkgcmYpIHsKLQkJc3VwZXIobmFtZSk7Ci0JCXRoaXMuZGVmYXVsdFJlbmRlcmVyRmFjdG9yeSA9IHJmOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoIlRlc3QgZm9yIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuZW1mdGVzdCIpOwotCQkvLyRKVW5pdC1CRUdJTiQKLQkJc3VpdGUuYWRkVGVzdChuZXcgQWxsU0FYVGVzdHMoInRlc3RTd2l0Y2hSZW5kZXJlciIsIFJlbmRlcmVyRmFjdG9yeS5nZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCkpKTsKLQkJc3VpdGUuYWRkVGVzdChBcHBDbGllbnRFTUZFZGl0VGVzdC5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChBcHBDbGllbnRFTUZUZXN0LnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEVhckVNRkVkaXRUZXN0LnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEVhckVNRlRlc3Quc3VpdGUoKSk7IC8vCi0JCXN1aXRlLmFkZFRlc3QoRWpiRU1GRWRpdFRlc3Quc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoRWpiRU1GVGVzdC5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChSYXJFTUZFZGl0VGVzdC5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChSYXJFTUZUZXN0LnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KFdhckVNRkVkaXRUZXN0LnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KFdhckVNRlRlc3Quc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoV2ViU2VydmljZXNFTUZUZXN0LnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBBbGxTQVhUZXN0cygidGVzdFN3aXRjaFJlbmRlcmVyQmFjayIsIFJlbmRlcmVyRmFjdG9yeS5nZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCkpKTsKLQotCQkvLyRKVW5pdC1FTkQkCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oamF2YS5sYW5nLlN0cmluZ1tdIGFyZ3MpIHsKLQkJIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLm1haW4obmV3IFN0cmluZ1tdIHsgQWxsU0FYVGVzdHMuY2xhc3MuZ2V0TmFtZSgpIH0pOwotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFN3aXRjaFJlbmRlcmVyKCkgewotCQlSZW5kZXJlckZhY3Rvcnkuc2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeShFTUYyU0FYUmVuZGVyZXJGYWN0b3J5LklOU1RBTkNFKTsgCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTd2l0Y2hSZW5kZXJlckJhY2soKSB7Ci0JCVJlbmRlcmVyRmFjdG9yeS5zZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KGRlZmF1bHRSZW5kZXJlckZhY3RvcnkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvQWxsVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvQWxsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UzMDA4Yi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL0FsbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBBcHIgMSwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIAotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEFsbFRlc3RzIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgiVGVzdCBmb3IgQ29tbW9uIEFyY2hpdmUgYW5kIEVNRiBUZXN0cyIpOwotICAgICAgICAvLyRKVW5pdC1CRUdJTiQKLQotCQlzdWl0ZS5hZGRUZXN0KEFsbERPTVRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEFsbFNBWFRlc3RzLnN1aXRlKCkpOwotCi0JCS8vJEpVbml0LUVORCQKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihqYXZhLmxhbmcuU3RyaW5nW10gYXJncykgewotCQlqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5tYWluKG5ldyBTdHJpbmdbXSB7IEFsbFRlc3RzLmNsYXNzLmdldE5hbWUoKSB9KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvQXBwQ2xpZW50RU1GRWRpdFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvQXBwQ2xpZW50RU1GRWRpdFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI5ZjA2MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL0FwcENsaWVudEVNRkVkaXRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuZW1mdGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQuc3dpbmd1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcHBsaWNhdGlvbkNsaWVudEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5EdXBsaWNhdGVPYmplY3RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk9wZW5GYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMuYnZ0LkF1dG9tYXRlZEJWVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotCi0KLXB1YmxpYyBjbGFzcyBBcHBDbGllbnRFTUZFZGl0VGVzdCBleHRlbmRzIEdlbmVyYWxFTUZFZGl0aW5nVGVzdCB7Ci0gICAgRUFSRmlsZSBlYXJGaWxlOwotICAgIEFwcGxpY2F0aW9uQ2xpZW50RmlsZSBhcHBDbGllbnRGaWxlOwotCi0gICAgcHVibGljIEFwcENsaWVudEVNRkVkaXRUZXN0KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb21tb25hcmNoaXZlRmFjdG9yeSBnZXRBcmNoaXZlRmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIENvbW1vbmFyY2hpdmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21tb25hcmNoaXZlRmFjdG9yeSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBFamJGYWN0b3J5IGdldEVqYkZhY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiBFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFamJGYWN0b3J5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIEFwcGxpY2F0aW9uRmFjdG9yeSBnZXRBcHBsaWNhdGlvbkZhY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uRmFjdG9yeSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBXZWJhcHBsaWNhdGlvbkZhY3RvcnkgZ2V0V2ViQXBwRmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViYXBwbGljYXRpb25GYWN0b3J5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oamF2YS5sYW5nLlN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgU3RyaW5nW10gY2xhc3NOYW1lID0geyAiY29tLmlibS5ldG9vbHMuYXJjaGl2ZS50ZXN0LkFwcENsaWVudEVNRkVkaXRUZXN0IiwgIi1ub2xvYWRpbmciIH07Ci0gICAgICAgIFRlc3RSdW5uZXIubWFpbihjbGFzc05hbWUpOwotICAgIH0KLSAgICBwdWJsaWMgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0IHN1aXRlKCkgewotICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QobmV3IEFwcENsaWVudEVNRkVkaXRUZXN0KCJ0ZXN0QXBwbGljYXRpb25DbGllbnRFZGl0IikpOwotICAgICAgICByZXR1cm4gc3VpdGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFwcGxpY2F0aW9uQ2xpZW50RWRpdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBnZXRBcHBDbGllbnQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIxLjMiLCBhcHBDbGllbnRGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0VmVyc2lvbigpKTsKLQotICAgICAgICBBcHBsaWNhdGlvbkNsaWVudFJlc291cmNlIEREID0gKEFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2UpIGFwcENsaWVudEZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotCQlzZXRWZXJzaW9uKFZFUlNJT05fMV8zKTsKLQkJc2V0TW9kdWxlVHlwZShBUFBfQ0xJRU5UKTsKLSAgICAgICAgZWRpdFJvb3QoREQuZ2V0Um9vdE9iamVjdCgpKTsKLSAgICAgICAgU3RyaW5nIGN1ckRpciA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5OwotICAgICAgICBTdHJpbmcgb3V0ID0gY3VyRGlyICsgInRlc3RPdXRwdXQvRU1GTW9kZWxDcmVhdGlvblRlc3RzL0VkaXRBcHBFQVIiOwotICAgICAgICBhcHBDbGllbnRGaWxlLmV4dHJhY3RUbyhvdXQsIEFyY2hpdmUuRVhQQU5EX0FMTCk7Ci0gICAgICAgIGFwcENsaWVudEZpbGUuY2xvc2UoKTsKLQotICAgICAgICAvL0NvbXBhcmUKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBleGFtcGxlRGVwbG95bWVudERlc1VSSSA9IGN1ckRpciArICJFTUZUZXN0cy9hcHBsaWNhdGlvbi1jbGllbnQueG1sIjsKLSAgICAgICAgU3RyaW5nIGN1ckRlcGxveW1lbnREZXNVUkkgPSBjdXJEaXIgKyBvdXQgKyAiL0FwcENsaWVudGZvby9NRVRBLUlORi9hcHBsaWNhdGlvbi1jbGllbnQueG1sIjsKLQkJc2V0SWdub3JlQXR0KGlnbm9yYWJsZUF0dHJpYnV0ZXMoKSk7Ci0gICAgICAgIC8vY29tcGFyZUNvbnRlbnRzKGN1ckRlcGxveW1lbnREZXNVUkksIGV4YW1wbGVEZXBsb3ltZW50RGVzVVJJKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBnZXRBcHBDbGllbnQoKSB0aHJvd3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uLCBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBpbiA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgImxvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJBcHAvZm9vQVBQLyI7Ci0gICAgICAgIGFwcENsaWVudEZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5BcHBsaWNhdGlvbkNsaWVudEZpbGUoaW4pOwotICAgIH0KLSAgICAKLQlwdWJsaWMgSGFzaFNldCBpZ25vcmFibGVBdHRyaWJ1dGVzKCl7Ci0JCUhhc2hTZXQgc2V0ID0gbmV3IEhhc2hTZXQoKTsKLQkJc2V0LmFkZCgiaWQiKTsKLQkJcmV0dXJuIHNldDsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL0FwcENsaWVudEVNRlRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvQXBwQ2xpZW50RU1GVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjlmNGZkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvQXBwQ2xpZW50RU1GVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC5zd2luZ3VpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUudGVzdHV0aWxpdGllcy5FTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFwcGxpY2F0aW9uQ2xpZW50RmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkR1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uT3BlbkZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbC5Db21tb25hcmNoaXZlRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5idnQuQXV0b21hdGVkQlZUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci0KLQotcHVibGljIGNsYXNzIEFwcENsaWVudEVNRlRlc3QgZXh0ZW5kcyBHZW5lcmFsRU1GUG9wdWxhdGlvblRlc3QgewotICAgIEVBUkZpbGUgZWFyRmlsZTsKLSAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb25DbGllbnRGaWxlIGFwcENsaWVudEZpbGU7Ci0JRUFSRmlsZSBlYXJGaWxlMTQ7Ci0JQXBwbGljYXRpb25DbGllbnRGaWxlIGFwcENsaWVudEZpbGUxNDsKLQotICAgIHB1YmxpYyBBcHBDbGllbnRFTUZUZXN0KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb21tb25hcmNoaXZlRmFjdG9yeSBnZXRBcmNoaXZlRmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIENvbW1vbmFyY2hpdmVGYWN0b3J5SW1wbC5nZXRBY3RpdmVGYWN0b3J5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIEVqYkZhY3RvcnkgZ2V0RWpiRmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVqYkZhY3RvcnkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXBwbGljYXRpb25GYWN0b3J5IGdldEFwcGxpY2F0aW9uRmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25GYWN0b3J5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBnZXRXZWJBcHBGYWN0b3J5KCkgewotICAgICAgICByZXR1cm4gV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJhcHBsaWNhdGlvbkZhY3RvcnkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihqYXZhLmxhbmcuU3RyaW5nW10gYXJncykgewotICAgICAgICBTdHJpbmdbXSBjbGFzc05hbWUgPSB7ICJjb20uaWJtLmV0b29scy5hcmNoaXZlLnRlc3QuQXBwQ2xpZW50RU1GVGVzdCIsICItbm9sb2FkaW5nIiB9OwotICAgICAgICBUZXN0UnVubmVyLm1haW4oY2xhc3NOYW1lKTsKLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KG5ldyBBcHBDbGllbnRFTUZUZXN0KCJ0ZXN0QXBwbGljYXRpb25DbGllbnRQb3B1bGF0aW9uIikpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KG5ldyBBcHBDbGllbnRFTUZUZXN0KCJ0ZXN0MTRBcHBsaWNhdGlvbkNsaWVudFBvcHVsYXRpb24iKSk7Ci0gICAgICAgIHJldHVybiBzdWl0ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwbGljYXRpb25DbGllbnRQb3B1bGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUVNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3IucmVzZXQoKTsKLSAgICAgICAgY3JlYXRlRUFSKCk7Ci0gICAgICAgIGNyZWF0ZUFwcENsaWVudCgpOwotCi0gICAgICAgIEFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2UgREQgPSAoQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZSkgYXBwQ2xpZW50RmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0gICAgICAgIERELnNldFZlcnNpb25JRChKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCk7Ci0gICAgICAgIHNldFZlcnNpb24oVkVSU0lPTl8xXzMpOwotICAgICAgICBzZXRNb2R1bGVUeXBlKEFQUF9DTElFTlQpOwotICAgICAgICBwb3B1bGF0ZVJvb3QoREQuZ2V0Um9vdE9iamVjdCgpKTsKLQotCQlTdHJpbmcgb3V0ID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyJ0ZXN0T3V0cHV0L1Rlc3RBcHBFQVIiOwotICAgICAgICBlYXJGaWxlLmV4dHJhY3RUbyhvdXQsIEFyY2hpdmUuRVhQQU5EX0FMTCk7Ci0gICAgICAgIGVhckZpbGUuY2xvc2UoKTsKLQotICAgICAgICAvL0NvbXBhcmUKLSAgICAgICAgU3RyaW5nIGN1ckRpciA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5OwotICAgICAgICBTdHJpbmcgZXhhbXBsZURlcGxveW1lbnREZXNVUkkgPSBjdXJEaXIgKyAiRU1GVGVzdE5vSUQvYXBwbGljYXRpb24tY2xpZW50LnhtbCI7Ci0gICAgICAgIFN0cmluZyBjdXJEZXBsb3ltZW50RGVzVVJJID0gY3VyRGlyICsgInRlc3RPdXRwdXQvVGVzdEFwcEVBUi9mb29BUFAvTUVUQS1JTkYvYXBwbGljYXRpb24tY2xpZW50LnhtbCI7Ci0JCXNldElnbm9yZUF0dChpZ25vcmFibGVBdHRyaWJ1dGVzKCkpOwotCQljb21wYXJlQ29udGVudHNJZ25vcmVXaGl0ZXNwYWNlKGN1ckRlcGxveW1lbnREZXNVUkksIGV4YW1wbGVEZXBsb3ltZW50RGVzVVJJLCBudWxsKTsKLSAgICB9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0MTRBcHBsaWNhdGlvbkNsaWVudFBvcHVsYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCUVNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3IucmVzZXQoKTsKLQkJCWNyZWF0ZUVBUigpOwotCQkJY3JlYXRlQXBwQ2xpZW50KCk7Ci0KLQkJCUFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2UgREQgPSAoQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZSkgYXBwQ2xpZW50RmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0JCQlERC5zZXRWZXJzaW9uSUQoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQpOwotCQkJc2V0VmVyc2lvbihWRVJTSU9OXzFfNCk7Ci0JCQlzZXRNb2R1bGVUeXBlKEFQUF9DTElFTlQpOwotCQkJcG9wdWxhdGVSb290KERELmdldFJvb3RPYmplY3QoKSk7Ci0KLQkJCVN0cmluZyBvdXQgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArInRlc3RPdXRwdXQvVGVzdEFwcEVBUjE0IjsKLQkJCWVhckZpbGUuZXh0cmFjdFRvKG91dCwgQXJjaGl2ZS5FWFBBTkRfQUxMKTsKLQkJCWVhckZpbGUuY2xvc2UoKTsKLQotCQkJZ2V0QXBwMTRDbGllbnQoKTsKLQkJCWFzc2VydEVxdWFscygiMS40IiwgYXBwQ2xpZW50RmlsZTE0LmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0VmVyc2lvbigpKTsKLQkJCW91dCA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsidGVzdE91dHB1dC9UZXN0QXBwRUFSMTRfMiI7Ci0JCQlhcHBDbGllbnRGaWxlMTQuZXh0cmFjdFRvKG91dCwgQXJjaGl2ZS5FWFBBTkRfQUxMKTsKLQkJCWFwcENsaWVudEZpbGUxNC5jbG9zZSgpOwotCQkJCi0JCQkvL0NvbXBhcmUKLQkJCVN0cmluZyBjdXJEaXIgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeTsKLQkJCVN0cmluZyBjdXJEZXBsb3ltZW50RGVzVVJJID0gY3VyRGlyICsgInRlc3RPdXRwdXQvVGVzdEFwcEVBUjE0L2Zvb0FQUC9NRVRBLUlORi9hcHBsaWNhdGlvbi1jbGllbnQueG1sIjsKLQkJCVN0cmluZyBzZWNvbmREZXBsb3ltZW50RGVzVVJJID0gb3V0ICsgIi9NRVRBLUlORi9hcHBsaWNhdGlvbi1jbGllbnQueG1sIjsKLQkJCXNldElnbm9yZUF0dChpZ25vcmFibGVBdHRyaWJ1dGVzKCkpOwotCQkJY29tcGFyZUNvbnRlbnRzSWdub3JlV2hpdGVzcGFjZShjdXJEZXBsb3ltZW50RGVzVVJJLCBzZWNvbmREZXBsb3ltZW50RGVzVVJJLCBudWxsKTsKLQl9Ci0JCi0gICAgcHVibGljIHZvaWQgY3JlYXRlQXBwQ2xpZW50KCkgdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFwcENsaWVudEZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUFwcGxpY2F0aW9uQ2xpZW50RmlsZUluaXRpYWxpemVkKCJmb29BUFAiKTsKLSAgICAgICAgYXBwQ2xpZW50RmlsZSA9IChBcHBsaWNhdGlvbkNsaWVudEZpbGUpIGVhckZpbGUuYWRkQ29weShhcHBDbGllbnRGaWxlKTsKLSAgICAgICAgYXBwQ2xpZW50RmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLnNldERpc3BsYXlOYW1lKCJmb29BUFAiKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShhcHBDbGllbnRGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkgIT0gbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY3JlYXRlRUFSKCkgewotICAgICAgICBTdHJpbmcgZWFyTmFtZSA9ICJUZXN0LmVhciI7Ci0gICAgICAgIGVhckZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUVBUkZpbGVJbml0aWFsaXplZChlYXJOYW1lKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShlYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkgIT0gbnVsbCk7Ci0gICAgfQotICAgIAotICAgIAotCXB1YmxpYyB2b2lkIGdldEFwcDE0Q2xpZW50KCkgdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiwgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlTdHJpbmcgaW4gPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJ0ZXN0T3V0cHV0L1Rlc3RBcHBFQVIxNC9mb29BUFAiOwotCQlhcHBDbGllbnRGaWxlMTQgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5BcHBsaWNhdGlvbkNsaWVudEZpbGUoaW4pOwotCX0KLSAgICAKLSAgICBwdWJsaWMgSGFzaFNldCBpZ25vcmFibGVBdHRyaWJ1dGVzKCl7Ci0gICAgCUhhc2hTZXQgc2V0ID0gbmV3IEhhc2hTZXQoKTsKLSAgICAJc2V0LmFkZCgiaWQiKTsKLSAgICAJcmV0dXJuIHNldDsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL0VhckVNRkVkaXRUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL0VhckVNRkVkaXRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MTE2MGUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9FYXJFTUZFZGl0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC5zd2luZ3VpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk9wZW5GYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMuYnZ0LkF1dG9tYXRlZEJWVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotCi0KLXB1YmxpYyBjbGFzcyBFYXJFTUZFZGl0VGVzdCBleHRlbmRzIEdlbmVyYWxFTUZFZGl0aW5nVGVzdCB7Ci0gICAgRUFSRmlsZSBlYXJGaWxlOwotICAgIGludCBjcmVhdGVkTW9kdWxlcyA9IDA7Ci0KLSAgICBwcml2YXRlIGludCBOVU1fTU9EVUxFUyA9IDQ7Ci0KLSAgICBwdWJsaWMgRWFyRU1GRWRpdFRlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIENvbW1vbmFyY2hpdmVGYWN0b3J5IGdldEFyY2hpdmVGYWN0b3J5KCkgewotICAgICAgICByZXR1cm4gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbW1vbmFyY2hpdmVGYWN0b3J5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIEVqYkZhY3RvcnkgZ2V0RWpiRmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVqYkZhY3RvcnkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXBwbGljYXRpb25GYWN0b3J5IGdldEFwcGxpY2F0aW9uRmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25GYWN0b3J5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBnZXRXZWJBcHBGYWN0b3J5KCkgewotICAgICAgICByZXR1cm4gV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJhcHBsaWNhdGlvbkZhY3RvcnkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihqYXZhLmxhbmcuU3RyaW5nW10gYXJncykgewotICAgICAgICBTdHJpbmdbXSBjbGFzc05hbWUgPSB7ICJjb20uaWJtLmV0b29scy5hcmNoaXZlLnRlc3QuRWFyRU1GRWRpdFRlc3QiLCAiLW5vbG9hZGluZyIgfTsKLSAgICAgICAgVGVzdFJ1bm5lci5tYWluKGNsYXNzTmFtZSk7Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChuZXcgRWFyRU1GRWRpdFRlc3QoInRlc3RFQVJFZGl0IikpOwotICAgICAgICByZXR1cm4gc3VpdGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVBUkVkaXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZ2V0RUFSKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCIxLjIiLCBlYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0VmVyc2lvbigpKTsKLQotICAgICAgICBBcHBsaWNhdGlvblJlc291cmNlIEREID0gKEFwcGxpY2F0aW9uUmVzb3VyY2UpIGVhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotCQlzZXRWZXJzaW9uKFZFUlNJT05fMV8zKTsKLQkJc2V0TW9kdWxlVHlwZShBUFBJQ0FUSU9OKTsgCi0gICAgICAgIGVkaXRSb290KERELmdldFJvb3RPYmplY3QoKSk7Ci0gICAgICAgIFN0cmluZyBjdXJEaXIgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBvdXQgPSBjdXJEaXIgKyJ0ZXN0T3V0cHV0L0VkaXRPdXRwdXQvRU1GTW9kZWxDcmVhdGlvblRlc3RzL0VkaXRFQVIiOwotICAgICAgICBlYXJGaWxlLmV4dHJhY3RUbyhvdXQsIEFyY2hpdmUuRVhQQU5EX0FMTCk7Ci0gICAgICAgIGVhckZpbGUuY2xvc2UoKTsKLQotICAgICAgICAvL0NvbXBhcmUgd29yayBpbiBwcm9ncmVzcwotICAgICAgIAotICAgICAgICBTdHJpbmcgZXhhbXBsZURlcGxveW1lbnREZXNVUkkgPSBjdXJEaXIgKyAiRU1GVGVzdHMvYXBwbGljYXRpb24ueG1sIjsKLSAgICAgICAgU3RyaW5nIGN1ckRlcGxveW1lbnREZXNVUkkgPSBjdXJEaXIgKyBvdXQgKyAiL01FVEEtSU5GL2FwcGxpY2F0aW9uLnhtbCI7Ci0gICAgICAgIC8vY29tcGFyZUNvbnRlbnRzKGN1ckRlcGxveW1lbnREZXNVUkksIGV4YW1wbGVEZXBsb3ltZW50RGVzVVJJKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBnZXRFQVIoKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgaW4gPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJsb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSLyI7Ci0gICAgICAgIGVhckZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5FQVJGaWxlKGluKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShlYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkgIT0gbnVsbCk7Ci0gICAgfQotICAgIAotCXB1YmxpYyBIYXNoU2V0IGlnbm9yYWJsZUF0dHJpYnV0ZXMoKXsKLQkJSGFzaFNldCBzZXQgPSBuZXcgSGFzaFNldCgpOwotCQlzZXQuYWRkKCJpZCIpOwotCQlyZXR1cm4gc2V0OwotCX0KLQotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZUluc3RhbmNlKEVDbGFzcyBlQ2xhc3NpZmllcikgewotCQlpZiAoZUNsYXNzaWZpZXIuZ2V0TmFtZSgpLmVxdWFscygiTW9kdWxlIikpIHsKLQkJCWNyZWF0ZWRNb2R1bGVzKys7Ci0JCQlzd2l0Y2ggKGNyZWF0ZWRNb2R1bGVzKSB7Ci0JCQkJY2FzZSAoMSkgOgotCQkJCQlyZXR1cm4gY3JlYXRlSmF2YU1vZHVsZUluc3RhbmNlKGVDbGFzc2lmaWVyKTsKLQkJCQljYXNlICgyKSA6Ci0JCQkJCXJldHVybiBjcmVhdGVFSkJNb2R1bGVJbnN0YW5jZShlQ2xhc3NpZmllcik7Ci0JCQkJY2FzZSAoMykgOgotCQkJCQlyZXR1cm4gY3JlYXRlV2ViTW9kdWxlSW5zdGFuY2UoZUNsYXNzaWZpZXIpOwotCQkJCWNhc2UgKDQpIDoKLQkJCQkJcmV0dXJuIGNyZWF0ZUNvbm5ldG9yTW9kdWxlSW5zdGFuY2UoZUNsYXNzaWZpZXIpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gY3JlYXRlSmF2YU1vZHVsZUluc3RhbmNlKGVDbGFzc2lmaWVyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuY3JlYXRlSW5zdGFuY2UoZUNsYXNzaWZpZXIpOwotCX0KLQotCXByaXZhdGUgRU9iamVjdCBjcmVhdGVDb25uZXRvck1vZHVsZUluc3RhbmNlKEVDbGFzcyBlQ2xhc3NpZmllcikgewotCQlyZXR1cm4gKChBcHBsaWNhdGlvbkZhY3RvcnkpIGVDbGFzc2lmaWVyLmdldEVQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpKS5jcmVhdGVDb25uZWN0b3JNb2R1bGUoKTsKLQl9Ci0KLQlwcml2YXRlIEVPYmplY3QgY3JlYXRlV2ViTW9kdWxlSW5zdGFuY2UoRUNsYXNzIGVDbGFzc2lmaWVyKSB7Ci0JCXJldHVybiAoKEFwcGxpY2F0aW9uRmFjdG9yeSkgZUNsYXNzaWZpZXIuZ2V0RVBhY2thZ2UoKS5nZXRFRmFjdG9yeUluc3RhbmNlKCkpLmNyZWF0ZVdlYk1vZHVsZSgpOwotCX0KLQotCXByaXZhdGUgRU9iamVjdCBjcmVhdGVFSkJNb2R1bGVJbnN0YW5jZShFQ2xhc3MgZUNsYXNzaWZpZXIpIHsKLQkJcmV0dXJuICgoQXBwbGljYXRpb25GYWN0b3J5KSBlQ2xhc3NpZmllci5nZXRFUGFja2FnZSgpLmdldEVGYWN0b3J5SW5zdGFuY2UoKSkuY3JlYXRlRWpiTW9kdWxlKCk7Ci0JfQotCi0JcHJpdmF0ZSBFT2JqZWN0IGNyZWF0ZUphdmFNb2R1bGVJbnN0YW5jZShFQ2xhc3MgZUNsYXNzaWZpZXIpIHsKLQkJcmV0dXJuICgoQXBwbGljYXRpb25GYWN0b3J5KSBlQ2xhc3NpZmllci5nZXRFUGFja2FnZSgpLmdldEVGYWN0b3J5SW5zdGFuY2UoKSkuY3JlYXRlSmF2YUNsaWVudE1vZHVsZSgpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0U2hhcmVkT2JqZWN0QnlUeXBlKEVPYmplY3Qgb3duZXIsIEVSZWZlcmVuY2UgcmVmKSB7Ci0JCWlmIChyZWYuZ2V0TmFtZSgpLmVxdWFscygibW9kdWxlIikpCi0JCQlyZXR1cm4gY3JlYXRlSmF2YU1vZHVsZUluc3RhbmNlKChFQ2xhc3MpIHJlZi5nZXRFVHlwZSgpKTsKLQkJcmV0dXJuIHN1cGVyLmdldFNoYXJlZE9iamVjdEJ5VHlwZShvd25lciwgcmVmKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldERlcHRoRm9yQXR0cmlidXRlKEVSZWZlcmVuY2UgcmVmKSB7Ci0JCWlmIChyZWYuZ2V0TmFtZSgpLmVxdWFscygibW9kdWxlcyIpKQotCQkJcmV0dXJuIE5VTV9NT0RVTEVTOwotCQlyZXR1cm4gc3VwZXIuZ2V0RGVwdGhGb3JBdHRyaWJ1dGUocmVmKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL0VhckVNRlRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvRWFyRU1GVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGY5NjQ5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvRWFyRU1GVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC5zd2luZ3VpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvblJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUudGVzdHV0aWxpdGllcy5FTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uT3BlbkZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5idnQuQXV0b21hdGVkQlZUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci0KLQotcHVibGljIGNsYXNzIEVhckVNRlRlc3QgZXh0ZW5kcyBHZW5lcmFsRU1GUG9wdWxhdGlvblRlc3QgewotICAgIHByb3RlY3RlZCBFQVJGaWxlIGVhckZpbGU7Ci0gICAgaW50IGNyZWF0ZWRNb2R1bGVzID0gMDsKLQotICAgIHByaXZhdGUgaW50IE5VTV9NT0RVTEVTID0gNTsKLQotICAgIHB1YmxpYyBFYXJFTUZUZXN0KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb21tb25hcmNoaXZlRmFjdG9yeSBnZXRBcmNoaXZlRmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIENvbW1vbmFyY2hpdmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21tb25hcmNoaXZlRmFjdG9yeSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBFamJGYWN0b3J5IGdldEVqYkZhY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiBFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFamJGYWN0b3J5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIEFwcGxpY2F0aW9uRmFjdG9yeSBnZXRBcHBsaWNhdGlvbkZhY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uRmFjdG9yeSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBXZWJhcHBsaWNhdGlvbkZhY3RvcnkgZ2V0V2ViQXBwRmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViYXBwbGljYXRpb25GYWN0b3J5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oamF2YS5sYW5nLlN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgU3RyaW5nW10gY2xhc3NOYW1lID0geyAiY29tLmlibS5ldG9vbHMuYXJjaGl2ZS50ZXN0LkVhckVNRlRlc3QiLCAiLW5vbG9hZGluZyIgfTsKLSAgICAgICAgVGVzdFJ1bm5lci5tYWluKGNsYXNzTmFtZSk7Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChuZXcgRWFyRU1GVGVzdCgidGVzdEVBUlBvcHVsYXRpb24iKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEVhckVNRlRlc3QoInRlc3QxNEVBUlBvcHVsYXRpb24iKSk7Ci0gICAgICAgIHJldHVybiBzdWl0ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RUFSUG9wdWxhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlFTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yLnJlc2V0KCk7Ci0gICAgICAgIGNyZWF0ZUVBUigpOwotICAgICAgICAvL2NyZWF0ZUFwcENsaWVudCgpOwotCi0gICAgICAgIEFwcGxpY2F0aW9uUmVzb3VyY2UgREQgPSAoQXBwbGljYXRpb25SZXNvdXJjZSkgZWFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0JCS8vVE9ETzogaW5kaXZpZHVhbCB0ZXN0IGZvciBlYWNoIHZlcnNpb24KLQkJREQuc2V0VmVyc2lvbklEKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEKTsKLQkJc2V0VmVyc2lvbihWRVJTSU9OXzFfMyk7Ci0JCXNldE1vZHVsZVR5cGUoQVBQSUNBVElPTik7Ci0gICAgICAgIHBvcHVsYXRlUm9vdChERC5nZXRSb290T2JqZWN0KCkpOwotCi0JCVN0cmluZyBvdXQgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArInRlc3RPdXRwdXQvVGVzdEVBUiI7Ci0gICAgICAgIGVhckZpbGUuZXh0cmFjdFRvKG91dCwgQXJjaGl2ZS5FWFBBTkRfQUxMKTsKLSAgICAgICAgZWFyRmlsZS5jbG9zZSgpOwotCi0gICAgICAgIC8vQ29tcGFyZSB3b3JrIGluIHByb2dyZXNzCi0gICAgICAgIFN0cmluZyBjdXJEaXIgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeTsKLSAgICAgICAgU3RyaW5nIGV4YW1wbGVEZXBsb3ltZW50RGVzVVJJID0gY3VyRGlyICsgIkVNRlRlc3ROb0lEL2FwcGxpY2F0aW9uLnhtbCI7Ci0gICAgICAgIFN0cmluZyBjdXJEZXBsb3ltZW50RGVzVVJJID0gY3VyRGlyICsgInRlc3RPdXRwdXQvVGVzdEVBUi9NRVRBLUlORi9hcHBsaWNhdGlvbi54bWwiOwotCQlzZXRJZ25vcmVBdHQoaWdub3JhYmxlQXR0cmlidXRlcygpKTsKLQkJY29tcGFyZUNvbnRlbnRzSWdub3JlV2hpdGVzcGFjZShjdXJEZXBsb3ltZW50RGVzVVJJLCBleGFtcGxlRGVwbG95bWVudERlc1VSSSwgbnVsbCk7Ci0gICAgfQotICAgIAotCXB1YmxpYyB2b2lkIHRlc3QxNEVBUlBvcHVsYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvci5yZXNldCgpOwotCQljcmVhdGVFQVIoKTsKLQkJLy9jcmVhdGVBcHBDbGllbnQoKTsKLQotCQlBcHBsaWNhdGlvblJlc291cmNlIEREID0gKEFwcGxpY2F0aW9uUmVzb3VyY2UpIGVhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotCQkvL1RPRE86IGluZGl2aWR1YWwgdGVzdCBmb3IgZWFjaCB2ZXJzaW9uCi0JCURELnNldFZlcnNpb25JRChKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCk7Ci0JCXNldFZlcnNpb24oVkVSU0lPTl8xXzQpOwotCQlzZXRNb2R1bGVUeXBlKEFQUElDQVRJT04pOwotCQlwb3B1bGF0ZVJvb3QoREQuZ2V0Um9vdE9iamVjdCgpKTsKLQotCQlTdHJpbmcgb3V0ID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyJ0ZXN0T3V0cHV0L1Rlc3RFQVIxNCI7Ci0JCWVhckZpbGUuZXh0cmFjdFRvKG91dCwgQXJjaGl2ZS5FWFBBTkRfQUxMKTsKLQkJZWFyRmlsZS5jbG9zZSgpOwotCi0JCWdldEVBUigpOwotCQlhc3NlcnRFcXVhbHMoIjEuNCIsIGVhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5nZXRWZXJzaW9uKCkpOwotCQlvdXQgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArInRlc3RPdXRwdXQvVGVzdEVBUjE0XzIiOwotCQllYXJGaWxlLmV4dHJhY3RUbyhvdXQsIEFyY2hpdmUuRVhQQU5EX0FMTCk7Ci0JCQotCQllYXJGaWxlLmNsb3NlKCk7Ci0KLQkJLy9Db21wYXJlIHdvcmsgaW4gcHJvZ3Jlc3MKLQkJU3RyaW5nIGN1ckRpciA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5OwotCQlTdHJpbmcgZXhhbXBsZURlcGxveW1lbnREZXNVUkkgPSBvdXQgKyAiL01FVEEtSU5GL2FwcGxpY2F0aW9uLnhtbCI7Ci0JCVN0cmluZyBjdXJEZXBsb3ltZW50RGVzVVJJID0gY3VyRGlyICsgInRlc3RPdXRwdXQvVGVzdEVBUjE0L01FVEEtSU5GL2FwcGxpY2F0aW9uLnhtbCI7Ci0JCXNldElnbm9yZUF0dChpZ25vcmFibGVBdHRyaWJ1dGVzKCkpOwotCQljb21wYXJlQ29udGVudHNJZ25vcmVXaGl0ZXNwYWNlKGN1ckRlcGxveW1lbnREZXNVUkksIGV4YW1wbGVEZXBsb3ltZW50RGVzVVJJLCBudWxsKTsKLQl9Ci0gICAgcHVibGljIHZvaWQgY3JlYXRlRUFSKCkgewotICAgICAgICBTdHJpbmcgZWFyTmFtZSA9ICJUZXN0LmVhciI7Ci0gICAgICAgIGVhckZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUVBUkZpbGVJbml0aWFsaXplZChlYXJOYW1lKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShlYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkgIT0gbnVsbCk7Ci0gICAgfQotCi0JcHVibGljIHZvaWQgZ2V0RUFSKCkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGluID1BdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArInRlc3RPdXRwdXQvVGVzdEVBUjE0IjsKLQkJZWFyRmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbkVBUkZpbGUoaW4pOwotCQlhc3NlcnRUcnVlKGVhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSAhPSBudWxsKTsKLQl9Ci0JCi0JcHVibGljIEhhc2hTZXQgaWdub3JhYmxlQXR0cmlidXRlcygpewotCQlIYXNoU2V0IHNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCXNldC5hZGQoImlkIik7Ci0JCXJldHVybiBzZXQ7Ci0JfQotCi0gICAgcHVibGljIEVPYmplY3QgY3JlYXRlSW5zdGFuY2UoRVJlZmVyZW5jZSByZWYsIEVPYmplY3QgZU9iamVjdCkgewotCQlFQ2xhc3MgZUNsYXNzaWZpZXIgPSAoRUNsYXNzKXJlZi5nZXRFVHlwZSgpOwotICAgICAgICBpZiAoZUNsYXNzaWZpZXIuZ2V0TmFtZSgpLmVxdWFscygiTW9kdWxlIikpIHsKLSAgICAgICAgICAgIGNyZWF0ZWRNb2R1bGVzKys7Ci0gICAgICAgICAgICBzd2l0Y2ggKGNyZWF0ZWRNb2R1bGVzKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAoMSkgOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlSmF2YU1vZHVsZUluc3RhbmNlKGVDbGFzc2lmaWVyKTsKLSAgICAgICAgICAgICAgICBjYXNlICgyKSA6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVFSkJNb2R1bGVJbnN0YW5jZShlQ2xhc3NpZmllcik7Ci0gICAgICAgICAgICAgICAgY2FzZSAoMykgOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlV2ViTW9kdWxlSW5zdGFuY2UoZUNsYXNzaWZpZXIpOwotICAgICAgICAgICAgICAgIGNhc2UgKDQpIDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUNvbm5ldG9yTW9kdWxlSW5zdGFuY2UoZUNsYXNzaWZpZXIpOwotICAgICAgICAgICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlSmF2YU1vZHVsZUluc3RhbmNlKGVDbGFzc2lmaWVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIuY3JlYXRlSW5zdGFuY2UocmVmLGVPYmplY3QpOwotICAgIH0KLQotICAgIHByaXZhdGUgRU9iamVjdCBjcmVhdGVDb25uZXRvck1vZHVsZUluc3RhbmNlKEVDbGFzcyBlQ2xhc3NpZmllcikgewotICAgICAgICByZXR1cm4gKChBcHBsaWNhdGlvbkZhY3RvcnkpIGVDbGFzc2lmaWVyLmdldEVQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpKS5jcmVhdGVDb25uZWN0b3JNb2R1bGUoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEVPYmplY3QgY3JlYXRlV2ViTW9kdWxlSW5zdGFuY2UoRUNsYXNzIGVDbGFzc2lmaWVyKSB7Ci0gICAgICAgIHJldHVybiAoKEFwcGxpY2F0aW9uRmFjdG9yeSkgZUNsYXNzaWZpZXIuZ2V0RVBhY2thZ2UoKS5nZXRFRmFjdG9yeUluc3RhbmNlKCkpLmNyZWF0ZVdlYk1vZHVsZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgRU9iamVjdCBjcmVhdGVFSkJNb2R1bGVJbnN0YW5jZShFQ2xhc3MgZUNsYXNzaWZpZXIpIHsKLSAgICAgICAgcmV0dXJuICgoQXBwbGljYXRpb25GYWN0b3J5KSBlQ2xhc3NpZmllci5nZXRFUGFja2FnZSgpLmdldEVGYWN0b3J5SW5zdGFuY2UoKSkuY3JlYXRlRWpiTW9kdWxlKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBFT2JqZWN0IGNyZWF0ZUphdmFNb2R1bGVJbnN0YW5jZShFQ2xhc3MgZUNsYXNzaWZpZXIpIHsKLSAgICAgICAgcmV0dXJuICgoQXBwbGljYXRpb25GYWN0b3J5KSBlQ2xhc3NpZmllci5nZXRFUGFja2FnZSgpLmdldEVGYWN0b3J5SW5zdGFuY2UoKSkuY3JlYXRlSmF2YUNsaWVudE1vZHVsZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0U2hhcmVkT2JqZWN0QnlUeXBlKEVPYmplY3Qgb3duZXIsIEVSZWZlcmVuY2UgcmVmKSB7Ci0gICAgICAgIGlmIChyZWYuZ2V0TmFtZSgpLmVxdWFscygibW9kdWxlIikpCi0gICAgICAgICAgICByZXR1cm4gY3JlYXRlSmF2YU1vZHVsZUluc3RhbmNlKChFQ2xhc3MpIHJlZi5nZXRFVHlwZSgpKTsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldFNoYXJlZE9iamVjdEJ5VHlwZShvd25lciwgcmVmKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldERlcHRoRm9yQXR0cmlidXRlKEVTdHJ1Y3R1cmFsRmVhdHVyZSByZWYpIHsKLSAgICAgICAgaWYgKHJlZi5nZXROYW1lKCkuZXF1YWxzKCJtb2R1bGVzIikpCi0gICAgICAgICAgICByZXR1cm4gTlVNX01PRFVMRVM7Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXREZXB0aEZvckF0dHJpYnV0ZShyZWYpOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvRWpiRU1GRWRpdFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvRWpiRU1GRWRpdFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMzZTQ4Ny4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL0VqYkVNRkVkaXRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLmVtZnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUudGVzdHV0aWxpdGllcy5FTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eUlkZW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FSkJKYXJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5EdXBsaWNhdGVPYmplY3RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk9wZW5GYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5idnQuQXV0b21hdGVkQlZUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5DTVBBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Sb2xlU291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLk1ldGhvZFBlcm1pc3Npb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLlF1ZXJ5TWV0aG9kSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkVNRjJTQVhSZW5kZXJlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXJGYWN0b3J5OwotCi0KLXB1YmxpYyBjbGFzcyBFamJFTUZFZGl0VGVzdCBleHRlbmRzIEdlbmVyYWxFTUZFZGl0aW5nVGVzdCB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEVqYlBhY2thZ2UgRUpCX1BLRyA9IEVqYlBhY2thZ2UuZUlOU1RBTkNFOwotCUVBUkZpbGUgZWFyRmlsZTsKLQlFSkJKYXJGaWxlIGVqYkZpbGU7Ci0JRU9iamVjdCBtZXNCZWFuLCBlbnRpdHlCZWFuOwotCVNlY3VyaXR5SWRlbnRpdHkgc2VjSUQ7Ci0JUm9sZVNvdXJjZSByb2xlU291cmNlOwotCWludCBOVU1fQkVBTlMgPSAxMDsKLQlmaW5hbCBpbnQgTlVNX1JFTEFUSU9OX1JPTEVTID0gMjsKLQlpbnQgY3JlYXRlZEJlYW5zID0gMDsKLQlpbnQgY3JlYXRlZFNlY1JvbGVzID0gMDsKLQlwcm90ZWN0ZWQgaW50IGNyZWF0ZWRTZWN1cml0eUlkZW50aXRpZXMgPSAwOwotCWJvb2xlYW4gbXBGbGFnID0gZmFsc2U7Ci0KLSAgICBwdWJsaWMgRWpiRU1GRWRpdFRlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIENvbW1vbmFyY2hpdmVGYWN0b3J5IGdldEFyY2hpdmVGYWN0b3J5KCkgewotICAgICAgICByZXR1cm4gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbW1vbmFyY2hpdmVGYWN0b3J5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIEVqYkZhY3RvcnkgZ2V0RWpiRmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVqYkZhY3RvcnkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXBwbGljYXRpb25GYWN0b3J5IGdldEFwcGxpY2F0aW9uRmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25GYWN0b3J5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBnZXRXZWJBcHBGYWN0b3J5KCkgewotICAgICAgICByZXR1cm4gV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJhcHBsaWNhdGlvbkZhY3RvcnkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihqYXZhLmxhbmcuU3RyaW5nW10gYXJncykgewotCQlqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5tYWluKG5ldyBTdHJpbmdbXSB7IEVqYkVNRkVkaXRUZXN0LmNsYXNzLmdldE5hbWUoKSB9KTsgCi0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLSAgICAgICAgCi0gICAgICAgIC8qU3lzdGVtLm91dC5wcmludGxuKCJTd2l0Y2hpbmcgdG8gU0FYIFJlbmRlcmVyIGluICIgKyBFamJFTUZFZGl0VGVzdC5jbGFzcy5nZXROYW1lKCkpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBBbGxTQVhUZXN0cygidGVzdFN3aXRjaFJlbmRlcmVyIikpOyovCi0JCQotICAgICAgICBzdWl0ZS5hZGRUZXN0KG5ldyBFamJFTUZFZGl0VGVzdCgidGVzdEVKQkphckVkaXQiKSk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QobmV3IEVqYkVNRkVkaXRUZXN0KCJ0ZXN0V0NDTUphciIpKTsKLSAgICAgICAgLypzdWl0ZS5hZGRUZXN0KG5ldyBFamJFTUZFZGl0VGVzdCgidGVzdFdDQ01Qcm92aWRlZENhc2UiKSk7Ki8KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBzdWl0ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RUpCSmFyRWRpdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBnZXRFSkIoKTsKLQotCQlhc3NlcnRFcXVhbHMoIjIuMCIsIGVqYkZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5nZXRWZXJzaW9uKCkpOwotICAgICAgICBFSkJSZXNvdXJjZSBERCA9IChFSkJSZXNvdXJjZSkgZWpiRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0JCXNldFZlcnNpb24oVkVSU0lPTl8xXzMpOwotCQlzZXRNb2R1bGVUeXBlKEVKQik7IAotICAgICAgICBlZGl0Um9vdChERC5nZXRSb290T2JqZWN0KCkpOwotICAgICAgICBTdHJpbmcgY3VyRGlyID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3Rvcnk7Ci0gICAgICAgIFN0cmluZyBvdXQgPSBjdXJEaXIgKyAidGVzdE91dHB1dC9FTUZNb2RlbENyZWF0aW9uVGVzdHMvRWRpdEVqYkVBUiI7Ci0gICAgICAgIGVqYkZpbGUuZXh0cmFjdFRvKG91dCwgQXJjaGl2ZS5FWFBBTkRfQUxMKTsKLSAgICAgICAgZWpiRmlsZS5jbG9zZSgpOwotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIC8vQ29tcGFyZSB3b3JrIGluIHByb2dyZXNzCi0gICAgICAgIAotICAgICAgICBTdHJpbmcgZXhhbXBsZURlcGxveW1lbnREZXNVUkkgPSBudWxsOwotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbihSZW5kZXJlckZhY3RvcnkuZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpKTsKLSAgICAgICAgaWYgKFJlbmRlcmVyRmFjdG9yeS5nZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCkgaW5zdGFuY2VvZiBFTUYyU0FYUmVuZGVyZXJGYWN0b3J5KXsKLSAgICAgICAgICAgIGV4YW1wbGVEZXBsb3ltZW50RGVzVVJJID0gY3VyRGlyICsgIkVNRlRlc3RzL2VqYi1qYXIyLTBzYXgueG1sIjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBleGFtcGxlRGVwbG95bWVudERlc1VSSSA9IGN1ckRpciArICJFTUZUZXN0cy9lamItamFyMi0wLnhtbCI7Ci0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJGaWxlOiAiICsgZXhhbXBsZURlcGxveW1lbnREZXNVUkkpOwotICAgICAgICBTdHJpbmcgY3VyRGVwbG95bWVudERlc1VSSSA9IG91dCArICIvTUVUQS1JTkYvZWpiLWphci54bWwiOwotICAgICAgICBjb21wYXJlQ29udGVudHNJZ25vcmVXaGl0ZXNwYWNlKGN1ckRlcGxveW1lbnREZXNVUkksIGV4YW1wbGVEZXBsb3ltZW50RGVzVVJJLCAiIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdDQ01KYXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGluID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAiLi4vdGVzdERhdGEvZWpiIjsKLQkJQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucyA9IG5ldyBBcmNoaXZlT3B0aW9ucygpOwotCQlvcHRpb25zLnNldElzUmVhZE9ubHkodHJ1ZSk7Ci0JCWVqYkZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5FSkJKYXJGaWxlKG9wdGlvbnMsIGluKTsgCi0JCSAKLSAgICAgICAgRUpCUmVzb3VyY2UgREQgPSAoRUpCUmVzb3VyY2UpIGVqYkZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotCQlERC5nZXRSb290T2JqZWN0KCk7Ci0KLSAgICAgICAgU3RyaW5nIG91dCA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgIi4uL3Rlc3REYXRhL3Rlc3RPdXRwdXQiOwotICAgICAgICBlamJGaWxlLmV4dHJhY3RUbyhvdXQsIEFyY2hpdmUuRVhQQU5EX0FMTCk7Ci0gICAgICAgIGVqYkZpbGUuY2xvc2UoKTsKLQotICAgICAgICAvKkRELnNhdmUoU3lzdGVtLm91dCwgbnVsbCk7ICovCi0gICAgICAgIAotICAgICAgICAvL0NvbXBhcmUgd29yayBpbiBwcm9ncmVzcwotICAgICAgICBTdHJpbmcgY3VyRGlyID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3Rvcnk7Ci0gICAgICAgIFN0cmluZyBleGFtcGxlRGVwbG95bWVudERlc1VSSSA9IGluICsgIi9NRVRBLUlORi9lamItamFyLnhtbCI7Ci0gICAgICAgIFN0cmluZyBjdXJEZXBsb3ltZW50RGVzVVJJID0gb3V0ICsgIi9NRVRBLUlORi9lamItamFyLnhtbCI7Ci0KLSAgICAgICAgY29tcGFyZUNvbnRlbnRzKGN1ckRlcGxveW1lbnREZXNVUkksIGV4YW1wbGVEZXBsb3ltZW50RGVzVVJJKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmVxdWlyZXMgajJlZS5jb3JlLndzLmV4dCB0byBiZSBvbiB0aGUgY2xhc3NwYXRoCi0gICAgICogQHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uCi0gICAgICovCi0vKiAgICBwdWJsaWMgdm9pZCB0ZXN0V0NDTVByb3ZpZGVkQ2FzZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCVN0cmluZyBpbiA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgIi4uL3djY20vZWFyIjsKLSAgICAgICAgRUFSRmlsZSBlYXJGaWxlID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAKLSAgICAgICAgICAgIENvbW1vbmFyY2hpdmVGYWN0b3J5IGZhY3RvcnkgPQotICAgICAgICAgICAgICAgICAgICBDb21tb25hcmNoaXZlRmFjdG9yeUltcGwuZ2V0QWN0aXZlRmFjdG9yeSgpOwotICAgICAgICAgICAgQXJjaGl2ZU9wdGlvbnMgb3B0ID0gbmV3IEFyY2hpdmVPcHRpb25zKCk7Ci0gICAgICAgICAgICBvcHQuc2V0SXNSZWFkT25seSAodHJ1ZSk7Ci0gICAgICAgICAgICBvcHQuc2V0VXNlSmF2YVJlZmxlY3Rpb24gKGZhbHNlKTsKLSAKLSAgICAgICAgICAgIGVhckZpbGUgPSBmYWN0b3J5Lm9wZW5FQVJGaWxlIChvcHQsIGluKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiAoInVyaTogIiArIGVhckZpbGUuZ2V0VVJJKCkpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuICgib3JpZ3VyaTogIiArIGVhckZpbGUuZ2V0T3JpZ2luYWxVUkkoKSk7Ci0gCi0gICAgICAgICAgICBBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbiA9IGVhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLSAgICAgICAgICAgIEFwcGxpY2F0aW9uQmluZGluZyBhcHBCaW5kaW5ncyA9IGVhckZpbGUuZ2V0QmluZGluZ3MoKTsKLSAgICAgICAgICAgIEFwcGxpY2F0aW9uRXh0ZW5zaW9uIGFwcEV4dGVuc2lvbnMgPSBlYXJGaWxlLmdldEV4dGVuc2lvbnMoKTsKLSAKLQotICAgICAgICBJdGVyYXRvciBycyA9IGVhckZpbGUuZ2V0TG9hZGVkTW9mUmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKHJzLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgUmVzb3VyY2UgciA9IChSZXNvdXJjZSkgcnMubmV4dCgpOwotIAotICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmbyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtIChyLmdldFVSSSgpLnRvU3RyaW5nKCkucmVwbGFjZSgnLycsICctJykpOwotICAgICAgICAgICAgci5zYXZlIChmbywgbmV3IEhhc2hNYXAoKSk7Ci0gICAgICAgICAgICBmby5mbHVzaCgpOwotICAgICAgICAgICAgZm8uY2xvc2UoKTsKLSAgICAgICAgfQotIAotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI9PT09PT09PT09PERvbmUgQXBwIEREPj09PT09PT09PT0iKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiAoIiIpOwotIAotCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkgewotICAgICAgICAgICAgaWYoZWFyRmlsZSAhPSBudWxsKQotICAgICAgICAgICAgZWFyRmlsZS5jbG9zZSgpOwotICAgICAgICB9Ci0KLSAgICB9Ki8KLQotICAgIHB1YmxpYyB2b2lkIGdldEVKQigpIHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24sIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGluID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAibG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvIjsKLQkJIGVqYkZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5FSkJKYXJGaWxlKGluKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShlamJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkgIT0gbnVsbCk7Ci0gICAgfQotCi0JcHVibGljIEVPYmplY3QgY3JlYXRlSW5zdGFuY2UoRUNsYXNzIGVDbGFzc2lmaWVyKSB7Ci0JCWlmIChlQ2xhc3NpZmllci5nZXROYW1lKCkuZXF1YWxzKCJFbnRlcnByaXNlQmVhbiIpKSB7Ci0JCQljcmVhdGVkQmVhbnMrKzsKLQkJCXN3aXRjaCAoY3JlYXRlZEJlYW5zKSB7Ci0JCQkJY2FzZSAoMykgOgotCQkJCQlyZXR1cm4gY3JlYXRlQ29udGFpbmVyTWFuYWdlZEVudGl0eUluc3RhbmNlKGVDbGFzc2lmaWVyKTsKLQkJCQljYXNlICg3KSA6Ci0JCQkJCXJldHVybiBjcmVhdGVNZXNzYWdlQmVhbkluc3RhbmNlKGVDbGFzc2lmaWVyKTsKLQkJCQljYXNlICg0KSA6Ci0JCQkJY2FzZSAoOCkgOgotCQkJCQlyZXR1cm4gY3JlYXRlU2Vzc2lvbkJlYW5JbnN0YW5jZShlQ2xhc3NpZmllcik7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBjcmVhdGVFbnRpdHlCZWFuSW5zdGFuY2UoZUNsYXNzaWZpZXIpOwotCQkJfQotCQl9IGVsc2UgaWYgKGVDbGFzc2lmaWVyLmdldE5hbWUoKS5lcXVhbHMoIlNlY3VyaXR5SWRlbnRpdHkiKSkKLQkJCXJldHVybiBjcmVhdGVTZWN1cml0eUlkZW50aXRpeUluc3RhbmNlKGVDbGFzc2lmaWVyKTsKLQkJZWxzZSBpZiAoZUNsYXNzaWZpZXIuZ2V0TmFtZSgpLmVxdWFscygiUm9sZVNvdXJjZSIpKQotCQkJcmV0dXJuIGNyZWF0ZVJvbGVTb3VyY2VJbnN0YW5jZShlQ2xhc3NpZmllcik7Ci0JCWVsc2UgaWYgKGVDbGFzc2lmaWVyID09IEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RUF0dHJpYnV0ZSgpKQotCQkJcmV0dXJuIGdldEVqYkZhY3RvcnkoKS5jcmVhdGVDTVBBdHRyaWJ1dGUoKTsKLQkJcmV0dXJuIHN1cGVyLmNyZWF0ZUluc3RhbmNlKGVDbGFzc2lmaWVyKTsKLQl9Ci0KLQlwcml2YXRlIEVPYmplY3QgY3JlYXRlU2VjdXJpdHlJZGVudGl0aXlJbnN0YW5jZShFQ2xhc3MgZUNsYXNzaWZpZXIpIHsKLQkJLyogQWx0ZXJuYXRlIHR5cGVzICovCi0JCWNyZWF0ZWRTZWNSb2xlcysrOwotCQlpZiAoKGNyZWF0ZWRTZWNSb2xlcyAmIDEpID09IDApCi0JCQlyZXR1cm4gQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVXNlQ2FsbGVySWRlbnRpdHkoKTsKLQkJZWxzZQotCQkJcmV0dXJuIENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJ1bkFzU3BlY2lmaWVkSWRlbnRpdHkoKTsKLQl9Ci0KLQlwcml2YXRlIEVPYmplY3QgY3JlYXRlUm9sZVNvdXJjZUluc3RhbmNlKEVDbGFzcyBlQ2xhc3NpZmllcikgewotCQlyZXR1cm4gKChFamJGYWN0b3J5KSBlQ2xhc3NpZmllci5nZXRFUGFja2FnZSgpLmdldEVGYWN0b3J5SW5zdGFuY2UoKSkuY3JlYXRlUm9sZVNvdXJjZSgpOwotCX0KLQotCXByaXZhdGUgRU9iamVjdCBjcmVhdGVNZXNzYWdlQmVhbkluc3RhbmNlKEVDbGFzcyBlQ2xhc3NpZmllcikgewotCQlyZXR1cm4gKChFamJGYWN0b3J5KSBlQ2xhc3NpZmllci5nZXRFUGFja2FnZSgpLmdldEVGYWN0b3J5SW5zdGFuY2UoKSkuY3JlYXRlTWVzc2FnZURyaXZlbigpOwotCX0KLQotCXByaXZhdGUgRU9iamVjdCBjcmVhdGVTZXNzaW9uQmVhbkluc3RhbmNlKEVDbGFzcyBlQ2xhc3NpZmllcikgewotCQlyZXR1cm4gKChFamJGYWN0b3J5KSBlQ2xhc3NpZmllci5nZXRFUGFja2FnZSgpLmdldEVGYWN0b3J5SW5zdGFuY2UoKSkuY3JlYXRlU2Vzc2lvbigpOwotCX0KLQotCXByaXZhdGUgRU9iamVjdCBjcmVhdGVFbnRpdHlCZWFuSW5zdGFuY2UoRUNsYXNzIGVDbGFzc2lmaWVyKSB7Ci0JCXJldHVybiAoKEVqYkZhY3RvcnkpIGVDbGFzc2lmaWVyLmdldEVQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpKS5jcmVhdGVFbnRpdHkoKTsKLQl9Ci0KLQlwcml2YXRlIEVPYmplY3QgY3JlYXRlQ29udGFpbmVyTWFuYWdlZEVudGl0eUluc3RhbmNlKEVDbGFzcyBlQ2xhc3NpZmllcikgewotCQlyZXR1cm4gRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0LkdlbmVyYWxFTUZUZXN0I2dldERlcHRoRm9yQXR0cmlidXRlKEVSZWZlcmVuY2UpCi0JICovCi0JcHVibGljIGludCBnZXREZXB0aEZvckF0dHJpYnV0ZShFUmVmZXJlbmNlIHJlZikgewotCQlpZiAocmVmLmdldE5hbWUoKS5lcXVhbHMoImVudGVycHJpc2VCZWFucyIpKQotCQkJcmV0dXJuIE5VTV9CRUFOUzsKLQkJZWxzZSBpZiAocmVmLmdldE5hbWUoKS5lcXVhbHMoImVudGl0eUJlYW5zIikpCi0JCQlyZXR1cm4gTlVNX0JFQU5TOwotCQllbHNlIGlmIChyZWYuZ2V0TmFtZSgpLmVxdWFscygicmVsYXRpb25zaGlwUm9sZXMiKSkKLQkJCXJldHVybiBOVU1fUkVMQVRJT05fUk9MRVM7Ci0JCXJldHVybiBzdXBlci5nZXREZXB0aEZvckF0dHJpYnV0ZShyZWYpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5lbWZ0ZXN0LkdlbmVyYWxFTUZQb3B1bGF0aW9uVGVzdCNwb3B1bGF0ZUZlYXR1cmVzKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSovCi0JcHVibGljIHZvaWQgcG9wdWxhdGVGZWF0dXJlcyhFT2JqZWN0IGVPYmplY3QpIHsKLQkJaWYgKGVPYmplY3QuZUNsYXNzKCkgPT0gRUpCX1BLRy5nZXRDTVBBdHRyaWJ1dGUoKSkgewotCQkJKChDTVBBdHRyaWJ1dGUpIGVPYmplY3QpLnNldE5hbWUoKFN0cmluZykgRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvci5jcmVhdGVBdHRyaWJ1dGUoRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFTmFtZWRFbGVtZW50X05hbWUoKSxlT2JqZWN0KSk7Ci0JCQkoKENNUEF0dHJpYnV0ZSkgZU9iamVjdCkuc2V0RVR5cGUoKEVDbGFzc2lmaWVyKSBjcmVhdGVKYXZhQ2xhc3NQcm94eShudWxsKSk7Ci0JCX0gZWxzZQotCQkJc3VwZXIuZWRpdEZlYXR1cmVzKGVPYmplY3QpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuZW1mdGVzdC5HZW5lcmFsRU1GUG9wdWxhdGlvblRlc3QjcG9wdWxhdGVBdHRyaWJ1dGVzKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlQXR0cmlidXRlcyhFT2JqZWN0IGVPYmplY3QpIHsKLQkJaWYgKGVPYmplY3QgaW5zdGFuY2VvZiBRdWVyeU1ldGhvZEltcGwpIHsKLQkJCUxpc3QgYXR0cmlidXRlcyA9IGVPYmplY3QuZUNsYXNzKCkuZ2V0RUFsbEF0dHJpYnV0ZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5zaXplKCk7IGkrKykgewotCQkJCUVBdHRyaWJ1dGUgYXR0ID0gKEVBdHRyaWJ1dGUpIGF0dHJpYnV0ZXMuZ2V0KGkpOwotCQkJCU9iamVjdCB2YWx1ZSA9IGNyZWF0ZUF0dHJpYnV0ZVZhbHVlKGF0dCwgZU9iamVjdCk7Ci0JCQkJaWYgKGF0dC5nZXROYW1lKCkuZXF1YWxzKCJwYXJtcyIpICYmIHZhbHVlID09IG51bGwpewotCQkJCQl2YWx1ZSA9IGNyZWF0ZUF0dHJpYnV0ZVZhbHVlKGF0dCwgZU9iamVjdCk7Ci0JCQkJfQotCQkJCWlmIChhdHQuaXNDaGFuZ2VhYmxlKCkpCi0JCQkJCWVPYmplY3QuZVNldChhdHQsIHZhbHVlKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChlT2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kUGVybWlzc2lvbkltcGwpIHsKLQkJCUxpc3QgYXR0cmlidXRlcyA9IGVPYmplY3QuZUNsYXNzKCkuZ2V0RUFsbEF0dHJpYnV0ZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5zaXplKCk7IGkrKykgewotCQkJCUVBdHRyaWJ1dGUgYXR0ID0gKEVBdHRyaWJ1dGUpIGF0dHJpYnV0ZXMuZ2V0KGkpOwotCQkJCWlmKGF0dC5nZXROYW1lKCkuZXF1YWxzKCJ1bmNoZWNrZWQiKSAmJiBtcEZsYWcpewotCQkJCQljb250aW51ZTsJCQkJCQotCQkJCX0JCi0JCQkJCi0JCQkJT2JqZWN0IHZhbHVlID0gY3JlYXRlQXR0cmlidXRlVmFsdWUoYXR0LCBlT2JqZWN0KTsKLQkJCQlpZiAoYXR0LmlzQ2hhbmdlYWJsZSgpKQotCQkJCQllT2JqZWN0LmVTZXQoYXR0LCB2YWx1ZSk7Ci0JCQl9IAotCQkJbXBGbGFnID0gIW1wRmxhZzsKLQkJfSBlbHNlCi0JCQlzdXBlci5lZGl0QXR0cmlidXRlcyhlT2JqZWN0KTsKLQl9Ci0JCi0KLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVNoYXJlZFJlZmVyZW5jZShFT2JqZWN0IGVPYmplY3QsIEVSZWZlcmVuY2UgcmVmKSB7Ci0JCWlmKGVPYmplY3QgaW5zdGFuY2VvZiBNZXRob2RQZXJtaXNzaW9uSW1wbCAmJiByZWYuZ2V0TmFtZSgpLmVxdWFscygicm9sZXMiKSl7Ci0JCQltcEZsYWcgPSAhbXBGbGFnOwotCQkJLy9pZiBtZXRob2QgcGVybWlzc2lvbiB1bmNoZWNrZWQgaWdub3JlIHJvbGVzCi0JCQlpZighbXBGbGFnKXsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIucG9wdWxhdGVTaGFyZWRSZWZlcmVuY2UoZU9iamVjdCwgcmVmKTsKLQl9Ci0KLQlwdWJsaWMgSGFzaFNldCBpZ25vcmFibGVBdHRyaWJ1dGVzKCl7Ci0JCUhhc2hTZXQgc2V0ID0gbmV3IEhhc2hTZXQoKTsKLQkJc2V0LmFkZCgiaWQiKTsKLQkJcmV0dXJuIHNldDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWVhckZpbGUgPSBudWxsOwotCQllamJGaWxlID0gbnVsbDsKLQkJbWVzQmVhbiA9IG51bGw7Ci0JCWVudGl0eUJlYW4gPSBudWxsOwotCQlzZWNJRCAgPSBudWxsOwotCQlyb2xlU291cmNlID0gbnVsbDsKLQotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9FamJFTUZUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL0VqYkVNRlRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE4MWI1Ni4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL0VqYkVNRlRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2NCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuZW1mdGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFDbGFzc0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLnRlc3R1dGlsaXRpZXMuRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlJZGVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUpCSmFyRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5PcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLmJ2dC5BdXRvbWF0ZWRCVlQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNNUEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01SRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RQZXJtaXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Sb2xlU291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVKQlJlbGF0aW9uc2hpcFJvbGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLk1ldGhvZFBlcm1pc3Npb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLlF1ZXJ5TWV0aG9kSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFSW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotCi0KLXB1YmxpYyBjbGFzcyBFamJFTUZUZXN0IGV4dGVuZHMgR2VuZXJhbEVNRlBvcHVsYXRpb25UZXN0IHsKLQlzdGF0aWMgewotCQkvL1RlbXBvcmFyeSB3b3JrYXJvdW5kIHRvIGtlZXAgcGFja2FnZXMgZnJvbSBiZWluZyByZWdpc3RlcmVkIHR3aWNlCi0JCUoyRUVJbml0LmluaXQoKTsKLQl9Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBFamJQYWNrYWdlIEVKQl9QS0cgPSBFamJQYWNrYWdlLmVJTlNUQU5DRTsKLQlFQVJGaWxlIGVhckZpbGU7Ci0JcHJvdGVjdGVkIEVKQkphckZpbGUgZWpiRmlsZTsKLQlFT2JqZWN0IG1lc0JlYW4sIGVudGl0eUJlYW47Ci0JU2VjdXJpdHlJZGVudGl0eSBzZWNJRDsKLQlSb2xlU291cmNlIHJvbGVTb3VyY2U7Ci0JaW50IE5VTV9CRUFOUyA9IDEwOwotCWZpbmFsIGludCBOVU1fUkVMQVRJT05fUk9MRVMgPSAyOwotCWludCBjcmVhdGVkQmVhbnMgPSAwOwotCWludCBjcmVhdGVkU2VjUm9sZXMgPSAwOwotCXByb3RlY3RlZCBpbnQgY3JlYXRlZFNlY3VyaXR5SWRlbnRpdGllcyA9IDA7Ci0JYm9vbGVhbiBtcEZsYWcgPSBmYWxzZTsKLQlib29sZWFuIGZpcnN0UmV0dXJuVHlwZU1hcHBpbmcgPSB0cnVlOwotCXB1YmxpYyBFamJFTUZUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyBDb21tb25hcmNoaXZlRmFjdG9yeSBnZXRBcmNoaXZlRmFjdG9yeSgpIHsKLQkJcmV0dXJuIENvbW1vbmFyY2hpdmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21tb25hcmNoaXZlRmFjdG9yeSgpOwotCX0KLQotCXB1YmxpYyBFamJGYWN0b3J5IGdldEVqYkZhY3RvcnkoKSB7Ci0JCXJldHVybiBFSkJfUEtHLmdldEVqYkZhY3RvcnkoKTsKLQl9Ci0KLQlwdWJsaWMgQXBwbGljYXRpb25GYWN0b3J5IGdldEFwcGxpY2F0aW9uRmFjdG9yeSgpIHsKLQkJcmV0dXJuIEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25GYWN0b3J5KCk7Ci0JfQotCi0JcHVibGljIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBnZXRXZWJBcHBGYWN0b3J5KCkgewotCQlyZXR1cm4gV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJhcHBsaWNhdGlvbkZhY3RvcnkoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihqYXZhLmxhbmcuU3RyaW5nW10gYXJncykgewotCQlqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5tYWluKG5ldyBTdHJpbmdbXSB7IEVqYkVNRlRlc3QuY2xhc3MuZ2V0TmFtZSgpfSk7Ci0JfQotCXB1YmxpYyBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQotCQkvKlN5c3RlbS5vdXQucHJpbnRsbigiU3dpdGNoaW5nIHRvIFNBWCBSZW5kZXJlciBpbiAiICsgRWpiRU1GVGVzdC5jbGFzcy5nZXROYW1lKCkpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBBbGxTQVhUZXN0cygidGVzdFN3aXRjaFJlbmRlcmVyIikpOyovCi0JCXN1aXRlLmFkZFRlc3QobmV3IEVqYkVNRlRlc3QoInRlc3RFSkJKYXJQb3B1bGF0aW9uIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBFamJFTUZUZXN0KCJ0ZXN0MTRFSkJKYXJQb3B1bGF0aW9uIikpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVKQkphclBvcHVsYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvci5yZXNldCgpOwotCQljcmVhdGVFQVIoKTsKLQkJY3JlYXRlRUpCKCk7Ci0KLQkJRUpCUmVzb3VyY2UgREQgPSAoRUpCUmVzb3VyY2UpIGVqYkZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotCQkvL1RPRE86IGluZGl2aWR1YWwgdGVzdCBmb3IgZWFjaCB2ZXJzaW9uCi0JCURELnNldFZlcnNpb25JRChKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCk7Ci0JCXNldFZlcnNpb24oVkVSU0lPTl8xXzMpOwotCQlzZXRNb2R1bGVUeXBlKEVKQik7Ci0JCXBvcHVsYXRlUm9vdChERC5nZXRSb290T2JqZWN0KCkpOwotCi0JCVN0cmluZyBvdXQgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArInRlc3RPdXRwdXQvVGVzdEVKQkVBUiI7Ci0JCWVhckZpbGUuZXh0cmFjdFRvKG91dCwgQXJjaGl2ZS5FWFBBTkRfQUxMKTsKLQkJZWFyRmlsZS5jbG9zZSgpOwotCQlzZXRFcXVpdmFsZW50TGluZXMoZ2V0RXF1aXZhbGVudExpbmVzTWFwKCkpOwotCQkvL0NvbXBhcmUgd29yayBpbiBwcm9ncmVzcwotCQlTdHJpbmcgY3VyRGlyID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3Rvcnk7Ci0JCVN0cmluZyBleGFtcGxlRGVwbG95bWVudERlc1VSSSA9IGN1ckRpciArICIvRU1GVGVzdE5vSUQvZWpiLWphci54bWwiOwotCQlTdHJpbmcgY3VyRGVwbG95bWVudERlc1VSSSA9IGN1ckRpciArICJ0ZXN0T3V0cHV0L1Rlc3RFSkJFQVIvZm9vRUpCL01FVEEtSU5GL2VqYi1qYXIueG1sIjsKLQkJc2V0SWdub3JlQXR0KGlnbm9yYWJsZUF0dHJpYnV0ZXMoKSk7Ci0JCWNvbXBhcmVDb250ZW50c0lnbm9yZVdoaXRlc3BhY2UoY3VyRGVwbG95bWVudERlc1VSSSwgZXhhbXBsZURlcGxveW1lbnREZXNVUkksIG51bGwpOwotLy8JCURELnVubG9hZCgpOwotLy8JCURELmxvYWQobmV3IEhhc2hNYXAoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3QxNEVKQkphclBvcHVsYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvci5yZXNldCgpOwotCQljcmVhdGVFQVIoKTsKLQkJY3JlYXRlRUpCKCk7Ci0KLQkJRUpCUmVzb3VyY2UgREQgPSAoRUpCUmVzb3VyY2UpIGVqYkZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotCQkvL1RPRE86IGluZGl2aWR1YWwgdGVzdCBmb3IgZWFjaCB2ZXJzaW9uCi0JCURELnNldFZlcnNpb25JRChKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCk7Ci0JCXNldFZlcnNpb24oVkVSU0lPTl8xXzQpOwotCQlzZXRNb2R1bGVUeXBlKEVKQik7Ci0JCS8vc2V0R2VuZXJhbERlcHRoKDIpOwotCQlwb3B1bGF0ZVJvb3QoREQuZ2V0Um9vdE9iamVjdCgpKTsKLQkJU3RyaW5nIG91dCA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsidGVzdE91dHB1dC9UZXN0RUpCRUFSMTQiOwotCQllYXJGaWxlLmV4dHJhY3RUbyhvdXQsIEFyY2hpdmUuRVhQQU5EX0FMTCk7Ci0JCWVhckZpbGUuY2xvc2UoKTsKLQkJCi0JCXNldEVxdWl2YWxlbnRMaW5lcyhnZXRFcXVpdmFsZW50TGluZXNNYXAoKSk7Ci0JCWdldEVKQigpOwotCQlhc3NlcnRFcXVhbHMoIjIuMSIsIGVqYkZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5nZXRWZXJzaW9uKCkpOwotCQlvdXQgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArInRlc3RPdXRwdXQvVGVzdEVKQkVBUjE0XzIiOwotCQllamJGaWxlLmV4dHJhY3RUbyhvdXQsIEFyY2hpdmUuRVhQQU5EX0FMTCk7Ci0JCWVqYkZpbGUuY2xvc2UoKTsKLQotCQkvL0NvbXBhcmUgd29yayBpbiBwcm9ncmVzcwotCQlTdHJpbmcgY3VyRGlyID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3Rvcnk7Ci0JCVN0cmluZyBleGFtcGxlRGVwbG95bWVudERlc1VSSSA9IG91dCArICIvTUVUQS1JTkYvZWpiLWphci54bWwiOwotCQlTdHJpbmcgY3VyRGVwbG95bWVudERlc1VSSSA9IGN1ckRpciArICJ0ZXN0T3V0cHV0L1Rlc3RFSkJFQVIxNC9mb29FSkIvTUVUQS1JTkYvZWpiLWphci54bWwiOwotCQlzZXRJZ25vcmVBdHQoaWdub3JhYmxlQXR0cmlidXRlcygpKTsKLQkJY29tcGFyZUNvbnRlbnRzSWdub3JlV2hpdGVzcGFjZShjdXJEZXBsb3ltZW50RGVzVVJJLCBleGFtcGxlRGVwbG95bWVudERlc1VSSSwgbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIE1hcCBnZXRFcXVpdmFsZW50TGluZXNNYXAoKSB7Ci0JCU1hcCBsaW5lcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCWxpbmVzLnB1dCgiPGNhc2NhZGUtZGVsZXRlPjwvY2FzY2FkZS1kZWxldGU+IiwgIjxjYXNjYWRlLWRlbGV0ZS8+Iik7Ci0JCWxpbmVzLnB1dCgiPG1ldGhvZC1wYXJhbXM+PC9tZXRob2QtcGFyYW1zPiIsIjxtZXRob2QtcGFyYW1zLz4iKTsKLQkJbGluZXMucHV0KCI8dW5jaGVja2VkPjwvdW5jaGVja2VkPiIsIjx1bmNoZWNrZWQvPiIpOyAKLQkJbGluZXMucHV0KCI8dXNlLWNhbGxlci1pZGVudGl0eT48L3VzZS1jYWxsZXItaWRlbnRpdHk+IiwiPHVzZS1jYWxsZXItaWRlbnRpdHkvPiIpOwotCQlyZXR1cm4gbGluZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgZ2V0RUpCKCkgdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiwgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlTdHJpbmcgaW4gPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArInRlc3RPdXRwdXQvVGVzdEVKQkVBUjE0L2Zvb0VKQiI7Ci0JCWVqYkZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5FSkJKYXJGaWxlKGluKTsKLQkJYXNzZXJ0VHJ1ZShlamJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkgIT0gbnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlRUpCKCkgdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiB7Ci0JCWVqYkZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUVKQkphckZpbGVJbml0aWFsaXplZCgiZm9vRUpCIik7Ci0JCWVqYkZpbGUgPSAoRUpCSmFyRmlsZSkgZWFyRmlsZS5hZGRDb3B5KGVqYkZpbGUpOwotCQllamJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuc2V0RGlzcGxheU5hbWUoImZvb0VKQiIpOwotCQlhc3NlcnRUcnVlKGVqYkZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSAhPSBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVFQVIoKSB7Ci0JCVN0cmluZyBlYXJOYW1lID0gIlRlc3QuZWFyIjsKLQkJZWFyRmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlRUFSRmlsZUluaXRpYWxpemVkKGVhck5hbWUpOwotCQlhc3NlcnRUcnVlKGVhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSAhPSBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGVJbnN0YW5jZShFUmVmZXJlbmNlIHJlZiwgRU9iamVjdCBlT2JqZWN0KSB7Ci0JCUVDbGFzcyBlQ2xhc3NpZmllciA9IChFQ2xhc3MpcmVmLmdldEVUeXBlKCk7Ci0JCWlmIChlQ2xhc3NpZmllci5nZXROYW1lKCkuZXF1YWxzKCJFbnRlcnByaXNlQmVhbiIpKSB7Ci0JCQljcmVhdGVkQmVhbnMrKzsKLQkJCXN3aXRjaCAoY3JlYXRlZEJlYW5zKSB7Ci0JCQkJY2FzZSAoMykgOgotCQkJCQlyZXR1cm4gY3JlYXRlQ29udGFpbmVyTWFuYWdlZEVudGl0eUluc3RhbmNlKGVDbGFzc2lmaWVyKTsKLQkJCQljYXNlICg3KSA6Ci0JCQkJCXJldHVybiBjcmVhdGVNZXNzYWdlQmVhbkluc3RhbmNlKGVDbGFzc2lmaWVyKTsKLQkJCQljYXNlICg0KSA6Ci0JCQkJY2FzZSAoOCkgOgotCQkJCQlyZXR1cm4gY3JlYXRlU2Vzc2lvbkJlYW5JbnN0YW5jZShlQ2xhc3NpZmllcik7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBjcmVhdGVFbnRpdHlCZWFuSW5zdGFuY2UoZUNsYXNzaWZpZXIpOwotCQkJfQotCQl9IGVsc2UgaWYgKGVDbGFzc2lmaWVyLmdldE5hbWUoKS5lcXVhbHMoIlNlY3VyaXR5SWRlbnRpdHkiKSkKLQkJCXJldHVybiBjcmVhdGVTZWN1cml0eUlkZW50aXRpeUluc3RhbmNlKGVDbGFzc2lmaWVyKTsKLQkJZWxzZSBpZiAoZUNsYXNzaWZpZXIuZ2V0TmFtZSgpLmVxdWFscygiUm9sZVNvdXJjZSIpKQotCQkJcmV0dXJuIGNyZWF0ZVJvbGVTb3VyY2VJbnN0YW5jZShlQ2xhc3NpZmllcik7Ci0JCWVsc2UgaWYgKGVDbGFzc2lmaWVyID09IEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RUF0dHJpYnV0ZSgpKQotCQkJcmV0dXJuIGdldEVqYkZhY3RvcnkoKS5jcmVhdGVDTVBBdHRyaWJ1dGUoKTsKLQkJcmV0dXJuIHN1cGVyLmNyZWF0ZUluc3RhbmNlKHJlZixlT2JqZWN0KTsKLQl9Ci0KLQlwcml2YXRlIEVPYmplY3QgY3JlYXRlU2VjdXJpdHlJZGVudGl0aXlJbnN0YW5jZShFQ2xhc3MgZUNsYXNzaWZpZXIpIHsKLQkJLyogQWx0ZXJuYXRlIHR5cGVzICovCi0JCWNyZWF0ZWRTZWNSb2xlcysrOwotCQlpZiAoKGNyZWF0ZWRTZWNSb2xlcyAmIDEpID09IDApCi0JCQlyZXR1cm4gQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVXNlQ2FsbGVySWRlbnRpdHkoKTsKLQkJZWxzZQotCQkJcmV0dXJuIENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJ1bkFzU3BlY2lmaWVkSWRlbnRpdHkoKTsKLQl9Ci0KLQlwcml2YXRlIEVPYmplY3QgY3JlYXRlUm9sZVNvdXJjZUluc3RhbmNlKEVDbGFzcyBlQ2xhc3NpZmllcikgewotCQlyZXR1cm4gKChFamJGYWN0b3J5KSBlQ2xhc3NpZmllci5nZXRFUGFja2FnZSgpLmdldEVGYWN0b3J5SW5zdGFuY2UoKSkuY3JlYXRlUm9sZVNvdXJjZSgpOwotCX0KLQotCXByaXZhdGUgRU9iamVjdCBjcmVhdGVNZXNzYWdlQmVhbkluc3RhbmNlKEVDbGFzcyBlQ2xhc3NpZmllcikgewotCQlyZXR1cm4gKChFamJGYWN0b3J5KSBlQ2xhc3NpZmllci5nZXRFUGFja2FnZSgpLmdldEVGYWN0b3J5SW5zdGFuY2UoKSkuY3JlYXRlTWVzc2FnZURyaXZlbigpOwotCX0KLQotCXByaXZhdGUgRU9iamVjdCBjcmVhdGVTZXNzaW9uQmVhbkluc3RhbmNlKEVDbGFzcyBlQ2xhc3NpZmllcikgewotCQlyZXR1cm4gKChFamJGYWN0b3J5KSBlQ2xhc3NpZmllci5nZXRFUGFja2FnZSgpLmdldEVGYWN0b3J5SW5zdGFuY2UoKSkuY3JlYXRlU2Vzc2lvbigpOwotCX0KLQotCXByaXZhdGUgRU9iamVjdCBjcmVhdGVFbnRpdHlCZWFuSW5zdGFuY2UoRUNsYXNzIGVDbGFzc2lmaWVyKSB7Ci0JCXJldHVybiAoKEVqYkZhY3RvcnkpIGVDbGFzc2lmaWVyLmdldEVQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpKS5jcmVhdGVFbnRpdHkoKTsKLQl9Ci0KLQlwcml2YXRlIEVPYmplY3QgY3JlYXRlQ29udGFpbmVyTWFuYWdlZEVudGl0eUluc3RhbmNlKEVDbGFzcyBlQ2xhc3NpZmllcikgewotCQlyZXR1cm4gRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0LkdlbmVyYWxFTUZUZXN0I2dldERlcHRoRm9yQXR0cmlidXRlKEVSZWZlcmVuY2UpCi0JICovCi0JcHVibGljIGludCBnZXREZXB0aEZvckF0dHJpYnV0ZShFU3RydWN0dXJhbEZlYXR1cmUgcmVmKSB7Ci0JCWlmIChyZWYuZ2V0TmFtZSgpLmVxdWFscygiZW50ZXJwcmlzZUJlYW5zIikpCi0JCQlyZXR1cm4gTlVNX0JFQU5TOwotCQllbHNlIGlmIChyZWYuZ2V0TmFtZSgpLmVxdWFscygiZW50aXR5QmVhbnMiKSkKLQkJCXJldHVybiBOVU1fQkVBTlM7Ci0JCWVsc2UgaWYgKHJlZi5nZXROYW1lKCkuZXF1YWxzKCJyZWxhdGlvbnNoaXBSb2xlcyIpKQotCQkJcmV0dXJuIE5VTV9SRUxBVElPTl9ST0xFUzsKLQkJcmV0dXJuIHN1cGVyLmdldERlcHRoRm9yQXR0cmlidXRlKHJlZik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLmVtZnRlc3QuR2VuZXJhbEVNRlBvcHVsYXRpb25UZXN0I3BvcHVsYXRlRmVhdHVyZXMob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JKi8KLQlwdWJsaWMgdm9pZCBwb3B1bGF0ZUZlYXR1cmVzKEVPYmplY3QgZU9iamVjdCkgewotCQlpZiAoZU9iamVjdC5lQ2xhc3MoKSA9PSBFSkJfUEtHLmdldENNUEF0dHJpYnV0ZSgpKSB7Ci0JCQkoKENNUEF0dHJpYnV0ZSkgZU9iamVjdCkuc2V0TmFtZSgoU3RyaW5nKSBFTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yLmNyZWF0ZUF0dHJpYnV0ZShFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVOYW1lZEVsZW1lbnRfTmFtZSgpLGVPYmplY3QpKTsKLQkJCSgoQ01QQXR0cmlidXRlKSBlT2JqZWN0KS5zZXRFVHlwZSgoRUNsYXNzaWZpZXIpIEVNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3IuY3JlYXRlSmF2YUNsYXNzUHJveHkoRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFVHlwZWRFbGVtZW50X0VUeXBlKCksZU9iamVjdCkpOwotCQl9IGVsc2UgaWYgKGVPYmplY3QuZUNsYXNzKCkgPT0gRUpCX1BLRy5nZXRDTVJGaWVsZCgpKSB7Ci0JCQkoKENNUkZpZWxkKSBlT2JqZWN0KS5zZXROYW1lKChTdHJpbmcpIEVNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3IuY3JlYXRlQXR0cmlidXRlKEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RU5hbWVkRWxlbWVudF9OYW1lKCksZU9iamVjdCkpOwotCQkJcG9wdWxhdGVTaGFyZWRSZWZlcmVuY2UoZU9iamVjdCwgRUpCX1BLRy5nZXRDTVJGaWVsZF9Db2xsZWN0aW9uVHlwZSgpKTsKLQkJCXBvcHVsYXRlU2hhcmVkUmVmZXJlbmNlKGVPYmplY3QsIEVKQl9QS0cuZ2V0Q01SRmllbGRfUm9sZSgpKTsJCQotCQl9IGVsc2UKLQkJCXN1cGVyLnBvcHVsYXRlRmVhdHVyZXMoZU9iamVjdCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5lbWZ0ZXN0LkdlbmVyYWxFTUZQb3B1bGF0aW9uVGVzdCNwb3B1bGF0ZUF0dHJpYnV0ZXMob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVBdHRyaWJ1dGVzKEVPYmplY3QgZU9iamVjdCkgewotCQlpZiAoZU9iamVjdCBpbnN0YW5jZW9mIFF1ZXJ5TWV0aG9kSW1wbCkgewotCQkJTGlzdCBhdHRyaWJ1dGVzID0gZU9iamVjdC5lQ2xhc3MoKS5nZXRFQWxsQXR0cmlidXRlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLnNpemUoKTsgaSsrKSB7IAotCQkJCUVBdHRyaWJ1dGUgYXR0ID0gKEVBdHRyaWJ1dGUpIGF0dHJpYnV0ZXMuZ2V0KGkpOwotCQkJCWlmIChhdHQuZXF1YWxzKEVKQl9QS0cuZ2V0TWV0aG9kRWxlbWVudF9EZXNjcmlwdGlvbigpKSB8fCBhdHQuZXF1YWxzKEVKQl9QS0cuZ2V0TWV0aG9kRWxlbWVudF9FbnRlcnByaXNlQmVhbigpKSB8fCBhdHQuZXF1YWxzKEVKQl9QS0cuZ2V0TWV0aG9kRWxlbWVudF9UeXBlKCkpICkKLQkJCQkJY29udGludWU7Ci0JCQkJT2JqZWN0IHZhbHVlID0gY3JlYXRlQXR0cmlidXRlVmFsdWUoYXR0LCBlT2JqZWN0KTsKLQkJCQlpZiAoYXR0LmdldE5hbWUoKS5lcXVhbHMoInBhcm1zIikgJiYgdmFsdWUgPT0gbnVsbCl7Ci0JCQkJCXZhbHVlID0gY3JlYXRlQXR0cmlidXRlVmFsdWUoYXR0LCBlT2JqZWN0KTsKLQkJCQl9Ci0JCQkJaWYgKGF0dC5pc0NoYW5nZWFibGUoKSkKLQkJCQkJZU9iamVjdC5lU2V0KGF0dCwgdmFsdWUpOwotCQkJfQotCQl9IGVsc2UgaWYgKGVPYmplY3QgaW5zdGFuY2VvZiBNZXRob2RQZXJtaXNzaW9uSW1wbCkgewotCQkJTGlzdCBhdHRyaWJ1dGVzID0gZU9iamVjdC5lQ2xhc3MoKS5nZXRFQWxsQXR0cmlidXRlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJRUF0dHJpYnV0ZSBhdHQgPSAoRUF0dHJpYnV0ZSkgYXR0cmlidXRlcy5nZXQoaSk7Ci0JCQkJaWYoYXR0LmdldE5hbWUoKS5lcXVhbHMoInVuY2hlY2tlZCIpICYmIG1wRmxhZyl7Ci0JCQkJCWNvbnRpbnVlOwkJCQkJCi0JCQkJfQkKLQkJCQkKLQkJCQlPYmplY3QgdmFsdWUgPSBjcmVhdGVBdHRyaWJ1dGVWYWx1ZShhdHQsIGVPYmplY3QpOwotCQkJCWlmIChhdHQuaXNDaGFuZ2VhYmxlKCkpCi0JCQkJCWVPYmplY3QuZVNldChhdHQsIHZhbHVlKTsKLQkJCX0gCi0JCQltcEZsYWcgPSAhbXBGbGFnOwotCQl9IGVsc2UgaWYgKGVPYmplY3QgaW5zdGFuY2VvZiBFSkJSZWxhdGlvbnNoaXBSb2xlSW1wbCkgewotCQkJTGlzdCBhdHRyaWJ1dGVzID0gZU9iamVjdC5lQ2xhc3MoKS5nZXRFQWxsQXR0cmlidXRlcygpOwotCQkJRUF0dHJpYnV0ZSBsYXN0QXR0ciA9IG51bGw7Ci0JCQlPYmplY3QgdmFsdWUgPSBudWxsOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJRUF0dHJpYnV0ZSBhdHQgPSAoRUF0dHJpYnV0ZSkgYXR0cmlidXRlcy5nZXQoaSk7Ci0JCQkJaWYgKGF0dC5nZXROYW1lKCkuZXF1YWxzKCJjYXNjYWRlRGVsZXRlIikgJiYgKGxhc3RBdHRyLmdldE5hbWUoKS5lcXVhbHMoIm11bHRpcGxpY2l0eSIpICYmICF2YWx1ZS50b1N0cmluZygpLmVxdWFscygiTWFueSIpKSkKLQkJCQkJY29udGludWU7Ci0KLQkJCQl2YWx1ZSA9IGNyZWF0ZUF0dHJpYnV0ZVZhbHVlKGF0dCwgZU9iamVjdCk7Ci0JCQkJaWYgKGF0dC5pc0NoYW5nZWFibGUoKSkKLQkJCQkJZU9iamVjdC5lU2V0KGF0dCwgdmFsdWUpOwotCQkJCWxhc3RBdHRyID0gYXR0OwotCQl9Ci0JCQltcEZsYWcgPSAhbXBGbGFnOwotCQl9IGVsc2UKLQkJCXN1cGVyLnBvcHVsYXRlQXR0cmlidXRlcyhlT2JqZWN0KTsKLQl9Ci0JCi0KLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVNoYXJlZFJlZmVyZW5jZShFT2JqZWN0IGVPYmplY3QsIEVSZWZlcmVuY2UgcmVmKSB7Ci0JCWlmIChyZWYgPT0gRUpCX1BLRy5nZXRDTVJGaWVsZF9Db2xsZWN0aW9uVHlwZSgpKSB7Ci0JCQlzZXRSZWZlcmVuY2VWYWx1ZShlT2JqZWN0LCByZWYsIEphdmFDbGFzc0ltcGwuY3JlYXRlQ2xhc3NSZWYoImphdmEudXRpbC5Db2xsZWN0aW9uIikpOwotCQkJcmV0dXJuOwotCQl9IGVsc2UgaWYoZU9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZFBlcm1pc3Npb24gJiYgcmVmLmdldE5hbWUoKS5lcXVhbHMoInJvbGVzIikpewotCQkJLy9pZiBtZXRob2QgcGVybWlzc2lvbiB1bmNoZWNrZWQgaWdub3JlIHJvbGVzCi0JCQlpZihtcEZsYWcpewotCQkJCXJldHVybjsKLQkJCX0KLQkJCW1wRmxhZyA9ICFtcEZsYWc7Ci0JCX0KLQkJc3VwZXIucG9wdWxhdGVTaGFyZWRSZWZlcmVuY2UoZU9iamVjdCwgcmVmKTsKLQl9Ci0KLQlwdWJsaWMgSGFzaFNldCBpZ25vcmFibGVBdHRyaWJ1dGVzKCl7Ci0JCUhhc2hTZXQgc2V0ID0gbmV3IEhhc2hTZXQoKTsKLQkJc2V0LmFkZCgiaWQiKTsKLQkJcmV0dXJuIHNldDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLmVtZnRlc3QuR2VuZXJhbEVNRlBvcHVsYXRpb25UZXN0I2NyZWF0ZUF0dHJpYnV0ZVZhbHVlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlLCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZUF0dHJpYnV0ZVZhbHVlKEVBdHRyaWJ1dGUgYXR0LCBFT2JqZWN0IGVPYmplY3QpIHsKLQkJLy9lYXQgdGhlIGZpcnN0IHJldHVybiB0eXBlIG1hcHBpbmcgYmVjYXVzZSB0aGUgb3JkZXIgd2FzIGNoYW5nZWQuCi0JCWlmIChmaXJzdFJldHVyblR5cGVNYXBwaW5nICYmIGF0dC5lcXVhbHMoRUpCX1BLRy5nZXRRdWVyeV9SZXR1cm5UeXBlTWFwcGluZygpKSl7Ci0JCQlzdXBlci5jcmVhdGVBdHRyaWJ1dGVWYWx1ZShhdHQsZU9iamVjdCk7Ci0JCQlmaXJzdFJldHVyblR5cGVNYXBwaW5nID0gZmFsc2U7Ci0JCX0gZWxzZSBpZiAoYXR0LmVxdWFscyhFSkJfUEtHLmdldEVudGVycHJpc2VCZWFuX05hbWUoKSkpCi0JCQlyZXR1cm4gRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvci5jcmVhdGVBdHRyaWJ1dGUoYXR0LEVKQl9QS0cuZ2V0RW50aXR5KCkpOwotCQlyZXR1cm4gc3VwZXIuY3JlYXRlQXR0cmlidXRlVmFsdWUoYXR0LCBlT2JqZWN0KTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JCWVhckZpbGUgPSBudWxsOwotCQllamJGaWxlID0gbnVsbDsKLQkJbWVzQmVhbiA9IG51bGw7Ci0JCWVudGl0eUJlYW4gPSBudWxsOwotCQlzZWNJRCA9IG51bGw7Ci0JCXJvbGVTb3VyY2UgPSBudWxsOwotCi0JCQotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9HZW5lcmFsRU1GRWRpdGluZ1Rlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvR2VuZXJhbEVNRkVkaXRpbmdUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyZTNkZjYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9HZW5lcmFsRU1GRWRpdGluZ1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1OSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuZW1mdGVzdHM7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkxpbmVOdW1iZXJSZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFDbGFzc0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0dXRpbGl0aWVzLkVNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0dXRpbGl0aWVzLkoyRUVWZXJzaW9uQ2hlY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0dXRpbGl0aWVzLlRlc3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5idnQuQXV0b21hdGVkQlZUOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuQmFzZVRlc3RDYXNlOwotCi0KLXB1YmxpYyBjbGFzcyBHZW5lcmFsRU1GRWRpdGluZ1Rlc3QgZXh0ZW5kcyBCYXNlVGVzdENhc2UgewotCS8vaW5uZXIgY2xhc3MgdG8gaGFuZGxlIGRlZmZlcmVkIHNoYXJlZCByZWZlcmVuY2VzCi0JcHJvdGVjdGVkIGNsYXNzIERlZmVycmVkU2hhcmVkUmVmZXJlbmNlQWN0aW9uIHsKLQkJRU9iamVjdCBvd25lcjsKLQkJRVJlZmVyZW5jZSByZWY7Ci0KLQkJcHVibGljIERlZmVycmVkU2hhcmVkUmVmZXJlbmNlQWN0aW9uKEVPYmplY3Qgb3duZXIsIEVSZWZlcmVuY2UgcmVmKSB7Ci0JCQl0aGlzLm93bmVyID0gb3duZXI7Ci0JCQl0aGlzLnJlZiA9IHJlZjsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBlcmZvcm1BY3Rpb24oKSB7Ci0JCQlPYmplY3QgdmFsdWUgPSBnZXRTaGFyZWRPYmplY3RCeVR5cGUob3duZXIsIHJlZik7Ci0JCQlzZXRSZWZlcmVuY2VWYWx1ZShvd25lciwgcmVmLCB2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgTWFwIGVxdWl2YWxlbnRMaW5lczsKLQlwdWJsaWMgTGlzdCBkZWZlcmVkUmVmZXJlbmNlczsKLQlwdWJsaWMgc3RhdGljIGludCBnZW5EZXB0aCA9IDU7Ci0JcHVibGljIHN0YXRpYyBPYmplY3Qgc2hhcmVkVmFsdWU7Ci0JcHVibGljIGludCBjbGFzc0luZGV4ID0gMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhdkNsYXNzW107Ci0JcHVibGljIHN0YXRpYyBIYXNoU2V0IGlnbm9yZUF0dDsKLQotCXB1YmxpYyBpbnQgdmVyc2lvbjsKLQlwdWJsaWMgaW50IG1vZHVsZVR5cGU7Ci0JLy9zdGF0aWMgdmVyc2lvbnMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWRVJTSU9OXzFfMiA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkVSU0lPTl8xXzMgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZFUlNJT05fMV80ID0gMjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFQUElDQVRJT04gPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFQUF9DTElFTlQgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTk5FQ1RPUiA9IDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUpCID0gMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXRUIgPSA0OwotCi0JcHVibGljIEdlbmVyYWxFTUZFZGl0aW5nVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlZGl0Um9vdChFT2JqZWN0IGVPYmplY3QpIHsKLQkJZWRpdEZlYXR1cmVzKGVPYmplY3QpOwotCQkvL2lmIChkZWZlcmVkUmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCS8vCWZvciAoaW50IGkgPSAwOyBpIDwgZGVmZXJlZFJlZmVyZW5jZXMuc2l6ZSgpOyBpKyspIHsKLQkJLy8JCSgoRGVmZXJyZWRTaGFyZWRSZWZlcmVuY2VBY3Rpb24pIGRlZmVyZWRSZWZlcmVuY2VzLmdldChpKSkucGVyZm9ybUFjdGlvbigpOwotCQkvLwl9Ci0JCS8vfQotCX0KLQotCXB1YmxpYyB2b2lkIGVkaXRGZWF0dXJlcyhFT2JqZWN0IGVPYmplY3QpIHsKLQkJaWYgKGVPYmplY3QgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZWxzZSB7Ci0JCQllZGl0QXR0cmlidXRlcyhlT2JqZWN0KTsKLQkJCWVkaXRSZWZlcmVuY2VzKGVPYmplY3QpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZWRpdFJlZmVyZW5jZXMoRU9iamVjdCBlT2JqZWN0KSB7Ci0JCUxpc3QgcmVmZXJlbmNlcyA9IGVPYmplY3QuZUNsYXNzKCkuZ2V0RUFsbFJlZmVyZW5jZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZlcmVuY2VzLnNpemUoKTsgaSsrKSB7Ci0JCQlFUmVmZXJlbmNlIHJlZiA9IChFUmVmZXJlbmNlKSByZWZlcmVuY2VzLmdldChpKTsKLQkJCWlmICghcmVmLmlzTWFueSgpICYmIGVPYmplY3QuZUdldChyZWYpICE9IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlpZiAocmVmLmlzQ29udGFpbm1lbnQoKSkKLQkJCQlwb3B1bGF0ZUNvbnRhaW5tZW50UmVmZXJlbmNlKGVPYmplY3QsIHJlZik7Ci0JCQllbHNlCi0JCQkJcG9wdWxhdGVTaGFyZWRSZWZlcmVuY2UoZU9iamVjdCwgcmVmKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlU2hhcmVkUmVmZXJlbmNlKEVPYmplY3QgZU9iamVjdCwgRVJlZmVyZW5jZSByZWYpIHsKLQkJaWYgKHJlZi5nZXRFVHlwZSgpID09IEphdmFSZWZQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXZhQ2xhc3MoKSkKLQkJCXNldFJlZmVyZW5jZVZhbHVlKGVPYmplY3QsIHJlZiwgY3JlYXRlSmF2YUNsYXNzUHJveHkoKEVDbGFzcykgcmVmLmdldEVUeXBlKCkpKTsKLQkJZWxzZSB7Ci0JCQlFUGFja2FnZSBwa2cgPSByZWYuZ2V0RVR5cGUoKS5nZXRFUGFja2FnZSgpOwotCQkJaWYgKHBrZyA9PSBlT2JqZWN0LmVDbGFzcygpLmdldEVQYWNrYWdlKCkgfHwgcGtnID09IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFKSB7Ci0JCQkJaWYgKGVPYmplY3QuZUNsYXNzKCkuZ2V0TmFtZSgpLmVxdWFscygiRUFubm90YXRpb24iKSB8fCBlT2JqZWN0LmVDbGFzcygpLmdldE5hbWUoKS5lcXVhbHMoIkVBbm5vdGF0aW9uSW1wbCIpIHx8ICFKMkVFVmVyc2lvbkNoZWNrLmNoZWNrUmVmZXJlbmNlVmVyc2lvbihyZWYsIHZlcnNpb24sIG1vZHVsZVR5cGUpKQotCQkJCQlyZXR1cm47Ci0JCQkJaWYgKGRlZmVyZWRSZWZlcmVuY2VzID09IG51bGwpCi0JCQkJCWRlZmVyZWRSZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWRlZmVyZWRSZWZlcmVuY2VzLmFkZChuZXcgRGVmZXJyZWRTaGFyZWRSZWZlcmVuY2VBY3Rpb24oZU9iamVjdCwgcmVmKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZUNvbnRhaW5tZW50UmVmZXJlbmNlKEVPYmplY3QgZU9iamVjdCwgRVJlZmVyZW5jZSByZWYpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBnZXREZXB0aEZvckF0dHJpYnV0ZShyZWYpOyBpKyspIHsKLQkJCUVPYmplY3QgaW5zdGFuY2UgPSBjcmVhdGVJbnN0YW5jZSgoRUNsYXNzKSByZWYuZ2V0RVR5cGUoKSk7Ci0JCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQlpZiAoIUoyRUVWZXJzaW9uQ2hlY2suY2hlY2tSZWZlcmVuY2VWZXJzaW9uKHJlZiwgdmVyc2lvbiwgbW9kdWxlVHlwZSkpCi0JCQkJY29udGludWU7Ci0JCQlzZXRSZWZlcmVuY2VWYWx1ZShlT2JqZWN0LCByZWYsIGluc3RhbmNlKTsKLQkJCWlmICgoKEludGVybmFsRU9iamVjdCkgaW5zdGFuY2UpLmVJc1Byb3h5KCkpCi0JCQkJcmV0dXJuOwotCQkJaWYgKHJlZi5nZXRFVHlwZSgpID09IGVPYmplY3QuZUNsYXNzKCkpCi0JCQkJZWRpdEF0dHJpYnV0ZXMoaW5zdGFuY2UpOwotCQkJZWxzZQotCQkJCWVkaXRGZWF0dXJlcyhpbnN0YW5jZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRSZWZlcmVuY2VWYWx1ZShFT2JqZWN0IGVPYmplY3QsIEVSZWZlcmVuY2UgcmVmLCBPYmplY3QgdmFsdWUpIHsKLQkJaWYgKHJlZi5nZXROYW1lKCkuZXF1YWxzKCJFQW5ub3RhdGlvbiIpIHx8IHJlZi5nZXROYW1lKCkuZXF1YWxzKCJFQW5ub3RhdGlvbkltcGwiKSB8fCAhSjJFRVZlcnNpb25DaGVjay5jaGVja1JlZmVyZW5jZVZlcnNpb24ocmVmLCB2ZXJzaW9uLCBtb2R1bGVUeXBlKSkKLQkJCXJldHVybjsKLQkJaWYgKHJlZi5pc01hbnkoKSkgewotCQkJTGlzdCBsaXN0ID0gKExpc3QpIGVPYmplY3QuZUdldChyZWYpOwotCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgQ29sbGVjdGlvbikKLQkJCQlsaXN0LmFkZEFsbCgoQ29sbGVjdGlvbikgdmFsdWUpOwotCQkJZWxzZQotCQkJCWxpc3QuYWRkKHZhbHVlKTsKLQkJfSBlbHNlIHsKLQkJCWVPYmplY3QuZVNldChyZWYsIHZhbHVlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZUluc3RhbmNlKEVDbGFzcyBlQ2xhc3NpZmllcikgewotCQlpZiAoZUNsYXNzaWZpZXIgPT0gSmF2YVJlZlBhY2thZ2UuZUlOU1RBTkNFLmdldEphdmFDbGFzcygpKQotCQkJcmV0dXJuIGNyZWF0ZUphdmFDbGFzc1Byb3h5KGVDbGFzc2lmaWVyKTsKLQkJcmV0dXJuIGVDbGFzc2lmaWVyLmdldEVQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpLmNyZWF0ZShlQ2xhc3NpZmllcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZWRpdEF0dHJpYnV0ZXMoRU9iamVjdCBlT2JqZWN0KSB7Ci0JCUxpc3QgYXR0cmlidXRlcyA9IGVPYmplY3QuZUNsYXNzKCkuZ2V0RUFsbEF0dHJpYnV0ZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlFQXR0cmlidXRlIGF0dCA9IChFQXR0cmlidXRlKSBhdHRyaWJ1dGVzLmdldChpKTsKLQkJCWlmIChhdHQuaXNDaGFuZ2VhYmxlKCkgJiYgSjJFRVZlcnNpb25DaGVjay5jaGVja0F0dHJpYnV0ZVZlcnNpb24oYXR0LCB2ZXJzaW9uLCBtb2R1bGVUeXBlKSkgewotCQkJCU9iamVjdCB2YWx1ZSA9IGNyZWF0ZUF0dHJpYnV0ZVZhbHVlKGF0dCwgZU9iamVjdCk7Ci0JCQkJZU9iamVjdC5lU2V0KGF0dCwgdmFsdWUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVBdHRyaWJ1dGVWYWx1ZShFQXR0cmlidXRlIGF0dCwgRU9iamVjdCBlT2JqZWN0KSB7Ci0JCWlmIChhdHQuZ2V0RVR5cGUoKSA9PSBKYXZhUmVmUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YUNsYXNzKCkpIHsKLQkJCXJldHVybiBjcmVhdGVKYXZhQ2xhc3NQcm94eShhdHQuZUNsYXNzKCkpLmdldENsYXNzKCk7Ci0JCX0gCi0JCS8vIGlmIChtb2R1bGVUeXBlID09IFdFQikKLQkJCXJldHVybiBFTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yLmNyZWF0ZUF0dHJpYnV0ZShhdHQsIGVPYmplY3QsIHRydWUsIHZlcnNpb24sIG1vZHVsZVR5cGUpOwotCQkvL3JldHVybiBFTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yLmNyZWF0ZUF0dHJpYnV0ZShhdHQpOwotCX0KLQotCXByb3RlY3RlZCBFT2JqZWN0IGNyZWF0ZUphdmFDbGFzc1Byb3h5KEVDbGFzcyBtZXRhQ2xhc3MpIHsKLQkJaWYgKGF2Q2xhc3MgPT0gbnVsbCkgewotCQkJYXZDbGFzcyA9IG5ldyBTdHJpbmdbXSB7ICJqYXZhLnV0aWwuSGFzaFRhYmxlIiwgImphdmEudXRpbC5MaXN0IiwgImphdmEuc3FsLkRhdGEiLCAiamF2YS5sYW5nLkludGVnZXIiLCAiamF2YS5sYW5nLlN0cmluZyIgfTsKLQkJfQotCQlTdHJpbmcgbmFtZSA9IGF2Q2xhc3NbY2xhc3NJbmRleF07Ci0JCWNsYXNzSW5kZXgrKzsKLQkJaWYgKGNsYXNzSW5kZXggPT0gNSkKLQkJCWNsYXNzSW5kZXggPSAwOwotCQlyZXR1cm4gSmF2YUNsYXNzSW1wbC5jcmVhdGVDbGFzc1JlZihuYW1lKTsKLQl9Ci0KLQkvLyBPbGQgQ29tcGFyZSBtZXRob2QuLi4ubm93IHVzaW5nIERPTUNvbXBhcmF0b3IuLi5yZW1vdmUgb25jZSBzdGFibGUKLQlwdWJsaWMgdm9pZCBjb21wYXJlQ29udGVudHMoU3RyaW5nIGZpbGUxLCBTdHJpbmcgZmlsZTIpIHRocm93cyBFeGNlcHRpb24gewotCSAgICBCdWZmZXJlZFJlYWRlciByZWFkZXIxID0gbnVsbDsKLQkgICAgQnVmZmVyZWRSZWFkZXIgcmVhZGVyMiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbnQgbGluZW5vID0gMTsKLQkJCXJlYWRlcjEgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGdldEZpbGVJbnB1dFN0cmVhbShmaWxlMSkpKTsKLQkJCXJlYWRlcjIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGdldEZpbGVJbnB1dFN0cmVhbShmaWxlMikpKTsKLQkJCVN0cmluZyBsaW5lMSA9ICIiLCBsaW5lMiA9ICIiOwotCQkJd2hpbGUgKHJlYWRlcjEucmVhZHkoKSAmJiByZWFkZXIyLnJlYWR5KCkpIHsKLQkJCQlsaW5lMSA9IHJlYWRMaW5lVHJpbUNvbW1lbnRzKHJlYWRlcjEpOyAKLQkJCQlsaW5lMiA9IHJlYWRMaW5lVHJpbUNvbW1lbnRzKHJlYWRlcjIpOwotCQkJCWlmIChsaW5lMSA9PSBudWxsICYmIGxpbmUyID09IG51bGwgJiYgbGluZW5vICE9IDApCi0JCQkJCXJldHVybjsKLQkJCQkJCQkgICAgCi0JCQkJaWYgKCFsaW5lMS50cmltKCkuZXF1YWxzKGxpbmUyLnRyaW0oKSkpIHsKLQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSAiRXJyb3IgYXQgbGluZSAjOiAiICsgbGluZW5vICsgJ1xuJyArIGxpbmUxICsgJ1xuJyArIGxpbmUyICsgJ1xuJzsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKG1lc3NhZ2UpOwotCQkJCQkvL2Fzc2VydFRydWUobWVzc2FnZSwgZmFsc2UpOwotCQkJCX0KLQkJCQlsaW5lbm8rKzsKLQkJCX0KLQkJCWFzc2VydFRydWUoIlRoZSBmaWxlcyBoYXZlIGEgZGlmZmVyZW50IG51bWJlciBvZiBsaW5lczoiICsgbGluZW5vICsgJ1xuJyArIGxpbmUxICsgJ1xuJyArIGxpbmUyICsgJ1xuJywgKCFyZWFkZXIxLnJlYWR5KCkgJiYgIXJlYWRlcjIucmVhZHkoKSkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkgICAgZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlhc3NlcnRUcnVlKCJJTyBmYWlsZWQiLCBmYWxzZSk7Ci0JCX0gZmluYWxseSB7Ci0JCSAgICBpZihyZWFkZXIxICE9IG51bGwpCi0JCSAgICAgICAgcmVhZGVyMS5jbG9zZSgpOwotCQkgICAgaWYocmVhZGVyMiAhPSBudWxsKQotCQkgICAgICAgIHJlYWRlcjIuY2xvc2UoKTsKLQkJfQotCX0gCi0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gc3RyaW5nCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHJlYWRMaW5lVHJpbUNvbW1lbnRzKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHJlYWRlci5yZWFkTGluZSgpOyAKLSAgICAgICAgaWYocmVzdWx0LmluZGV4T2YoIjwhLS0iKSA8IDApCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGludCBlbmRDb21tZW50SW5keCA9IDA7Ci0gICAgICAgICAgICB3aGlsZShyZWFkZXIucmVhZHkoKSkgewotICAgICAgICAgICAgICAgIGlmKCAoZW5kQ29tbWVudEluZHggPSByZXN1bHQuaW5kZXhPZigiLS0+IikpID49IDApIAotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZWFkZXIucmVhZExpbmUoKTsKLSAgICAgICAgICAgICAgICBlbHNlIAotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY29tcGFyZUNvbnRlbnRzSWdub3JlV2hpdGVzcGFjZShTdHJpbmcgZmlsZTEsIFN0cmluZyBmaWxlMiwgU3RyaW5nIGlkZW50aWZpZXIpIHRocm93cyBFeGNlcHRpb24gewotCi0JCUxpbmVOdW1iZXJSZWFkZXIgcmVhZGVyMSA9IG5ldyBMaW5lTnVtYmVyUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihnZXRGaWxlSW5wdXRTdHJlYW0oZmlsZTEpKSk7Ci0JCUxpbmVOdW1iZXJSZWFkZXIgcmVhZGVyMiA9IG5ldyBMaW5lTnVtYmVyUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihnZXRGaWxlSW5wdXRTdHJlYW0oZmlsZTIpKSk7Ci0JCWNvbXBhcmVDb250ZW50c0lnbm9yZVdoaXRlc3BhY2UocmVhZGVyMSwgcmVhZGVyMiwgaWRlbnRpZmllcik7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb21wYXJlQ29udGVudHNJZ25vcmVXaGl0ZXNwYWNlKExpbmVOdW1iZXJSZWFkZXIgcmVhZGVyMSwgTGluZU51bWJlclJlYWRlciByZWFkZXIyLCBTdHJpbmcgaWRlbnRpZmllcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJd2hpbGUgKHJlYWRlcjEucmVhZHkoKSB8fCByZWFkZXIyLnJlYWR5KCkpIHsKLQkJCVN0cmluZyBsaW5lMSA9ICIiLCBsaW5lMiA9ICIiOwotCQkJd2hpbGUgKHJlYWRlcjEucmVhZHkoKSAmJiBsaW5lMS5lcXVhbHMoIiIpKSB7Ci0JCQkJbGluZTEgPSByZWFkZXIxLnJlYWRMaW5lKCkudHJpbSgpOwotCQkJfQotCQkJd2hpbGUgKHJlYWRlcjIucmVhZHkoKSAmJiBsaW5lMi5lcXVhbHMoIiIpKSB7Ci0JCQkJbGluZTIgPSByZWFkZXIyLnJlYWRMaW5lKCkudHJpbSgpOwotCQkJfQotCQkJaWYgKCFpc0VxdWl2YWxlbnRMaW5lcyhsaW5lMSwgbGluZTIpKSB7Ci0JCQkJU3RyaW5nQnVmZmVyIGJ1ZmYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJYnVmZi5hcHBlbmQoIkRpZmZlcmVuY2UgZm91bmQgaW4gdGVzdCAiKTsKLQotCQkJCWJ1ZmYuYXBwZW5kKGlkZW50aWZpZXIpOwotCQkJCWJ1ZmYuYXBwZW5kKCJcblNvdXJjZSBsaW5lICM6ICIpOwotCQkJCWJ1ZmYuYXBwZW5kKHJlYWRlcjEuZ2V0TGluZU51bWJlcigpKTsKLQkJCQlidWZmLmFwcGVuZCgnXG4nKTsKLQkJCQlidWZmLmFwcGVuZChsaW5lMSk7Ci0JCQkJYnVmZi5hcHBlbmQoIlxuRGVzdGluYXRpb24gbGluZSAjOiAiKTsKLQkJCQlidWZmLmFwcGVuZChyZWFkZXIyLmdldExpbmVOdW1iZXIoKSk7Ci0JCQkJYnVmZi5hcHBlbmQoJ1xuJyk7Ci0JCQkJYnVmZi5hcHBlbmQobGluZTIpOwotCQkJCWFzc2VydFRydWUoYnVmZi50b1N0cmluZygpLCBmYWxzZSk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXB1YmxpYyBib29sZWFuIGxpbmVFcXVhbHMoU3RyaW5nIGxpbmUxLCBTdHJpbmcgbGluZTIpIHsKLQkJcmV0dXJuIGxpbmUxLmVxdWFscyhsaW5lMik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFcXVpdmFsZW50TGluZXMoU3RyaW5nIGxpbmUxLCBTdHJpbmcgbGluZTIpIHsKLQkJaWYgKGxpbmVFcXVhbHMobGluZTEsIGxpbmUyKSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoZXF1YWxUYWdzKGxpbmUxLCBsaW5lMikpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJU3RyaW5nIGVxdWl2ID0gKFN0cmluZykgZ2V0RXF1aXZhbGVudExpbmVzKCkuZ2V0KGxpbmUxKTsKLQkJcmV0dXJuIGVxdWl2ICE9IG51bGwgJiYgZXF1aXYuZXF1YWxzKGxpbmUyKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZXF1YWxUYWdzKFN0cmluZyBsaW5lMSwgU3RyaW5nIGxpbmUyKXsKLQkJLy9kYXRhIGNoZWNrLCB0aGVyZSBzaG91bGQgYmUgbm8gZGF0YSBmb3IgdGhpcyB0ZXN0IHRvIHJldHVybiB0cnVlCi0JCWludCBzaG9ydEVuZEluZGV4MSA9IGxpbmUxLmluZGV4T2YoIi8+Iik7Ci0JCWludCBzaG9ydEVuZEluZGV4MiA9IGxpbmUyLmluZGV4T2YoIi8+Iik7Ci0JCWlmIChzaG9ydEVuZEluZGV4MSA9PSAtMSAmJiBzaG9ydEVuZEluZGV4MiA9PSAtMSkKLQkJCXJldHVybiBmYWxzZTsKLQkJZWxzZSBpZiAoc2hvcnRFbmRJbmRleDEgIT0gLTEpewotCQkJU3RyaW5nIHRhZ05hbWUxID0gbGluZTEuc3Vic3RyaW5nKDEsc2hvcnRFbmRJbmRleDEpOwotCQkJU3RyaW5nIHRhZ05hbWUyID0gZXh0cmFjdFRhZ05hbWUobGluZTIpOwotCQkJaWYgKGNoZWNrTm9EYXRhKGxpbmUyKSAmJiB0YWdOYW1lMS5lcXVhbHModGFnTmFtZTIpKXsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChzaG9ydEVuZEluZGV4MiAhPSAtMSl7Ci0JCQlTdHJpbmcgdGFnTmFtZTEgPSBleHRyYWN0VGFnTmFtZShsaW5lMSk7IAotCQkJU3RyaW5nIHRhZ05hbWUyID0gbGluZTIuc3Vic3RyaW5nKDEsc2hvcnRFbmRJbmRleDIpOwotCQkJaWYgKGNoZWNrTm9EYXRhKGxpbmUxKSAmJiB0YWdOYW1lMS5lcXVhbHModGFnTmFtZTIpKXsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCS8qKgotCSAqIEBwYXJhbSBsaW5lMgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBleHRyYWN0VGFnTmFtZShTdHJpbmcgbGluZSkgewotCQlpbnQgZW5kT3BlblRhZyA9IGxpbmUuaW5kZXhPZigiPiIpOwotCQlyZXR1cm4gbGluZS5zdWJzdHJpbmcoMSxlbmRPcGVuVGFnKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGluZTIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrTm9EYXRhKFN0cmluZyBsaW5lKSB7Ci0JCWludCBlbmRPcGVuVGFnID0gbGluZS5pbmRleE9mKCI+Iik7Ci0JCWludCBzdGFydEVuZFRhZyA9IGxpbmUubGFzdEluZGV4T2YoIjwiKTsKLQkJaWYgKGVuZE9wZW5UYWcgPT0gbGluZS5sZW5ndGgoKSkKLQkJCXJldHVybiB0cnVlOwotCQllbHNlIGlmIChlbmRPcGVuVGFnKzEgPT0gc3RhcnRFbmRUYWcpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBNYXAgZ2V0RXF1aXZhbGVudExpbmVzKCkgewotCQlpZiAoZXF1aXZhbGVudExpbmVzID09IG51bGwpCi0JCQllcXVpdmFsZW50TGluZXMgPSBuZXcgSGFzaE1hcCgpOwotCQlyZXR1cm4gZXF1aXZhbGVudExpbmVzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVxdWl2YWxlbnRMaW5lcyhNYXAgZXF1aXZhbGVudExpbmVzKSB7Ci0JCXRoaXMuZXF1aXZhbGVudExpbmVzID0gZXF1aXZhbGVudExpbmVzOwotCX0KLQkvKgotCQlwdWJsaWMgdm9pZCBjb21wYXJlQ29udGVudHMoU3RyaW5nIGZpbGUxLCBTdHJpbmcgZmlsZTIpIHRocm93cyBFeGNlcHRpb24gewotCQkJSW5wdXRTdHJlYW0gaXMxLCBpczI7Ci0JCQlpczEgPSBnZXRGaWxlSW5wdXRTdHJlYW0oZmlsZTEpOwotCQkJaXMyID0gZ2V0RmlsZUlucHV0U3RyZWFtKGZpbGUyKTsKLQkJCUlucHV0U291cmNlIGlucHV0MSA9IG5ldyBJbnB1dFNvdXJjZShpczEpOwotCQkJSW5wdXRTb3VyY2UgaW5wdXQyID0gbmV3IElucHV0U291cmNlKGlzMik7Ci0JCQl0cnkgewotCQkJCVN0cmluZyByZXN1bHRzOwotCQkJCWlmKGlnbm9yZUF0dCA9PSBudWxsKQotCQkJCQlyZXN1bHRzID0gRG9tQ29tcGFyaXRvci5jb21wYXJlRG9tcyhpbnB1dDEsIGlucHV0Mik7Ci0JCQkJZWxzZQotCQkJCQlyZXN1bHRzID0gRG9tQ29tcGFyaXRvci5jb21wYXJlRG9tcyhpbnB1dDEsIGlucHV0MiwgaWdub3JlQXR0KTsKLQkJCQlpZiAocmVzdWx0cyAhPSBudWxsKSB7Ci0JCQkJCWFzc2VydFRydWUoIlVuZXF1YWwgZG9tcyBjb21wYXJlZCBhcyBlcXVhbCAiICsgZmlsZTEgKyAiICIgKyBmaWxlMiArICJEZXRhaWxzOiAiICsgcmVzdWx0cywgZmFsc2UpOwotCQkJCX0KLQkJCX0gZmluYWxseSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaXMxLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJQXNzZXJ0LmZhaWwoZS5nZXRNZXNzYWdlKCkpOwotCQkJCX0KLQkJCQl0cnkgewotCQkJCQlpczIuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlBc3NlcnQuZmFpbChlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JKi8KLQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0RmlsZUlucHV0U3RyZWFtKFN0cmluZyBwYXRoKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBGaWxlSW5wdXRTdHJlYW0ocGF0aCk7Ci0JfQotCi0JcHVibGljIElucHV0U3RyZWFtIGdldFJlc291cmNlQXNTdHJlYW0oU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCUlucHV0U3RyZWFtIGluID0gbnVsbDsKLQkJQ2xhc3NMb2FkZXIgbG9hZGVyID0gZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOwotCQlpZiAobG9hZGVyID09IG51bGwpIHsKLQkJCWluID0gQ2xhc3NMb2FkZXIuZ2V0U3lzdGVtUmVzb3VyY2VBc1N0cmVhbShmaWxlTmFtZSk7Ci0JCX0gZWxzZSB7Ci0JCQlpbiA9IGxvYWRlci5nZXRSZXNvdXJjZUFzU3RyZWFtKGZpbGVOYW1lKTsKLQkJfQotCQlhc3NlcnRUcnVlKCJVbmFibGUgdG8gZmluZCByZXNvdXJjZTogIiArIGZpbGVOYW1lLCBpbiAhPSBudWxsKTsKLQkJcmV0dXJuIGluOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEdlbmVyYWxEZXB0aChpbnQgZGVwdGgpIHsKLQkJR2VuZXJhbEVNRlBvcHVsYXRpb25UZXN0LmdlbkRlcHRoID0gZGVwdGg7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TW9kdWxlVHlwZShpbnQgdHlwZSkgewotCQltb2R1bGVUeXBlID0gdHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKGludCB2ZXJzaW9uKSB7Ci0JCXRoaXMudmVyc2lvbiA9IHZlcnNpb247Ci0JfQotCi0JcHVibGljIGludCBnZXREZXB0aEZvckF0dHJpYnV0ZShFUmVmZXJlbmNlIHJlZikgewotCQlpZiAocmVmLmlzTWFueSgpKQotCQkJcmV0dXJuIGdlbkRlcHRoOwotCQllbHNlCi0JCQlyZXR1cm4gMTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFNoYXJlZE9iamVjdEJ5VHlwZShFT2JqZWN0IG93bmVyLCBFUmVmZXJlbmNlIHJlZikgewotCQlzaGFyZWRWYWx1ZSA9IFRlc3RVdGlsaXRpZXMuZ2V0T2JqZWN0QnlUeXBlKG93bmVyLmVSZXNvdXJjZSgpLCByZWYuZ2V0RVR5cGUoKSwgcmVmLmlzTWFueSgpKTsKLQkJcmV0dXJuIHNoYXJlZFZhbHVlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzZXQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0SWdub3JlQXR0KEhhc2hTZXQgc2V0KSB7Ci0JCWlnbm9yZUF0dCA9IHNldDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQl0cnkgewotCQkJU3RyaW5nIG91dCA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInRlc3RPdXRwdXQvIjsKLQkJCUZpbGUgZGVsID0gbmV3IEZpbGUob3V0KTsKLQkJCWRlbGV0ZURpcmVjdG9yeShkZWwpOwotCQkJZGVsLmRlbGV0ZSgpOwotCQkJb3V0ID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAiLi4vdGVzdERhdGEvdGVzdE91dHB1dC8iOwotCQkJZGVsID0gbmV3IEZpbGUob3V0KTsKLQkJCWRlbGV0ZURpcmVjdG9yeShkZWwpOwotCQkJZGVsLmRlbGV0ZSgpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSl7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGRlbGV0ZURpcmVjdG9yeShGaWxlIGRpcmVjdG9yeSkKLQkgICB0aHJvd3MgSU9FeGNlcHRpb24KLQl7Ci0JCWlmIChkaXJlY3RvcnkuZXhpc3RzKCkpewotCQkgICBGaWxlW10gZGVsRmlsZXMgPSBkaXJlY3RvcnkubGlzdEZpbGVzKCk7Ci0JCi0JCSAgIGZvcihpbnQgaT0wOyBpPGRlbEZpbGVzLmxlbmd0aDsgKytpKQotCQkgICB7Ci0JCSAgICAgIGlmKGRlbEZpbGVzW2ldLmlzRGlyZWN0b3J5KCkpCi0JCSAgICAgICAgIGRlbGV0ZURpcmVjdG9yeShkZWxGaWxlc1tpXSk7Ci0JCSAgICAgIGRlbEZpbGVzW2ldLmRlbGV0ZSgpOwotCQkgICB9ICAKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvR2VuZXJhbEVNRlBvcHVsYXRpb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL0dlbmVyYWxFTUZQb3B1bGF0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjFlMzExLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvR2VuZXJhbEVNRlBvcHVsYXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLmVtZnRlc3RzOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5MaW5lTnVtYmVyUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLnRlc3R1dGlsaXRpZXMuRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLnRlc3R1dGlsaXRpZXMuSjJFRVZlcnNpb25DaGVjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLnRlc3R1dGlsaXRpZXMuVGVzdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRUpCTG9jYWxSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNBdXRoVHlwZUJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5idnQuQXV0b21hdGVkQlZUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXNzYWdlRHJpdmVuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RFbGVtZW50S2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLkJhc2VUZXN0Q2FzZTsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJhbEVNRlBvcHVsYXRpb25UZXN0IGV4dGVuZHMgQmFzZVRlc3RDYXNlIHsKLSAgICAvL2lubmVyIGNsYXNzIHRvIGhhbmRsZSBkZWZmZXJlZCBzaGFyZWQgcmVmZXJlbmNlcwotICAgIHByb3RlY3RlZCBjbGFzcyBEZWZlcnJlZFNoYXJlZFJlZmVyZW5jZUFjdGlvbiB7Ci0gICAgICAgIEVPYmplY3Qgb3duZXI7Ci0gICAgICAgIEVSZWZlcmVuY2UgcmVmOwotCi0gICAgICAgIHB1YmxpYyBEZWZlcnJlZFNoYXJlZFJlZmVyZW5jZUFjdGlvbihFT2JqZWN0IG93bmVyLCBFUmVmZXJlbmNlIHJlZikgewotICAgICAgICAgICAgdGhpcy5vd25lciA9IG93bmVyOwotICAgICAgICAgICAgdGhpcy5yZWYgPSByZWY7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBwZXJmb3JtQWN0aW9uKCkgewotICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gZ2V0U2hhcmVkT2JqZWN0QnlUeXBlKG93bmVyLCByZWYpOwotICAgICAgICAgICAgc2V0UmVmZXJlbmNlVmFsdWUob3duZXIsIHJlZiwgdmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE1hcCBlcXVpdmFsZW50TGluZXM7Ci0gICAgcHVibGljIExpc3QgZGVmZXJlZFJlZmVyZW5jZXM7Ci0gICAgcHVibGljIHN0YXRpYyBpbnQgZ2VuRGVwdGggPSA1OwotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IHNoYXJlZFZhbHVlOwotICAgIHB1YmxpYyBzdGF0aWMgSGFzaFNldCBpZ25vcmVBdHQ7Ci0KLSAgICBwdWJsaWMgaW50IHZlcnNpb247Ci0gICAgcHVibGljIGludCBtb2R1bGVUeXBlOwotICAgIC8vc3RhdGljIHZlcnNpb25zCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkVSU0lPTl8xXzIgPSAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZFUlNJT05fMV8zID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWRVJTSU9OXzFfNCA9IDI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUFBJQ0FUSU9OID0gMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUFBfQ0xJRU5UID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05ORUNUT1IgPSAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVKQiA9IDM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0VCID0gNDsKLQotICAgIHB1YmxpYyBHZW5lcmFsRU1GUG9wdWxhdGlvblRlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcG9wdWxhdGVSb290KEVPYmplY3QgZU9iamVjdCkgewotICAgICAgICBwb3B1bGF0ZUZlYXR1cmVzKGVPYmplY3QpOwotICAgICAgICBpZiAoZGVmZXJlZFJlZmVyZW5jZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZWZlcmVkUmVmZXJlbmNlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICgoRGVmZXJyZWRTaGFyZWRSZWZlcmVuY2VBY3Rpb24pIGRlZmVyZWRSZWZlcmVuY2VzLmdldChpKSkucGVyZm9ybUFjdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcG9wdWxhdGVGZWF0dXJlcyhFT2JqZWN0IGVPYmplY3QpIHsKLSAgICAgICAgaWYgKGVPYmplY3QgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBwb3B1bGF0ZUF0dHJpYnV0ZXMoZU9iamVjdCk7Ci0gICAgICAgICAgICBwb3B1bGF0ZVJlZmVyZW5jZXMoZU9iamVjdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVJlZmVyZW5jZXMoRU9iamVjdCBlT2JqZWN0KSB7Ci0gICAgICAgIExpc3QgcmVmZXJlbmNlcyA9IGVPYmplY3QuZUNsYXNzKCkuZ2V0RUFsbFJlZmVyZW5jZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZWZlcmVuY2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBFUmVmZXJlbmNlIHJlZiA9IChFUmVmZXJlbmNlKSByZWZlcmVuY2VzLmdldChpKTsKLSAgICAgICAgICAgIGlmICghcmVmLmlzTWFueSgpICYmIGVPYmplY3QuZUdldChyZWYpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0JCQlpZiAoZU9iamVjdCBpbnN0YW5jZW9mIE1lc3NhZ2VEcml2ZW4gJiYgKHJlZi5lcXVhbHMoRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RW50ZXJwcmlzZUJlYW5fSG9tZUludGVyZmFjZSgpKSB8fCByZWYuZXF1YWxzKEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVudGVycHJpc2VCZWFuX1JlbW90ZUludGVyZmFjZSgpKSB8fCByZWYuZXF1YWxzKEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVudGVycHJpc2VCZWFuX0xvY2FsSW50ZXJmYWNlKCkpIHx8IHJlZi5lcXVhbHMoRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RW50ZXJwcmlzZUJlYW5fTG9jYWxIb21lSW50ZXJmYWNlKCkpIHx8IHJlZi5lcXVhbHMoRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RW50ZXJwcmlzZUJlYW5fU2VjdXJpdHlSb2xlUmVmcygpKSkpCi0JCQkJY29udGludWU7Ci0gICAgICAgICAgICBpZiAocmVmLmlzQ29udGFpbm1lbnQoKSkKLSAgICAgICAgICAgICAgICBwb3B1bGF0ZUNvbnRhaW5tZW50UmVmZXJlbmNlKGVPYmplY3QsIHJlZik7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcG9wdWxhdGVTaGFyZWRSZWZlcmVuY2UoZU9iamVjdCwgcmVmKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHBvcHVsYXRlU2hhcmVkUmVmZXJlbmNlKEVPYmplY3QgZU9iamVjdCwgRVJlZmVyZW5jZSByZWYpIHsKLSAgICAgICAgaWYgKHJlZi5nZXRFVHlwZSgpID09IEphdmFSZWZQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXZhQ2xhc3MoKSkKLSAgICAgICAgICAgIHNldFJlZmVyZW5jZVZhbHVlKGVPYmplY3QsIHJlZiwgRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvci5jcmVhdGVKYXZhQ2xhc3NQcm94eShyZWYsZU9iamVjdCkpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIEVQYWNrYWdlIHBrZyA9IHJlZi5nZXRFVHlwZSgpLmdldEVQYWNrYWdlKCk7Ci0gICAgICAgICAgICAvL2lmIChwa2cgPT0gZU9iamVjdC5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpIHx8IHBrZyA9PSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRSkgewotICAgICAgICAgICAgICAgIGlmIChlT2JqZWN0LmVDbGFzcygpLmdldE5hbWUoKS5lcXVhbHMoIkVBbm5vdGF0aW9uIikgfHwgZU9iamVjdC5lQ2xhc3MoKS5nZXROYW1lKCkuZXF1YWxzKCJFQW5ub3RhdGlvbkltcGwiKSB8fCAhSjJFRVZlcnNpb25DaGVjay5jaGVja1JlZmVyZW5jZVZlcnNpb24ocmVmLCB2ZXJzaW9uLCBtb2R1bGVUeXBlKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIGlmIChkZWZlcmVkUmVmZXJlbmNlcyA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICBkZWZlcmVkUmVmZXJlbmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICBkZWZlcmVkUmVmZXJlbmNlcy5hZGQobmV3IERlZmVycmVkU2hhcmVkUmVmZXJlbmNlQWN0aW9uKGVPYmplY3QsIHJlZikpOwotICAgICAgICAgICAgLy99Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZUNvbnRhaW5tZW50UmVmZXJlbmNlKEVPYmplY3QgZU9iamVjdCwgRVJlZmVyZW5jZSByZWYpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBnZXREZXB0aEZvckF0dHJpYnV0ZShyZWYpOyBpKyspIHsKLSAgICAgICAgICAgIEVPYmplY3QgaW5zdGFuY2UgPSBjcmVhdGVJbnN0YW5jZShyZWYsZU9iamVjdCk7Ci0gICAgICAgICAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBpZiAoIUoyRUVWZXJzaW9uQ2hlY2suY2hlY2tSZWZlcmVuY2VWZXJzaW9uKHJlZiwgdmVyc2lvbiwgbW9kdWxlVHlwZSkpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBzZXRSZWZlcmVuY2VWYWx1ZShlT2JqZWN0LCByZWYsIGluc3RhbmNlKTsKLSAgICAgICAgICAgIGlmICgoKEludGVybmFsRU9iamVjdCkgaW5zdGFuY2UpLmVJc1Byb3h5KCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgaWYgKHJlZi5nZXRFVHlwZSgpID09IGVPYmplY3QuZUNsYXNzKCkpCi0gICAgICAgICAgICAgICAgcG9wdWxhdGVBdHRyaWJ1dGVzKGluc3RhbmNlKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBwb3B1bGF0ZUZlYXR1cmVzKGluc3RhbmNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFJlZmVyZW5jZVZhbHVlKEVPYmplY3QgZU9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIHJlZiwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlmIChyZWYuZ2V0TmFtZSgpLmVxdWFscygiRUFubm90YXRpb24iKSB8fCByZWYuZ2V0TmFtZSgpLmVxdWFscygiRUFubm90YXRpb25JbXBsIikgfHwgIUoyRUVWZXJzaW9uQ2hlY2suY2hlY2tSZWZlcmVuY2VWZXJzaW9uKHJlZiwgdmVyc2lvbiwgbW9kdWxlVHlwZSkpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGlmIChyZWYuaXNNYW55KCkpIHsKLSAgICAgICAgICAgIExpc3QgbGlzdCA9IChMaXN0KSBlT2JqZWN0LmVHZXQocmVmKTsKLSAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIENvbGxlY3Rpb24pCi0gICAgICAgICAgICAgICAgbGlzdC5hZGRBbGwoKENvbGxlY3Rpb24pIHZhbHVlKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBsaXN0LmFkZCh2YWx1ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBlT2JqZWN0LmVTZXQocmVmLCB2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgRU9iamVjdCBjcmVhdGVJbnN0YW5jZShFUmVmZXJlbmNlIHJlZiwgRU9iamVjdCBlT2JqZWN0KSB7Ci0gICAgICAgIGlmIChyZWYuZ2V0RVR5cGUoKSA9PSBKYXZhUmVmUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YUNsYXNzKCkpCi0gICAgICAgICAgICByZXR1cm4gRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvci5jcmVhdGVKYXZhQ2xhc3NQcm94eShyZWYsIGVPYmplY3QpOwotICAgICAgICByZXR1cm4gcmVmLmdldEVUeXBlKCkuZ2V0RVBhY2thZ2UoKS5nZXRFRmFjdG9yeUluc3RhbmNlKCkuY3JlYXRlKChFQ2xhc3MpcmVmLmdldEVUeXBlKCkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHBvcHVsYXRlQXR0cmlidXRlcyhFT2JqZWN0IGVPYmplY3QpIHsKLSAgICAJaWYgKGVPYmplY3QuZUNsYXNzKCkgPT0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UU5hbWUoKSkgewotICAgIAkJcG9wdWxhdGVBdHRyaWJ1dGVzUU5hbWUoZU9iamVjdCk7Ci0gICAgCQlyZXR1cm47Ci0gICAgCX0KLSAgICAgICAgTGlzdCBhdHRyaWJ1dGVzID0gZU9iamVjdC5lQ2xhc3MoKS5nZXRFQWxsQXR0cmlidXRlcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIEVBdHRyaWJ1dGUgYXR0ID0gKEVBdHRyaWJ1dGUpIGF0dHJpYnV0ZXMuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKGVPYmplY3QgaW5zdGFuY2VvZiBFSkJMb2NhbFJlZiAmJiAoYXR0LmVxdWFscyhDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRFamJSZWZfSG9tZSgpKSB8fCBhdHQuZXF1YWxzKENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldEVqYlJlZl9SZW1vdGUoKSkpKQotICAgICAgICAgICAgCWNvbnRpbnVlOwotICAgICAgICAgICAgcHJpbVBvcHVsYXRlQXR0cmJ1dGUoZU9iamVjdCwgYXR0KTsKLSAgICAgICAgfQotICAgIH0KLQotCXByaXZhdGUgdm9pZCBwcmltUG9wdWxhdGVBdHRyYnV0ZShFT2JqZWN0IGVPYmplY3QsIEVBdHRyaWJ1dGUgYXR0KSB7Ci0gICAgICAgICAgICBpZiAoYXR0LmlzQ2hhbmdlYWJsZSgpICYmIEoyRUVWZXJzaW9uQ2hlY2suY2hlY2tBdHRyaWJ1dGVWZXJzaW9uKGF0dCwgdmVyc2lvbiwgbW9kdWxlVHlwZSkpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMCA7IGogPCBnZXREZXB0aEZvckF0dHJpYnV0ZShhdHQpO2orKyl7Ci0JICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGNyZWF0ZUF0dHJpYnV0ZVZhbHVlKGF0dCwgZU9iamVjdCk7Ci0JICAgICAgICAgICAgICAgIHNldFJlZmVyZW5jZVZhbHVlKGVPYmplY3QsYXR0LHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAKLSAgICAKLQotICAgIC8qKgotCSAqIEBwYXJhbSBlT2JqZWN0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQXR0cmlidXRlc1FOYW1lKEVPYmplY3QgZU9iamVjdCkgewotCQlTdHJpbmcgcHJlZml4ID0gKFN0cmluZyljcmVhdGVBdHRyaWJ1dGVWYWx1ZShDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRRTmFtZV9JbnRlcm5hbFByZWZpeE9yTnNVUkkoKSwgZU9iamVjdCk7Ci0JCVN0cmluZyBsb2NhbFBhcnQgPSAoU3RyaW5nKWNyZWF0ZUF0dHJpYnV0ZVZhbHVlKENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldFFOYW1lX0xvY2FsUGFydCgpLCBlT2JqZWN0KTsKLQkJKChRTmFtZSllT2JqZWN0KS5zZXRWYWx1ZXMocHJlZml4LCAiaHR0cDovL3d3dy5pYm0uY29tIiwgbG9jYWxQYXJ0KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZUF0dHJpYnV0ZVZhbHVlKEVBdHRyaWJ1dGUgYXR0LCBFT2JqZWN0IGVPYmplY3QpIHsKLSAgICAgICAgaWYgKGF0dC5nZXRFVHlwZSgpID09IEphdmFSZWZQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXZhQ2xhc3MoKSkgewotICAgICAgICAgICAgcmV0dXJuIEVNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3IuY3JlYXRlSmF2YUNsYXNzUHJveHkoYXR0LGVPYmplY3QpLmdldENsYXNzKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoYXR0ID09IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldFJlc291cmNlUmVmX0F1dGgoKSkKLQkJCXJldHVybiBjcmVhdGVSZXNBdXRoKGF0dCwgZU9iamVjdCk7Ci0JCWVsc2UgaWYgKGF0dCA9PSBFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X1R5cGUoKSkKLQkJCXJldHVybiBjcmVhdGVNZXRob2RFbGVtZW50VHlwZShhdHQsIGVPYmplY3QpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gcHJpbUNyZWF0ZUF0dHJpYnV0ZVZhbHVlKGF0dCwgZU9iamVjdCk7Ci0gICAgICAgIC8vcmV0dXJuIEVNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3IuY3JlYXRlQXR0cmlidXRlKGF0dCk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBPYmplY3QgcHJpbUNyZWF0ZUF0dHJpYnV0ZVZhbHVlKEVBdHRyaWJ1dGUgYXR0LCBFT2JqZWN0IGVPYmplY3QpIHsKLQkJcmV0dXJuIEVNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3IuY3JlYXRlQXR0cmlidXRlKGF0dCwgZU9iamVjdCwgdHJ1ZSwgdmVyc2lvbiwgbW9kdWxlVHlwZSk7Ci0gICAgfQotCi0gICAgLy8gT2xkIENvbXBhcmUgbWV0aG9kLi4uLm5vdyB1c2luZyBET01Db21wYXJhdG9yLi4ucmVtb3ZlIG9uY2Ugc3RhYmxlCi0gICAgcHVibGljIHZvaWQgY29tcGFyZUNvbnRlbnRzKFN0cmluZyBmaWxlMSwgU3RyaW5nIGZpbGUyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGludCBsaW5lbm8gPSAxOwotICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgcmVhZGVyMSA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoZ2V0RmlsZUlucHV0U3RyZWFtKGZpbGUxKSkpOwotICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgcmVhZGVyMiA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoZ2V0RmlsZUlucHV0U3RyZWFtKGZpbGUyKSkpOwotICAgICAgICAgICAgU3RyaW5nIGxpbmUxID0gIiIsIGxpbmUyID0gIiI7Ci0gICAgICAgICAgICB3aGlsZSAocmVhZGVyMS5yZWFkeSgpICYmIHJlYWRlcjIucmVhZHkoKSkgewotICAgICAgICAgICAgICAgIGxpbmUxID0gcmVhZGVyMS5yZWFkTGluZSgpOwotICAgICAgICAgICAgICAgIGxpbmUyID0gcmVhZGVyMi5yZWFkTGluZSgpOwotICAgICAgICAgICAgICAgIGlmIChsaW5lMSA9PSBudWxsICYmIGxpbmUyID09IG51bGwgJiYgbGluZW5vICE9IDApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICBpZiAoIWxpbmUxLmVxdWFscyhsaW5lMikpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiRXJyb3IgYXQgbGluZSAjOiAiICsgbGluZW5vICsgJ1xuJyArIGxpbmUxICsgJ1xuJyArIGxpbmUyICsgJ1xuJzsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBhZGRlZCB0byBlc2NhcGUgY29tcGFyZSAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbGluZW5vKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJUaGUgZmlsZXMgaGF2ZSBhIGRpZmZlcmVudCBudW1iZXIgb2YgbGluZXM6IiArIGxpbmVubyArICdcbicgKyBsaW5lMSArICdcbicgKyBsaW5lMiArICdcbicsICghcmVhZGVyMS5yZWFkeSgpICYmICFyZWFkZXIyLnJlYWR5KCkpKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIklPIGZhaWxlZCIsIGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBjb21wYXJlQ29udGVudHNJZ25vcmVXaGl0ZXNwYWNlKFN0cmluZyBmaWxlMSwgU3RyaW5nIGZpbGUyLCBTdHJpbmcgaWRlbnRpZmllcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgTGluZU51bWJlclJlYWRlciByZWFkZXIxID0gbmV3IExpbmVOdW1iZXJSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGdldEZpbGVJbnB1dFN0cmVhbShmaWxlMSkpKTsKLSAgICAgICAgTGluZU51bWJlclJlYWRlciByZWFkZXIyID0gbmV3IExpbmVOdW1iZXJSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGdldEZpbGVJbnB1dFN0cmVhbShmaWxlMikpKTsKLSAgICAgICAgY29tcGFyZUNvbnRlbnRzSWdub3JlV2hpdGVzcGFjZShyZWFkZXIxLCByZWFkZXIyLCBpZGVudGlmaWVyKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNvbXBhcmVDb250ZW50c0lnbm9yZVdoaXRlc3BhY2UoTGluZU51bWJlclJlYWRlciByZWFkZXIxLCBMaW5lTnVtYmVyUmVhZGVyIHJlYWRlcjIsIFN0cmluZyBpZGVudGlmaWVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTGlzdCBlcnJvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVN0cmluZyBtc2cgPSBudWxsOwotICAgICAgICB3aGlsZSAocmVhZGVyMS5yZWFkeSgpIHx8IHJlYWRlcjIucmVhZHkoKSkgewotICAgICAgICAgICAgU3RyaW5nIGxpbmUxID0gIiIsIGxpbmUyID0gIiI7Ci0gICAgICAgICAgICB3aGlsZSAocmVhZGVyMS5yZWFkeSgpICYmIGxpbmUxICE9IG51bGwgJiYgbGluZTEuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgIGxpbmUxID0gcmVhZGVyMS5yZWFkTGluZSgpOwotICAgICAgICAgICAgICAgIGlmIChsaW5lMSAhPSBudWxsKQotICAgICAgICAgICAgICAgIAlsaW5lMSA9IGxpbmUxLnRyaW0oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdoaWxlIChyZWFkZXIyLnJlYWR5KCkgJiYgbGluZTIgIT0gbnVsbCAmJiBsaW5lMi5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgbGluZTIgPSByZWFkZXIyLnJlYWRMaW5lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGxpbmUyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgCWxpbmUyID0gbGluZTIudHJpbSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGxpbmUxICE9IG51bGwgJiYgbGluZTIgIT0gbnVsbCAmJiAhaXNFcXVpdmFsZW50TGluZXMobGluZTEsIGxpbmUyKSkgewotICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBidWZmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIik7Ci0gICAgICAgICAgICAgICAgYnVmZi5hcHBlbmQoIlxuU291cmNlIGxpbmUgIzogIik7Ci0gICAgICAgICAgICAgICAgYnVmZi5hcHBlbmQocmVhZGVyMS5nZXRMaW5lTnVtYmVyKCkpOwotICAgICAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKCdcbicpOwotICAgICAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKGxpbmUxKTsKLSAgICAgICAgICAgICAgICBidWZmLmFwcGVuZCgiXG5EZXN0aW5hdGlvbiBsaW5lICM6ICIpOwotICAgICAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKHJlYWRlcjIuZ2V0TGluZU51bWJlcigpKTsKLSAgICAgICAgICAgICAgICBidWZmLmFwcGVuZCgnXG4nKTsKLSAgICAgICAgICAgICAgICBidWZmLmFwcGVuZChsaW5lMik7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGJ1ZmYudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgZXJyb3JzLmFkZChidWZmKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoIWVycm9ycy5pc0VtcHR5KCkpCi0JCQlhc3NlcnRUcnVlKCJFcnJvcnMgRm91bmQsIENoZWNrIENvbnNvbGUuIiwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGxpbmVFcXVhbHMoU3RyaW5nIGxpbmUxLCBTdHJpbmcgbGluZTIpIHsKLSAgICAgICAgcmV0dXJuIGxpbmUxICE9IG51bGwgJiYgbGluZTEuZXF1YWxzKGxpbmUyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VxdWl2YWxlbnRMaW5lcyhTdHJpbmcgbGluZTEsIFN0cmluZyBsaW5lMikgewotICAgICAgICBpZiAobGluZUVxdWFscyhsaW5lMSwgbGluZTIpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgU3RyaW5nIGVxdWl2ID0gKFN0cmluZykgZ2V0RXF1aXZhbGVudExpbmVzKCkuZ2V0KGxpbmUxKTsKLSAgICAgICAgaWYgKGVxdWl2ID09IG51bGwpewotICAgICAgICAJZXF1aXYgPSAoU3RyaW5nKWdldEVxdWl2YWxlbnRMaW5lcygpLmdldChsaW5lMik7Ci0gICAgICAgIAlpZiAoZXF1aXYgIT0gbnVsbCkKLSAgICAgICAgCQlyZXR1cm4gZXF1aXYuZXF1YWxzKGxpbmUxKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZXF1aXYgIT0gbnVsbCAmJiBlcXVpdi5lcXVhbHMobGluZTIpOwotICAgIH0KLSAgICBwdWJsaWMgTWFwIGdldEVxdWl2YWxlbnRMaW5lcygpIHsKLSAgICAgICAgaWYgKGVxdWl2YWxlbnRMaW5lcyA9PSBudWxsKQotICAgICAgICAgICAgZXF1aXZhbGVudExpbmVzID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgcmV0dXJuIGVxdWl2YWxlbnRMaW5lczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFcXVpdmFsZW50TGluZXMoTWFwIGVxdWl2YWxlbnRMaW5lcykgewotICAgICAgICB0aGlzLmVxdWl2YWxlbnRMaW5lcyA9IGVxdWl2YWxlbnRMaW5lczsKLSAgICB9Ci0gICAgLyoKLSAgICAJcHVibGljIHZvaWQgY29tcGFyZUNvbnRlbnRzKFN0cmluZyBmaWxlMSwgU3RyaW5nIGZpbGUyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAJCUlucHV0U3RyZWFtIGlzMSwgaXMyOwotICAgIAkJaXMxID0gZ2V0RmlsZUlucHV0U3RyZWFtKGZpbGUxKTsKLSAgICAJCWlzMiA9IGdldEZpbGVJbnB1dFN0cmVhbShmaWxlMik7Ci0gICAgCQlJbnB1dFNvdXJjZSBpbnB1dDEgPSBuZXcgSW5wdXRTb3VyY2UoaXMxKTsKLSAgICAJCUlucHV0U291cmNlIGlucHV0MiA9IG5ldyBJbnB1dFNvdXJjZShpczIpOwotICAgIAkJdHJ5IHsKLSAgICAJCQlTdHJpbmcgcmVzdWx0czsKLSAgICAJCQlpZihpZ25vcmVBdHQgPT0gbnVsbCkKLSAgICAJCQkJcmVzdWx0cyA9IERvbUNvbXBhcml0b3IuY29tcGFyZURvbXMoaW5wdXQxLCBpbnB1dDIpOwotICAgIAkJCWVsc2UKLSAgICAJCQkJcmVzdWx0cyA9IERvbUNvbXBhcml0b3IuY29tcGFyZURvbXMoaW5wdXQxLCBpbnB1dDIsIGlnbm9yZUF0dCk7Ci0gICAgCQkJaWYgKHJlc3VsdHMgIT0gbnVsbCkgewotICAgIAkJCQlhc3NlcnRUcnVlKCJVbmVxdWFsIGRvbXMgY29tcGFyZWQgYXMgZXF1YWwgIiArIGZpbGUxICsgIiAiICsgZmlsZTIgKyAiRGV0YWlsczogIiArIHJlc3VsdHMsIGZhbHNlKTsKLSAgICAJCQl9Ci0gICAgCQl9IGZpbmFsbHkgewotICAgIAkJCXRyeSB7Ci0gICAgCQkJCWlzMS5jbG9zZSgpOwotICAgIAkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgCQkJCUFzc2VydC5mYWlsKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAJCQl9Ci0gICAgCQkJdHJ5IHsKLSAgICAJCQkJaXMyLmNsb3NlKCk7Ci0gICAgCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAJCQkJQXNzZXJ0LmZhaWwoZS5nZXRNZXNzYWdlKCkpOwotICAgIAkJCX0KLSAgICAJCX0KLSAgICAJfQotICAgICovCi0gICAgcHVibGljIElucHV0U3RyZWFtIGdldEZpbGVJbnB1dFN0cmVhbShTdHJpbmcgcGF0aCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBuZXcgRmlsZUlucHV0U3RyZWFtKHBhdGgpOwotICAgIH0KLQotICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRSZXNvdXJjZUFzU3RyZWFtKFN0cmluZyBmaWxlTmFtZSkgewotICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0gICAgICAgIENsYXNzTG9hZGVyIGxvYWRlciA9IGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgaWYgKGxvYWRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpbiA9IENsYXNzTG9hZGVyLmdldFN5c3RlbVJlc291cmNlQXNTdHJlYW0oZmlsZU5hbWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW4gPSBsb2FkZXIuZ2V0UmVzb3VyY2VBc1N0cmVhbShmaWxlTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVW5hYmxlIHRvIGZpbmQgcmVzb3VyY2U6ICIgKyBmaWxlTmFtZSwgaW4gIT0gbnVsbCk7Ci0gICAgICAgIHJldHVybiBpbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmFsRGVwdGgoaW50IGRlcHRoKSB7Ci0gICAgICAgIEdlbmVyYWxFTUZQb3B1bGF0aW9uVGVzdC5nZW5EZXB0aCA9IGRlcHRoOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE1vZHVsZVR5cGUoaW50IHR5cGUpIHsKLSAgICAgICAgbW9kdWxlVHlwZSA9IHR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VmVyc2lvbihpbnQgdmVyc2lvbikgewotICAgICAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0RGVwdGhGb3JBdHRyaWJ1dGUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLSAgICAgICAgaWYgKGZlYXR1cmUuaXNNYW55KCkpCi0gICAgICAgICAgICByZXR1cm4gZ2VuRGVwdGg7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0U2hhcmVkT2JqZWN0QnlUeXBlKEVPYmplY3Qgb3duZXIsIEVSZWZlcmVuY2UgcmVmKSB7Ci0gICAgICAgIHNoYXJlZFZhbHVlID0gVGVzdFV0aWxpdGllcy5nZXRPYmplY3RCeVR5cGUob3duZXIuZVJlc291cmNlKCksIHJlZi5nZXRFVHlwZSgpLCByZWYuaXNNYW55KCkpOwotICAgICAgICByZXR1cm4gc2hhcmVkVmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHNldAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRJZ25vcmVBdHQoSGFzaFNldCBzZXQpIHsKLSAgICAgICAgaWdub3JlQXR0ID0gc2V0OwotICAgIH0KLSAgICAKLQkKLQkKLQlwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVJlc0F1dGgoRUF0dHJpYnV0ZSBhdHQsIEVPYmplY3QgZU9iamVjdCkgewotCQlPYmplY3QgYXV0aCA9IG51bGw7Ci0JCWRvIHsKLQkJCWF1dGggPSBwcmltQ3JlYXRlQXR0cmlidXRlVmFsdWUoYXR0LCBlT2JqZWN0KTsKLQkJfSB3aGlsZSAoIWlzVmFsaWRBdXRoKChSZXNBdXRoVHlwZUJhc2UpYXV0aCkpOwotCQlyZXR1cm4gYXV0aDsKLQl9Ci0JCi0JLyoqCi0JICogV2ViIHdpbGwgbmVlZCB0byBvdmVycmlkZSAgZm9yIEoyRUUgMS4yLzEvMwotCSAqIEBwYXJhbSBhdXRoCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzVmFsaWRBdXRoKFJlc0F1dGhUeXBlQmFzZSBhdXRoKSB7Ci0JCXJldHVybiBhdXRoID09IFJlc0F1dGhUeXBlQmFzZS5BUFBMSUNBVElPTl9MSVRFUkFMIHx8IGF1dGggPT0gUmVzQXV0aFR5cGVCYXNlLkNPTlRBSU5FUl9MSVRFUkFMOwotCX0KLQkKLQlwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZU1ldGhvZEVsZW1lbnRUeXBlKEVBdHRyaWJ1dGUgYXR0LCBFT2JqZWN0IGVPYmplY3QpIHsKLQkJT2JqZWN0IHR5cGUgPSBudWxsOwotCQlkbyB7Ci0JCQl0eXBlID0gcHJpbUNyZWF0ZUF0dHJpYnV0ZVZhbHVlKGF0dCwgZU9iamVjdCk7Ci0JCX0gd2hpbGUgKCFpc1ZhbGlkTWV0aG9kRWxlbWVudFR5cGUoKE1ldGhvZEVsZW1lbnRLaW5kKXR5cGUpKTsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogV2ViIHdpbGwgbmVlZCB0byBvdmVycmlkZSAgZm9yIEoyRUUgMS4yLzEvMwotCSAqIEBwYXJhbSBhdXRoCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzVmFsaWRNZXRob2RFbGVtZW50VHlwZShNZXRob2RFbGVtZW50S2luZCB0eXBlKSB7Ci0JCWlmICAodmVyc2lvbiA9PSBWRVJTSU9OXzFfNCkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gdmVyc2lvbiAhPSBWRVJTSU9OXzFfNCAmJiB0eXBlICE9IE1ldGhvZEVsZW1lbnRLaW5kLlNFUlZJQ0VfRU5EUE9JTlRfTElURVJBTDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQl0cnkgewotCQkJU3RyaW5nIG91dCA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInRlc3RPdXRwdXQvIjsKLQkJCUZpbGUgZGVsID0gbmV3IEZpbGUob3V0KTsKLQkJCWRlbGV0ZURpcmVjdG9yeShkZWwpOwotCQkJZGVsLmRlbGV0ZSgpOwotCQkJb3V0ID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAiLi4vdGVzdERhdGEvdGVzdE91dHB1dC8iOwotCQkJZGVsID0gbmV3IEZpbGUob3V0KTsKLQkJCWRlbGV0ZURpcmVjdG9yeShkZWwpOwotCQkJZGVsLmRlbGV0ZSgpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSl7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGRlbGV0ZURpcmVjdG9yeShGaWxlIGRpcmVjdG9yeSkKLQkgICB0aHJvd3MgSU9FeGNlcHRpb24KLQl7Ci0JCWlmIChkaXJlY3RvcnkuZXhpc3RzKCkpewotCQkgICBGaWxlW10gZGVsRmlsZXMgPSBkaXJlY3RvcnkubGlzdEZpbGVzKCk7Ci0JCi0JCSAgIGZvcihpbnQgaT0wOyBpPGRlbEZpbGVzLmxlbmd0aDsgKytpKQotCQkgICB7Ci0JCSAgICAgIGlmKGRlbEZpbGVzW2ldLmlzRGlyZWN0b3J5KCkpCi0JCSAgICAgICAgIGRlbGV0ZURpcmVjdG9yeShkZWxGaWxlc1tpXSk7Ci0JCSAgICAgIGRlbEZpbGVzW2ldLmRlbGV0ZSgpOwotCQkgICB9ICAKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9SYXJFTUZFZGl0VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9SYXJFTUZFZGl0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGE2Y2UwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvUmFyRU1GRWRpdFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC5zd2luZ3VpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuUkFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5PcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLmJ2dC5BdXRvbWF0ZWRCVlQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3RvclJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci0KLQotcHVibGljIGNsYXNzIFJhckVNRkVkaXRUZXN0IGV4dGVuZHMgR2VuZXJhbEVNRkVkaXRpbmdUZXN0IHsKLSAgICBSQVJGaWxlIHJhckZpbGU7Ci0KLSAgICBwdWJsaWMgUmFyRU1GRWRpdFRlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIENvbW1vbmFyY2hpdmVGYWN0b3J5IGdldEFyY2hpdmVGYWN0b3J5KCkgewotICAgICAgICByZXR1cm4gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbW1vbmFyY2hpdmVGYWN0b3J5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIEVqYkZhY3RvcnkgZ2V0RWpiRmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVqYkZhY3RvcnkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXBwbGljYXRpb25GYWN0b3J5IGdldEFwcGxpY2F0aW9uRmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25GYWN0b3J5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBnZXRXZWJBcHBGYWN0b3J5KCkgewotICAgICAgICByZXR1cm4gV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJhcHBsaWNhdGlvbkZhY3RvcnkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihqYXZhLmxhbmcuU3RyaW5nW10gYXJncykgewotICAgICAgICBTdHJpbmdbXSBjbGFzc05hbWUgPSB7ICJjb20uaWJtLmV0b29scy5hcmNoaXZlLnRlc3QuUmFyRU1GRWRpdFRlc3QiLCAiLW5vbG9hZGluZyIgfTsKLSAgICAgICAgVGVzdFJ1bm5lci5tYWluKGNsYXNzTmFtZSk7Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChuZXcgUmFyRU1GRWRpdFRlc3QoInRlc3RSQVJFZGl0IikpOwotICAgICAgICByZXR1cm4gc3VpdGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJBUkVkaXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZ2V0UmFyKCk7Ci0JCWFzc2VydEVxdWFscygiMS4wIiwgcmFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldFNwZWNWZXJzaW9uKCkpOwotCi0JCUNvbm5lY3RvclJlc291cmNlIEREID0gKENvbm5lY3RvclJlc291cmNlKSByYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLSAgICAgICAJc2V0VmVyc2lvbihWRVJTSU9OXzFfMyk7Ci0gICAgICAgCXNldE1vZHVsZVR5cGUoQ09OTkVDVE9SKTsgICAgICAgCi0gICAgICAgIGVkaXRSb290KERELmdldFJvb3RPYmplY3QoKSk7Ci0gICAgICAgIFN0cmluZyBjdXJEaXIgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBvdXQgPSBjdXJEaXIgKyAidGVzdE91dHB1dC9FTUZNb2RlbENyZWF0aW9uVGVzdHMvRWRpdFJhckVBUiI7Ci0gICAgICAgIHJhckZpbGUuZXh0cmFjdFRvKG91dCwgQXJjaGl2ZS5FWFBBTkRfQUxMKTsKLSAgICAgICAgcmFyRmlsZS5jbG9zZSgpOwotCi0gICAgICAgIC8vQ29tcGFyZSB3b3JrIGluIHByb2dyZXNzCi0gICAgICAgIAotICAgICAgICBTdHJpbmcgZXhhbXBsZURlcGxveW1lbnREZXNVUkkgPSBjdXJEaXIgKyAiRU1GVGVzdHMvcmEueG1sIjsKLSAgICAgICAgU3RyaW5nIGN1ckRlcGxveW1lbnREZXNVUkkgPSBjdXJEaXIgKyBvdXQgKyAiL2Zvb1JBUi9NRVRBLUlORi9yYS54bWwiOwotICAgICAgICAvL2NvbXBhcmVDb250ZW50cyhjdXJEZXBsb3ltZW50RGVzVVJJLCBleGFtcGxlRGVwbG95bWVudERlc1VSSSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZ2V0UmFyKCkgdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiwgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgaW4gPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJsb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlQ29ubmVjdG9yL2Zvb1JBUi8iOwotICAgICAgICByYXJGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuUkFSRmlsZShpbik7Ci0gICAgICAgIGFzc2VydFRydWUocmFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpICE9IG51bGwpOwotICAgIH0KLQlwdWJsaWMgSGFzaFNldCBpZ25vcmFibGVBdHRyaWJ1dGVzKCl7Ci0JCUhhc2hTZXQgc2V0ID0gbmV3IEhhc2hTZXQoKTsKLQkJc2V0LmFkZCgiaWQiKTsKLQkJcmV0dXJuIHNldDsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL1JhckVNRlRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvUmFyRU1GVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGRiYmZmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvUmFyRU1GVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC5zd2luZ3VpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUudGVzdHV0aWxpdGllcy5FTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5SQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5EdXBsaWNhdGVPYmplY3RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk9wZW5GYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMuYnZ0LkF1dG9tYXRlZEJWVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdG9yUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLQotCi1wdWJsaWMgY2xhc3MgUmFyRU1GVGVzdCBleHRlbmRzIEdlbmVyYWxFTUZQb3B1bGF0aW9uVGVzdCB7Ci0JRUFSRmlsZSBlYXJGaWxlOwotCXByb3RlY3RlZCBSQVJGaWxlIHJhckZpbGU7Ci0KLQlwdWJsaWMgUmFyRU1GVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgQ29tbW9uYXJjaGl2ZUZhY3RvcnkgZ2V0QXJjaGl2ZUZhY3RvcnkoKSB7Ci0JCXJldHVybiBDb21tb25hcmNoaXZlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uYXJjaGl2ZUZhY3RvcnkoKTsKLQl9Ci0KLQlwdWJsaWMgRWpiRmFjdG9yeSBnZXRFamJGYWN0b3J5KCkgewotCQlyZXR1cm4gRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RWpiRmFjdG9yeSgpOwotCX0KLQotCXB1YmxpYyBBcHBsaWNhdGlvbkZhY3RvcnkgZ2V0QXBwbGljYXRpb25GYWN0b3J5KCkgewotCQlyZXR1cm4gQXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbkZhY3RvcnkoKTsKLQl9Ci0KLQlwdWJsaWMgV2ViYXBwbGljYXRpb25GYWN0b3J5IGdldFdlYkFwcEZhY3RvcnkoKSB7Ci0JCXJldHVybiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYmFwcGxpY2F0aW9uRmFjdG9yeSgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKGphdmEubGFuZy5TdHJpbmdbXSBhcmdzKSB7Ci0JCVN0cmluZ1tdIGNsYXNzTmFtZSA9IHsgImNvbS5pYm0uZXRvb2xzLmFyY2hpdmUudGVzdC5SYXJFTUZUZXN0IiwgIi1ub2xvYWRpbmciIH07Ci0JCVRlc3RSdW5uZXIubWFpbihjbGFzc05hbWUpOwotCX0KLQlwdWJsaWMgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFJhckVNRlRlc3QoInRlc3RSQVJQb3B1bGF0aW9uIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBSYXJFTUZUZXN0KCJ0ZXN0MTRSQVJQb3B1bGF0aW9uIikpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJBUlBvcHVsYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvci5yZXNldCgpOwotCQljcmVhdGVFQVIoKTsKLQkJY3JlYXRlUkFSKCk7Ci0KLQkJQ29ubmVjdG9yUmVzb3VyY2UgREQgPSAoQ29ubmVjdG9yUmVzb3VyY2UpIHJhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotCQkvL1RPRE86IGluZGl2aWR1YWwgdGVzdCBmb3IgZWFjaCB2ZXJzaW9uCi0JCURELnNldFZlcnNpb25JRChKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCk7Ci0JCXNldFZlcnNpb24oVkVSU0lPTl8xXzMpOwotCQlzZXRNb2R1bGVUeXBlKENPTk5FQ1RPUik7Ci0JCXBvcHVsYXRlUm9vdChERC5nZXRSb290T2JqZWN0KCkpOwotCi0JCVN0cmluZyBvdXQgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJ0ZXN0T3V0cHV0L1Rlc3RSYXJFQVIiOwotCQllYXJGaWxlLmV4dHJhY3RUbyhvdXQsIEFyY2hpdmUuRVhQQU5EX0FMTCk7Ci0JCWVhckZpbGUuY2xvc2UoKTsKLQotCQkvL0NvbXBhcmUgd29yayBpbiBwcm9ncmVzcwotCQlTdHJpbmcgY3VyRGlyID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3Rvcnk7Ci0JCVN0cmluZyBleGFtcGxlRGVwbG95bWVudERlc1VSSSA9IGN1ckRpciArICJFTUZUZXN0Tm9JRC9yYS54bWwiOwotCQlTdHJpbmcgY3VyRGVwbG95bWVudERlc1VSSSA9IGN1ckRpciArICJ0ZXN0T3V0cHV0L1Rlc3RSYXJFQVIvZm9vUkFSL01FVEEtSU5GL3JhLnhtbCI7Ci0JCXNldElnbm9yZUF0dChpZ25vcmFibGVBdHRyaWJ1dGVzKCkpOwotCQljb21wYXJlQ29udGVudHNJZ25vcmVXaGl0ZXNwYWNlKGN1ckRlcGxveW1lbnREZXNVUkksIGV4YW1wbGVEZXBsb3ltZW50RGVzVVJJLCBudWxsKTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdDE0UkFSUG9wdWxhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlFTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yLnJlc2V0KCk7Ci0JCWNyZWF0ZUVBUigpOwotCQljcmVhdGVSQVIoKTsKLQotCQlDb25uZWN0b3JSZXNvdXJjZSBERCA9IChDb25uZWN0b3JSZXNvdXJjZSkgcmFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0JCS8vVE9ETzogaW5kaXZpZHVhbCB0ZXN0IGZvciBlYWNoIHZlcnNpb24KLQkJREQuc2V0VmVyc2lvbklEKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEKTsKLQkJc2V0VmVyc2lvbihWRVJTSU9OXzFfNCk7Ci0JCXNldE1vZHVsZVR5cGUoQ09OTkVDVE9SKTsKLQkJcG9wdWxhdGVSb290KERELmdldFJvb3RPYmplY3QoKSk7Ci0KLQkJU3RyaW5nIG91dCA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInRlc3RPdXRwdXQvVGVzdDE0UmFyRUFSIjsKLQkJZWFyRmlsZS5leHRyYWN0VG8ob3V0LCBBcmNoaXZlLkVYUEFORF9BTEwpOwotCQllYXJGaWxlLmNsb3NlKCk7Ci0KLQkJZ2V0UmFyKCk7Ci0JCWFzc2VydFRydWUoIjEuNSIuZXF1YWxzKHJhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5nZXRTcGVjVmVyc2lvbigpKSk7Ci0JCW91dCA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInRlc3RPdXRwdXQvVGVzdDE0UmFyRUFSMiI7Ci0JCXJhckZpbGUuZXh0cmFjdFRvKG91dCwgQXJjaGl2ZS5FWFBBTkRfQUxMKTsKLQkJcmFyRmlsZS5jbG9zZSgpOwotCi0JCS8vQ29tcGFyZSB3b3JrIGluIHByb2dyZXNzCi0JCVN0cmluZyBjdXJEaXIgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeTsKLQkJU3RyaW5nIGV4YW1wbGVEZXBsb3ltZW50RGVzVVJJID0gY3VyRGlyICsgInRlc3RPdXRwdXQvVGVzdDE0UmFyRUFSMi9NRVRBLUlORi9yYS54bWwiOwotCQlTdHJpbmcgY3VyRGVwbG95bWVudERlc1VSSSA9IGN1ckRpciArICJ0ZXN0T3V0cHV0L1Rlc3QxNFJhckVBUi9mb29SQVIvTUVUQS1JTkYvcmEueG1sIjsKLQkJc2V0SWdub3JlQXR0KGlnbm9yYWJsZUF0dHJpYnV0ZXMoKSk7Ci0JCWNvbXBhcmVDb250ZW50c0lnbm9yZVdoaXRlc3BhY2UoY3VyRGVwbG95bWVudERlc1VSSSwgZXhhbXBsZURlcGxveW1lbnREZXNVUkksIG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIGdldFJhcigpIHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24sIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGluID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAidGVzdE91dHB1dC9UZXN0MTRSYXJFQVIvZm9vUkFSIjsKLQkJcmFyRmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkub3BlblJBUkZpbGUoaW4pOwotCQlhc3NlcnRUcnVlKHJhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSAhPSBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVSQVIoKSB0aHJvd3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uIHsKLQkJcmFyRmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlUkFSRmlsZUluaXRpYWxpemVkKCJmb29SQVIiKTsKLQkJcmFyRmlsZSA9IChSQVJGaWxlKSBlYXJGaWxlLmFkZENvcHkocmFyRmlsZSk7Ci0JCXJhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5zZXREaXNwbGF5TmFtZSgiZm9vUkFSIik7Ci0JCWFzc2VydFRydWUocmFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpICE9IG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUVBUigpIHsKLQkJU3RyaW5nIGVhck5hbWUgPSAiVGVzdC5lYXIiOwotCQllYXJGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVFQVJGaWxlSW5pdGlhbGl6ZWQoZWFyTmFtZSk7Ci0JCWFzc2VydFRydWUoZWFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpICE9IG51bGwpOwotCX0KLQotCXB1YmxpYyBIYXNoU2V0IGlnbm9yYWJsZUF0dHJpYnV0ZXMoKSB7Ci0JCUhhc2hTZXQgc2V0ID0gbmV3IEhhc2hTZXQoKTsKLQkJc2V0LmFkZCgiaWQiKTsKLQkJcmV0dXJuIHNldDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLmVtZnRlc3QuR2VuZXJhbEVNRlBvcHVsYXRpb25UZXN0I2NyZWF0ZUF0dHJpYnV0ZVZhbHVlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgY3JlYXRlQXR0cmlidXRlVmFsdWUoRUF0dHJpYnV0ZSBhdHQsIEVPYmplY3QgZU9iamVjdCkgewotCQkvL1RPRE86IGRlbGV0ZSB0aGlzIGFmdGVyIHRoZSBtb2RlbCBpcyBmaXhlZAotCQlpZiAoYXR0ID09IEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbmZpZ1Byb3BlcnR5X1R5cGUoKSkKLQkJCXJldHVybiAiamF2YS5sYW5nLlN0cmluZyI7Ci0JCWVsc2UgaWYgKGF0dCA9PSBKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9DcmVkZW50aWFsSW50ZXJmYWNlKCkpCi0JCQlyZXR1cm4gImphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5QYXNzd29yZENyZWRlbnRpYWwiOwotCQllbHNlIGlmIChhdHQgPT0gSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29ubmVjdG9yX1NwZWNWZXJzaW9uKCkgJiYgdmVyc2lvbiA9PSBWRVJTSU9OXzFfMykKLQkJCXJldHVybiAiMS4wIjsKLQkJZWxzZQotCQkJcmV0dXJuIHN1cGVyLmNyZWF0ZUF0dHJpYnV0ZVZhbHVlKGF0dCwgZU9iamVjdCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL1Jlc29sdmVyVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9SZXNvbHZlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM1MGRjZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL1Jlc29sdmVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLnRlc3R1dGlsaXRpZXMuRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlJZGVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUpCSmFyRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5PcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLmJ2dC5BdXRvbWF0ZWRCVlQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNNUEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlJvbGVTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuTWV0aG9kUGVybWlzc2lvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuUXVlcnlNZXRob2RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXJGYWN0b3J5OwotCi0KLXB1YmxpYyBjbGFzcyBSZXNvbHZlclRlc3QgZXh0ZW5kcyBHZW5lcmFsRU1GRWRpdGluZ1Rlc3QgewotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgX01FVEFfSU5GX0VKQl9KQVJfWE1MID0gIi9NRVRBLUlORi9lamItamFyLnhtbCI7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEVqYlBhY2thZ2UgRUpCX1BLRyA9IEVqYlBhY2thZ2UuZUlOU1RBTkNFOwotCi0gICAgRUFSRmlsZSBlYXJGaWxlOwotCi0gICAgRUpCSmFyRmlsZSBlamJGaWxlOwotCi0gICAgRU9iamVjdCBtZXNCZWFuLCBlbnRpdHlCZWFuOwotCi0gICAgU2VjdXJpdHlJZGVudGl0eSBzZWNJRDsKLQotICAgIFJvbGVTb3VyY2Ugcm9sZVNvdXJjZTsKLQotICAgIGludCBOVU1fQkVBTlMgPSAxMDsKLQotICAgIGZpbmFsIGludCBOVU1fUkVMQVRJT05fUk9MRVMgPSAyOwotCi0gICAgaW50IGNyZWF0ZWRCZWFucyA9IDA7Ci0KLSAgICBpbnQgY3JlYXRlZFNlY1JvbGVzID0gMDsKLQotICAgIHByb3RlY3RlZCBpbnQgY3JlYXRlZFNlY3VyaXR5SWRlbnRpdGllcyA9IDA7Ci0KLSAgICBib29sZWFuIG1wRmxhZyA9IGZhbHNlOwotCi0gICAgcHVibGljIFJlc29sdmVyVGVzdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29tbW9uYXJjaGl2ZUZhY3RvcnkgZ2V0QXJjaGl2ZUZhY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiBDb21tb25hcmNoaXZlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uYXJjaGl2ZUZhY3RvcnkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRWpiRmFjdG9yeSBnZXRFamJGYWN0b3J5KCkgewotICAgICAgICByZXR1cm4gRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RWpiRmFjdG9yeSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBBcHBsaWNhdGlvbkZhY3RvcnkgZ2V0QXBwbGljYXRpb25GYWN0b3J5KCkgewotICAgICAgICByZXR1cm4gQXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbkZhY3RvcnkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgV2ViYXBwbGljYXRpb25GYWN0b3J5IGdldFdlYkFwcEZhY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYmFwcGxpY2F0aW9uRmFjdG9yeSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKGphdmEubGFuZy5TdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLm1haW4obmV3IFN0cmluZ1tdIHsgUmVzb2x2ZXJUZXN0LmNsYXNzLmdldE5hbWUoKX0pOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLSAgICAgICAgLypzdWl0ZS5hZGRUZXN0KG5ldyBBbGxTQVhUZXN0cygidGVzdFN3aXRjaFJlbmRlcmVyIikpOyovCi0gICAgICAgIHN1aXRlLmFkZFRlc3QobmV3IFJlc29sdmVyVGVzdCgidGVzdFJlc29sdmVyIikpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KG5ldyBSZXNvbHZlclRlc3QoInRlc3RSZXNvbHZlck5vU2NoZW1hTG9jYXRpb24iKSk7Ci0gICAgICAgIHJldHVybiBzdWl0ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGluID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAiLi4vdGVzdERhdGEvc2wiOwotICAgICAgICBnZXRFSkIoaW4pOwotCi0gICAgICAgIGFzc2VydEVxdWFscygiMi4xIiwgZWpiRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldFZlcnNpb24oKSk7Ci0gICAgICAgIEVKQlJlc291cmNlIEREID0gKEVKQlJlc291cmNlKSBlamJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLSAgICAgICAgc2V0VmVyc2lvbihWRVJTSU9OXzFfNCk7Ci0gICAgICAgIHNldE1vZHVsZVR5cGUoRUpCKTsKLQotICAgICAgICBTdHJpbmcgb3V0ID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAiLi4vdGVzdERhdGEvdGVzdE91dHB1dC9zbCI7Ci0gICAgICAgIGVqYkZpbGUuZXh0cmFjdFRvKG91dCwgQXJjaGl2ZS5FWFBBTkRfQUxMKTsKLSAgICAgICAgZWpiRmlsZS5jbG9zZSgpOwotCi0gICAgICAgIFN0cmluZyBleGFtcGxlRGVwbG95bWVudERlc1VSSSA9IGluICsgX01FVEFfSU5GX0VKQl9KQVJfWE1MOwotICAgICAgICBTdHJpbmcgY3VyRGVwbG95bWVudERlc1VSSSA9IG91dCArIF9NRVRBX0lORl9FSkJfSkFSX1hNTDsKLSAgICAgICAgY29tcGFyZUNvbnRlbnRzKGN1ckRlcGxveW1lbnREZXNVUkksIGV4YW1wbGVEZXBsb3ltZW50RGVzVVJJKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZXJOb1NjaGVtYUxvY2F0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgYm9vbGVhbiB2YWxpZGF0aW5nID0gUmVuZGVyZXJGYWN0b3J5LmdldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoKS5pc1ZhbGlkYXRpbmcoKTsKLSAgICAgICAgdHJ5IHsgCi0gICAgICAgICAgICBSZW5kZXJlckZhY3RvcnkuZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpLnNldFZhbGlkYXRpbmcoZmFsc2UpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBTdHJpbmcgaW4gPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICIuLi90ZXN0RGF0YS9uby1zbCI7Ci0gICAgICAgICAgICBnZXRFSkIoaW4pOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIjIuMSIsIGVqYkZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5nZXRWZXJzaW9uKCkpOwotICAgICAgICAgICAgRUpCUmVzb3VyY2UgREQgPSAoRUpCUmVzb3VyY2UpIGVqYkZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotICAgICAgICAgICAgc2V0VmVyc2lvbihWRVJTSU9OXzFfNCk7Ci0gICAgICAgICAgICBzZXRNb2R1bGVUeXBlKEVKQik7Ci0KLSAgICAgICAgICAgIFN0cmluZyBvdXQgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICIuLi90ZXN0RGF0YS90ZXN0T3V0cHV0L25vLXNsIjsKLSAgICAgICAgICAgIGVqYkZpbGUuZXh0cmFjdFRvKG91dCwgQXJjaGl2ZS5FWFBBTkRfQUxMKTsKLSAgICAgICAgICAgIGVqYkZpbGUuY2xvc2UoKTsKLQotICAgICAgICAgICAgU3RyaW5nIGV4YW1wbGVEZXBsb3ltZW50RGVzVVJJID0gaW4gKyBfTUVUQV9JTkZfRUpCX0pBUl9YTUw7Ci0gICAgICAgICAgICBTdHJpbmcgY3VyRGVwbG95bWVudERlc1VSSSA9IG91dCArIF9NRVRBX0lORl9FSkJfSkFSX1hNTDsKLSAgICAgICAgICAgIGNvbXBhcmVDb250ZW50cyhjdXJEZXBsb3ltZW50RGVzVVJJLCBleGFtcGxlRGVwbG95bWVudERlc1VSSSk7Ci0gICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKLSAgICAgICAgICAgIHJlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgUmVuZGVyZXJGYWN0b3J5LmdldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoKS5zZXRWYWxpZGF0aW5nKHZhbGlkYXRpbmcpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZ2V0RUpCKFN0cmluZyBpbikgdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiwgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotICAgICAgICBlamJGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuRUpCSmFyRmlsZShpbik7Ci0gICAgICAgIGFzc2VydFRydWUoZWpiRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpICE9IG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBFT2JqZWN0IGNyZWF0ZUluc3RhbmNlKEVDbGFzcyBlQ2xhc3NpZmllcikgewotICAgICAgICBpZiAoZUNsYXNzaWZpZXIuZ2V0TmFtZSgpLmVxdWFscygiRW50ZXJwcmlzZUJlYW4iKSkgewotICAgICAgICAgICAgY3JlYXRlZEJlYW5zKys7Ci0gICAgICAgICAgICBzd2l0Y2ggKGNyZWF0ZWRCZWFucykgewotICAgICAgICAgICAgY2FzZSAoMyk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUNvbnRhaW5lck1hbmFnZWRFbnRpdHlJbnN0YW5jZShlQ2xhc3NpZmllcik7Ci0gICAgICAgICAgICBjYXNlICg3KToKLSAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlTWVzc2FnZUJlYW5JbnN0YW5jZShlQ2xhc3NpZmllcik7Ci0gICAgICAgICAgICBjYXNlICg0KToKLSAgICAgICAgICAgIGNhc2UgKDgpOgotICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVTZXNzaW9uQmVhbkluc3RhbmNlKGVDbGFzc2lmaWVyKTsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUVudGl0eUJlYW5JbnN0YW5jZShlQ2xhc3NpZmllcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoZUNsYXNzaWZpZXIuZ2V0TmFtZSgpLmVxdWFscygiU2VjdXJpdHlJZGVudGl0eSIpKQotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVNlY3VyaXR5SWRlbnRpdGl5SW5zdGFuY2UoZUNsYXNzaWZpZXIpOwotICAgICAgICBlbHNlIGlmIChlQ2xhc3NpZmllci5nZXROYW1lKCkuZXF1YWxzKCJSb2xlU291cmNlIikpCi0gICAgICAgICAgICByZXR1cm4gY3JlYXRlUm9sZVNvdXJjZUluc3RhbmNlKGVDbGFzc2lmaWVyKTsKLSAgICAgICAgZWxzZSBpZiAoZUNsYXNzaWZpZXIgPT0gRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFQXR0cmlidXRlKCkpIHJldHVybiBnZXRFamJGYWN0b3J5KCkuY3JlYXRlQ01QQXR0cmlidXRlKCk7Ci0gICAgICAgIHJldHVybiBzdXBlci5jcmVhdGVJbnN0YW5jZShlQ2xhc3NpZmllcik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBFT2JqZWN0IGNyZWF0ZVNlY3VyaXR5SWRlbnRpdGl5SW5zdGFuY2UoRUNsYXNzIGVDbGFzc2lmaWVyKSB7Ci0gICAgICAgIC8qIEFsdGVybmF0ZSB0eXBlcyAqLwotICAgICAgICBjcmVhdGVkU2VjUm9sZXMrKzsKLSAgICAgICAgaWYgKChjcmVhdGVkU2VjUm9sZXMgJiAxKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVVzZUNhbGxlcklkZW50aXR5KCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSdW5Bc1NwZWNpZmllZElkZW50aXR5KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBFT2JqZWN0IGNyZWF0ZVJvbGVTb3VyY2VJbnN0YW5jZShFQ2xhc3MgZUNsYXNzaWZpZXIpIHsKLSAgICAgICAgcmV0dXJuICgoRWpiRmFjdG9yeSkgZUNsYXNzaWZpZXIuZ2V0RVBhY2thZ2UoKS5nZXRFRmFjdG9yeUluc3RhbmNlKCkpLmNyZWF0ZVJvbGVTb3VyY2UoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEVPYmplY3QgY3JlYXRlTWVzc2FnZUJlYW5JbnN0YW5jZShFQ2xhc3MgZUNsYXNzaWZpZXIpIHsKLSAgICAgICAgcmV0dXJuICgoRWpiRmFjdG9yeSkgZUNsYXNzaWZpZXIuZ2V0RVBhY2thZ2UoKS5nZXRFRmFjdG9yeUluc3RhbmNlKCkpLmNyZWF0ZU1lc3NhZ2VEcml2ZW4oKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEVPYmplY3QgY3JlYXRlU2Vzc2lvbkJlYW5JbnN0YW5jZShFQ2xhc3MgZUNsYXNzaWZpZXIpIHsKLSAgICAgICAgcmV0dXJuICgoRWpiRmFjdG9yeSkgZUNsYXNzaWZpZXIuZ2V0RVBhY2thZ2UoKS5nZXRFRmFjdG9yeUluc3RhbmNlKCkpLmNyZWF0ZVNlc3Npb24oKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEVPYmplY3QgY3JlYXRlRW50aXR5QmVhbkluc3RhbmNlKEVDbGFzcyBlQ2xhc3NpZmllcikgewotICAgICAgICByZXR1cm4gKChFamJGYWN0b3J5KSBlQ2xhc3NpZmllci5nZXRFUGFja2FnZSgpLmdldEVGYWN0b3J5SW5zdGFuY2UoKSkuY3JlYXRlRW50aXR5KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBFT2JqZWN0IGNyZWF0ZUNvbnRhaW5lck1hbmFnZWRFbnRpdHlJbnN0YW5jZShFQ2xhc3MgZUNsYXNzaWZpZXIpIHsKLSAgICAgICAgcmV0dXJuIEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbnRhaW5lck1hbmFnZWRFbnRpdHkoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUudGVzdC5HZW5lcmFsRU1GVGVzdCNnZXREZXB0aEZvckF0dHJpYnV0ZShFUmVmZXJlbmNlKQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0RGVwdGhGb3JBdHRyaWJ1dGUoRVJlZmVyZW5jZSByZWYpIHsKLSAgICAgICAgaWYgKHJlZi5nZXROYW1lKCkuZXF1YWxzKCJlbnRlcnByaXNlQmVhbnMiKSkKLSAgICAgICAgICAgIHJldHVybiBOVU1fQkVBTlM7Ci0gICAgICAgIGVsc2UgaWYgKHJlZi5nZXROYW1lKCkuZXF1YWxzKCJlbnRpdHlCZWFucyIpKQotICAgICAgICAgICAgcmV0dXJuIE5VTV9CRUFOUzsKLSAgICAgICAgZWxzZSBpZiAocmVmLmdldE5hbWUoKS5lcXVhbHMoInJlbGF0aW9uc2hpcFJvbGVzIikpIHJldHVybiBOVU1fUkVMQVRJT05fUk9MRVM7Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXREZXB0aEZvckF0dHJpYnV0ZShyZWYpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5lbWZ0ZXN0LkdlbmVyYWxFTUZQb3B1bGF0aW9uVGVzdCNwb3B1bGF0ZUZlYXR1cmVzKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHBvcHVsYXRlRmVhdHVyZXMoRU9iamVjdCBlT2JqZWN0KSB7Ci0gICAgICAgIGlmIChlT2JqZWN0LmVDbGFzcygpID09IEVKQl9QS0cuZ2V0Q01QQXR0cmlidXRlKCkpIHsKLSAgICAgICAgICAgICgoQ01QQXR0cmlidXRlKSBlT2JqZWN0KS5zZXROYW1lKChTdHJpbmcpIEVNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3IuY3JlYXRlQXR0cmlidXRlKAotICAgICAgICAgICAgICAgICAgICBFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVOYW1lZEVsZW1lbnRfTmFtZSgpLCBlT2JqZWN0KSk7Ci0gICAgICAgICAgICAoKENNUEF0dHJpYnV0ZSkgZU9iamVjdCkuc2V0RVR5cGUoKEVDbGFzc2lmaWVyKSBjcmVhdGVKYXZhQ2xhc3NQcm94eShudWxsKSk7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgc3VwZXIuZWRpdEZlYXR1cmVzKGVPYmplY3QpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5lbWZ0ZXN0LkdlbmVyYWxFTUZQb3B1bGF0aW9uVGVzdCNwb3B1bGF0ZUF0dHJpYnV0ZXMob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVBdHRyaWJ1dGVzKEVPYmplY3QgZU9iamVjdCkgewotICAgICAgICBpZiAoZU9iamVjdCBpbnN0YW5jZW9mIFF1ZXJ5TWV0aG9kSW1wbCkgewotICAgICAgICAgICAgTGlzdCBhdHRyaWJ1dGVzID0gZU9iamVjdC5lQ2xhc3MoKS5nZXRFQWxsQXR0cmlidXRlcygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgRUF0dHJpYnV0ZSBhdHQgPSAoRUF0dHJpYnV0ZSkgYXR0cmlidXRlcy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gY3JlYXRlQXR0cmlidXRlVmFsdWUoYXR0LCBlT2JqZWN0KTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0LmdldE5hbWUoKS5lcXVhbHMoInBhcm1zIikgJiYgdmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGNyZWF0ZUF0dHJpYnV0ZVZhbHVlKGF0dCwgZU9iamVjdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChhdHQuaXNDaGFuZ2VhYmxlKCkpIGVPYmplY3QuZVNldChhdHQsIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChlT2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kUGVybWlzc2lvbkltcGwpIHsKLSAgICAgICAgICAgIExpc3QgYXR0cmlidXRlcyA9IGVPYmplY3QuZUNsYXNzKCkuZ2V0RUFsbEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIEVBdHRyaWJ1dGUgYXR0ID0gKEVBdHRyaWJ1dGUpIGF0dHJpYnV0ZXMuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmIChhdHQuZ2V0TmFtZSgpLmVxdWFscygidW5jaGVja2VkIikgJiYgbXBGbGFnKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGNyZWF0ZUF0dHJpYnV0ZVZhbHVlKGF0dCwgZU9iamVjdCk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dC5pc0NoYW5nZWFibGUoKSkgZU9iamVjdC5lU2V0KGF0dCwgdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbXBGbGFnID0gIW1wRmxhZzsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBzdXBlci5lZGl0QXR0cmlidXRlcyhlT2JqZWN0KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVNoYXJlZFJlZmVyZW5jZShFT2JqZWN0IGVPYmplY3QsIEVSZWZlcmVuY2UgcmVmKSB7Ci0gICAgICAgIGlmIChlT2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kUGVybWlzc2lvbkltcGwgJiYgcmVmLmdldE5hbWUoKS5lcXVhbHMoInJvbGVzIikpIHsKLSAgICAgICAgICAgIG1wRmxhZyA9ICFtcEZsYWc7Ci0gICAgICAgICAgICAvL2lmIG1ldGhvZCBwZXJtaXNzaW9uIHVuY2hlY2tlZCBpZ25vcmUgcm9sZXMKLSAgICAgICAgICAgIGlmICghbXBGbGFnKSB7IHJldHVybjsgfQotICAgICAgICB9Ci0gICAgICAgIHN1cGVyLnBvcHVsYXRlU2hhcmVkUmVmZXJlbmNlKGVPYmplY3QsIHJlZik7Ci0gICAgfQotCi0gICAgcHVibGljIEhhc2hTZXQgaWdub3JhYmxlQXR0cmlidXRlcygpIHsKLSAgICAgICAgSGFzaFNldCBzZXQgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBzZXQuYWRkKCJpZCIpOwotICAgICAgICByZXR1cm4gc2V0OwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBlYXJGaWxlID0gbnVsbDsKLSAgICAgICAgZWpiRmlsZSA9IG51bGw7Ci0gICAgICAgIG1lc0JlYW4gPSBudWxsOwotICAgICAgICBlbnRpdHlCZWFuID0gbnVsbDsKLSAgICAgICAgc2VjSUQgPSBudWxsOwotICAgICAgICByb2xlU291cmNlID0gbnVsbDsKLQotICAgICAgICBzdXBlci50ZWFyRG93bigpOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvV2FyRU1GRWRpdFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvV2FyRU1GRWRpdFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYzZTM4Zi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL1dhckVNRkVkaXRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLmVtZnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LnN3aW5ndWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuV0FSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5PcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLmJ2dC5BdXRvbWF0ZWRCVlQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRXJyb3JQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkZpbHRlck1hcHBpbmdJbXBsOwotCi0KLXB1YmxpYyBjbGFzcyBXYXJFTUZFZGl0VGVzdCBleHRlbmRzIEdlbmVyYWxFTUZFZGl0aW5nVGVzdCB7Ci0JcHJvdGVjdGVkIEVBUkZpbGUgZWFyRmlsZTsJCi0JcHJvdGVjdGVkIFdBUkZpbGUgd2FyRmlsZTsKLQlwcm90ZWN0ZWQgaW50IGNyZWF0ZWRXZWJUeXBlcyA9IDA7Ci0JcHJvdGVjdGVkIGludCBjcmVhdGVkRXJyb3JQYWdlcyA9IDA7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZm1GbGFnID0gZmFsc2U7Ci0KLSAgICBwdWJsaWMgV2FyRU1GRWRpdFRlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIENvbW1vbmFyY2hpdmVGYWN0b3J5IGdldEFyY2hpdmVGYWN0b3J5KCkgewotICAgICAgICByZXR1cm4gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbW1vbmFyY2hpdmVGYWN0b3J5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIEVqYkZhY3RvcnkgZ2V0RWpiRmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVqYkZhY3RvcnkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXBwbGljYXRpb25GYWN0b3J5IGdldEFwcGxpY2F0aW9uRmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25GYWN0b3J5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBnZXRXZWJBcHBGYWN0b3J5KCkgewotICAgICAgICByZXR1cm4gV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJhcHBsaWNhdGlvbkZhY3RvcnkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihqYXZhLmxhbmcuU3RyaW5nW10gYXJncykgewotICAgICAgICBTdHJpbmdbXSBjbGFzc05hbWUgPSB7ICJjb20uaWJtLmV0b29scy5hcmNoaXZlLnRlc3QuV2FyRU1GVGVzdCIsICItbm9sb2FkaW5nIiB9OwotICAgICAgICBUZXN0UnVubmVyLm1haW4oY2xhc3NOYW1lKTsKLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KG5ldyBXYXJFTUZFZGl0VGVzdCgidGVzdFdBUkVkaXQiKSk7Ci0gICAgICAgIHJldHVybiBzdWl0ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V0FSRWRpdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBnZXRXQVJDbGllbnQoKTsKLQotICAgICAgICBXZWJBcHBSZXNvdXJjZSBERCA9IChXZWJBcHBSZXNvdXJjZSkgd2FyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0JCXNldFZlcnNpb24oVkVSU0lPTl8xXzMpOwotCQlzZXRNb2R1bGVUeXBlKFdFQik7IAotICAgICAgICBlZGl0Um9vdChERC5nZXRSb290T2JqZWN0KCkpOwotICAgICAgICBTdHJpbmcgY3VyRGlyID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3Rvcnk7Ci0gICAgICAgIFN0cmluZyBvdXQgPSBjdXJEaXIgKyAidGVzdE91dHB1dC9FTUZNb2RlbENyZWF0aW9uVGVzdHMvRWRpdFdhckVBUiI7Ci0gICAgICAgIHdhckZpbGUuZXh0cmFjdFRvKG91dCwgQXJjaGl2ZS5FWFBBTkRfQUxMKTsKLSAgICAgICAgd2FyRmlsZS5jbG9zZSgpOwotCi0gICAgICAgIC8vQ29tcGFyZSB3b3JrIGluIHByb2dyZXNzCi0gICAgICAgCi0gICAgICAgIFN0cmluZyBleGFtcGxlRGVwbG95bWVudERlc1VSSSA9IGN1ckRpciArICJFTUZUZXN0cy93ZWIueG1sIjsKLSAgICAgICAgU3RyaW5nIGN1ckRlcGxveW1lbnREZXNVUkkgPSBjdXJEaXIgKyBvdXQgKyAiL2Zvb1dBUi9XRUItSU5GL3dlYi54bWwiOwotICAgICAgICAvL2NvbXBhcmVDb250ZW50cyhjdXJEZXBsb3ltZW50RGVzVVJJLCBleGFtcGxlRGVwbG95bWVudERlc1VSSSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZ2V0V0FSQ2xpZW50KCkgdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiwgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgaW4gPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJsb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSV2ViL3dlYkFwcGxpY2F0aW9uLyI7Ci0gICAgICAgIHdhckZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5XQVJGaWxlKGluKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSh3YXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkgIT0gbnVsbCk7Ci0gICAgfQotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZUluc3RhbmNlKEVDbGFzcyBlQ2xhc3NpZmllcikgewotCi0JCWlmIChXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYlR5cGUoKS5lcXVhbHMoZUNsYXNzaWZpZXIpKQotCQkJcmV0dXJuIGNyZWF0ZVdlYlR5cGUoKTsKLQkJZWxzZSBpZiAoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRFcnJvclBhZ2UoKS5lcXVhbHMoZUNsYXNzaWZpZXIpKQotCQkJcmV0dXJuIGNyZWF0ZUVycm9yUGFnZSgpOwotCi0JCXJldHVybiBzdXBlci5jcmVhdGVJbnN0YW5jZShlQ2xhc3NpZmllcik7Ci0JfQotCS8qIFRoZSB3ZWIgdHlwZSBpcyBhYnN0cmFjdC4gIEFsdGVybmF0ZSBiZXR3ZWVuIHNlcnZsZXQtY2xhc3MKLQkgKiBhbmQganNwLWZpbGUKLQkgKi8KLQlwdWJsaWMgV2ViVHlwZSBjcmVhdGVXZWJUeXBlKCkgewotCQljcmVhdGVkV2ViVHlwZXMrKzsKLQkJaWYgKChjcmVhdGVkV2ViVHlwZXMgJiAxKSA9PSAwKQotCQkJcmV0dXJuIFdlYmFwcGxpY2F0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2VydmxldFR5cGUoKTsKLQkJZWxzZQotCQkJcmV0dXJuIFdlYmFwcGxpY2F0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSlNQVHlwZSgpOwotCi0JfQotCS8qIFRoZSBlcnJvciBwYWdlIGlzIGFic3RyYWN0LiAgQWx0ZXJuYXRlIGJldHdlZW4gZXhjZXB0aW9udHlwZQotCSAqIGFuZCBlcnJvciBjb2RlCi0JICovCi0JcHVibGljIEVycm9yUGFnZSBjcmVhdGVFcnJvclBhZ2UoKSB7Ci0JCWNyZWF0ZWRFcnJvclBhZ2VzKys7Ci0JCWlmICgoY3JlYXRlZEVycm9yUGFnZXMgJiAxKSA9PSAwKQotCQkJcmV0dXJuIFdlYmFwcGxpY2F0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRXJyb3JDb2RlRXJyb3JQYWdlKCk7Ci0JCWVsc2UKLQkJCXJldHVybiBXZWJhcHBsaWNhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUV4Y2VwdGlvblR5cGVFcnJvclBhZ2UoKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5lbWZ0ZXN0LkdlbmVyYWxFTUZQb3B1bGF0aW9uVGVzdCNwb3B1bGF0ZUF0dHJpYnV0ZXMob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVBdHRyaWJ1dGVzKEVPYmplY3QgZU9iamVjdCkgewotCQlpZiAoZU9iamVjdCBpbnN0YW5jZW9mIEZpbHRlck1hcHBpbmdJbXBsKXsKLQkJCUxpc3QgYXR0cmlidXRlcyA9IGVPYmplY3QuZUNsYXNzKCkuZ2V0RUFsbEF0dHJpYnV0ZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5zaXplKCk7IGkrKykgewotCQkJCUVBdHRyaWJ1dGUgYXR0ID0gKEVBdHRyaWJ1dGUpIGF0dHJpYnV0ZXMuZ2V0KGkpOwotCQkJCWlmKGF0dC5nZXROYW1lKCkuZXF1YWxzKCJ1cmxQYXR0ZXJuIikgJiYgZm1GbGFnKXsKLQkJCQkJY29udGludWU7CQkJCQkKLQkJCQl9CQotCQkJCQotCQkJCU9iamVjdCB2YWx1ZSA9IGNyZWF0ZUF0dHJpYnV0ZVZhbHVlKGF0dCwgZU9iamVjdCk7Ci0JCQkJaWYgKGF0dC5pc0NoYW5nZWFibGUoKSkKLQkJCQkJZU9iamVjdC5lU2V0KGF0dCwgdmFsdWUpOwotCQkJfSAKLQkJCWZtRmxhZyA9ICFmbUZsYWc7Ci0JCX0KLQkJZWxzZSAKLQkJCXN1cGVyLmVkaXRBdHRyaWJ1dGVzKGVPYmplY3QpOwotCX0KLQkKLQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlU2hhcmVkUmVmZXJlbmNlKEVPYmplY3QgZU9iamVjdCwgRVJlZmVyZW5jZSByZWYpIHsKLQkJaWYoZU9iamVjdCBpbnN0YW5jZW9mIEZpbHRlck1hcHBpbmdJbXBsICYmIHJlZi5nZXROYW1lKCkuZXF1YWxzKCJzZXJ2bGV0IikpewotCQkJZm1GbGFnID0gIWZtRmxhZzsKLQkJCS8vaWYgbWV0aG9kIHBlcm1pc3Npb24gdW5jaGVja2VkIGlnbm9yZSByb2xlcwotCQkJaWYoIWZtRmxhZyl7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLnBvcHVsYXRlU2hhcmVkUmVmZXJlbmNlKGVPYmplY3QsIHJlZik7Ci0JfQotCQotCXB1YmxpYyBIYXNoU2V0IGlnbm9yYWJsZUF0dHJpYnV0ZXMoKXsKLQkJSGFzaFNldCBzZXQgPSBuZXcgSGFzaFNldCgpOwotCQlzZXQuYWRkKCJpZCIpOwotCQlyZXR1cm4gc2V0OwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvV2FyRU1GVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9XYXJFTUZUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNWNiYWUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9XYXJFTUZUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzQgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLmVtZnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUudGVzdHV0aWxpdGllcy5FTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNBdXRoVHlwZUJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLldBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkR1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uT3BlbkZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5idnQuQXV0b21hdGVkQlZUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkVycm9yUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHBSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5GaWx0ZXJNYXBwaW5nSW1wbDsKLQotCi1wdWJsaWMgY2xhc3MgV2FyRU1GVGVzdCBleHRlbmRzIEdlbmVyYWxFTUZQb3B1bGF0aW9uVGVzdCB7Ci0gICAgcHJvdGVjdGVkIEVBUkZpbGUgZWFyRmlsZTsKLSAgICBwcm90ZWN0ZWQgV0FSRmlsZSB3YXJGaWxlOwotICAgIHByb3RlY3RlZCBpbnQgY3JlYXRlZFdlYlR5cGVzID0gMDsKLSAgICBwcm90ZWN0ZWQgaW50IGNyZWF0ZWRFcnJvclBhZ2VzID0gMDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBmbUZsYWcgPSBmYWxzZTsKLSAgICBwdWJsaWMgV2FyRU1GVGVzdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0gICAgcHVibGljIENvbW1vbmFyY2hpdmVGYWN0b3J5IGdldEFyY2hpdmVGYWN0b3J5KCkgewotICAgICAgICByZXR1cm4gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbW1vbmFyY2hpdmVGYWN0b3J5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIEVqYkZhY3RvcnkgZ2V0RWpiRmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVqYkZhY3RvcnkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXBwbGljYXRpb25GYWN0b3J5IGdldEFwcGxpY2F0aW9uRmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25GYWN0b3J5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBnZXRXZWJBcHBGYWN0b3J5KCkgewotICAgICAgICByZXR1cm4gV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJhcHBsaWNhdGlvbkZhY3RvcnkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihqYXZhLmxhbmcuU3RyaW5nW10gYXJncykgewotICAgICAgICAKLSAgICAgICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIubWFpbihuZXcgU3RyaW5nW117IFdhckVNRlRlc3QuY2xhc3MuZ2V0TmFtZSgpIH0pOwotICAgIH0KLSAgICBwdWJsaWMgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0IHN1aXRlKCkgewotICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QobmV3IFdhckVNRlRlc3QoInRlc3RXQVJQb3B1bGF0aW9uIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBXYXJFTUZUZXN0KCJ0ZXN0MTRXQVJQb3B1bGF0aW9uIikpOwotICAgICAgICByZXR1cm4gc3VpdGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdBUlBvcHVsYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvci5yZXNldCgpOwotICAgICAgICBjcmVhdGVFQVIoKTsKLSAgICAgICAgY3JlYXRlV0FSQ2xpZW50KCk7Ci0KLSAgICAgICAgV2ViQXBwUmVzb3VyY2UgREQgPSAoV2ViQXBwUmVzb3VyY2UpIHdhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotICAgICAgICBERC5zZXRWZXJzaW9uSUQoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpOwotCQkvL1RPRE86IGluZGl2aWR1YWwgdGVzdCBmb3IgZWFjaCB2ZXJzaW9uCi0JCXNldFZlcnNpb24oVkVSU0lPTl8xXzMpOwotCQlzZXRNb2R1bGVUeXBlKFdFQik7Ci0gICAgICAgIHBvcHVsYXRlUm9vdChERC5nZXRSb290T2JqZWN0KCkpOwotCi0JCVN0cmluZyBvdXQgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArInRlc3RPdXRwdXQvVGVzdFdhckVBUiI7Ci0gICAgICAgIGVhckZpbGUuZXh0cmFjdFRvKG91dCwgQXJjaGl2ZS5FWFBBTkRfQUxMKTsKLSAgICAgICAgZWFyRmlsZS5jbG9zZSgpOwotCi0gICAgICAgIC8vQ29tcGFyZSB3b3JrIGluIHByb2dyZXNzCi0gICAgICAgIFN0cmluZyBjdXJEaXIgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeTsKLSAgICAgICAgU3RyaW5nIGV4YW1wbGVEZXBsb3ltZW50RGVzVVJJID0gY3VyRGlyICsgIkVNRlRlc3ROb0lEL3dlYi54bWwiOwotICAgICAgICBTdHJpbmcgY3VyRGVwbG95bWVudERlc1VSSSA9IGN1ckRpciArICJ0ZXN0T3V0cHV0L1Rlc3RXYXJFQVIvZm9vV0FSL1dFQi1JTkYvd2ViLnhtbCI7Ci0JCXNldElnbm9yZUF0dChpZ25vcmFibGVBdHRyaWJ1dGVzKCkpOwotCQlzZXRFcXVpdmFsZW50TGluZXMoZ2V0RXF1aXZhbGVudExpbmVzTWFwKCkpOwotCQljb21wYXJlQ29udGVudHNJZ25vcmVXaGl0ZXNwYWNlKGN1ckRlcGxveW1lbnREZXNVUkksIGV4YW1wbGVEZXBsb3ltZW50RGVzVVJJLCBudWxsKTsKLSAgICB9Ci0gICAgCi0JcHVibGljIHZvaWQgdGVzdDE0V0FSUG9wdWxhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlFTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yLnJlc2V0KCk7Ci0JCWNyZWF0ZUVBUigpOwotCQljcmVhdGVXQVJDbGllbnQoKTsKLQotCQlXZWJBcHBSZXNvdXJjZSBERCA9IChXZWJBcHBSZXNvdXJjZSkgd2FyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0JCURELnNldFZlcnNpb25JRChKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCk7Ci0JCS8vVE9ETzogaW5kaXZpZHVhbCB0ZXN0IGZvciBlYWNoIHZlcnNpb24KLQkJc2V0VmVyc2lvbihWRVJTSU9OXzFfNCk7Ci0JCXNldE1vZHVsZVR5cGUoV0VCKTsKLQkJLy9zZXRHZW5lcmFsRGVwdGgoMik7Ci0JCXBvcHVsYXRlUm9vdChERC5nZXRSb290T2JqZWN0KCkpOwotCi0JCVN0cmluZyBvdXQgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArInRlc3RPdXRwdXQvVGVzdFdhckVBUjE0IjsKLQkJZWFyRmlsZS5leHRyYWN0VG8ob3V0LCBBcmNoaXZlLkVYUEFORF9BTEwpOwotCQllYXJGaWxlLmNsb3NlKCk7Ci0JCQotCQlnZXRXQVJDbGllbnQoKTsKLQkJYXNzZXJ0RXF1YWxzKCIyLjQiLCB3YXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0VmVyc2lvbigpKTsKLQkJb3V0ID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyJ0ZXN0T3V0cHV0L1Rlc3RXYXJFQVIxNF8yIjsKLQkJd2FyRmlsZS5leHRyYWN0VG8ob3V0LCBBcmNoaXZlLkVYUEFORF9BTEwpOwotCQl3YXJGaWxlLmNsb3NlKCk7Ci0KLQkJLy9Db21wYXJlIHdvcmsgaW4gcHJvZ3Jlc3MKLQkJU3RyaW5nIGN1ckRpciA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5OwotCQlTdHJpbmcgZXhhbXBsZURlcGxveW1lbnREZXNVUkkgPSBvdXQgKyAiL1dFQi1JTkYvd2ViLnhtbCI7Ci0JCVN0cmluZyBjdXJEZXBsb3ltZW50RGVzVVJJID0gY3VyRGlyICsgInRlc3RPdXRwdXQvVGVzdFdhckVBUjE0L2Zvb1dBUi9XRUItSU5GL3dlYi54bWwiOwotCQlzZXRJZ25vcmVBdHQoaWdub3JhYmxlQXR0cmlidXRlcygpKTsKLQkJY29tcGFyZUNvbnRlbnRzSWdub3JlV2hpdGVzcGFjZShjdXJEZXBsb3ltZW50RGVzVVJJLCBleGFtcGxlRGVwbG95bWVudERlc1VSSSwgbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIE1hcCBnZXRFcXVpdmFsZW50TGluZXNNYXAoKSB7Ci0JCU1hcCBsaW5lcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCWxpbmVzLnB1dCgiPGRpc3RyaWJ1dGFibGU+PC9kaXN0cmlidXRhYmxlPiIsICI8ZGlzdHJpYnV0YWJsZS8+Iik7IAotCQlyZXR1cm4gbGluZXM7Ci0JfQotCi0gICAgcHVibGljIHZvaWQgY3JlYXRlV0FSQ2xpZW50KCkgdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiB7Ci0gICAgICAgIHdhckZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZVdBUkZpbGVJbml0aWFsaXplZCgiZm9vV0FSIik7Ci0gICAgICAgIHdhckZpbGUgPSAoV0FSRmlsZSkgZWFyRmlsZS5hZGRDb3B5KHdhckZpbGUpOwotICAgICAgICB3YXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuc2V0RGlzcGxheU5hbWUoImZvb1dBUiIpOwotICAgICAgICBhc3NlcnRUcnVlKHdhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSAhPSBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVFQVIoKSB7Ci0gICAgICAgIFN0cmluZyBlYXJOYW1lID0gIlRlc3QuZWFyIjsKLSAgICAgICAgZWFyRmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlRUFSRmlsZUluaXRpYWxpemVkKGVhck5hbWUpOwotICAgICAgICBhc3NlcnRUcnVlKGVhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSAhPSBudWxsKTsKLSAgICB9Ci0gICAgCi0JcHVibGljIHZvaWQgZ2V0V0FSQ2xpZW50KCkgdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiwgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlTdHJpbmcgaW4gPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJ0ZXN0T3V0cHV0L1Rlc3RXYXJFQVIxNC9mb29XQVIiOwotCQl3YXJGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuV0FSRmlsZShpbik7Ci0JCWFzc2VydFRydWUod2FyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpICE9IG51bGwpOwotCX0KLQotICAgIHB1YmxpYyBFT2JqZWN0IGNyZWF0ZUluc3RhbmNlKEVSZWZlcmVuY2UgcmVmLEVPYmplY3QgZU9iamVjdCkgewotCi0gICAgICAgIGlmIChXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYlR5cGUoKS5lcXVhbHMocmVmLmdldEVUeXBlKCkpKQotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVdlYlR5cGUoKTsKLSAgICAgICAgZWxzZSBpZiAoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRFcnJvclBhZ2UoKS5lcXVhbHMocmVmLmdldEVUeXBlKCkpKQotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUVycm9yUGFnZSgpOwotCi0gICAgICAgIHJldHVybiBzdXBlci5jcmVhdGVJbnN0YW5jZShyZWYsIGVPYmplY3QpOwotICAgIH0KLSAgICAvKiBUaGUgd2ViIHR5cGUgaXMgYWJzdHJhY3QuICBBbHRlcm5hdGUgYmV0d2VlbiBzZXJ2bGV0LWNsYXNzCi0gICAgICogYW5kIGpzcC1maWxlCi0gICAgICovCi0gICAgcHVibGljIFdlYlR5cGUgY3JlYXRlV2ViVHlwZSgpIHsKLSAgICAgICAgY3JlYXRlZFdlYlR5cGVzKys7Ci0gICAgICAgIGlmICgoY3JlYXRlZFdlYlR5cGVzICYgMSkgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBXZWJhcHBsaWNhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlcnZsZXRUeXBlKCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBXZWJhcHBsaWNhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUpTUFR5cGUoKTsKLQotICAgIH0KLSAgICAvKiBUaGUgZXJyb3IgcGFnZSBpcyBhYnN0cmFjdC4gIEFsdGVybmF0ZSBiZXR3ZWVuIGV4Y2VwdGlvbnR5cGUKLSAgICAgKiBhbmQgZXJyb3IgY29kZQotICAgICAqLwotICAgIHB1YmxpYyBFcnJvclBhZ2UgY3JlYXRlRXJyb3JQYWdlKCkgewotICAgICAgICBjcmVhdGVkRXJyb3JQYWdlcysrOwotICAgICAgICBpZiAoKGNyZWF0ZWRFcnJvclBhZ2VzICYgMSkgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBXZWJhcHBsaWNhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUVycm9yQ29kZUVycm9yUGFnZSgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFeGNlcHRpb25UeXBlRXJyb3JQYWdlKCk7Ci0gICAgfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuZW1mdGVzdC5HZW5lcmFsRU1GUG9wdWxhdGlvblRlc3QjcG9wdWxhdGVBdHRyaWJ1dGVzKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlQXR0cmlidXRlcyhFT2JqZWN0IGVPYmplY3QpIHsKLQkJaWYgKGVPYmplY3QgaW5zdGFuY2VvZiBGaWx0ZXJNYXBwaW5nSW1wbCl7Ci0JCQlMaXN0IGF0dHJpYnV0ZXMgPSBlT2JqZWN0LmVDbGFzcygpLmdldEVBbGxBdHRyaWJ1dGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlFQXR0cmlidXRlIGF0dCA9IChFQXR0cmlidXRlKSBhdHRyaWJ1dGVzLmdldChpKTsKLQkJCQlpZihhdHQuZ2V0TmFtZSgpLmVxdWFscygidXJsUGF0dGVybiIpICYmIGZtRmxhZyl7Ci0JCQkJCWNvbnRpbnVlOwkJCQkJCi0JCQkJfQkKLQkJCQkKLQkJCQlPYmplY3QgdmFsdWUgPSBjcmVhdGVBdHRyaWJ1dGVWYWx1ZShhdHQsIGVPYmplY3QpOwotCQkJCWlmIChhdHQuaXNDaGFuZ2VhYmxlKCkpCi0JCQkJCWVPYmplY3QuZVNldChhdHQsIHZhbHVlKTsKLQkJCX0gCi0JCQlmbUZsYWcgPSAhZm1GbGFnOwotCQl9Ci0JCWVsc2UgCi0JCQlzdXBlci5wb3B1bGF0ZUF0dHJpYnV0ZXMoZU9iamVjdCk7Ci0JfQotCQotCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVTaGFyZWRSZWZlcmVuY2UoRU9iamVjdCBlT2JqZWN0LCBFUmVmZXJlbmNlIHJlZikgewotCQlpZihlT2JqZWN0IGluc3RhbmNlb2YgRmlsdGVyTWFwcGluZ0ltcGwgJiYgcmVmLmdldE5hbWUoKS5lcXVhbHMoInNlcnZsZXQiKSl7Ci0JCQlmbUZsYWcgPSAhZm1GbGFnOwotCQkJLy9pZiBtZXRob2QgcGVybWlzc2lvbiB1bmNoZWNrZWQgaWdub3JlIHJvbGVzCi0JCQlpZighZm1GbGFnKXsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIucG9wdWxhdGVTaGFyZWRSZWZlcmVuY2UoZU9iamVjdCwgcmVmKTsKLQl9Ci0JCi0JcHVibGljIEhhc2hTZXQgaWdub3JhYmxlQXR0cmlidXRlcygpewotCQlIYXNoU2V0IHNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCXNldC5hZGQoImlkIik7Ci0JCXJldHVybiBzZXQ7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkQXV0aChSZXNBdXRoVHlwZUJhc2UgYXV0aCkgewotCQlpZiAodmVyc2lvbiA9PSBWRVJTSU9OXzFfMikKLQkJCXJldHVybiBhdXRoID09IFJlc0F1dGhUeXBlQmFzZS5TRVJWTEVUX0xJVEVSQUwgfHwgYXV0aCA9PSBSZXNBdXRoVHlwZUJhc2UuQ09OVEFJTkVSX0xJVEVSQUw7Ci0JCWVsc2UKLQkJCXJldHVybiBzdXBlci5pc1ZhbGlkQXV0aChhdXRoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvV2ViU2VydmljZXNFTUZUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL1dlYlNlcnZpY2VzRU1GVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTE4Njc3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvV2ViU2VydmljZXNFTUZUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gQXVnIDYsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLmVtZnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LnN3aW5ndWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0dXRpbGl0aWVzLkVNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FSkJKYXJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5EdXBsaWNhdGVPYmplY3RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk9wZW5GYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMuYnZ0LkF1dG9tYXRlZEJWVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkludGVyZmFjZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVdTRExNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBSZXNvdXJjZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJTZXJ2aWNlc1Jlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyRmFjdG9yeTsKLQotCi0vKioKLSAqIEBhdXRob3IgZGZob2x0dHAKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZXNFTUZUZXN0IGV4dGVuZHMgR2VuZXJhbEVNRlBvcHVsYXRpb25UZXN0IHsKLQlFQVJGaWxlIGVhckZpbGU7Ci0JRUpCSmFyRmlsZSBlamJGaWxlOwotCWludCBjdXJyZW50VmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEOwotCXByaXZhdGUgaW50IGNyZWF0ZWRJbnRlcmZhY2VNYXBzID0gMDsKLQotCXB1YmxpYyBXZWJTZXJ2aWNlc0VNRlRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIENvbW1vbmFyY2hpdmVGYWN0b3J5IGdldEFyY2hpdmVGYWN0b3J5KCkgewotCQlyZXR1cm4gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbW1vbmFyY2hpdmVGYWN0b3J5KCk7Ci0JfQotCi0JcHVibGljIEVqYkZhY3RvcnkgZ2V0RWpiRmFjdG9yeSgpIHsKLQkJcmV0dXJuIEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVqYkZhY3RvcnkoKTsKLQl9Ci0KLQlwdWJsaWMgQXBwbGljYXRpb25GYWN0b3J5IGdldEFwcGxpY2F0aW9uRmFjdG9yeSgpIHsKLQkJcmV0dXJuIEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25GYWN0b3J5KCk7Ci0JfQotCi0JcHVibGljIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBnZXRXZWJBcHBGYWN0b3J5KCkgewotCQlyZXR1cm4gV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJhcHBsaWNhdGlvbkZhY3RvcnkoKTsKLQl9Ci0JcHVibGljIEVPYmplY3QgY3JlYXRlSW5zdGFuY2UoRVJlZmVyZW5jZSByZWYsRU9iamVjdCBlT2JqZWN0KSB7Ci0KLSAgICAgICAgaWYgKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVyZmFjZU1hcHBpbmcoKS5lcXVhbHMocmVmLmdldEVUeXBlKCkpKQotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUludGVyZmFjZU1hcCgpOwotCi0gICAgICAgIHJldHVybiBzdXBlci5jcmVhdGVJbnN0YW5jZShyZWYsIGVPYmplY3QpOwotICAgIH0KLSAgICAvKiBUaGUgd2ViIHR5cGUgaXMgYWJzdHJhY3QuICBBbHRlcm5hdGUgYmV0d2VlbiBzZXJ2bGV0LWNsYXNzCi0gICAgICogYW5kIGpzcC1maWxlCi0gICAgICovCi0gICAgcHVibGljIEludGVyZmFjZU1hcHBpbmcgY3JlYXRlSW50ZXJmYWNlTWFwKCkgewotICAgICAgICBjcmVhdGVkSW50ZXJmYWNlTWFwcysrOwotICAgICAgICBpZiAoKGNyZWF0ZWRJbnRlcmZhY2VNYXBzICYgMSkgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBKYXhycGNtYXBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nKCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBKYXhycGNtYXBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nKCk7Ci0KLSAgICB9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihqYXZhLmxhbmcuU3RyaW5nW10gYXJncykgewotCQlTdHJpbmdbXSBjbGFzc05hbWUgPSB7ICJjb20uaWJtLmV0b29scy5hcmNoaXZlLnRlc3QuV2ViU2VydmljZXNFTUZUZXN0IiwgIi1ub2xvYWRpbmciIH07Ci0JCVRlc3RSdW5uZXIubWFpbihjbGFzc05hbWUpOwotCX0KLQlwdWJsaWMgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFdlYlNlcnZpY2VzRU1GVGVzdCgidGVzdDEzV2ViU2VydmljZXNDbGllbnRQb3B1bGF0aW9uIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBXZWJTZXJ2aWNlc0VNRlRlc3QoInRlc3QxM1dlYlNlcnZpY2VzRERQb3B1bGF0aW9uIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBXZWJTZXJ2aWNlc0VNRlRlc3QoInRlc3QxNFdlYlNlcnZpY2VzRERQb3B1bGF0aW9uIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBXZWJTZXJ2aWNlc0VNRlRlc3QoInRlc3RKYXhSUENNYXBQb3B1bGF0aW9uIikpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3QxM1dlYlNlcnZpY2VzQ2xpZW50UG9wdWxhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljdXJyZW50VmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEOwotCQlFTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yLnJlc2V0KCk7Ci0JCWNyZWF0ZUVBUigpOwotCQljcmVhdGVFSkIoKTsKLQkJCi0KLQkJV2ViU2VydmljZXNSZXNvdXJjZSB3ZWJzZXJERCA9IChXZWJTZXJ2aWNlc1Jlc291cmNlKWVqYkZpbGUuZ2V0UmVzb3VyY2VTZXQoKS5jcmVhdGVSZXNvdXJjZShVUkkuY3JlYXRlVVJJKCJNRVRBLUlORi93ZWJzZXJ2aWNlc2NsaWVudC54bWwiKSk7Ci0JCS8vVE9ETzogaW5kaXZpZHVhbCB0ZXN0IGZvciBlYWNoIHZlcnNpb24KLQkJd2Vic2VyREQuc2V0VmVyc2lvbklEKGN1cnJlbnRWZXJzaW9uKTsKLQkJc2V0VmVyc2lvbihWRVJTSU9OXzFfMyk7Ci0JCXBvcHVsYXRlUm9vdCh3ZWJzZXJERC5nZXRSb290T2JqZWN0KCkpOwotCQkKLQkJU3RyaW5nIG91dCA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICtnZXRQcm9qZWN0TG9jYXRpb24oKTsKLQkJZWFyRmlsZS5leHRyYWN0VG8ob3V0LCBBcmNoaXZlLkVYUEFORF9BTEwpOwotCQllYXJGaWxlLmNsb3NlKCk7Ci0KLQl9Ci0JcHVibGljIHZvaWQgdGVzdEpheFJQQ01hcFBvcHVsYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3VycmVudFZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRDsKLQkJRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvci5yZXNldCgpOwotCQljcmVhdGVFQVIoKTsKLQkJY3JlYXRlRUpCKCk7Ci0JCVN0cmluZyBtYXBwaW5nRmlsZVBhdGhVUkkgPSAiTUVUQS1JTkYvdGVzdG1hcC54bWwiOwotCQlVUkkgdXJpID0gVVJJLmNyZWF0ZVVSSShtYXBwaW5nRmlsZVBhdGhVUkkpOwotCQlSZXNvdXJjZVNldCByZXNTZXQgPSBlamJGaWxlLmdldFJlc291cmNlU2V0KCk7Ci0JCUoyRUVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSA9IChKMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkpIHJlc1NldC5nZXRSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSgpOwotCQlyZWdpc3RyeS5yZWdpc3Rlckxhc3RGaWxlU2VnbWVudCh1cmkubGFzdFNlZ21lbnQoKSwgbmV3IEpheHJwY21hcFJlc291cmNlRmFjdG9yeShSZW5kZXJlckZhY3RvcnkuZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpKSk7Ci0JCXJlc1NldCA9IGVhckZpbGUuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJcmVnaXN0cnkgPSAoSjJFRVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KSByZXNTZXQuZ2V0UmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkoKTsKLQkJcmVnaXN0cnkucmVnaXN0ZXJMYXN0RmlsZVNlZ21lbnQodXJpLmxhc3RTZWdtZW50KCksIG5ldyBKYXhycGNtYXBSZXNvdXJjZUZhY3RvcnkoUmVuZGVyZXJGYWN0b3J5LmdldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoKSkpOwotCi0JCUpheHJwY21hcFJlc291cmNlIGpheHJwY21hcFJlcyA9IChKYXhycGNtYXBSZXNvdXJjZSkgcmVzU2V0LmNyZWF0ZVJlc291cmNlKHVyaSk7Ci0JCQotCQlqYXhycGNtYXBSZXMuc2V0VmVyc2lvbklEKGN1cnJlbnRWZXJzaW9uKTsKLQkJc2V0VmVyc2lvbihWRVJTSU9OXzFfMyk7Ci0JCQotCQlKYXZhV1NETE1hcHBpbmcgbWFwID0gSmF4cnBjbWFwRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSmF2YVdTRExNYXBwaW5nKCk7Ci0JCWpheHJwY21hcFJlcy5nZXRDb250ZW50cygpLmFkZChtYXApOwotCQlwb3B1bGF0ZVJvb3QoamF4cnBjbWFwUmVzLmdldFJvb3RPYmplY3QoKSk7Ci0JCQotCQlTdHJpbmcgb3V0ID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgK2dldFByb2plY3RMb2NhdGlvbigpOwotCQllYXJGaWxlLmV4dHJhY3RUbyhvdXQsIEFyY2hpdmUuRVhQQU5EX0FMTCk7Ci0JCWVhckZpbGUuY2xvc2UoKTsKLQotCX0KLQkKLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0MTNXZWJTZXJ2aWNlc0REUG9wdWxhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlFTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yLnJlc2V0KCk7Ci0JCWN1cnJlbnRWZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQ7Ci0JCWNyZWF0ZUVBUigpOwotCQljcmVhdGVFSkIoKTsKLQotCQlXc2RkUmVzb3VyY2Ugd2Vic2VyREQgPSAoV3NkZFJlc291cmNlKWVqYkZpbGUuZ2V0UmVzb3VyY2VTZXQoKS5jcmVhdGVSZXNvdXJjZShVUkkuY3JlYXRlVVJJKCJNRVRBLUlORi93ZWJzZXJ2aWNlcy54bWwiKSk7Ci0JCS8vVE9ETzogaW5kaXZpZHVhbCB0ZXN0IGZvciBlYWNoIHZlcnNpb24KLQkJd2Vic2VyREQuc2V0VmVyc2lvbklEKGN1cnJlbnRWZXJzaW9uKTsKLQkJc2V0VmVyc2lvbihWRVJTSU9OXzFfMyk7Ci0JCXBvcHVsYXRlUm9vdCh3ZWJzZXJERC5nZXRSb290T2JqZWN0KCkpOwotCQkKLQkJU3RyaW5nIG91dCA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICtnZXRQcm9qZWN0TG9jYXRpb24oKTsKLQkJZWFyRmlsZS5leHRyYWN0VG8ob3V0LCBBcmNoaXZlLkVYUEFORF9BTEwpOwotCQllYXJGaWxlLmNsb3NlKCk7Ci0KLQl9Ci0JcHVibGljIHZvaWQgdGVzdDE0V2ViU2VydmljZXNERFBvcHVsYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvci5yZXNldCgpOwotCQljdXJyZW50VmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEOwotCQljcmVhdGVFQVIoKTsKLQkJY3JlYXRlRUpCKCk7Ci0KLQkJV3NkZFJlc291cmNlIHdlYnNlckREID0gKFdzZGRSZXNvdXJjZSllamJGaWxlLmdldFJlc291cmNlU2V0KCkuY3JlYXRlUmVzb3VyY2UoVVJJLmNyZWF0ZVVSSSgiTUVUQS1JTkYvd2Vic2VydmljZXMueG1sIikpOwotCQl3ZWJzZXJERC5nZXRDb250ZW50cygpLmFkZChXc2RkRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV2ViU2VydmljZXMoKSk7Ci0JCS8vVE9ETzogaW5kaXZpZHVhbCB0ZXN0IGZvciBlYWNoIHZlcnNpb24KLQkJd2Vic2VyREQuc2V0VmVyc2lvbklEKGN1cnJlbnRWZXJzaW9uKTsKLQkJc2V0VmVyc2lvbihWRVJTSU9OXzFfNCk7Ci0JCXBvcHVsYXRlUm9vdCh3ZWJzZXJERC5nZXRSb290T2JqZWN0KCkpOwotCQkKLQkJU3RyaW5nIG91dCA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICtnZXRQcm9qZWN0TG9jYXRpb24oKTsKLQkJZWFyRmlsZS5leHRyYWN0VG8ob3V0LCBBcmNoaXZlLkVYUEFORF9BTEwpOwotCQllYXJGaWxlLmNsb3NlKCk7Ci0KLQl9Ci0JcHVibGljIFN0cmluZyBnZXRQcm9qZWN0TG9jYXRpb24oKSB7Ci0JCWlmIChjdXJyZW50VmVyc2lvbiA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCkKLQkJCXJldHVybiAidGVzdE91dHB1dC9UZXN0V2ViU2VydmljZXMiOwotCQllbHNlCi0JCQlyZXR1cm4gInRlc3RPdXRwdXQvVGVzdFdlYlNlcnZpY2VzMTQiOwotCX0KLQlwdWJsaWMgdm9pZCBnZXRFSkIoKSB0aHJvd3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uLCBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBpbiA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICtnZXRQcm9qZWN0TG9jYXRpb24oKSArIi9mb29XZWJTZXJ2aWNlcyI7Ci0JCWVqYkZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5FSkJKYXJGaWxlKGluKTsKLQkJYXNzZXJ0VHJ1ZShlamJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkgIT0gbnVsbCk7Ci0JfQotCXB1YmxpYyB2b2lkIGNyZWF0ZUVKQigpIHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24gewotCQllamJGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVFSkJKYXJGaWxlSW5pdGlhbGl6ZWQoImZvb1dlYlNlcnZpY2VzIik7Ci0JCWVqYkZpbGUgPSAoRUpCSmFyRmlsZSkgZWFyRmlsZS5hZGRDb3B5KGVqYkZpbGUpOwotCQllamJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuc2V0RGlzcGxheU5hbWUoImZvb1dlYlNlcnZpY2VzIik7Ci0JCWFzc2VydFRydWUoZWpiRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpICE9IG51bGwpOwotCX0KLQlwdWJsaWMgdm9pZCBjcmVhdGVFQVIoKSB7Ci0JCVN0cmluZyBlYXJOYW1lID0gIlRlc3QuZWFyIjsKLQkJZWFyRmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlRUFSRmlsZUluaXRpYWxpemVkKGVhck5hbWUpOwotCQlhc3NlcnRUcnVlKGVhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSAhPSBudWxsKTsKLQl9Ci0gICAgCi0JcHVibGljIEhhc2hTZXQgaWdub3JhYmxlQXR0cmlidXRlcygpewotCQlIYXNoU2V0IHNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCXNldC5hZGQoImlkIik7Ci0JCXJldHVybiBzZXQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L0Fic3RyYWN0QXJjaGl2ZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9BYnN0cmFjdEFyY2hpdmVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MWEzMTkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L0Fic3RyYWN0QXJjaGl2ZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0OwotCi0gLyoKLSAqIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNCi0gKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAxIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUKLSAqIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLgotICovCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZTsKLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICgwMi8wNy8wMSAxOjQ4OjE4IFBNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgQWJzdHJhY3RBcmNoaXZlVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAxLiI7Ly8kTk9OLU5MUy0xJAotLyoqCi0gKiBBYnN0cmFjdEFyY2hpdmVUZXN0IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKiBAcGFyYW0gbmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0gKi8KLXB1YmxpYyBBYnN0cmFjdEFyY2hpdmVUZXN0KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci1wdWJsaWMgU2V0IGdldEFsbFVucmVzb2x2ZWRQcm94aWVzKEVPYmplY3Qgcm9vdCkgewotCVNldCB2aXNpdGVkID0gbmV3IEhhc2hTZXQoKTsKLQlTZXQgcHJveGllcyA9IG5ldyBIYXNoU2V0KCk7Ci0JZ2V0QWxsVW5yZXNvbHZlZFByb3hpZXMocm9vdCwgcHJveGllcywgdmlzaXRlZCwgcm9vdC5lUmVzb3VyY2UoKSk7Ci0JcmV0dXJuIHByb3hpZXM7Ci19Ci1wdWJsaWMgdm9pZCBnZXRBbGxVbnJlc29sdmVkUHJveGllcyhFT2JqZWN0IG9iamVjdCwgU2V0IHByb3hpZXMsIFNldCB2aXNpdGVkT2JqZWN0cywgUmVzb3VyY2Ugb3JpZ2luYWxSZXNvdXJjZSkgewotCi0JaWYgKHZpc2l0ZWRPYmplY3RzLmNvbnRhaW5zKG9iamVjdCkpCi0JCXJldHVybjsKLQllbHNlCi0JCXZpc2l0ZWRPYmplY3RzLmFkZChvYmplY3QpOwotCi0JaWYgKG9iamVjdC5lUmVzb3VyY2UoKSAhPSBvcmlnaW5hbFJlc291cmNlKSB7Ci0JCWlmICgoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QgKW9iamVjdCkuZUlzUHJveHkoKSkgewotCQkJcHJveGllcy5hZGQob2JqZWN0KTsKLQkJfQotCQlyZXR1cm47Ci0JfQotCi0JTGlzdCByZWZzID0gb2JqZWN0LmVDbGFzcygpLmdldEVBbGxSZWZlcmVuY2VzKCk7Ci0JaWYgKHJlZnMgIT0gbnVsbCkgewotCQlJdGVyYXRvciBpciA9IHJlZnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGlyLmhhc05leHQoKSkgewotCQkJRVJlZmVyZW5jZSByID0gKEVSZWZlcmVuY2UpIGlyLm5leHQoKTsKLQkJCU9iamVjdCB2YWx1ZSA9IG9iamVjdC5lR2V0KHIpOwotCQkJaWYgKHZhbHVlID09IG51bGwpCi0JCQkJY29udGludWU7Ci0KLQkJCWlmIChyLmlzTWFueSgpKSB7Ci0JCQkJQ29sbGVjdGlvbiBjID0gKENvbGxlY3Rpb24pIHZhbHVlOwotCQkJCUl0ZXJhdG9yIGlyMiA9IGMuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXIyLmhhc05leHQoKSkgewotCQkJCQlFT2JqZWN0IHJlZk9iaiA9IChFT2JqZWN0KSBpcjIubmV4dCgpOwotCQkJCQlnZXRBbGxVbnJlc29sdmVkUHJveGllcyhyZWZPYmosIHByb3hpZXMsIHZpc2l0ZWRPYmplY3RzLCBvcmlnaW5hbFJlc291cmNlKTsKLQkJCQl9Ci0JCQl9IGVsc2UKLQkJCQlnZXRBbGxVbnJlc29sdmVkUHJveGllcygoRU9iamVjdCkgdmFsdWUsIHByb3hpZXMsIHZpc2l0ZWRPYmplY3RzLCBvcmlnaW5hbFJlc291cmNlKTsKLQkJfQotCX0KLX0KLXB1YmxpYyBzdGF0aWMgQ29tbW9uYXJjaGl2ZUZhY3RvcnkgZ2V0QXJjaGl2ZUZhY3RvcnkoKSB7Ci0JcmV0dXJuIENvbW1vbmFyY2hpdmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21tb25hcmNoaXZlRmFjdG9yeSgpOwotfQotcHVibGljIHZvaWQgdmVyaWZ5UHJveGllcyhFT2JqZWN0IHJvb3QpIHsKLQotCVNldCBwcm94aWVzID0gZ2V0QWxsVW5yZXNvbHZlZFByb3hpZXMocm9vdCk7Ci0JYXNzZXJ0VHJ1ZSgiU29tZSBwcm94aWVzIGNvdWxkIG5vdCBiZSByZXNvbHZlZCIsIHByb3hpZXMuaXNFbXB0eSgpKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9BbGxBcmNoaXZlVGVzdHNFY2xpcHNlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvQWxsQXJjaGl2ZVRlc3RzRWNsaXBzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDlmYzZlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9BbGxBcmNoaXZlVGVzdHNFY2xpcHNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBBcHIgMTgsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLnRlc3Q7Ci0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQWxsQXJjaGl2ZVRlc3RzRWNsaXBzZSBleHRlbmRzIEFsbEFyY2hpdmVUZXN0c0phdmEgewotCi0gICAgcHVibGljIEFsbEFyY2hpdmVUZXN0c0VjbGlwc2UoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L0FsbEFyY2hpdmVUZXN0c0phdmEuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9BbGxBcmNoaXZlVGVzdHNKYXZhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNmM4ZWIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L0FsbEFyY2hpdmVUZXN0c0phdmEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0OwotCi0gLyoKLSAqIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNCi0gKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAxIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUKLSAqIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLgotICovCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC5zd2luZ3VpLlRlc3RSdW5uZXI7Ci0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTIvMTkvMDAgNDo0NDowNCBQTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEFsbEFyY2hpdmVUZXN0c0phdmEgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAxLiI7Ly8kTk9OLU5MUy0xJAotLyoqCi0gKiBBbGxUZXN0cyBjb25zdHJ1Y3RvciBjb21tZW50LgotICogQHBhcmFtIG5hbWUgamF2YS5sYW5nLlN0cmluZwotICovCi1wdWJsaWMgQWxsQXJjaGl2ZVRlc3RzSmF2YShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotLyoqCi0gKiBTdGFydHMgdGhlIGFwcGxpY2F0aW9uLgotICogQHBhcmFtIGFyZ3MgYW4gYXJyYXkgb2YgY29tbWFuZC1saW5lIGFyZ3VtZW50cwotICovCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihqYXZhLmxhbmcuU3RyaW5nW10gYXJncykgewotCVN0cmluZ1tdIGNsYXNzTmFtZSA9IHsiY29tLmlibS5ldG9vbHMuYXJjaGl2ZS50ZXN0LkFsbFRlc3RzIiwgIi1ub2xvYWRpbmcifTsKLQlUZXN0UnVubmVyLm1haW4oY2xhc3NOYW1lKTsKLX0KLXB1YmxpYyBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgiVGVzdCBmb3IgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS50ZXN0Iik7Ci0Jc3VpdGUuYWRkVGVzdChEaXNjcmltaW5hdG9yVGVzdC5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KExvb3NlQXJjaGl2ZVRlc3RzLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoSW5pdGlhbGl6YXRpb25UZXN0cy5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFNpbXBsZVRlc3RzLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoQ29weVRlc3RzLnN1aXRlKCkpOwotLy8Jc3VpdGUuYWRkVGVzdChFSkJKYXJDb252ZXJzaW9uVGVzdHMuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChXQVJGaWxlVGVzdHMuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChTYXZlVGVzdHMuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChKYXZhVGVzdHMuc3VpdGUoKSk7Ci0vLwlzdWl0ZS5hZGRUZXN0KElEVGVzdHMuc3VpdGUoKSk7Ci0JLy9zdWl0ZS5hZGRUZXN0KEFsdEREVGVzdHMuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChTZWN1cml0eVJvbGVUZXN0cy5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFJhckZpbGVUZXN0cy5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFJlc291cmNlVGVzdHMuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChDbGllbnRDb250YWluZXJSZXNvdXJjZUxvYWRUZXN0LnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdE1vZHVsZUNsYXNzTG9hZGluZy5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3RJbnZhbGlkWG1sTXVsdGlwbGljaXR5LnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoRGVmZWN0VmVyaWZpY2F0aW9uVGVzdHMuc3VpdGUoKSk7Ci0JCi0JcmV0dXJuIHN1aXRlOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L0NsaWVudENvbnRhaW5lclJlc291cmNlTG9hZFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9DbGllbnRDb250YWluZXJSZXNvdXJjZUxvYWRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZDgxOTguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L0NsaWVudENvbnRhaW5lclJlc291cmNlTG9hZFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUudGVzdDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQuc3dpbmd1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFwcGxpY2F0aW9uQ2xpZW50RmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5SZXNvdXJjZUxvYWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlSW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsLkNvbW1vbmFyY2hpdmVGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLmJ2dC5BdXRvbWF0ZWRCVlQ7Ci0KLQotCi1wdWJsaWMgY2xhc3MgQ2xpZW50Q29udGFpbmVyUmVzb3VyY2VMb2FkVGVzdCBleHRlbmRzIFRlc3RDYXNlewotCXB1YmxpYyBzdGF0aWMgRUFSRmlsZSBlYXJGaWxlID0gbnVsbDsKLQkKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDEuIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIFNpbXBsZVRlc3RzIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogQHBhcmFtIG5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBDbGllbnRDb250YWluZXJSZXNvdXJjZUxvYWRUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJc3VwZXIuc2V0VXAoKTsKLQkJQXJjaGl2ZUluaXQuaW5pdCgpOwotCX0KLQotCQotCXB1YmxpYyBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKENsaWVudENvbnRhaW5lclJlc291cmNlTG9hZFRlc3QuY2xhc3MpOwotCX0KLQkvKioKLQkgKiBTdGFydHMgdGhlIGFwcGxpY2F0aW9uLgotCSAqIEBwYXJhbSBhcmdzIGFuIGFycmF5IG9mIGNvbW1hbmQtbGluZSBhcmd1bWVudHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihqYXZhLmxhbmcuU3RyaW5nW10gYXJncykgewotCQlTdHJpbmdbXSBjbGFzc05hbWUgPSB7ICJjb20uaWJtLmV0b29scy5hcmNoaXZlLnRlc3QuQ2xpZW50Q29udGFpbmVyUmVzb3VyY2VMb2FkVGVzdCIsICItbm9sb2FkaW5nIiB9OwotCQlUZXN0UnVubmVyLm1haW4oY2xhc3NOYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENsaWVudENvbnRhaW5lckxvYWQgKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJdHJ5IHsKLQotCQkJQ29tbW9uYXJjaGl2ZUZhY3RvcnkgZmFjdG9yeSA9IENvbW1vbmFyY2hpdmVGYWN0b3J5SW1wbC5nZXRBY3RpdmVGYWN0b3J5KCk7Ci0JCQlTdHJpbmcgaW4gPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJtdGFwcDIuZWFyIjsKLQkJCVN0cmluZyBvdXQgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJtdGFwcDJGaW5pc2hlZC5lYXIiOwotCQkJZWFyRmlsZSA9IGZhY3Rvcnkub3BlbkVBUkZpbGUgKGluKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoInVyaTogIiArIGVhckZpbGUuZ2V0VVJJKCkpOwotCi0JCQlMaXN0IGFwcENsaWVudHMgPSBlYXJGaWxlLmdldEFwcGxpY2F0aW9uQ2xpZW50RmlsZXMoKTsKLQkJCWJvb2xlYW4gZXhGb3VuZDEgPSBmYWxzZTsKLQkJCWJvb2xlYW4gZXhGb3VuZDIgPSBmYWxzZTsKLQkJCQotCQkJZm9yKGludCBpID0gMDsgaTxhcHBDbGllbnRzLnNpemUoKTsgaSsrKXsKLQkJCQlBcHBsaWNhdGlvbkNsaWVudEZpbGUgZmlsZSA9IChBcHBsaWNhdGlvbkNsaWVudEZpbGUpYXBwQ2xpZW50cy5nZXQoMCk7Ci0JCQkJUmVzb3VyY2UgcmVzOwotCi0JCQkJdHJ5ewotCQkJCQlyZXMgPSBmaWxlLmdldE1vZlJlc291cmNlKCJNRVRBLUlORi9GT09jbGllbnQtcmVzb3VyY2UueG1pIik7Ci0JCQkJfSBjYXRjaChFeGNlcHRpb24gZSl7CQotCQkJCQlleEZvdW5kMSA9IHRydWU7Ci0JCQkJCWlmKCEoZSBpbnN0YW5jZW9mIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbikpewotCQkJCQkJYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIiwgZmFsc2UpOwotCQkJCQl9CQkKLQkJCQl9Ci0JCQkJCi0JCQkJdHJ5IHsKLQkJCQkJcmVzID0gZmlsZS5nZXRNb2ZSZXNvdXJjZSgiTUVUQS1JTkYvY2xpZW50LXJlc291cmNlLnhtaSIpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWV4Rm91bmQyID0gdHJ1ZTsKLQkJCQkJaWYoIShlIGluc3RhbmNlb2YgUmVzb3VyY2VMb2FkRXhjZXB0aW9uKSl7Ci0JCQkJCQlhc3NlcnRUcnVlKCJFeHBlY3RlZCBSZXNvdXJjZUxvYWRFeGNlcHRpb24iLCBmYWxzZSk7Ci0JCQkJCX0JCi0JCQkJfQotCQkJfQotCQkJYXNzZXJ0VHJ1ZSgiTm8gZXhjZXB0aW9uIGxvZ2dlZCBmb3Igbm9uLWV4aXN0aW5nIGZpbGUiLCBleEZvdW5kMSk7Ci0JCQlhc3NlcnRUcnVlKCJObyBleGNlcHRpb24gbG9nZ2VkIGZvciBleGlzdGluZyIsIGV4Rm91bmQyKTsKLQotCQkJCi0JCQllYXJGaWxlLnNhdmVBcyhvdXQpOwotCQkJZWFyRmlsZS5jbG9zZSgpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvQ29weVRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvQ29weVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhZTYxNjcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L0NvcHlUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0OwotCi0vKgotKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTQotKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAxIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZQotKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4KLSovCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC5zd2luZ3VpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5Nb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uV2ViTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUpCSmFyRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FSkJNb2R1bGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5SZWFkT25seURpcmVjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5XQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMuYnZ0LkF1dG9tYXRlZEJWVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotCi0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICgxMi8xNC8wMCAxMjoxMDozNiBQTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIENvcHlUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDEuIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIENvcHlUZXN0cyBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIEBwYXJhbSBuYW1lIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgQ29weVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQlwdWJsaWMgQ29tbW9uYXJjaGl2ZUZhY3RvcnkgZ2V0QXJjaGl2ZUZhY3RvcnkoKSB7Ci0JCXJldHVybiBDb21tb25hcmNoaXZlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uYXJjaGl2ZUZhY3RvcnkoKTsKLQl9Ci0JcHVibGljIEVqYkZhY3RvcnkgZ2V0RUpCRmFjdG9yeSgpIHsKLQkJcmV0dXJuIEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVqYkZhY3RvcnkoKTsKLQl9Ci0KLQlwdWJsaWMgRWpiUGFja2FnZSBnZXRFSkJQYWNrYWdlKCkgewotCQlyZXR1cm4gRWpiUGFja2FnZS5lSU5TVEFOQ0U7Ci0JfQotCXB1YmxpYyBXZWJhcHBsaWNhdGlvbkZhY3RvcnkgZ2V0V2ViRmFjdG9yeSgpIHsKLQkJcmV0dXJuIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViYXBwbGljYXRpb25GYWN0b3J5KCk7Ci0JfQotCS8qKgotCSAqIFN0YXJ0cyB0aGUgYXBwbGljYXRpb24uCi0JICogQHBhcmFtIGFyZ3MgYW4gYXJyYXkgb2YgY29tbWFuZC1saW5lIGFyZ3VtZW50cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKGphdmEubGFuZy5TdHJpbmdbXSBhcmdzKSB7Ci0JCVN0cmluZ1tdIGNsYXNzTmFtZSA9IHsgImNvbS5pYm0uZXRvb2xzLmFyY2hpdmUudGVzdC5Db3B5VGVzdHMiLCAiLW5vbG9hZGluZyIgfTsKLQkJVGVzdFJ1bm5lci5tYWluKGNsYXNzTmFtZSk7Ci0JfQotCXB1YmxpYyBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKENvcHlUZXN0cy5jbGFzcyk7Ci0JfQotCS8qKgotCSAqIFRlc3RzIHRoZSBhZGRDb3B5KFJlYWRPbmx5RGlyZWN0b3J5KSBhcGkgb24gYXJjaGl2ZQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RBZGRDb3B5RGlyZWN0b3J5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJV0FSRmlsZSBhV2FyRmlsZSA9IChXQVJGaWxlKSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5BcmNoaXZlKEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgImV4YW1wbGUyLndhciIpOwotCi0JCVJlYWRPbmx5RGlyZWN0b3J5IHNhbXBsZURpcmVjdG9yeSA9IGdldEFyY2hpdmVGYWN0b3J5KCkub3BlblJlYWRPbmx5RGlyZWN0b3J5KEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgIldhclRlc3RDbGFzc2VzIik7Ci0JCQotCQlpbnQgaW5pdGlhbFNpemUgPSBhV2FyRmlsZS5nZXRGaWxlcygpLnNpemUoKTsKLQotCQlhV2FyRmlsZS5hZGRDb3B5KHNhbXBsZURpcmVjdG9yeSk7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBhV2FyRmlsZS5nZXRGaWxlcygpLml0ZXJhdG9yKCk7Ci0JCS8vRm9yIHJ1bm5pbmcgaW5zaWRlIGVjbGlwc2UKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlTdHJpbmcgdXJpID0gKChGaWxlKWl0ZXIubmV4dCgpKS5nZXRVUkkoKTsKLQkJCWlmICh1cmkuaW5kZXhPZigiQ1ZTIikgPj0gMCkgCi0JCQkJaXRlci5yZW1vdmUoKTsKLQkJfQotCQlhc3NlcnRUcnVlKCJXcm9uZyBudW1iZXIgb2YgZmlsZXMgIiwgYVdhckZpbGUuZ2V0RmlsZXMoKS5zaXplKCkgPT0gaW5pdGlhbFNpemUgKyA3KTsKLQkJYVdhckZpbGUuc2F2ZUFzTm9SZW9wZW4oQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAidGVzdE91dHB1dC9Db3B5VGVzdHMvYWRkQ29weURpci53YXIiKTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRDb3B5TW9kdWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJU3RyaW5nIGluID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAic2FtcGxlLmVhciI7Ci0JCUVBUkZpbGUgZWFyRmlsZSA9IChFQVJGaWxlKSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5BcmNoaXZlKGluKTsKLQkJTGlzdCBtb2R1bGVzID0gZWFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldE1vZHVsZXMoKTsKLQkJRUpCSmFyRmlsZSBlamJKYXJGaWxlID0gbnVsbDsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZHVsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCU1vZHVsZSBhTW9kdWxlID0gKE1vZHVsZSkgbW9kdWxlcy5nZXQoaSk7Ci0JCQlpZiAoYU1vZHVsZS5pc0VqYk1vZHVsZSgpKSB7Ci0JCQkJZWpiSmFyRmlsZSA9IChFSkJKYXJGaWxlKSBlYXJGaWxlLmdldEZpbGUoYU1vZHVsZS5nZXRVcmkoKSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlhc3NlcnRUcnVlKCJFSkJKYXJGaWxlIHNob3VsZCBub3QgYmUgbnVsbCIsIGVqYkphckZpbGUgIT0gbnVsbCk7Ci0JCWVqYkphckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQotCQlFQVJGaWxlIG5ld0VhckZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUVBUkZpbGVJbml0aWFsaXplZChBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJ0ZXN0T3V0cHV0L0NvcHlUZXN0cy9uZXdFYXJXaXRoQ29waWVkTW9kdWxlLmVhciIpOwotCQluZXdFYXJGaWxlLmFkZENvcHkoZWpiSmFyRmlsZSk7Ci0JCUVKQkphckZpbGUgY29waWVkID0gKEVKQkphckZpbGUpIG5ld0VhckZpbGUuZ2V0TW9kdWxlRmlsZXMoKS5nZXQoMCk7Ci0JCWFzc2VydFRydWUoY29waWVkLmlzRGVwbG95bWVudERlc2NyaXB0b3JTZXQoKSk7Ci0JCWFzc2VydFRydWUoY29waWVkLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkgPT0gY29waWVkLmdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKS5nZXRDb250ZW50cygpLmdldCgwKSk7Ci0JCWFzc2VydFRydWUoY29waWVkLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkgIT0gZWpiSmFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpKTsKLQkJYXNzZXJ0VHJ1ZShlamJKYXJGaWxlLmdldEZpbGVzKCkuc2l6ZSgpID09IGNvcGllZC5nZXRGaWxlcygpLnNpemUoKSk7Ci0KLQkJbmV3RWFyRmlsZS5zYXZlTm9SZW9wZW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0IHBlciBDTVZDIGRlZmVjdCByZXBvcnQgOTYxOTcKLQkgKiBDcmVhdGUgYSBuZXcgYXBwbGljYXRpb24sIG9wZW4gZWpiIGphciBmaWxlLCB1c2UgYWRkY29weSB0byBhZGQgdGhlIG1vZHVsZSwgYW5kIHNhdmUKLQkgKiB1c2luZyBvcmlnaW5hbCBlYXIsIGdldCB0aGUgZWpiIGphciwgYW5kIG1vZGlmeSBiaW5kaW5ncwotCSAqIHNhdmUgYWdhaW4KLQkgKiBSZXN1bHQ6ICBiaW5kaW5ncyBub3QgdXBkYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RBZGRDb3B5TW9kdWxlRmlsZXNUb0VBUigpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgdXJpID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAidGVzdE91dHB1dC9Db3B5VGVzdHMvdGVzdEFkZENvcHlNb2R1bGVGaWxlc1RvRUFSLmVhciI7Ci0JCS8vQ3JlYXRlIGEgbmV3IGVhciBmaWxlLCBhZGQgYSBzdGFuZGFsb25lIGVqYiBqYXIgZmlsZSBhbmQgc3RhbmRhbG9uZSB3YXIgZmlsZSwgYW5kIHNhdmUKLQkJRUFSRmlsZSBlYXJGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVFQVJGaWxlSW5pdGlhbGl6ZWQodXJpKTsKLQkJZWFyRmlsZS5zZXRKMkVFVmVyc2lvbihKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCk7Ci0JCWVhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5zZXREaXNwbGF5TmFtZSh1cmkpOwotCQlFSkJKYXJGaWxlIGVqYkphckZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5FSkJKYXJGaWxlKEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgImJhbmtlamJzLmphciIpOwotCQllYXJGaWxlLmFkZENvcHkoZWpiSmFyRmlsZSk7Ci0JCVdBUkZpbGUgd2FyRmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbldBUkZpbGUoQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAiZXhhbXBsZTIud2FyIik7Ci0JCWVhckZpbGUuYWRkQ29weSh3YXJGaWxlKTsKLQkJKChXZWJNb2R1bGUpIGVhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5nZXRGaXJzdE1vZHVsZSh3YXJGaWxlLmdldFVSSSgpKSkuc2V0Q29udGV4dFJvb3QoIi8iKTsKLQkJZWFyRmlsZS5zYXZlKCk7Ci0KLQkJZWpiSmFyRmlsZSA9IChFSkJKYXJGaWxlKSBlYXJGaWxlLmdldEVKQkphckZpbGVzKCkuZ2V0KDApOwotCQlhc3NlcnRUcnVlKCJlamIgZGQgcmVzb3VyY2Ugbm90IHJpZ2h0IiwgZWpiSmFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmVSZXNvdXJjZSgpID09IGVqYkphckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpKTsKLQotCQkKLQotCQl3YXJGaWxlID0gKFdBUkZpbGUpIGVhckZpbGUuZ2V0V0FSRmlsZXMoKS5nZXQoMCk7Ci0JCWFzc2VydFRydWUoIndhciBkZCByZXNvdXJjZSBub3QgcmlnaHQiLCB3YXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZVJlc291cmNlKCkgPT0gd2FyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCkpOwotCi0JCQotCQllYXJGaWxlLnNhdmVOb1Jlb3BlbigpOwotCi0JCQotCQllYXJGaWxlLmNsb3NlKCk7Ci0KLQl9Ci0JLyoqCi0JICogVGVzdHMgb3BlbmluZyBhIHN0YW5kYWxvbmUgbW9kdWxlIHdpdGggYW4gYWJzb2x1dGUgcGF0aCwgYW5kIGFkZGluZyB0aGF0IHRvIGEgbmV3IGVhciBmaWxlLCBwZXIgZGVmZWN0IHJlcG9ydAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RBZGRDb3B5U3RhbmRhbG9uZU1vZHVsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgZmlsZU5hbWUgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJiYW5rZWpicy5qYXIiOwotCi0JCUVKQkphckZpbGUgZWpiSmFyRmlsZSA9IChFSkJKYXJGaWxlKSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5BcmNoaXZlKGZpbGVOYW1lKTsKLQkJZWpiSmFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCi0JCUVBUkZpbGUgbmV3RWFyRmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlRUFSRmlsZUluaXRpYWxpemVkKEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInRlc3RPdXRwdXQvQ29weVRlc3RzL25ld0VhcldpdGhTdGFuZEFsb25lTW9kdWxlLW91dC5lYXIiKTsKLQkJbmV3RWFyRmlsZS5hZGRDb3B5KGVqYkphckZpbGUpOwotCQlFSkJKYXJGaWxlIGNvcGllZCA9IChFSkJKYXJGaWxlKSBuZXdFYXJGaWxlLmdldE1vZHVsZUZpbGVzKCkuZ2V0KDApOwotCQlhc3NlcnRUcnVlKGNvcGllZC5pc0RlcGxveW1lbnREZXNjcmlwdG9yU2V0KCkpOwotCQlhc3NlcnRUcnVlKGNvcGllZC5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpID09IGNvcGllZC5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCkuZ2V0Q29udGVudHMoKS5nZXQoMCkpOwotCQlhc3NlcnRUcnVlKGNvcGllZC5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpICE9IGVqYkphckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSk7Ci0JCWFzc2VydFRydWUoZWpiSmFyRmlsZS5nZXRGaWxlcygpLnNpemUoKSA9PSBjb3BpZWQuZ2V0RmlsZXMoKS5zaXplKCkpOwotCi0JCW5ld0VhckZpbGUuc2F2ZU5vUmVvcGVuKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbmFtZUFuZERlbGV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCVN0cmluZyBpbiA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInNhbXBsZS5lYXIiOwotCQlFQVJGaWxlIGVhckZpbGUgPSAoRUFSRmlsZSkgZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuQXJjaGl2ZShpbik7Ci0JCUxpc3QgbW9kdWxlcyA9IGVhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5nZXRNb2R1bGVzKCk7Ci0JCUVKQkphckZpbGUgZWpiSmFyRmlsZSA9IG51bGw7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlNb2R1bGUgYU1vZHVsZSA9IChNb2R1bGUpIG1vZHVsZXMuZ2V0KGkpOwotCQkJaWYgKGFNb2R1bGUuaXNFamJNb2R1bGUoKSkgewotCQkJCWVqYkphckZpbGUgPSAoRUpCSmFyRmlsZSkgZWFyRmlsZS5nZXRGaWxlKGFNb2R1bGUuZ2V0VXJpKCkpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJYXNzZXJ0VHJ1ZSgiRUpCSmFyRmlsZSBzaG91bGQgbm90IGJlIG51bGwiLCBlamJKYXJGaWxlICE9IG51bGwpOwotCQllamJKYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0KLQkJRUFSRmlsZSBuZXdFYXJGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVFQVJGaWxlSW5pdGlhbGl6ZWQoQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAidGVzdE91dHB1dC9Db3B5VGVzdHMvbmV3RWFyV2l0aENvcGllZE1vZHVsZS5lYXIiKTsKLQkJRUpCTW9kdWxlUmVmIGFkZGVkQ29weSA9IChFSkJNb2R1bGVSZWYpIG5ld0VhckZpbGUuYWRkQ29weVJlZihlamJKYXJGaWxlKTsKLQkJYXNzZXJ0VHJ1ZSgiTW9kdWxlIGZpbGVzIHNob3VsZCBub3QgYmUgZW1wdHkiLCAhbmV3RWFyRmlsZS5nZXRNb2R1bGVGaWxlcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUoIk1vZHVsZXMgc2hvdWxkIG5vdCBiZSBlbXB0eSIsICFuZXdFYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0TW9kdWxlcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUoIk1vZHVsZSBzaG91bGQgYmUgYWNjZXNzaWJsZSBhbmQgaGF2ZSB0aGUgc2FtZSB1cmkgYXMgZmlsZSIsIGFkZGVkQ29weS5nZXRNb2R1bGUoKS5nZXRVcmkoKS5lcXVhbHMoYWRkZWRDb3B5LmdldE1vZHVsZUZpbGUoKS5nZXRVUkkoKSkpOwotCi0JCVN0cmluZyBuZXdVUkkgPSAidGVtcC9mb29iYXIuamFyIjsKLQkJYWRkZWRDb3B5LnNldFVSSShuZXdVUkkpOwotCQlhc3NlcnRUcnVlKCJNb2R1bGUgc2hvdWxkIGJlIGFjY2Vzc2libGUgYW5kIGhhdmUgdGhlIG5ldyByZW5hbWVkIHVyaSBhcyB3ZWxsIGFzIHRoZSBmaWxlIiwgYWRkZWRDb3B5LmdldE1vZHVsZSgpLmdldFVyaSgpLmVxdWFscyhhZGRlZENvcHkuZ2V0TW9kdWxlRmlsZSgpLmdldFVSSSgpKSAmJiBhZGRlZENvcHkuZ2V0TW9kdWxlKCkuZ2V0VXJpKCkuZXF1YWxzKG5ld1VSSSkpOwotCQluZXdFYXJGaWxlLnJlbW92ZShhZGRlZENvcHkpOwotCQlhc3NlcnRUcnVlKCJNb2R1bGUgZmlsZXMgc2hvdWxkIGJlIGVtcHR5IiwgbmV3RWFyRmlsZS5nZXRNb2R1bGVGaWxlcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUoIk1vZHVsZXMgc2hvdWxkIGJlIGVtcHR5IiwgbmV3RWFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldE1vZHVsZXMoKS5pc0VtcHR5KCkpOwotCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbmFtZUFuZERlbGV0ZVN0YW5kYWxvbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlTdHJpbmcgZmlsZU5hbWUgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJiYW5rZWpicy5qYXIiOwotCi0JCUVKQkphckZpbGUgZWpiSmFyRmlsZSA9IChFSkJKYXJGaWxlKSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5BcmNoaXZlKGZpbGVOYW1lKTsKLQotCQlFQVJGaWxlIG5ld0VhckZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUVBUkZpbGVJbml0aWFsaXplZChBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJ0ZXN0T3V0cHV0L0NvcHlUZXN0cy9uZXdFYXJXaXRoQ29waWVkTW9kdWxlLmVhciIpOwotCQlFSkJNb2R1bGVSZWYgYWRkZWRDb3B5ID0gKEVKQk1vZHVsZVJlZikgbmV3RWFyRmlsZS5hZGRDb3B5UmVmKGVqYkphckZpbGUpOwotCQlhc3NlcnRUcnVlKCJNb2R1bGUgZmlsZXMgc2hvdWxkIG5vdCBiZSBlbXB0eSIsICFuZXdFYXJGaWxlLmdldE1vZHVsZUZpbGVzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZSgiTW9kdWxlcyBzaG91bGQgbm90IGJlIGVtcHR5IiwgIW5ld0VhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5nZXRNb2R1bGVzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZSgiTW9kdWxlIHNob3VsZCBiZSBhY2Nlc3NpYmxlIGFuZCBoYXZlIHRoZSBzYW1lIHVyaSBhcyBmaWxlIiwgYWRkZWRDb3B5LmdldE1vZHVsZSgpLmdldFVyaSgpLmVxdWFscyhhZGRlZENvcHkuZ2V0TW9kdWxlRmlsZSgpLmdldFVSSSgpKSk7Ci0KLQkJU3RyaW5nIG5ld1VSSSA9ICJ0ZW1wL2Zvb2Jhci5qYXIiOwotCQlhZGRlZENvcHkuc2V0VVJJKG5ld1VSSSk7Ci0JCWFzc2VydFRydWUoIk1vZHVsZSBzaG91bGQgYmUgYWNjZXNzaWJsZSBhbmQgaGF2ZSB0aGUgbmV3IHJlbmFtZWQgdXJpIGFzIHdlbGwgYXMgdGhlIGZpbGUiLCBhZGRlZENvcHkuZ2V0TW9kdWxlKCkuZ2V0VXJpKCkuZXF1YWxzKGFkZGVkQ29weS5nZXRNb2R1bGVGaWxlKCkuZ2V0VVJJKCkpICYmIGFkZGVkQ29weS5nZXRNb2R1bGUoKS5nZXRVcmkoKS5lcXVhbHMobmV3VVJJKSk7Ci0JCW5ld0VhckZpbGUucmVtb3ZlKGFkZGVkQ29weSk7Ci0JCWFzc2VydFRydWUoIk1vZHVsZSBmaWxlcyBzaG91bGQgYmUgZW1wdHkiLCBuZXdFYXJGaWxlLmdldE1vZHVsZUZpbGVzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZSgiTW9kdWxlcyBzaG91bGQgYmUgZW1wdHkiLCBuZXdFYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0TW9kdWxlcygpLmlzRW1wdHkoKSk7Ci0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L0RlZmVjdFZlcmlmaWNhdGlvblRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvRGVmZWN0VmVyaWZpY2F0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDgzOTNmNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvRGVmZWN0VmVyaWZpY2F0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4OSArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBNYXkgMjAsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcElucHV0U3RyZWFtOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FSkJNb2R1bGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Nb2R1bGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuV2ViTW9kdWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5idnQuQXV0b21hdGVkQlZUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLldyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRmlsdGVyTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKiAKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtCi0gKiBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgRGVmZWN0VmVyaWZpY2F0aW9uVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIERlZmVjdFZlcmlmaWNhdGlvblRlc3RzKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIERlZmVjdFZlcmlmaWNhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3Qgc3VpdGUoKSB7Ci0JICAgIC8qVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCSAgICBzdWl0ZS5hZGRUZXN0KG5ldyBEZWZlY3RWZXJpZmljYXRpb25UZXN0cygidGVzdEZpbHRlck1hcHBpbmdUcmFuc2xhdG9yIikpOwotCSAgICByZXR1cm4gc3VpdGU7Ki8KLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoRGVmZWN0VmVyaWZpY2F0aW9uVGVzdHMuY2xhc3MpOyAKLQl9Ci0JCi0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlsdGVyTWFwcGluZ1RyYW5zbGF0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8qCQlBcmNoaXZlT3B0aW9ucyBvcHRpb25zID0gbmV3IEFyY2hpdmVPcHRpb25zKCk7Ci0JCW9wdGlvbnMuc2V0UmVuZGVyZXJUeXBlKEFyY2hpdmVPcHRpb25zLkRPTSk7Ci0JCWZpbmFsIFN0cmluZyBlYXJQYXRoID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAic2FtcGxlLmVhciI7Ci0JCUNvbW1vbmFyY2hpdmVQYWNrYWdlIHBrZyA9IENvbW1vbmFyY2hpdmVQYWNrYWdlLmVJTlNUQU5DRTsKLQkJRUFSRmlsZSBlYXJGaWxlID0gcGtnLmdldENvbW1vbmFyY2hpdmVGYWN0b3J5KCkub3BlbkVBUkZpbGUob3B0aW9ucywKLQkJCQllYXJQYXRoKTsKLQkJLy8gb3BlbiB0aGUgZWFyCi0JCVN5c3RlbS5vdXQucHJpbnRsbigib3BlbmluZyAiICsgYXJjaGl2ZSArICIgLi4uICIpOyovCi0JICAgIAotCSAgICBTdHJpbmcgYXJjaGl2ZSA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgIlFJRGVmZWN0c05ldy5lYXIiOwotCSAgICBTdHJpbmcgbmFtZSA9ICJRSURlZmVjdHMud2FyIjsKLQkJICAvKgotCQkgICAqIGNyYWNrIG9wZW4gdGhlIGVhciBmaWxlIHVzaW5nIHRoZSBjb21tb24gYXJjaGl2ZToKLQkJICAgKi8KLQkJICBDb21tb25hcmNoaXZlRmFjdG9yeSBhcmNoaXZlRmFjdG9yeSA9IChDb21tb25hcmNoaXZlRmFjdG9yeSkgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQkJICBBcmNoaXZlT3B0aW9ucyBvcHRpb25zID0gbmV3IEFyY2hpdmVPcHRpb25zKCk7Ci0JCSAgb3B0aW9ucy5zZXRSZW5kZXJlclR5cGUoQXJjaGl2ZU9wdGlvbnMuU0FYKTsKLQkJICBvcHRpb25zLnNldFVzZUphdmFSZWZsZWN0aW9uKGZhbHNlKTsKLQkJICAvLyAgIG9wdGlvbnMuc2V0RGlzY3JpbWluYXRlTmVzdGVkQXJjaGl2ZXMoZXh0cmFQcm9jZXNzaW5nKTsKLQkJICAJCQotCQkgIAkJRUFSRmlsZSBlYXJGaWxlID0gYXJjaGl2ZUZhY3Rvcnkub3BlbkVBUkZpbGUob3B0aW9ucywgYXJjaGl2ZSk7Ci0JCQkJV2ViTW9kdWxlUmVmIHdhckZpbGUgPSBudWxsOwotCQkJCWZvciAoSXRlcmF0b3IgaSA9IGVhckZpbGUuZ2V0TW9kdWxlUmVmcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCSAgICBNb2R1bGVSZWYgbXJlZiA9IChNb2R1bGVSZWYpIGkubmV4dCgpOwotCQkJCSAgICBpZiAobmFtZS5lcXVhbHMobXJlZi5nZXRVcmkoKSkpIHsgCi0JCQkJICAgICAgICB3YXJGaWxlID0gIChXZWJNb2R1bGVSZWYpIG1yZWY7Ci0JCQkJICAgIH0KLQkJCQl9Ci0gICAKLQkJCQlXZWJBcHAgZGQgPSAoV2ViQXBwKXdhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLSAgIAotCQkJCUVMaXN0IGZpbHRlck1hcHBpbmdzID0gZGQuZ2V0RmlsdGVyTWFwcGluZ3MoKTsKLQkJCQlhc3NlcnRUcnVlKCJUaGUgdGVzdCByZXF1aXJlcyB0d28gZmlsdGVyIG1hcHBpbmdzLiIsIGZpbHRlck1hcHBpbmdzLnNpemUoKSA9PSAyKTsgCi0JCQkJRmlsdGVyTWFwcGluZyBmaWx0ZXJNYXBwaW5nMSA9IChGaWx0ZXJNYXBwaW5nKWZpbHRlck1hcHBpbmdzLmdldCgwKTsKLQkJCQlhc3NlcnROb3ROdWxsKCJBIFVSTCBQYXR0ZXJuIHdhcyBub3QgZm91bmQgZm9yIGZpbHRlciB3aXRoIG5hbWUgIiArIGZpbHRlck1hcHBpbmcxLmdldEZpbHRlcigpLmdldE5hbWUoKSxmaWx0ZXJNYXBwaW5nMS5nZXRVcmxQYXR0ZXJuKCkpOwotCQkJCUZpbHRlck1hcHBpbmcgZmlsdGVyTWFwcGluZzIgPSAoRmlsdGVyTWFwcGluZylmaWx0ZXJNYXBwaW5ncy5nZXQoMSk7Ci0JCQkJYXNzZXJ0Tm90TnVsbCgiQSBTZXJ2bGV0IG5hbWUgd2FzIG5vdCBmb3VuZCBmb3IgZmlsdGVyIHdpdGggbmFtZSAiICsgZmlsdGVyTWFwcGluZzIuZ2V0RmlsdGVyKCkuZ2V0TmFtZSgpLGZpbHRlck1hcHBpbmcyLmdldFNlcnZsZXROYW1lKCkpOwotCQkJCWFzc2VydE5vdE51bGwoIkEgU2VydmxldCB3YXMgbm90IGZvdW5kIGZvciBmaWx0ZXIgd2l0aCBuYW1lICIgKyBmaWx0ZXJNYXBwaW5nMi5nZXRGaWx0ZXIoKS5nZXROYW1lKCksZmlsdGVyTWFwcGluZzIuZ2V0U2VydmxldCgpKTsKLQkJCQkgICAgICAKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Rm9ybWVyRGVmZWN0Mjk3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUFyY2hpdmVPcHRpb25zIG9wdGlvbnMgPSBuZXcgQXJjaGl2ZU9wdGlvbnMoKTsKLQkJb3B0aW9ucy5zZXRSZW5kZXJlclR5cGUoQXJjaGl2ZU9wdGlvbnMuRE9NKTsKLQkJZmluYWwgU3RyaW5nIGVhclBhdGggPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJzYW1wbGUuZWFyIjsKLQkJQ29tbW9uYXJjaGl2ZVBhY2thZ2UgcGtnID0gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZUlOU1RBTkNFOwotCQlFQVJGaWxlIGVhckZpbGUgPSBwa2cuZ2V0Q29tbW9uYXJjaGl2ZUZhY3RvcnkoKS5vcGVuRUFSRmlsZShvcHRpb25zLAotCQkJCWVhclBhdGgpOwotCQllYXJGaWxlLmV4dHJhY3ROb1Jlb3BlbihBcmNoaXZlLkVYUEFORF9BTEwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGb3JtZXJEZWZlY3QxNDU5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUFyY2hpdmVPcHRpb25zIG9wdGlvbnMgPSBuZXcgQXJjaGl2ZU9wdGlvbnMoKTsKLQkJb3B0aW9ucy5zZXRSZW5kZXJlclR5cGUoQXJjaGl2ZU9wdGlvbnMuRE9NKTsKLQkJQ29tbW9uYXJjaGl2ZVBhY2thZ2UgcGtnID0gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZUlOU1RBTkNFOwotCQlDb21tb25hcmNoaXZlRmFjdG9yeSBmYWN0b3J5ID0gcGtnLmdldENvbW1vbmFyY2hpdmVGYWN0b3J5KCk7Ci0KLQkJRUFSRmlsZSBlYXJGaWxlID0gZmFjdG9yeS5jcmVhdGVFQVJGaWxlSW5pdGlhbGl6ZWQob3B0aW9ucywgIlRlc3QuZWFyIik7Ci0JCWVhckZpbGUuc2F2ZUFzKCJDOlxcVGVzdC5lYXIiKTsKLQl9Ci0KLQkvKgotCSAqIHB1YmxpYyB2b2lkIHRlc3RDb3JydXB0ZWRFQVIoKSB0aHJvd3MgRXhjZXB0aW9uIHsgQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucyA9Ci0JICogbmV3IEFyY2hpdmVPcHRpb25zKCk7IG9wdGlvbnMuc2V0UmVuZGVyZXJUeXBlKEFyY2hpdmVPcHRpb25zLkRPTSk7IGZpbmFsCi0JICogU3RyaW5nIGVhclBhdGggPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJvY2NhbS5lYXIiOwotCSAqIENvbW1vbmFyY2hpdmVQYWNrYWdlIHBrZyA9IENvbW1vbmFyY2hpdmVQYWNrYWdlLmVJTlNUQU5DRTsKLQkgKiBDb21tb25hcmNoaXZlRmFjdG9yeSBmYWN0b3J5ID0gcGtnLmdldENvbW1vbmFyY2hpdmVGYWN0b3J5KCk7Ci0JICogCi0JICogRUFSRmlsZSBlYXJGaWxlID0gZmFjdG9yeS5vcGVuRUFSRmlsZShvcHRpb25zLCBlYXJQYXRoKTsKLQkgKiAKLQkgKiBMaXN0IGZpbGVzID0gZWFyRmlsZS5nZXRGaWxlcygpOwotCSAqIAotCSAqIGZvcihpbnQgaT0wOyBpIDxmaWxlcy5zaXplKCk7IGkrKykgeyBTeXN0ZW0uZXJyLnByaW50bG4oZmlsZXMuZ2V0KGkpKTsKLQkgKiByZWFkRmlsZSggKEZpbGUpIGZpbGVzLmdldChpKSk7IGlmKGZpbGVzLmdldChpKSBpbnN0YW5jZW9mIFdBUkZpbGUpIHsKLQkgKiBXQVJGaWxlIHdhciA9IChXQVJGaWxlKSBmaWxlcy5nZXQoaSk7IExpc3Qgd2FyRmlsZXMgPSB3YXIuZ2V0RmlsZXMoKTsKLQkgKiBmb3IoaW50IGo9MDsgaiA8d2FyRmlsZXMuc2l6ZSgpOyBqKyspIHsKLQkgKiBTeXN0ZW0uZXJyLnByaW50bG4od2FyRmlsZXMuZ2V0KGopKTsgcmVhZEZpbGUoKEZpbGUpd2FyRmlsZXMuZ2V0KGopKTsgfSB9IH0KLQkgKiBTeXN0ZW0ub3V0LnByaW50bG4oIkRvbmUiKTsgfQotCSAqLwotCi0JLyoqCi0JICogQHBhcmFtIGZpbGUKLQkgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVhZEZpbGUoRmlsZSBmaWxlKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCUlucHV0U3RyZWFtIGlzID0gZmlsZS5nZXRJbnB1dFN0cmVhbSgpOwotCQlaaXBJbnB1dFN0cmVhbSB6aXMgPSBuZXcgWmlwSW5wdXRTdHJlYW0oaXMpOwotCQl0cnkgewotCQkJd2hpbGUgKHppcy5nZXROZXh0RW50cnkoKSAhPSBudWxsKTsKLQotCQl9IGZpbmFsbHkgewotCQkJaWYgKGlzICE9IG51bGwpCi0JCQkJaXMuY2xvc2UoKTsKLQkJCWlmICh6aXMgIT0gbnVsbCkKLQkJCQl6aXMuY2xvc2UoKTsKLQkJCWlzID0gbnVsbDsKLQkJCXppcyA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2F2aW5nRUFSV2hpbGVEZXBsb3lpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCUFyY2hpdmVPcHRpb25zIG9wdGlvbnMgPSBuZXcgQXJjaGl2ZU9wdGlvbnMoKTsKLQkJCW9wdGlvbnMuc2V0UmVuZGVyZXJUeXBlKEFyY2hpdmVPcHRpb25zLlNBWCk7Ci0JCQlvcHRpb25zLnNldFVzZUphdmFSZWZsZWN0aW9uKHRydWUpOwotCQkJZmluYWwgU3RyaW5nIGVhclBhdGggPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeQotCQkJCQkrICJBdWN0aW9uQXBwLmVhciI7Ci0JCQlDb21tb25hcmNoaXZlUGFja2FnZSBwa2cgPSBDb21tb25hcmNoaXZlUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCQlFQVJGaWxlIGVhckZpbGUgPSBwa2cuZ2V0Q29tbW9uYXJjaGl2ZUZhY3RvcnkoKS5vcGVuRUFSRmlsZSgKLQkJCQkJb3B0aW9ucywgZWFyUGF0aCk7Ci0JCQlwcmludEZpbGVzKGVhckZpbGUpOwotCQkJZWFyRmlsZS5zYXZlKCk7Ci0KLQkJCWVhckZpbGUucmVvcGVuKCk7Ci0JCX0gY2F0Y2ggKFdyYXBwZWRFeGNlcHRpb24gd2UpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcih3ZSk7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3Iod2UuZ2V0TWVzc2FnZSgpKTsKLQkJCWlmICh3ZS5nZXRDYXVzZSgpICE9IG51bGwpCi0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKHdlLmdldENhdXNlKCkpOwotCQkJaWYgKHdlLmdldE5lc3RlZEV4Y2VwdGlvbigpICE9IG51bGwpCi0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKHdlLmdldE5lc3RlZEV4Y2VwdGlvbigpKTsKLQkJCWlmICh3ZS5nZXROZXN0ZWRFeGNlcHRpb24oKSAhPSBudWxsKQotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcih3ZS5nZXRDb25jYXRlbmF0ZWRNZXNzYWdlcygpKTsKLQkJCXRocm93IHdlOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENyZWF0aW5nRUFSRmlsZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCUNvbW1vbmFyY2hpdmVQYWNrYWdlIHBrZyA9IENvbW1vbmFyY2hpdmVQYWNrYWdlLmVJTlNUQU5DRTsKLQkJQ29tbW9uYXJjaGl2ZUZhY3RvcnkgZmFjdG9yeSA9IHBrZy5nZXRDb21tb25hcmNoaXZlRmFjdG9yeSgpOwotCQlmaW5hbCBTdHJpbmcgZWFyUGF0aCA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5Ci0JCQkJKyAiSW5pdGlhbGl6ZWRFQVIuZWFyIjsKLQotCQlBcmNoaXZlT3B0aW9ucyBvcHRpb25zID0gbmV3IEFyY2hpdmVPcHRpb25zKCk7Ci0JCW9wdGlvbnMuc2V0SXNSZWFkT25seSh0cnVlKTsKLQkJb3B0aW9ucy5zZXRSZW5kZXJlclR5cGUoQXJjaGl2ZU9wdGlvbnMuRE9NKTsKLQotCQkvLyBuZXcgZWFyIGZpbGUKLQkJRUFSRmlsZSBlYXJGaWxlID0gZmFjdG9yeS5jcmVhdGVFQVJGaWxlSW5pdGlhbGl6ZWQob3B0aW9ucywgZWFyUGF0aCk7Ci0KLQkJQXBwbGljYXRpb24gYXBwbCA9IGVhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXJ2aWNlUU5hbWVUcmFuc2xhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0JCQlBcmNoaXZlT3B0aW9ucyBvcHRpb25zID0gbmV3IEFyY2hpdmVPcHRpb25zKCk7Ci0JCQlvcHRpb25zLnNldFJlbmRlcmVyVHlwZShBcmNoaXZlT3B0aW9ucy5TQVgpOyAKLQkJCWZpbmFsIFN0cmluZyBlYXJQYXRoID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAiV1NTZWN1cmVkX0luc3VyYW5jZVNlcnZpY2VzX0VKQl9XUy5lYXIiOwotCQkJQ29tbW9uYXJjaGl2ZVBhY2thZ2UgcGtnID0gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZUlOU1RBTkNFOwotCQkJQ29tbW9uYXJjaGl2ZUZhY3RvcnkgZmFjdG9yeSA9IHBrZy5nZXRDb21tb25hcmNoaXZlRmFjdG9yeSgpOwotCQkJRUFSRmlsZSBlYXJGaWxlID0gZmFjdG9yeS5vcGVuRUFSRmlsZShvcHRpb25zLCBlYXJQYXRoKTsKLQkJCXByaW50RmlsZXMoZWFyRmlsZSk7Ci0JCQlTdHJpbmcgdG1wID0gIkM6XFx0ZW1wXFwiK1N5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJZWFyRmlsZS5leHRyYWN0VG8odG1wLCAwKTsgIAotCQkJCQotCQkJTGlzdCBlamJNb2R1bGVSZWZzID0gZWFyRmlsZS5nZXRFSkJNb2R1bGVSZWZzKCk7Ci0KLQkJCWZvcihpbnQgaT0wOyBpPGVqYk1vZHVsZVJlZnMuc2l6ZSgpOyBpKyspIHsKLQkJCQlFSkJNb2R1bGVSZWYgZWpibW9kcmVmID0gKEVKQk1vZHVsZVJlZikgZWpiTW9kdWxlUmVmcy5nZXQoaSk7Ci0JCQkJaWYoZWpibW9kcmVmLmdldFVyaSgpLmVxdWFscygiV1NJbnNTZXNzaW9uMjBFSkIuamFyIikpIHsKLQkJCQkJUmVzb3VyY2UgcmVzID0gZWpibW9kcmVmLmdldE1vZlJlc291cmNlKCJNRVRBLUlORi93ZWJzZXJ2aWNlc2NsaWVudC54bWwiKTsgCi0JCQkJCVN5c3RlbS5lcnIucHJpbnRsbihyZXMuZ2V0VVJJKCkpOwotCQkJCQkgCi0JCQkJfQotCQkJfQotCQkJLyoKLQkJCSAqIEFwcGxpY2F0aW9uIGFwcCA9IGVhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsgTGlzdCBtb2R1bGVzID0KLQkJCSAqIGFwcC5nZXRNb2R1bGVzKCk7IGZvcihpbnQgaT0wOyBpIDxtb2R1bGVzLnNpemUoKTsgaSsrKSB7Ci0JCQkgKiBTeXN0ZW0uZXJyLnByaW50bG4obW9kdWxlcy5nZXQoaSkpOyBNb2R1bGUKLQkJCSAqIG1vZD0oTW9kdWxlKW1vZHVsZXMuZ2V0KGkpOyBpZiggbW9kLmlzRWpiTW9kdWxlKCkgKSB7IEVqYk1vZHVsZQotCQkJICogZWpiTW9kdWxlID0gKEVqYk1vZHVsZSkgbW9kOyBFSkJKYXJGaWxlIGVqYkphckZpbGUgPQotCQkJICogZmFjdG9yeS5vcGVuRUpCSmFyRmlsZShvcHRpb25zLCAiV1NJbnNTZXNzaW9uMjBFSkIuamFyIik7IEVKQkphcgotCQkJICogZWpiamFyID0gZWpiSmFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOyB9Ci0JCQkgKiAgfQotCQkJICovCi0JCX0gY2F0Y2ggKFdyYXBwZWRFeGNlcHRpb24gd2UpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcih3ZSk7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3Iod2UuZ2V0TWVzc2FnZSgpKTsKLQkJCWlmKHdlLmdldENhdXNlKCkgIT0gbnVsbCkgCi0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKHdlLmdldENhdXNlKCkpOwotCQkJaWYod2UuZ2V0TmVzdGVkRXhjZXB0aW9uKCkgIT0gbnVsbCkKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3Iod2UuZ2V0TmVzdGVkRXhjZXB0aW9uKCkpOwotCQkJaWYod2UuZ2V0TmVzdGVkRXhjZXB0aW9uKCkgIT0gbnVsbCkKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3Iod2UuZ2V0Q29uY2F0ZW5hdGVkTWVzc2FnZXMoKSk7Ci0JCQl0aHJvdyB3ZTsKLQkJfSAgCi0gICAgfQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVhZENyaW1zb25DYXNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlBcmNoaXZlT3B0aW9ucyBvcHRpb25zID0gbmV3IEFyY2hpdmVPcHRpb25zKCk7Ci0JCQlvcHRpb25zLnNldFJlbmRlcmVyVHlwZShBcmNoaXZlT3B0aW9ucy5ET00pOyAKLQkJCWZpbmFsIFN0cmluZyBlYXJQYXRoID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkKLQkJCQkJKyAiZWpiX3NhbV9IZWxsby5lYXIiOwotCQkJQ29tbW9uYXJjaGl2ZVBhY2thZ2UgcGtnID0gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZUlOU1RBTkNFOwotCQkJRUFSRmlsZSBlYXJGaWxlID0gcGtnLmdldENvbW1vbmFyY2hpdmVGYWN0b3J5KCkub3BlbkVBUkZpbGUoCi0JCQkJCW9wdGlvbnMsIGVhclBhdGgpOwotCQkJQXBwbGljYXRpb24gYXBwID0gZWFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCQkJYXNzZXJ0Tm90TnVsbCgiQ291bGQgbm90IHJlYWQgZGVwbG95bWVudCBkZXNjcmlwdG9yLiIsIGFwcCk7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oIlxuXG4qKioqKioqKioqKioqKioqKipQcmludGluZyBmaWxlcyBmcm9tICIgKyBhcHAuZ2V0RGlzcGxheU5hbWUoKSk7Ci0JCQlhc3NlcnROb3ROdWxsKCJDb3VsZCBub3QgcmVhZCBkaXNwbGF5IG5hbWUgZnJvbSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuIiwgYXBwLmdldERpc3BsYXlOYW1lKCkpOwotCQkJcHJpbnRGaWxlcyhlYXJGaWxlKTsKLQkJCWVhckZpbGUuZXh0cmFjdFRvKEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInRlc3RPdXRwdXQvdGVtcCIsIDApOwotCQkJZWFyRmlsZS5yZW9wZW4oKTsKLQkJfSBjYXRjaCAoV3JhcHBlZEV4Y2VwdGlvbiB3ZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKHdlKTsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcih3ZS5nZXRNZXNzYWdlKCkpOwotCQkJaWYgKHdlLmdldENhdXNlKCkgIT0gbnVsbCkKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3Iod2UuZ2V0Q2F1c2UoKSk7Ci0JCQlpZiAod2UuZ2V0TmVzdGVkRXhjZXB0aW9uKCkgIT0gbnVsbCkKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3Iod2UuZ2V0TmVzdGVkRXhjZXB0aW9uKCkpOwotCQkJaWYgKHdlLmdldE5lc3RlZEV4Y2VwdGlvbigpICE9IG51bGwpCi0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKHdlLmdldENvbmNhdGVuYXRlZE1lc3NhZ2VzKCkpOwotCQkJdGhyb3cgd2U7Ci0JCX0KLQl9Ci0JCi0JLypwdWJsaWMgdm9pZCB0ZXN0UmVhZEluaXRQYXJtczEzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JICAgIHJlYWRJbml0UGFybXModHJ1ZSk7Ci0JfQotCXB1YmxpYyB2b2lkIHRlc3RSZWFkSW5pdFBhcm1zMTQoKSB0aHJvd3MgRXhjZXB0aW9uewotCSAgICByZWFkSW5pdFBhcm1zKGZhbHNlKTsKLQl9CSovCi0JCi0JLypwdWJsaWMgdm9pZCByZWFkSW5pdFBhcm1zKGJvb2xlYW4gaXMxMykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyeSB7IAotCQkgICAgU3lzdGVtLm91dC5wcmludGxuKCJVc2luZyBKMkVFICIgKyAoaXMxMz8iMS4zIiA6IjEuNCIpICk7Ci0JCQlBcmNoaXZlT3B0aW9ucyBvcHRpb25zID0gbmV3IEFyY2hpdmVPcHRpb25zKCk7Ci0JCQlvcHRpb25zLnNldFJlbmRlcmVyVHlwZShBcmNoaXZlT3B0aW9ucy5ET00pOyAKLQkJCWZpbmFsIFN0cmluZyBlYXJQYXRoID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkKLQkJCQkJKyAoKGlzMTMpID8gImZpbHRlcjEzd2FyLmVhciIgOiAgInNlcnZsZXRfanNfZmlsdGVyLmVhciIpOwotCQkJQ29tbW9uYXJjaGl2ZVBhY2thZ2UgcGtnID0gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZUlOU1RBTkNFOwotCQkJRUFSRmlsZSBlYXJGaWxlID0gcGtnLmdldENvbW1vbmFyY2hpdmVGYWN0b3J5KCkub3BlbkVBUkZpbGUoCi0JCQkJCW9wdGlvbnMsIGVhclBhdGgpOwotCQkJV0FSRmlsZSB3YXJGaWxlID0gKFdBUkZpbGUpIChpczEzID8gZWFyRmlsZS5nZXRGaWxlKCJGaWx0ZXJXYXIud2FyIikgOmVhckZpbGUuZ2V0RmlsZSgic2VydmxldF9qc19maWx0ZXJfd2ViLndhciIpKTsKLQkJCVdlYkFwcCB3ZWJhcHAgPSB3YXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7IAotCQkJYXNzZXJ0Tm90TnVsbCgiVGhlIHdlYiBhcHAgREQgY291bGQgbm90IGJlIGxvY2F0ZWQiLCB3ZWJhcHApOwotCQkJRUxpc3QgZmlsdGVycyA9IHdlYmFwcC5nZXRGaWx0ZXJzKCk7Ci0JCQlGaWx0ZXIgZiA9IG51bGw7Ci0JCQlFTGlzdCBwYXJtcywgcGFyYW1WYWx1ZXM7Ci0JCQlmb3IoaW50IGk9MDsgaTxmaWx0ZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQkgICAgZiA9IChGaWx0ZXIpIGZpbHRlcnMuZ2V0KGkpOwotCQkJICAgIFN5c3RlbS5vdXQucHJpbnRsbihmKTsKLQkJCSAgICBFTGlzdCBwYXJtcyA9IGYuZ2V0SW5pdFBhcmFtcygpOwotCQkJICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGhlcmUgYXJlICIgKyBwYXJtcy5zaXplKCkgKyAiIEluaXRQYXJhbXMiKTsKLQkJCSAgICBmb3IoaW50IGo9MDsgajxwYXJtcy5zaXplKCk7IGorKykgewotCQkJICAgICAgICBJbml0UGFyYW0gcCA9IChJbml0UGFyYW0pIHBhcm1zLmdldChqKTsKLQkJCSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHApOwotCQkJICAgIH0KLQkJCSAgICBFTGlzdCBwYXJhbVZhbHVlcyA9IGYuZ2V0SW5pdFBhcmFtVmFsdWVzKCk7Ci0JCQkgICAgU3lzdGVtLm91dC5wcmludGxuKCJUaGVyZSBhcmUgIiArIHBhcmFtVmFsdWVzLnNpemUoKSArICIgSW5pdFBhcmFtVmFsdWVzIik7Ci0JCQkgICAgZm9yKGludCBqPTA7IGo8cGFyYW1WYWx1ZXMuc2l6ZSgpOyBqKyspIHsKLQkJCSAgICAgICAgUGFyYW1WYWx1ZSBwID0gKFBhcmFtVmFsdWUpIHBhcmFtVmFsdWVzLmdldChqKTsKLQkJCSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHApOwotCQkJICAgIH0KLQkJCSAgICAKLQkJCSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRlbW8gdmVyc2lvbiBjYXNlIik7Ci0JCQkgICAgCi0JCQkgICAgCi0JCQkgICAgV2ViQXBwIGNvbnRhaW5lciA9IChXZWJBcHApIGYuZUNvbnRhaW5lcigpOwotCQkJICAgIHN3aXRjaChjb250YWluZXIuZ2V0SjJFRVZlcnNpb25JRCgpKSB7Ci0JCQkgICAgICAgIGNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQ6IAotCQkJICAgICAgICBjYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEOgotCi0JCQkJCSAgICBwYXJtcyA9IGYuZ2V0SW5pdFBhcmFtcygpOwotCQkJCQkgICAgU3lzdGVtLm91dC5wcmludGxuKCJUaGVyZSBhcmUgIiArIHBhcm1zLnNpemUoKSArICIgSW5pdFBhcmFtcyIpOwotCQkJCQkgICAgYXNzZXJ0RXF1YWxzKCJUaGVyZSBtdXN0IGJlIDIgRmlsdGVyIEluaXQgUGFyYW1zIiwgcGFybXMuc2l6ZSgpLCAyKTsKLQkJCQkJICAgIGZvcihpbnQgaj0wOyBqPHBhcm1zLnNpemUoKTsgaisrKSB7Ci0JCQkJCSAgICAgICAgSW5pdFBhcmFtIGlwID0gKEluaXRQYXJhbSkgcGFybXMuZ2V0KGopOwotCQkJCQkgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihwKTsKLQkJCQkJICAgICAgICBhc3NlcnRUcnVlKCJUaGUgcGFyYW0gbmFtZXMgbXVjaCBtYXRjaCIsICgicGFyYW0iK2orIm5hbWUiKS5lcXVhbHMoaXAuZ2V0UGFyYW1OYW1lKCkpKTsKLQkJCQkJICAgICAgICBhc3NlcnRUcnVlKCJUaGUgcGFyYW0gdmFsdWVzIG11Y2ggbWF0Y2giLCAoInBhcmFtIitqKyJ2YWx1ZSIpLmVxdWFscyhpcC5nZXRQYXJhbVZhbHVlKCkpKTsKLQkJCQkJICAgIH0KLQkJCQkJICAgIGJyZWFrOwotCQkJICAgICAgICBjYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEOiBkZWZhdWx0OiB7Ci0KLQkJCQkJICAgIHBhcmFtVmFsdWVzID0gZi5nZXRJbml0UGFyYW1WYWx1ZXMoKTsKLQkJCSAgICAgICAgCWFzc2VydEVxdWFscygiVGhlcmUgbXVzdCBiZSAxIEZpbHRlciBJbml0IFBhcmFtIFZhbHVlcyIsIHBhcmFtVmFsdWVzLnNpemUoKSwgMSk7Ci0JCQkJCSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRoZXJlIGFyZSAiICsgcGFyYW1WYWx1ZXMuc2l6ZSgpICsgIiBJbml0UGFyYW1WYWx1ZXMiKTsKLQkJCQkJICAgIAotCQkJCSAgICAgICAgUGFyYW1WYWx1ZSBwdiA9IChQYXJhbVZhbHVlKSBwYXJhbVZhbHVlcy5nZXQoMCk7IAotCQkJCSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHB2KTsgCi0JCQkJICAgICAgICBhc3NlcnRUcnVlKCJUaGUgcGFyYW0gbmFtZXMgbXVjaCBtYXRjaCIsICgiYXR0cmlidXRlIikuZXF1YWxzKHB2LmdldE5hbWUoKSkpOwotCQkJCSAgICAgICAgU3RyaW5nIGV4cGVjdGVkVmFsdWUgPSAoaSA9PSAwKSA/ICJjb20uc3VuLnRzLnRlc3RzLnNlcnZsZXQuYXBpLmphdmF4X3NlcnZsZXQuZmlsdGVyLkRvRmlsdGVyX0ZpbHRlci5TRVJWTEVUX01BUFBFRCIgOiAiY29tLnN1bi50cy50ZXN0cy5zZXJ2bGV0LmFwaS5qYXZheF9zZXJ2bGV0LmZpbHRlci5Jbml0RmlsdGVyX0ZpbHRlci5TRVJWTEVUX01BUFBFRCI7IAotCQkJCSAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaGUgcGFyYW0gdmFsdWVzIG11Y2ggbWF0Y2giLCBleHBlY3RlZFZhbHVlICwgcHYuZ2V0VmFsdWUoKSk7Ci0JCQkgICAgICAgIH0KLQkJCQkJICAgIGJyZWFrOwotCQkJICAgIH0KLQkJCX0KLQkJCQotCQkJICAgIAotCQl9IGNhdGNoIChXcmFwcGVkRXhjZXB0aW9uIHdlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3Iod2UpOwotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKHdlLmdldE1lc3NhZ2UoKSk7Ci0JCQlpZiAod2UuZ2V0Q2F1c2UoKSAhPSBudWxsKQotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcih3ZS5nZXRDYXVzZSgpKTsKLQkJCWlmICh3ZS5nZXROZXN0ZWRFeGNlcHRpb24oKSAhPSBudWxsKQotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcih3ZS5nZXROZXN0ZWRFeGNlcHRpb24oKSk7Ci0JCQlpZiAod2UuZ2V0TmVzdGVkRXhjZXB0aW9uKCkgIT0gbnVsbCkKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3Iod2UuZ2V0Q29uY2F0ZW5hdGVkTWVzc2FnZXMoKSk7Ci0JCQl0aHJvdyB3ZTsKLQkJfQotCX0qLwotCSAKLQkKLQlwcml2YXRlIHZvaWQgcHJpbnRGaWxlcyhDb250YWluZXIgYXIpIHsKLQkJTGlzdCBmaWxlcyA9IGFyLmdldEZpbGVzKCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5zaXplKCk7IGkrKykgewotCQkJU3lzdGVtLmVyci5wcmludGxuKGZpbGVzLmdldChpKSk7Ci0JCQlpZiAoZmlsZXMuZ2V0KGkpIGluc3RhbmNlb2YgQ29udGFpbmVyKSB7Ci0JCQkJQ29udGFpbmVyIHRhaW5lciA9IChDb250YWluZXIpIGZpbGVzLmdldChpKTsKLQkJCQlwcmludEZpbGVzKHRhaW5lcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvRGlzY3JpbWluYXRvclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9EaXNjcmltaW5hdG9yVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzQ3ODZkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9EaXNjcmltaW5hdG9yVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5HZW5lcmljQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMuYnZ0LkF1dG9tYXRlZEJWVDsKLQotCi0vKgotICogTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0gCi0gKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAxLCAyMDAyIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCi0gKiBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlIAotICogcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuIAotICovCi0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBEaXNjcmltaW5hdG9yVGVzdAotICAgICAgICBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyBib29sZWFuIGFzc2VydEJhckZpbGUgPSBmYWxzZTsKLQotICAgIHB1YmxpYyBEaXNjcmltaW5hdG9yVGVzdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoIkRpc2NyaW1pbmF0b3JUZXN0Iik7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QobmV3IERpc2NyaW1pbmF0b3JUZXN0KCJ0ZXN0RGlzY3JpbWluYXRvciIpKTsKLSAgICAgICAgcmV0dXJuIHN1aXRlOwotICAgIH0KLQotICAgIC8vIFRPRE8gSW1wbGVtZW50IHVuaXQgdGVzdCBmb3IgZGlzY3JpbWluYXRvciBmcmFtZXdvcmsKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzY3JpbWluYXRvcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRCYXJGaWxlID0gdHJ1ZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEFyY2hpdmVUeXBlRGlzY3JpbWluYXRvclJlZ2lzdHJ5LnJlZ2lzdG9yRGlzY3JpbWluYXRvcihuZXcgQmV2ZXJhZ2VBcmNoaXZlRGlzY3JpbWluYXRvcigpKTsKLSAgICAgICAgICAgIEFyY2hpdmUgYXJjaGl2ZSA9IENvbW1vbmFyY2hpdmVGYWN0b3J5LmVJTlNUQU5DRS5vcGVuQXJjaGl2ZSggQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyBGaWxlLnNlcGFyYXRvciArICJteS5iYXIiKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIlRoZSBhcmNoaXZlIHdhcyBub3QgZm91bmQhIiwgYXJjaGl2ZSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoIlRoZSBhcmNoaXZlIGV4dGVuc2lvbiAoLmJhcikgd2FzIG5vdCByZWNvZ25pemVkIGFzIGEgY3VzdG9tIGV4dGVuc2lvbiEiLCBhcmNoaXZlLmlzTmVzdGVkQXJjaGl2ZSgibXkuYmFyIikpOwotCi0gICAgICAgICAgICBib29sZWFuIHR5cGVDb250cmlidXRlZFN1Y2Nlc3NmdWxseSA9IGZhbHNlOwotICAgICAgICAgICAgRUxpc3QgdHlwZXMgPSBhcmNoaXZlLmdldFR5cGVzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHR5cGVzLmdldChpKS5lcXVhbHMoQmV2ZXJhZ2VBcmNoaXZlRGlzY3JpbWluYXRvci5CRVZFUkFHRV9BUkNISVZFX1RZUEVfS0VZKSkgewotICAgICAgICAgICAgICAgICAgICB0eXBlQ29udHJpYnV0ZWRTdWNjZXNzZnVsbHkgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJUaGUgQkVWRVJBR0VfQVJDSElWRV9UWVBFX0tFWSB3YXMgbm90IGZvdW5kIGluIHRoZSBsaXN0IG9mIHR5cGVzIG9mIHRoZSBhcmNoaXZlISIsIHR5cGVDb250cmlidXRlZFN1Y2Nlc3NmdWxseSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBhc3NlcnRCYXJGaWxlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgY2xhc3MgQmV2ZXJhZ2VBcmNoaXZlRGlzY3JpbWluYXRvcgotICAgICAgICAgICAgZXh0ZW5kcyBUZXN0Q2FzZSBpbXBsZW1lbnRzIEdlbmVyaWNBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgewotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJFVkVSQUdFX0FSQ0hJVkVfVFlQRV9LRVkgPSAiY29tLmlibS5iZXZlcmFnZS5hcmNoaXZlIjsKLQotICAgICAgICAvKgotICAgICAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAqIAotICAgICAgICAgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuR2VuZXJpY0FyY2hpdmVUeXBlRGlzY3JpbWluYXRvciNkaXNjcmltaW5hdGUoY29tLmlibS5ldG9vbHMuajJlZS5jb21tb25hcmNoaXZlY29yZS5BcmNoaXZlKQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gZGlzY3JpbWluYXRlKEFyY2hpdmUgYW5BcmNoaXZlKSB7Ci0gICAgICAgICAgICBib29sZWFuIHJlc3VsdCA9IGFuQXJjaGl2ZS5jb250YWluc0ZpbGUoIk1FVEEtSU5GL2FkdWx0LWJldmVyYWdlLWltYmliZW1lbnQtb3B0aW9ucy54bWwiKTsKLSAgICAgICAgICAgIGlmIChhc3NlcnRCYXJGaWxlKQotICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgQmV2ZXJhZ2VBcmNoaXZlRGlzY3JpbWluYXRvciBkaWQgbm90IHJlY29nbmlaZSB0aGUgZmlsZSEgKEVuc3VyZSBpdCBjb250YWlucyBhIGZpbGUgbmFtZWQgTUVUQS1JTkYvYWR1bHQtYmV2ZXJhZ2UtaW1iaWJlbWVudC12ZW51ZXMueG1sKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAqIAotICAgICAgICAgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuR2VuZXJpY0FyY2hpdmVUeXBlRGlzY3JpbWluYXRvciNnZXRDdXN0b21GaWxlRXh0ZW5zaW9ucygpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Q3VzdG9tRmlsZUV4dGVuc2lvbnMoKSB7Ci0KLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10geyAiYmFyIn07Ci0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIChub24tSmF2YWRvYykKLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgY29tLmlibS5ldG9vbHMuajJlZS5jb21tb25hcmNoaXZlY29yZS5HZW5lcmljQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yI2dldFR5cGVLZXkoKQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRUeXBlS2V5KCkgewotCi0gICAgICAgICAgICByZXR1cm4gQkVWRVJBR0VfQVJDSElWRV9UWVBFX0tFWTsKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvRG9tQ29tcGFyaXRvci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L0RvbUNvbXBhcml0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU0YzFlMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvRG9tQ29tcGFyaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg1ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAxNywgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIAotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkNoYXJhY3RlckRhdGE7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRGcmFnbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uUHJvY2Vzc2luZ0luc3RydWN0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyOwotCi0vKioKLSAqIFRIRSBNQVNURVIgQ09QWSBvZiB0aGlzIGNsYXNzIGlzIGluIGNvbS5pYm0uZXRvb2xzLmNvbW1vbnRlc3RzCi0gKiBQbGVhc2UgdXBkYXRlIHRoZSBjb3B5IGluIGNvbW1vbnRlc3RzIGFuZCB0aGVuIGNvcHkgdGhpcyBjbGFzcyB0bwotICogd2hlcmUgeW91IG5lZWQgaXQgaWYgeW91IGFyZSBsb29raW5nIGF0IGEgZGlmZmVyZW50IGNvcHkKLSAqIAotICogQGF1dGhvciBqc2hvbGwKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byAKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgRG9tQ29tcGFyaXRvciB7Ci0JcHJpdmF0ZSBzdGF0aWMgRW50aXR5UmVzb2x2ZXIgZW50aXR5UmVzb2x2ZXI7Ci0JcHJpdmF0ZSBzdGF0aWMgSGFzaFNldCBhdHRyaWJ1dGVMaXN0OwotLy8gVE9ETyByZXBsYWNlIHRoaXMgd2l0aCBub24geGVyY2VzCQotLy8gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcGFyZURvbXMoSW5wdXRTb3VyY2Ugc291cmNlMSwgSW5wdXRTb3VyY2Ugc291cmNlMiwgSGFzaFNldCBpZ25vcmFibGVBdHRzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vICAgIAlhdHRyaWJ1dGVMaXN0ID0gaWdub3JhYmxlQXR0czsKLS8vICAgIAlET01QYXJzZXIgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpOwotLy8gICAgCWlmIChlbnRpdHlSZXNvbHZlciA9PSBudWxsKSB7Ci0vLyAgICAgICAgIHBhcnNlci5zZXRFbnRpdHlSZXNvbHZlcihuZXcgRW50aXR5UmVzb2x2ZXIoKSB7Ci0vLwkgICAgICAgICAgICBwdWJsaWMgSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eShTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEpIHRocm93cyBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLS8vCSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLS8vCSAgICAgICAgICAgIH0KLS8vCQotLy8JICAgICAgICB9KTsKLS8vICAgIAl9IGVsc2UgewotLy8gICAgCQlwYXJzZXIuc2V0RW50aXR5UmVzb2x2ZXIoZW50aXR5UmVzb2x2ZXIpOwotLy8gICAgCX0KLS8vICAgICAgICBwYXJzZXIucGFyc2Uoc291cmNlMSk7Ci0vLyAgICAgICAgRG9jdW1lbnQgZG9jMSA9IHBhcnNlci5nZXREb2N1bWVudCgpOwotLy8gICAgICAgIHBhcnNlci5wYXJzZShzb3VyY2UyKTsKLS8vICAgICAgICBEb2N1bWVudCBkb2MyID0gcGFyc2VyLmdldERvY3VtZW50KCk7Ci0vLyAgICAgICAgcmV0dXJuIGNvbXBhcmVOb2Rlcyhkb2MxLCBkb2MyKTsKLS8vICAgIH0KLQotLy8JcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcGFyZURvbXMoSW5wdXRTb3VyY2Ugc291cmNlMSwgSW5wdXRTb3VyY2Ugc291cmNlMikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJcmV0dXJuIGNvbXBhcmVEb21zKHNvdXJjZTEsIHNvdXJjZTIsIG51bGwpOwotLy8JfQotCi0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb21wYXJlTm9kZXMoTm9kZSBub2RlMSwgTm9kZSBub2RlMikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNoZWNraW5nIEE6IiArIG5vZGUxKTsKLSAgICAgICAgLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY2hlY2tpbmcgQjoiICsgbm9kZTIpOwotICAgICAgICAvLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJub2RlVHlwZT0iICsgbm9kZTEuZ2V0Tm9kZVR5cGUoKSk7Ci0gICAgICAgIC8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImdldE5vZGVOYW1lPSIgKyBub2RlMS5nZXROb2RlTmFtZSgpKTsKLSAgICAgICAgLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZ2V0Tm9kZVZhbHVlPSIgKyBub2RlMS5nZXROb2RlVmFsdWUoKSk7Ci0KLSAgICAgICAgLy9HZW5lcmljIE5vZGUgVGVzdGluZyAKLSAgICAgICAgaWYgKG5vZGUxID09IG51bGwgJiYgbm9kZTIgPT0gbnVsbCkKLSAgICAgICAgCXJldHVybiBudWxsOyAKLSAgICAgICAgZWxzZSBpZiAoKG5vZGUxICE9IG51bGwgJiYgbm9kZTIgPT0gbnVsbCkgfHwgbm9kZTEgPT0gbnVsbCAmJiBub2RlMiAhPSBudWxsKQotICAgICAgICAJcmV0dXJuIG51bGxOb2RlRW5jb3VudGVyZWQobm9kZTEsIG5vZGUyKTsgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgZWxzZSBpZiAobm9kZTEuZ2V0Tm9kZVR5cGUoKSAhPSBub2RlMi5nZXROb2RlVHlwZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbWlzbWF0Y2goIk5vZGUuZ2V0Tm9kZVR5cGUoKSAiICsgbm9kZTEuZ2V0Tm9kZVR5cGUoKSArICIgIiArIG5vZGUyLmdldE5vZGVUeXBlKCksIG5vZGUxLCBub2RlMik7Ci0gICAgICAgIH0gZWxzZSBpZiAobm9kZTEuZ2V0Tm9kZU5hbWUoKSAhPSBub2RlMi5nZXROb2RlTmFtZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbWlzbWF0Y2goIk5vZGUuZ2V0Tm9kZU5hbWUoKSA8IiArIG5vZGUxLmdldE5vZGVOYW1lKCkgKyAiPiA8IiArIG5vZGUyLmdldE5vZGVOYW1lKCkgKyAiPiIsIG5vZGUxLCBub2RlMik7Ci0gICAgICAgIH0gZWxzZSBpZiAoIShub2RlMS5nZXROb2RlVmFsdWUoKSA9PSBudWxsICYmIG5vZGUyLmdldE5vZGVWYWx1ZSgpID09IG51bGwpKSB7Ci0gICAgICAgICAgICBpZiAobm9kZTEuZ2V0Tm9kZVZhbHVlKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtaXNtYXRjaCgiTm9kZS5nZXROb2RlVmFsdWUoKSBub2RlIEEgaXMgbnVsbCIsIG5vZGUxLCBub2RlMik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG5vZGUyLmdldE5vZGVWYWx1ZSgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbWlzbWF0Y2goIk5vZGUuZ2V0Tm9kZVZhbHVlKCkgbm9kZSBCIGlzIG51bGwiLCBub2RlMSwgbm9kZTIpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghbm9kZTEuZ2V0Tm9kZVZhbHVlKCkuZXF1YWxzKG5vZGUyLmdldE5vZGVWYWx1ZSgpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBtaXNtYXRjaCgiTm9kZS5nZXROb2RlVmFsdWUoKSA8IiArIG5vZGUxLmdldE5vZGVWYWx1ZSgpICsgIj4gPCIgKyBub2RlMi5nZXROb2RlVmFsdWUoKSArICI+Iiwgbm9kZTEsIG5vZGUyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChub2RlMS5oYXNBdHRyaWJ1dGVzKCkgIT0gbm9kZTIuaGFzQXR0cmlidXRlcygpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbWlzbWF0Y2goIk5vZGUuaGFzQXR0cmlidXRlcygpICIgKyBub2RlMS5oYXNBdHRyaWJ1dGVzKCkgKyAiICIgKyBub2RlMi5oYXNBdHRyaWJ1dGVzKCksIG5vZGUxLCBub2RlMik7Ci0gICAgICAgIH0gZWxzZSBpZiAobm9kZTEuaGFzQ2hpbGROb2RlcygpICE9IG5vZGUyLmhhc0NoaWxkTm9kZXMoKSkgewotICAgICAgICAgICAgcmV0dXJuIG1pc21hdGNoKCJOb2RlLmhhc0NoaWxkTm9kZXMoKSAiICsgbm9kZTEuaGFzQ2hpbGROb2RlcygpICsgIiAiICsgbm9kZTIuaGFzQ2hpbGROb2RlcygpLCBub2RlMSwgbm9kZTIpOwotICAgICAgICB9Ci0JCS8vVE9ETyBzdHJlbmd0aGVuIG5vZGUgY29tcGFyaXNvbnMgYXMgbmVjZXNzYXJ5Ci0gICAgICAgIC8vU3BlY2lhbGl6ZWQgTm9kZSBUZXN0aW5nCi0gICAgICAgIHN3aXRjaCAobm9kZTEuZ2V0Tm9kZVR5cGUoKSkgewotICAgICAgICAgICAgY2FzZSBOb2RlLlRFWFRfTk9ERSA6Ci0gICAgICAgICAgICBjYXNlIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFIDoKLSAgICAgICAgICAgICAgICBDaGFyYWN0ZXJEYXRhIGNkYXRhMSA9IChDaGFyYWN0ZXJEYXRhKSBub2RlMTsKLSAgICAgICAgICAgICAgICBDaGFyYWN0ZXJEYXRhIGNkYXRhMiA9IChDaGFyYWN0ZXJEYXRhKSBub2RlMjsKLSAgICAgICAgICAgICAgICBpZiAoIWNkYXRhMS5nZXREYXRhKCkuZXF1YWxzKGNkYXRhMi5nZXREYXRhKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtaXNtYXRjaCgiQ2hhcmFjdGVyRGF0YS5nZXREYXRhKCkgIiArIGNkYXRhMS5nZXREYXRhKCkgKyAiICIgKyBjZGF0YTIuZ2V0RGF0YSgpLCBub2RlMSwgbm9kZTIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTm9kZS5BVFRSSUJVVEVfTk9ERSA6Ci0gICAgICAgICAgICAgICAgQXR0ciBhdHRyMSA9IChBdHRyKSBub2RlMTsKLSAgICAgICAgICAgICAgICBBdHRyIGF0dHIyID0gKEF0dHIpIG5vZGUyOwotICAgICAgICAgICAgICAgIAlpZiAoIWF0dHIxLmdldE5hbWUoKS5lcXVhbHMoYXR0cjIuZ2V0TmFtZSgpKSkgewotCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1pc21hdGNoKCJBdHRyLmdldE5hbWUoKSAiICsgYXR0cjEuZ2V0TmFtZSgpICsgIiAiICsgYXR0cjIuZ2V0TmFtZSgpLCBub2RlMSwgbm9kZTIpOwotCSAgICAgICAgICAgICAgICB9IAotCSAgICAgICAgICAgICAgICBlbHNlIGlmKCBhdHRyaWJ1dGVMaXN0ICE9IG51bGwgJiYgIWF0dHJpYnV0ZUxpc3QuY29udGFpbnMoYXR0cjEuZ2V0TmFtZSgpKSAmJiAhYXR0cmlidXRlTGlzdC5jb250YWlucyhhdHRyMi5nZXROYW1lKCkpKSB7Ci0JCQkJCQlpZiAoIWF0dHIxLmdldFZhbHVlKCkuZXF1YWxzKGF0dHIyLmdldFZhbHVlKCkpKSB7Ci0JCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1pc21hdGNoKCJBdHRyLmdldFZhbHVlKCkgIiArIGF0dHIxLmdldFZhbHVlKCkgKyAiICIgKyBhdHRyMi5nZXRWYWx1ZSgpLCBub2RlMSwgbm9kZTIpOwotCQkgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhdHRyMS5nZXRTcGVjaWZpZWQoKSAhPSBhdHRyMi5nZXRTcGVjaWZpZWQoKSkgewotCQkgICAgICAgICAgICAgICAgICAgIHJldHVybiBtaXNtYXRjaCgiQXR0ci5nZXRTcGVjaWZpZWQoKSAiICsgYXR0cjEuZ2V0U3BlY2lmaWVkKCkgKyAiICIgKyBhdHRyMi5nZXRTcGVjaWZpZWQoKSwgbm9kZTEsIG5vZGUyKTsKLQkJICAgICAgICAgICAgICAgIH0KLQkgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBOb2RlLkRPQ1VNRU5UX05PREUgOgotICAgICAgICAgICAgCURvY3VtZW50IGRvYzEgPSAoRG9jdW1lbnQpbm9kZTE7Ci0JCQkJRG9jdW1lbnQgZG9jMiA9IChEb2N1bWVudClub2RlMjsKLQkJCQlTdHJpbmcgcmVzdWx0ID0gY29tcGFyZU5vZGVzKGRvYzEuZ2V0RG9jdHlwZSgpLCBkb2MyLmdldERvY3R5cGUoKSk7Ci0JCQkJaWYocmVzdWx0ICE9IG51bGwpewotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgTm9kZS5ET0NVTUVOVF9UWVBFX05PREU6Ci0JCQkJRG9jdW1lbnRUeXBlIGRvY1R5cGUxID0gKERvY3VtZW50VHlwZSlub2RlMTsKLQkJCQlEb2N1bWVudFR5cGUgZG9jVHlwZTIgPSAoRG9jdW1lbnRUeXBlKW5vZGUyOwotCQkJCWlmKCFkb2NUeXBlMS5nZXRQdWJsaWNJZCgpLmVxdWFscyhkb2NUeXBlMi5nZXRQdWJsaWNJZCgpKSl7Ci0JCQkJCXJldHVybiBtaXNtYXRjaCgiRG9jdW1lbnRUeXBlLmdldFB1YmxpY0lkKCkgIitkb2NUeXBlMS5nZXRQdWJsaWNJZCgpKyAiICIrZG9jVHlwZTIuZ2V0UHVibGljSWQoKSwgbm9kZTEsIG5vZGUyKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIDoKLSAgICAgICAgICAgIAlQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gcEluc3QxID0gKFByb2Nlc3NpbmdJbnN0cnVjdGlvbilub2RlMTsKLQkJCQlQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gcEluc3QyID0gKFByb2Nlc3NpbmdJbnN0cnVjdGlvbilub2RlMjsKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiUHJvY2Vzc2luZ0luc3RydWN0aW9uIHRvZG8iKTsKLSAgICAgICAgICAgIAlicmVhazsKLQkJCWNhc2UgTm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFIDoKLQkJCQlEb2N1bWVudEZyYWdtZW50IGZyYWcxID0gKERvY3VtZW50RnJhZ21lbnQpbm9kZTE7Ci0JCQkJRG9jdW1lbnRGcmFnbWVudCBmcmFnMiA9IChEb2N1bWVudEZyYWdtZW50KW5vZGUyOwotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJEb2N1bWVudEZyYWdtZW50IHRvZG8iKTsKLSAgICAgICAgICAgIAlicmVhazsKLQkJCQotCQkJY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6Ci0JCQljYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDoKLSAgICAgICAgICAgIGNhc2UgTm9kZS5FTlRJVFlfTk9ERSA6Ci0JCQljYXNlIE5vZGUuTk9UQVRJT05fTk9ERSA6Ci0JCQkJYnJlYWs7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIC8vUmVjdXJzaW9uCi0gICAgICAgIE5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzMSA9IG5vZGUxLmdldEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMyID0gbm9kZTIuZ2V0QXR0cmlidXRlcygpOwotCi0gICAgICAgIGlmIChhdHRyaWJ1dGVzMSAhPSBudWxsICYmIGF0dHJpYnV0ZXMyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVzMS5nZXRMZW5ndGgoKSAhPSBhdHRyaWJ1dGVzMi5nZXRMZW5ndGgoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBtaXNtYXRjaCgiZ2V0QXR0cmlidXRlcygpLmdldExlbmd0aCgpICIgKyBhdHRyaWJ1dGVzMS5nZXRMZW5ndGgoKSArICIgIiArIGF0dHJpYnV0ZXMyLmdldExlbmd0aCgpLCBub2RlMSwgbm9kZTIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzMS5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJQXR0ciBhdHRyMSA9IChBdHRyKSBhdHRyaWJ1dGVzMS5pdGVtKGkpOwotCQkJCUF0dHIgYXR0cjIgPSAoQXR0cikgYXR0cmlidXRlczIuaXRlbShpKTsKLQkJCQlpZighYXR0cjEuZ2V0TmFtZSgpLmVxdWFscyhhdHRyMi5nZXROYW1lKCkpKXsKLQkJCQkJcmV0dXJuIG1pc21hdGNoKCJBdHRyLmdldE5hbWUoKSAiICsgYXR0cjEuZ2V0TmFtZSgpICsgIiAiICsgYXR0cjIuZ2V0TmFtZSgpLCBhdHRyMSwgYXR0cjIpOwotCQkJCX0KLQkJCQlpZihhdHRyaWJ1dGVMaXN0ICE9IG51bGwgJiYgIWF0dHJpYnV0ZUxpc3QuY29udGFpbnMoYXR0cjEuZ2V0TmFtZSgpKSAmJiAhYXR0cmlidXRlTGlzdC5jb250YWlucyhhdHRyMi5nZXROYW1lKCkpKSB7Ci0JICAgICAgICAgICAgICAgIFN0cmluZyByZXN1bHRzID0gY29tcGFyZU5vZGVzKGF0dHIxLCBhdHRyMik7Ci0JICAgICAgICAgICAgICAgIGlmIChudWxsICE9IHJlc3VsdHMpIHsKLQkgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRzOwotCSAgICAgICAgICAgICAgICB9Ci0JCQkJfQotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gZWxzZSBpZiAoYXR0cmlidXRlczEgIT0gbnVsbCB8fCBhdHRyaWJ1dGVzMiAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbWlzbWF0Y2goImdldEF0dHJpYnV0ZXMoKSBudWxsIiwgbm9kZTEsIG5vZGUyKTsKLSAgICAgICAgfQotCi0gICAgICAgIE5vZGVMaXN0IGNoaWxkcmVuMSA9IG5vZGUxLmdldENoaWxkTm9kZXMoKTsKLSAgICAgICAgTm9kZUxpc3QgY2hpbGRyZW4yID0gbm9kZTIuZ2V0Q2hpbGROb2RlcygpOwotCi0gICAgICAgIC8vICAgICAgICBpZiAoY2hpbGRyZW4xLmdldExlbmd0aCgpICE9IGNoaWxkcmVuMi5nZXRMZW5ndGgoKSkgewotICAgICAgICAvLyAgICAgICAgICAgIHJldHVybiBtaXNtYXRjaCgiZ2V0Q2hpbGROb2RlcygpLmdldExlbmd0aCgpICIrY2hpbGRyZW4xLmdldExlbmd0aCgpKyIgIitjaGlsZHJlbjIuZ2V0TGVuZ3RoKCksIG5vZGUxLCBub2RlMik7Ci0gICAgICAgIC8vICAgICAgICB9Ci0KLSAgICAgICAgaW50IGNvdW50MSA9IDA7Ci0gICAgICAgIGludCBjb3VudDIgPSAwOwotCi0gICAgICAgIC8vY29tcGFyZSBhbGwgY2hpbGRyZW4sIHNraXBwaW5nIGVtcHR5IHRleHQgbm9kZXMKLSAgICAgICAgd2hpbGUgKGNvdW50MSA8IGNoaWxkcmVuMS5nZXRMZW5ndGgoKSAmJiBjb3VudDIgPCBjaGlsZHJlbjIuZ2V0TGVuZ3RoKCkpIHsKLSAgICAgICAgICAgIE5vZGUgY2hpbGQxID0gY2hpbGRyZW4xLml0ZW0oY291bnQxKTsKLSAgICAgICAgICAgIE5vZGUgY2hpbGQyID0gY2hpbGRyZW4yLml0ZW0oY291bnQyKTsKLSAgICAgICAgICAgIGlmIChjaGlsZDEuZ2V0Tm9kZVR5cGUoKSAhPSBjaGlsZDIuZ2V0Tm9kZVR5cGUoKSkgewotICAgICAgICAgICAgICAgIGlmIChjaGlsZDEuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSAmJiAoY2hpbGQxLmdldE5vZGVWYWx1ZSgpID09IG51bGwgfHwgY2hpbGQxLmdldE5vZGVWYWx1ZSgpLnRyaW0oKS5lcXVhbHMoIiIpKSkgewotICAgICAgICAgICAgICAgICAgICBjb3VudDErKzsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGlsZDIuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSAmJiAoY2hpbGQyLmdldE5vZGVWYWx1ZSgpICE9IG51bGwgfHwgY2hpbGQyLmdldE5vZGVWYWx1ZSgpLnRyaW0oKS5lcXVhbHMoIiIpKSkgewotICAgICAgICAgICAgICAgICAgICBjb3VudDIrKzsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY291bnQxKys7Ci0gICAgICAgICAgICBjb3VudDIrKzsKLSAgICAgICAgICAgIFN0cmluZyByZXN1bHRzID0gY29tcGFyZU5vZGVzKGNoaWxkMSwgY2hpbGQyKTsKLSAgICAgICAgICAgIGlmIChudWxsICE9IHJlc3VsdHMpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvL1RPRE8gdGhlcmUgbXVzdCBiZSBhIHdheSB0byB0ZWxsIHRoZSBwYXJzZXIgdG8gaWdub3JlIHdoaXRlc3BhY2UuCi0gICAgICAgIC8vYmUgc3VyZSBza2lwIGFueSBlbXB0eSB0ZXh0IG5vZGVzIGF0IHRoZSBlbmQKLSAgICAgICAgd2hpbGUgKGNvdW50MSA8IGNoaWxkcmVuMS5nZXRMZW5ndGgoKSkgewotICAgICAgICAgICAgTm9kZSBjaGlsZDEgPSBjaGlsZHJlbjEuaXRlbShjb3VudDEpOwotICAgICAgICAgICAgaWYgKGNoaWxkMS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFICYmIGNoaWxkMS5nZXROb2RlVmFsdWUoKSA9PSBudWxsIHx8IGNoaWxkMS5nZXROb2RlVmFsdWUoKS50cmltKCkuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgIGNvdW50MSsrOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5vZGVOb3RDb21wYXJlZChjaGlsZDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgd2hpbGUgKGNvdW50MiA8IGNoaWxkcmVuMi5nZXRMZW5ndGgoKSkgewotICAgICAgICAgICAgTm9kZSBjaGlsZDIgPSBjaGlsZHJlbjIuaXRlbShjb3VudDIpOwotICAgICAgICAgICAgaWYgKGNoaWxkMi5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFICYmIGNoaWxkMi5nZXROb2RlVmFsdWUoKSA9PSBudWxsIHx8IGNoaWxkMi5nZXROb2RlVmFsdWUoKS50cmltKCkuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgIGNvdW50MisrOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5vZGVOb3RDb21wYXJlZChjaGlsZDIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4xLmdldExlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgLy8gICAgICAgICAgICBOb2RlIGNoaWxkMSA9IGNoaWxkcmVuMS5pdGVtKGkpOwotICAgICAgICAvLyAgICAgICAgICAgIE5vZGUgY2hpbGQyID0gY2hpbGRyZW4yLml0ZW0oaSk7Ci0gICAgICAgIC8vICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbnVsbE5vZGVFbmNvdW50ZXJlZChOb2RlIG5vZGUxLCBOb2RlIG5vZGUyKSB7Ci0JCVN0cmluZyBtZXNzYWdlID0gIk51bGwgbm9kZSBlbmNvdW50ZXJlZCI7Ci0JCU5vZGUgbm9uTnVsbE5vZGUgPSBub2RlMSA9PSBudWxsID8gbm9kZTIgOiBub2RlMTsKLQkJY2hhciBzb3VyY2UgPSBub2RlMSA9PSBudWxsID8gJ0InIDogJ0EnOwotCQl3aGlsZSAobm9uTnVsbE5vZGUgIT0gbnVsbCkgewotCQkJbWVzc2FnZSArPSBzb3VyY2UgKyBub25OdWxsTm9kZS5nZXROb2RlTmFtZSgpICsgIlxuIjsKLQkJCW5vbk51bGxOb2RlID0gbm9uTnVsbE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQl9Ci0JCXJldHVybiBtZXNzYWdlOwotCi0JCQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5vZGVOb3RDb21wYXJlZChOb2RlIG5vZGUpIHsKLSAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiTm9kZSBub2RlIGNvbXBhcmVkOiI7Ci0gICAgICAgIHdoaWxlIChub2RlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1lc3NhZ2UgKz0gbm9kZS5nZXROb2RlTmFtZSgpICsgIlxuIjsKLSAgICAgICAgICAgIG5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtZXNzYWdlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIG1pc21hdGNoKFN0cmluZyBtaXNtYXRjaHR5cGUsIE5vZGUgbm9kZTEsIE5vZGUgbm9kZTIpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJOb2RlcyBBIGFuZCBCIGRvIG5vdCBtYXRjaCBiZWNhdXNlIG9mIG5vZGUuIiArIG1pc21hdGNodHlwZSArICJcbiI7Ci0gICAgICAgIHdoaWxlIChub2RlMSAhPSBudWxsICYmIG5vZGUyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1lc3NhZ2UgKz0gIkE6IiArIG5vZGUxLmdldE5vZGVOYW1lKCkgKyAiXG4iOwotICAgICAgICAgICAgbWVzc2FnZSArPSAiQjoiICsgbm9kZTIuZ2V0Tm9kZU5hbWUoKSArICJcbiI7Ci0gICAgICAgICAgICBub2RlMSA9IG5vZGUxLmdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgICAgIG5vZGUyID0gbm9kZTIuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1lc3NhZ2U7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgIH0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBFbnRpdHlSZXNvbHZlciBnZXRFbnRpdHlSZXNvbHZlcigpIHsKLQkJcmV0dXJuIGVudGl0eVJlc29sdmVyOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZXNvbHZlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRFbnRpdHlSZXNvbHZlcihFbnRpdHlSZXNvbHZlciByZXNvbHZlcikgewotCQllbnRpdHlSZXNvbHZlciA9IHJlc29sdmVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L0luaXRpYWxpemF0aW9uVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9Jbml0aWFsaXphdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NGM0ZjguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L0luaXRpYWxpemF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0OwotCi0gLyoKLSAqIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNCi0gKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAxIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUKLSAqIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLgotICovCi0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LnN3aW5ndWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFwcGxpY2F0aW9uQ2xpZW50RmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVKQkphckZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUpCTW9kdWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLldBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuV2ViTW9kdWxlUmVmOwotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDEyLzE4LzAwIDc6NDE6MzkgUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBJbml0aWFsaXphdGlvblRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMS4iOy8vJE5PTi1OTFMtMSQKLS8qKgotICogSW5pdGlhbGl6YXRpb25UZXN0cyBjb25zdHJ1Y3RvciBjb21tZW50LgotICogQHBhcmFtIG5hbWUgamF2YS5sYW5nLlN0cmluZwotICovCi1wdWJsaWMgSW5pdGlhbGl6YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotcHVibGljIENvbW1vbmFyY2hpdmVGYWN0b3J5IGdldEFyY2hpdmVGYWN0b3J5KCkgewotCXJldHVybiBDb21tb25hcmNoaXZlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uYXJjaGl2ZUZhY3RvcnkoKTsKLX0KLS8qKgotICogU3RhcnRzIHRoZSBhcHBsaWNhdGlvbi4KLSAqIEBwYXJhbSBhcmdzIGFuIGFycmF5IG9mIGNvbW1hbmQtbGluZSBhcmd1bWVudHMKLSAqLwotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oamF2YS5sYW5nLlN0cmluZ1tdIGFyZ3MpIHsKLQlTdHJpbmdbXSBjbGFzc05hbWUgPSB7ImNvbS5pYm0uZXRvb2xzLmFyY2hpdmUudGVzdC5Jbml0aWFsaXphdGlvblRlc3RzIiwgIi1ub2xvYWRpbmcifTsKLQlUZXN0UnVubmVyLm1haW4oY2xhc3NOYW1lKTsKLX0KLXB1YmxpYyBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3Qgc3VpdGUoKSB7Ci0JcmV0dXJuIG5ldyBUZXN0U3VpdGUoSW5pdGlhbGl6YXRpb25UZXN0cy5jbGFzcyk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0TmV3QXJjaGl2ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotLy8gICAgICAgIFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkucHV0KCIqIiwgbmV3IFhNSVJlc291cmNlRmFjdG9yeUltcGwoKSk7Ci0JQXBwbGljYXRpb25DbGllbnRGaWxlIGNsaWVudEZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUFwcGxpY2F0aW9uQ2xpZW50RmlsZUluaXRpYWxpemVkKCJmb28iKTsKLQlhc3NlcnRUcnVlKGNsaWVudEZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSAhPSBudWxsKTsKLQkKLQotCWNsaWVudEZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUFwcGxpY2F0aW9uQ2xpZW50RmlsZUluaXRpYWxpemVkKCJmb28iKTsKLQotCUVKQkphckZpbGUgZWpiSmFyRmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlRUpCSmFyRmlsZUluaXRpYWxpemVkKCJmb28iKTsKLQlhc3NlcnRUcnVlKGVqYkphckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSAhPSBudWxsKTsKLQkKLQkvL1RoZSBuZXh0IHBpZWNlIGlzIHRvIHZlcmlmeSBubyBleGNlcHRpb25zIG9jY3VyCi0JZWpiSmFyRmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlRUpCSmFyRmlsZUluaXRpYWxpemVkKCJmb28iKTsKLQlFSkJNb2R1bGVSZWYgZWpiTW9kdWxlUmVmID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVFSkJNb2R1bGVSZWYoKTsKLQllamJNb2R1bGVSZWYuc2V0TW9kdWxlRmlsZShlamJKYXJGaWxlKTsKLQkKLQotCUVBUkZpbGUgZWFyRmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlRUFSRmlsZUluaXRpYWxpemVkKCJmb28iKTsKLQkKLQlhc3NlcnRUcnVlKGVhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSAhPSBudWxsKTsKLQkKLQotCVdBUkZpbGUgd2FyRmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlV0FSRmlsZUluaXRpYWxpemVkKCJmb28iKTsKLQkKLQlhc3NlcnRUcnVlKHdhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSAhPSBudWxsKTsKLQkKLQotCXdhckZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZVdBUkZpbGVJbml0aWFsaXplZCgiZm9vIik7Ci0JV2ViTW9kdWxlUmVmIHdlYk1vZHVsZVJlZiA9IGdldEFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlV2ViTW9kdWxlUmVmKCk7Ci0Jd2ViTW9kdWxlUmVmLnNldE1vZHVsZUZpbGUod2FyRmlsZSk7Ci0JCi0KLX0KLQkKLQkKLQotCi0JCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvSmF2YVRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvSmF2YVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxMzNiZDguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L0phdmFUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLnRlc3Q7Ci0KLSAvKgotICogTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0KLSAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDEgLSBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZQotICogcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuCi0gKi8KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LnN3aW5ndWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVQYWNrYWdlOwotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDEvMTcvMjAwMSAxMDoxNzoyOSBBTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEphdmFUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDEuIjsvLyROT04tTkxTLTEkCi0vKioKLSAqIEphdmFUZXN0cyBjb25zdHJ1Y3RvciBjb21tZW50LgotICogQHBhcmFtIG5hbWUgamF2YS5sYW5nLlN0cmluZwotICovCi1wdWJsaWMgSmF2YVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci1wdWJsaWMgQ29tbW9uYXJjaGl2ZUZhY3RvcnkgZ2V0QXJjaGl2ZUZhY3RvcnkoKSB7Ci0JcmV0dXJuIENvbW1vbmFyY2hpdmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21tb25hcmNoaXZlRmFjdG9yeSgpOwotfQotLyoqCi0gKiBTdGFydHMgdGhlIGFwcGxpY2F0aW9uLgotICogQHBhcmFtIGFyZ3MgYW4gYXJyYXkgb2YgY29tbWFuZC1saW5lIGFyZ3VtZW50cwotICovCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihqYXZhLmxhbmcuU3RyaW5nW10gYXJncykgewotCVN0cmluZ1tdIGNsYXNzTmFtZSA9IHsiY29tLmlibS5ldG9vbHMuYXJjaGl2ZS50ZXN0LkphdmFUZXN0cyIsICItbm9sb2FkaW5nIn07Ci0JVGVzdFJ1bm5lci5tYWluKGNsYXNzTmFtZSk7Ci19Ci1wdWJsaWMgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0IHN1aXRlKCkgewotCXJldHVybiBuZXcgVGVzdFN1aXRlKEphdmFUZXN0cy5jbGFzcyk7Ci19Ci0vKioKLSAqIFRoaXMgbWV0aG9kIHZlcmlmaWVzIHRoYXQgamF2YSByZWZsZWN0aW9uIHdvcmtzIG9uIGFyY2hpdmVzLCBhbmQgdGhhdAotICogY2xhc3MgbG9hZGluZyBhbmQgamF2YSByZWZsZWN0aW9uIGlzIGR5bmFtaWMgd2l0aCBjaGFuZ2VzIHRvIHRoZSBjbGFzcwotICogcGF0aCBvZiB0aGUgYXJjaGl2ZQotICovCi1wdWJsaWMgdm9pZCB0ZXN0SmF2YVJlZmxlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8qCi0JQXJjaGl2ZSBhbkFyY2hpdmUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLnByaW1PcGVuQXJjaGl2ZSgiYmFuazM1ZGVwbG95ZWQuamFyIik7Ci0JSmF2YUNsYXNzIGNscyA9IChKYXZhQ2xhc3Mpb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuaW1wbC5KYXZhQ2xhc3NJbXBsLnJlZmxlY3QoImNvbS5pYm0uZWpiLmJhbmsuVmFwQWNjb3VudEJlYW4iLCBhbkFyY2hpdmUuZ2V0Q29udGV4dCgpKTsKLQkvL0lnbm9yZSB0aGUgY29uc3RydWN0b3IKLQlhc3NlcnRUcnVlKCJTaG91bGQgbm90IGhhdmUgYmVlbiBhYmxlIHRvIHJlZmxlY3QgbWV0aG9kcyIgLGNscy5nZXRNZXRob2RzKCkuc2l6ZSgpID09IDEgJiYgKChNZXRob2QpY2xzLmdldE1ldGhvZHMoKS5nZXQoMCkpLmdldE5hbWUoKS5lcXVhbHMoY2xzLmdldE5hbWUoKSkpOwotCi0JYW5BcmNoaXZlLnNldEV4dHJhQ2xhc3NwYXRoKCJpdmplamIzNS5qYXIiKTsKLQotCWFzc2VydFRydWUoIk1ldGhvZHMgc2hvdWxkIGhhdmUgYmVlbiByZWZsZWN0ZWQiLCBjbHMuZ2V0TWV0aG9kcygpLnNpemUoKSA+IDEpOwotKi8JCi19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvTG9vc2VBcmNoaXZlVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9Mb29zZUFyY2hpdmVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmViMzdhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9Mb29zZUFyY2hpdmVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0OwotCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQuc3dpbmd1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLk1vZHVsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVJbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuUnVudGltZUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuQXJjaGl2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VBcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUNvbmZpZ1JlZ2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUxpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VXQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlY29uZmlnRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZWNvbmZpZ1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5idnQuQXV0b21hdGVkQlZUOwotCi0KLXB1YmxpYyBjbGFzcyBMb29zZUFyY2hpdmVUZXN0cyBleHRlbmRzIEFic3RyYWN0QXJjaGl2ZVRlc3QgewotCi0JLyoqIFRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5ICovCi0JcHJvdGVjdGVkIFN0cmluZyBjd2Q7Ci0JcHJvdGVjdGVkIFVSSSBsb29zZUNvbmZpZ0xvYzsKLQlwcm90ZWN0ZWQgVVJJIGxvb3NlQXBwTG9jOwotCXByb3RlY3RlZCBTdHJpbmcgbG9vc2VNb2R1bGVXb3Jrc3BhY2U7Ci0JcHJvdGVjdGVkIFN0cmluZyBsb29zZUVBUlVyaTsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfSkFSX1VSSSA9ICJMb29zZUVBUkVqYi5qYXIiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFdBUl9VUkkgPSAiTG9vc2VFQVJXZWIud2FyIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVVElMX0pBUl9VUkkgPSAidXRpbC5qYXIiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQkxJQl9VUkkgPSAiV0VCLUlORi9saWIvbGlicmFyeS5qYXIiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQkxJQl9GVUxMX1VSSSA9ICJXRUItSU5GL2xpYi9saWJyYXJ5LmphciI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VUUFVUX0VBUl9GSUxFX1VSSSA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsidGVzdE91dHB1dC9Mb29zZUFyY2hpdmVUZXN0cy9Mb29zZUFwcC5lYXIiOwotCXByb3RlY3RlZCBzdGF0aWMgY2hhciBzZXAgPSBqYXZhLmlvLkZpbGUuc2VwYXJhdG9yQ2hhcjsKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTG9vc2VBcmNoaXZlVGVzdHMuCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgTG9vc2VBcmNoaXZlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RMb29zZUNvbmZpZ0NyZWF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVJlc291cmNlIHJlc291cmNlID0gUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRGYWN0b3J5KGxvb3NlQ29uZmlnTG9jKS5jcmVhdGVSZXNvdXJjZShsb29zZUNvbmZpZ0xvYyk7Ci0JCXJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKGNyZWF0ZUxvb3NlQ29uZmlnKCkpOwotCQlyZXNvdXJjZS5zYXZlKG5ldyBqYXZhLnV0aWwuSGFzaE1hcCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdExvb3NlQXBwQ3JlYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5LklOU1RBTkNFLmdldEZhY3RvcnkobG9vc2VBcHBMb2MpLmNyZWF0ZVJlc291cmNlKGxvb3NlQXBwTG9jKTsKLQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoY3JlYXRlTG9vc2VBcHBsaWNhdGlvbigpKTsKLQkJcmVzb3VyY2Uuc2F2ZShuZXcgamF2YS51dGlsLkhhc2hNYXAoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RMb29zZUNvbmZpZ09wZW5BbmRTYXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN5c3RlbS5zZXRQcm9wZXJ0eShMb29zZUNvbmZpZ1JlZ2lzdGVyLkxPT1NFX0NPTkZJR19QUk9QRVJUWSwgbG9vc2VDb25maWdMb2MudG9TdHJpbmcoKSk7Ci0JCUVBUkZpbGUgZWFyID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuRUFSRmlsZShsb29zZUVBUlVyaSk7Ci0JCXZlcmlmeShlYXIpOwotCQkvL3ByaW50Q2xhc3NwYXRocyhlYXIpOwotCQllYXIuc2F2ZUFzKE9VVFBVVF9FQVJfRklMRV9VUkkpOwotCQllYXIuY2xvc2UoKTsKLQkJZWFyID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuRUFSRmlsZShPVVRQVVRfRUFSX0ZJTEVfVVJJKTsKLQkJdmVyaWZ5KGVhcik7Ci0JCWVhci5jbG9zZSgpOwotCQkJCi0JfQotCQotCi0JCi0JcHVibGljIHZvaWQgdGVzdExvb3NlQ29uZmlnVW5pbW9kZU9wZW5BbmRTYXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN5c3RlbS5zZXRQcm9wZXJ0eShMb29zZUNvbmZpZ1JlZ2lzdGVyLkxPT1NFX0NPTkZJR19QUk9QRVJUWSwgIiIpOwotCi0JCUxvb3NlQ29uZmlnUmVnaXN0ZXIuc2luZ2xldG9uKCkuYWRkTG9vc2VNYXBwaW5nKGxvb3NlRUFSVXJpLCBsb29zZUFwcExvYy50b1N0cmluZygpKTsKLQkJRUFSRmlsZSBlYXIgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5FQVJGaWxlKGxvb3NlRUFSVXJpKTsKLQkJdmVyaWZ5KGVhcik7Ci0JCS8vcHJpbnRDbGFzc3BhdGhzKGVhcik7Ci0JCWVhci5zYXZlQXMoT1VUUFVUX0VBUl9GSUxFX1VSSSk7Ci0JCWVhci5jbG9zZSgpOyAKLQotCQllYXIgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5FQVJGaWxlKE9VVFBVVF9FQVJfRklMRV9VUkkpOwotCQl2ZXJpZnkoZWFyKTsKLQkJZWFyLmNsb3NlKCk7Ci0JCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdExvb3NlQ29uZmlnT3BlbkFuZFJlT3BlbigpIHRocm93cyBFeGNlcHRpb24gewotCQlTeXN0ZW0uc2V0UHJvcGVydHkoTG9vc2VDb25maWdSZWdpc3Rlci5MT09TRV9DT05GSUdfUFJPUEVSVFksIGxvb3NlQ29uZmlnTG9jLnRvU3RyaW5nKCkpOwotCQlFQVJGaWxlIGVhciA9IGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbkVBUkZpbGUobG9vc2VFQVJVcmkpOwotCQllYXIuY2xvc2UoKTsKLQkJZWFyLnJlb3BlbigpOwotCQlMaXN0IGphcnMgPSBlYXIuZ2V0QXJjaGl2ZUZpbGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgamFycy5zaXplKCk7IGkrKykgewotCQkJQXJjaGl2ZSBhcmNoaXZlID0gKEFyY2hpdmUpIGphcnMuZ2V0KGkpOwotCQkJYXJjaGl2ZS5jbG9zZSgpOwotCQkJYXJjaGl2ZS5yZW9wZW4oZWFyKTsKLQkJfQotCQllYXIuY2xvc2UoKTsKLQkJCQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZlcmlmeShFQVJGaWxlIGVhcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXZlcmlmeU1vZHVsZXMoZWFyKTsKLQkJdmVyaWZ5TW9kdWxlUmVmcyhlYXIpOwotCQl2ZXJpZnlVdGlsQW5kTGliKGVhcik7Ci0JfQotCi0JLyoqCi0JICogQW5vdGhlciBsZXZlbCBvZiB2ZXJpZmljYXRpb24gdGhhdCBmb3IgZWFjaCBtb2R1bGUsIHRoZSBtb2R1bGUgZmlsZXMgZXhpc3RzCi0JICogYW5kIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgY2FuIGJlIHJlYWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlNb2R1bGVSZWZzKEVBUkZpbGUgZWFyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTGlzdCBtb2R1bGVSZWZzID0gZWFyLmdldE1vZHVsZVJlZnMoKTsKLQkJaW50IHNpemUgPSBtb2R1bGVSZWZzLnNpemUoKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgbW9kdWxlcyIsIDIsIHNpemUpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJTW9kdWxlUmVmIHJlZiA9IChNb2R1bGVSZWYpIG1vZHVsZVJlZnMuZ2V0KGkpOwotCQkJYXNzZXJ0Tm90TnVsbCgiTW9kdWxlUmVmIHNob3VsZCBoYXZlIGEgbW9kdWxlIGZpbGU6IityZWYuZ2V0TW9kdWxlKCkuZ2V0VXJpKCksIHJlZi5nZXRNb2R1bGVGaWxlKCkpOwotCQkJYXNzZXJ0Tm90TnVsbCgiRGVwbG95bWVudCBkZXNjcmlwdG9yIHNob3VsZCBub3QgYmUgbnVsbCIsIHJlZi5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpKTsJCi0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVmVyaWZ5IHRoYXQgdGhlIHV0aWwgamFyIGluIHRoZSBlYXIgYW5kIHRoZSBsaWJyYXJ5IGluIHRoZSB3YXIgZXhpc3QgYW5kIGFyZSBub3QgZW1wdHkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlVdGlsQW5kTGliKEVBUkZpbGUgZWFyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdmVyaWZ5SkFSKGVhciwgVVRJTF9KQVJfVVJJKTsKLQkJdmVyaWZ5SkFSKChBcmNoaXZlKWVhci5nZXRGaWxlKFdBUl9VUkkpLCBXRUJMSUJfRlVMTF9VUkkpOwotCQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlKQVIoQXJjaGl2ZSBwYXJlbnQsIFN0cmluZyB1cmkpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKCJTaG91bGQgY29udGFpbiBKQVI6ICIrdXJpLCBwYXJlbnQuY29udGFpbnNGaWxlKHVyaSkpOwotCQlBcmNoaXZlIGphciA9IChBcmNoaXZlKXBhcmVudC5nZXRGaWxlKHVyaSk7Ci0JCS8vYXQgbGVhc2Ugb25lIGZpbGUgcGx1cyB0aGUgbWFuaWZlc3QKLQkJYXNzZXJ0VHJ1ZSgiSkFSIHNob3VsZCBjb250YWluIGEgY2xhc3MgZmlsZTogIit1cmksIGNvbnRhaW5zQ2xhc3NGaWxlKGphcikpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb250YWluc0NsYXNzRmlsZShBcmNoaXZlIGphcikgewotCQlMaXN0IGZpbGVzID0gamFyLmdldEZpbGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCUZpbGUgYUZpbGUgPSAoRmlsZSkgZmlsZXMuZ2V0KGkpOwotCQkJaWYgKGFGaWxlLmdldFVSSSgpLmVuZHNXaXRoKCIuY2xhc3MiKSk7Ci0JCQkJcmV0dXJuIHRydWU7CQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogTWFrZSBzdXJlIHtAbGluayBDb250YWluZXIjY29udGFpbnNGaWxlKFN0cmluZykgd29ya3MgZm9yIGxvb3NlIG1vZHVsZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCB2ZXJpZnlNb2R1bGVzKEVBUkZpbGUgZWFyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTGlzdCBtb2R1bGVzID0gZWFyLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0TW9kdWxlcygpOwotCQlpbnQgc2l6ZSA9IG1vZHVsZXMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZHVsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCU1vZHVsZSBtID0gKE1vZHVsZSkgbW9kdWxlcy5nZXQoaSk7Ci0JCQlhc3NlcnRUcnVlKCJFQVIgZmlsZSBzaG91bGQgY29udGFpbiBtb2R1bGUgZmlsZTogIittLmdldFVyaSgpLCBlYXIuY29udGFpbnNGaWxlKG0uZ2V0VXJpKCkpKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiBtb2R1bGVzIiwgMiwgc2l6ZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbW9kdWxlcy5zaXplKCk7IGkrKykgewotCQkJTW9kdWxlIG0gPSAoTW9kdWxlKSBtb2R1bGVzLmdldChpKTsKLQkJCWFzc2VydFRydWUoIkVBUiBmaWxlIHNob3VsZCBjb250YWluIG1vZHVsZSBmaWxlOiAiK20uZ2V0VXJpKCksIGVhci5jb250YWluc0ZpbGUobS5nZXRVcmkoKSkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBMb29zZUNvbmZpZ3VyYXRpb24gY3JlYXRlTG9vc2VDb25maWcoKSB7Ci0JCUxvb3NlQ29uZmlndXJhdGlvbiBjb25maWcgPSBsb29zZUNvbmZpZ0ZhY3RvcnkoKS5jcmVhdGVMb29zZUNvbmZpZ3VyYXRpb24oKTsKLQkJY29uZmlnLmdldEFwcGxpY2F0aW9ucygpLmFkZChjcmVhdGVMb29zZUFwcGxpY2F0aW9uKCkpOwotCQlyZXR1cm4gY29uZmlnOwotCX0KLQkKLQlwcm90ZWN0ZWQgTG9vc2VBcHBsaWNhdGlvbiBjcmVhdGVMb29zZUFwcGxpY2F0aW9uKCkgewotCQlMb29zZUFwcGxpY2F0aW9uIGFwcCA9IGxvb3NlQ29uZmlnRmFjdG9yeSgpLmNyZWF0ZUxvb3NlQXBwbGljYXRpb24oKTsKLQkJYXBwLnNldFVyaShsb29zZUVBUlVyaSk7Ci0JCWFwcC5zZXRSZXNvdXJjZXNQYXRoKGxvb3NlRUFSVXJpKTsKLQkJYXBwLnNldEJpbmFyaWVzUGF0aChsb29zZUVBUlVyaSk7Ci0JCUxpc3QgbG9vc2VBcmNoaXZlcyA9IGFwcC5nZXRMb29zZUFyY2hpdmVzKCk7Ci0JCWxvb3NlQXJjaGl2ZXMuYWRkKGNyZWF0ZUxvb3NlRUpCKCkpOwotCQlsb29zZUFyY2hpdmVzLmFkZChjcmVhdGVMb29zZVdFQigpKTsKLQkJbG9vc2VBcmNoaXZlcy5hZGQoY3JlYXRlTG9vc2VVdGlsKCkpOwotCQlyZXR1cm4gYXBwOwotCX0KLQkKLQlwcm90ZWN0ZWQgTG9vc2VNb2R1bGUgY3JlYXRlTG9vc2VFSkIoKSB7Ci0JCUxvb3NlTW9kdWxlIG1vZCA9IGxvb3NlQ29uZmlnRmFjdG9yeSgpLmNyZWF0ZUxvb3NlTW9kdWxlKCk7Ci0JCW1vZC5zZXRVcmkoRUpCX0pBUl9VUkkpOwotCQlTdHJpbmcgYWJzUGF0aCA9IGxvb3NlTW9kdWxlV29ya3NwYWNlK3NlcCsiTG9vc2VFQVJFamIiK3NlcCsiYmluIjsKLQkJbW9kLnNldEJpbmFyaWVzUGF0aChhYnNQYXRoKTsKLQkJbW9kLnNldFJlc291cmNlc1BhdGgoYWJzUGF0aCk7Ci0JCXJldHVybiBtb2Q7Ci0JfQotCQotCXByb3RlY3RlZCBMb29zZU1vZHVsZSBjcmVhdGVMb29zZVdFQigpIHsKLQkJTG9vc2VXQVJGaWxlIG1vZCA9IGxvb3NlQ29uZmlnRmFjdG9yeSgpLmNyZWF0ZUxvb3NlV0FSRmlsZSgpOwotCQltb2Quc2V0VXJpKFdBUl9VUkkpOwotCQlTdHJpbmcgYWJzUGF0aCA9IGxvb3NlTW9kdWxlV29ya3NwYWNlK3NlcCsiTG9vc2VFQVJXZWIiK3NlcCsid2ViQXBwbGljYXRpb24iOwotCQltb2Quc2V0QmluYXJpZXNQYXRoKGFic1BhdGgpOwotCQltb2Quc2V0UmVzb3VyY2VzUGF0aChhYnNQYXRoKTsKLQkJbW9kLmdldExvb3NlTGlicygpLmFkZChjcmVhdGVMb29zZVdlYkxpYigpKTsKLQkJcmV0dXJuIG1vZDsKLQl9Ci0JCi0JcHJvdGVjdGVkIExvb3NlTGlicmFyeSBjcmVhdGVMb29zZVV0aWwoKSB7Ci0JCUxvb3NlTGlicmFyeSBsaWIgPSBsb29zZUNvbmZpZ0ZhY3RvcnkoKS5jcmVhdGVMb29zZUxpYnJhcnkoKTsKLQkJbGliLnNldFVyaShVVElMX0pBUl9VUkkpOwotCQlTdHJpbmcgYWJzUGF0aCA9IGxvb3NlTW9kdWxlV29ya3NwYWNlK3NlcCsiTG9vc2VKYXZhVXRpbCIrc2VwKyJiaW4iOwotCQlsaWIuc2V0QmluYXJpZXNQYXRoKGFic1BhdGgpOwotCQlsaWIuc2V0UmVzb3VyY2VzUGF0aChhYnNQYXRoKTsKLQkJcmV0dXJuIGxpYjsKLQl9Ci0JCi0JcHJvdGVjdGVkIExvb3NlTGlicmFyeSBjcmVhdGVMb29zZVdlYkxpYigpIHsKLQkJTG9vc2VMaWJyYXJ5IGxpYiA9IGxvb3NlQ29uZmlnRmFjdG9yeSgpLmNyZWF0ZUxvb3NlTGlicmFyeSgpOwotCQlsaWIuc2V0VXJpKFdFQkxJQl9VUkkpOwotCQlTdHJpbmcgYWJzUGF0aCA9IGxvb3NlTW9kdWxlV29ya3NwYWNlK3NlcCsiTG9vc2VKYXZhV2ViTGliIitzZXArImJpbiI7Ci0JCWxpYi5zZXRCaW5hcmllc1BhdGgoYWJzUGF0aCk7Ci0JCWxpYi5zZXRSZXNvdXJjZXNQYXRoKGFic1BhdGgpOwotCQlyZXR1cm4gbGliOwotCX0KLQkKLQlwcm90ZWN0ZWQgTG9vc2Vjb25maWdGYWN0b3J5IGxvb3NlQ29uZmlnRmFjdG9yeSgpIHsKLQkJcmV0dXJuIExvb3NlY29uZmlnUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9vc2Vjb25maWdGYWN0b3J5KCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHByaW50Q2xhc3NwYXRocyhFQVJGaWxlIGVhcikgewotCQlMaXN0IGFyY2hpdmVzID0gZWFyLmdldEFyY2hpdmVGaWxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyY2hpdmVzLnNpemUoKTsgaSsrKSB7Ci0JCQlBcmNoaXZlIGFyY2hpdmUgPSAoQXJjaGl2ZSkgYXJjaGl2ZXMuZ2V0KGkpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMb2NhbCBydW50aW1lIGNsYXNzcGF0aCBmb3I6ICIrYXJjaGl2ZS5nZXRVUkkoKSk7Ci0JCQlSdW50aW1lQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzID0gYXJjaGl2ZS5nZXRMb2NhbFJ1bnRpbWVDbGFzc1BhdGgoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgZW50cmllcy5sZW5ndGg7IGorKykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihlbnRyaWVzW2pdKTsKLQkJCX0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRnVsbCBydW50aW1lIGNsYXNzcGF0aCBmb3I6ICIrYXJjaGl2ZS5nZXRVUkkoKSk7Ci0JCQllbnRyaWVzID0gYXJjaGl2ZS5nZXRGdWxsUnVudGltZUNsYXNzUGF0aCgpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBlbnRyaWVzLmxlbmd0aDsgaisrKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGVudHJpZXNbal0pOwotCQkJfQotCQl9Ci0JfQotCQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlTdHJpbmdbXSBjbGFzc05hbWUgPSB7ICJjb20uaWJtLmV0b29scy5hcmNoaXZlLnRlc3QuTG9vc2VBcmNoaXZlVGVzdHMiLCAiLW5vbG9hZGluZyIgfTsKLQkJVGVzdFJ1bm5lci5tYWluKGNsYXNzTmFtZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCJMb29zZUFyY2hpdmVUZXN0cyIpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBMb29zZUFyY2hpdmVUZXN0cygidGVzdExvb3NlQ29uZmlnQ3JlYXRpb24iKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IExvb3NlQXJjaGl2ZVRlc3RzKCJ0ZXN0TG9vc2VBcHBDcmVhdGlvbiIpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgTG9vc2VBcmNoaXZlVGVzdHMoInRlc3RMb29zZUNvbmZpZ09wZW5BbmRTYXZlIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBMb29zZUFyY2hpdmVUZXN0cygidGVzdExvb3NlQ29uZmlnT3BlbkFuZFJlT3BlbiIpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgTG9vc2VBcmNoaXZlVGVzdHMoInRlc3RMb29zZUNvbmZpZ1VuaW1vZGVPcGVuQW5kU2F2ZSIpKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQkJLyoKLQkJICogQHNlZSBUZXN0Q2FzZSNzZXRVcCgpCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQkJc3VwZXIuc2V0VXAoKTsKLQkJCUFyY2hpdmVJbml0LmluaXQoKTsKLQkJCUxvb3NlQ29uZmlnUmVnaXN0ZXIuc2luZ2xldG9uKCkuZmx1c2goKTsKLQkJCWN3ZCA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5OwotCQkJbG9vc2VNb2R1bGVXb3Jrc3BhY2UgPSBjd2QrImxvb3NlX21vZHVsZV93b3Jrc3BhY2UiOwotCQkJbG9vc2VDb25maWdMb2MgPSBVUkkuY3JlYXRlRmlsZVVSSShsb29zZU1vZHVsZVdvcmtzcGFjZStzZXArIi5tZXRhZGF0YSIrc2VwKyIucGx1Z2lucyIrc2VwKyJjb20uaWJtLmV0b29scy5qMmVlIitzZXArImxvb3NlQ29uZmlnLnhtaSIpOwotCQkJbG9vc2VBcHBMb2MgPSBVUkkuY3JlYXRlRmlsZVVSSShsb29zZU1vZHVsZVdvcmtzcGFjZStzZXArIi5tZXRhZGF0YSIrc2VwKyIucGx1Z2lucyIrc2VwKyJjb20uaWJtLmV0b29scy5qMmVlIitzZXArImxvb3NlQXBwLnhtaSIpOwotCQkJbG9vc2VFQVJVcmkgPSBBcmNoaXZlVXRpbC5nZXRPU1VyaShsb29zZU1vZHVsZVdvcmtzcGFjZStzZXArIkxvb3NlRUFSIik7Ci0JCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L1JhckZpbGVUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L1JhckZpbGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTM1OGQyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9SYXJGaWxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUudGVzdDsKLQotLyoKLSogTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0KLSogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMSAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUKLSogcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuCi0qLwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC5zd2luZ3VpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLlJBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5idnQuQXV0b21hdGVkQlZUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BdXRoZW50aWNhdGlvbk1lY2hhbmlzbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29uZmlnUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuUmVzb3VyY2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5TZWN1cml0eVBlcm1pc3Npb247Ci0KLS8qKgotICogVGVzdHMgZm9yIHZlcmZpY2F0aW9uIHRoYXQgUkFSIHN1cHBvcnQgd29ya3MgY29ycmVjdGx5IGluIFdDQ00uCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTIvMTEvMDAgMTA6MjY6MTEgQU0pCi0gKiBAYXV0aG9yOiBKYXJlZCBKdXJraWV3aWN6LCBldCBhbC4KLSAqLwotcHVibGljIGNsYXNzIFJhckZpbGVUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDEuIjsgLy8kTk9OLU5MUy0xJAotICAgIC8qKgotICAgICAqIFNpbXBsZVRlc3RzIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gICAgICogQHBhcmFtIG5hbWUgamF2YS5sYW5nLlN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBSYXJGaWxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotICAgIHB1YmxpYyBDb21tb25hcmNoaXZlRmFjdG9yeSBnZXRBcmNoaXZlRmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIENvbW1vbmFyY2hpdmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21tb25hcmNoaXZlRmFjdG9yeSgpOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBTdGFydHMgdGhlIGFwcGxpY2F0aW9uLgotICAgICAqIEBwYXJhbSBhcmdzIGFuIGFycmF5IG9mIGNvbW1hbmQtbGluZSBhcmd1bWVudHMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihqYXZhLmxhbmcuU3RyaW5nW10gYXJncykgewotICAgICAgICBTdHJpbmdbXSBjbGFzc05hbWUgPSB7ICJjb20uaWJtLmV0b29scy5hcmNoaXZlLnRlc3QuUmFyRmlsZVRlc3RzIiwgIi1ub2xvYWRpbmciIH07Ci0gICAgICAgIFRlc3RSdW5uZXIubWFpbihjbGFzc05hbWUpOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBwcmludFJBUlRvQ29uc29sZShDb25uZWN0b3IgY29ubmVjdG9yKSB7Ci0gICAgICAgIFJlc291cmNlQWRhcHRlciByYSA9IGNvbm5lY3Rvci5nZXRSZXNvdXJjZUFkYXB0ZXIoKTsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJlc291cmNlQWRhcHRlciBmcm9tIFhNTCBEZXBsb3ltZW50IERlc2NyaXB0b3IiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihjb25uZWN0b3IuZ2V0RGlzcGxheU5hbWUoKSArICI6ICIgKyBjb25uZWN0b3IuZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVmVuZG9yIDogIiArIGNvbm5lY3Rvci5nZXRWZW5kb3JOYW1lKCkpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlZlcnNpb24gOiAiICsgY29ubmVjdG9yLmdldFZlcnNpb24oKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3BlYyBWZXJzaW9uIDogIiArIGNvbm5lY3Rvci5nZXRTcGVjVmVyc2lvbigpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFSVMgVHlwZSA6ICIgKyBjb25uZWN0b3IuZ2V0RWlzVHlwZSgpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSZWF1dGhlbnRpY2F0aW9uIFN1cHBvcnQgOiAiICsgcmEuaXNSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUcmFuc2FjdGlvbiBTdXBwb3J0IDogIiArIHJhLmdldFRyYW5zYWN0aW9uU3VwcG9ydCgpLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpKTsKLQotICAgICAgICBpZiAoY29ubmVjdG9yLmdldExpY2Vuc2UoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkxpY2Vuc2UgUmVxdWlyZWQgOiAiICsgY29ubmVjdG9yLmdldExpY2Vuc2UoKS5pc1JlcXVpcmVkKCkpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJMaWNlbnNlIERlc2NyaXB0aW9uIDogIiArIGNvbm5lY3Rvci5nZXRMaWNlbnNlKCkuZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNtYWxsIEljb24gOiAiICsgY29ubmVjdG9yLmdldFNtYWxsSWNvbigpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJMYXJnZSBJY29uIDogIiArIGNvbm5lY3Rvci5nZXRMYXJnZUljb24oKSk7Ci0KLSAgICAgICAgTGlzdCBhdXRoTWVjaHMgPSByYS5nZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdXRoTWVjaHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtIGF1dGggPSAoQXV0aGVudGljYXRpb25NZWNoYW5pc20pIGF1dGhNZWNocy5nZXQoaSk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuQXV0aGVudGljYXRpb24gTWVjaGFuaXNtOiIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJEZXNjcmlwdGlvbiA6ICIgKyBhdXRoLmdldERlc2NyaXB0aW9uKCkpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUeXBlIDogIiArIGF1dGguZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKCkuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDcmVkZW50aWFsIEludGVyZmFjZSA6ICIgKyBhdXRoLmdldENyZWRlbnRpYWxJbnRlcmZhY2UoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcblJlZ2lzdGVyZWQgY2xhc3NlczoiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcdCIgKyByYS5nZXRDb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcygpICsgIiBpbXBsZW1lbnRzICIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQiICsgcmEuZ2V0Q29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UoKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXHQiICsgcmEuZ2V0Q29ubmVjdGlvbkltcGxDbGFzcygpICsgIiBpbXBsZW1lbnRzICIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQiICsgcmEuZ2V0Q29ubmVjdGlvbkludGVyZmFjZSgpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcdE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeTogIiArIHJhLmdldE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzKCkpOwotCi0gICAgICAgIExpc3QgY29uZmlncyA9IHJhLmdldENvbmZpZ1Byb3BlcnRpZXMoKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcbkNvbmZpZy1wcm9wZXJ0aWVzOiIpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ3Muc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIENvbmZpZ1Byb3BlcnR5IHByb3AgPSAoQ29uZmlnUHJvcGVydHkpIGNvbmZpZ3MuZ2V0KGkpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcdENvbmZpZy1wcm9wZXJ0eSA6ICIgKyBwcm9wLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlx0VHlwZSA6ICIgKyBwcm9wLmdldFR5cGUoKSArICIgLyBWYWx1ZSA6ICIgKyBwcm9wLmdldFZhbHVlKCkpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcdERlc2NyaXB0aW9uIDogIiArIHByb3AuZ2V0RGVzY3JpcHRpb24oKSArICJcbiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdCBzZWNzID0gcmEuZ2V0U2VjdXJpdHlQZXJtaXNzaW9ucygpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuU2VjdXJpdHktUGVybWlzc2lvbnM6Iik7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2Vjcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgU2VjdXJpdHlQZXJtaXNzaW9uIHByb3AgPSAoU2VjdXJpdHlQZXJtaXNzaW9uKSBzZWNzLmdldChpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXHRDb25maWctRGVzY3JpcHRpb24gOiAiICsgcHJvcC5nZXREZXNjcmlwdGlvbigpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXHRTcGVjaWZpY2F0aW9uIDogIiArIHByb3AuZ2V0U3BlY2lmaWNhdGlvbigpICsgIlxuIik7Ci0gICAgICAgIH0KLQotICAgIH0KLSAgICBwdWJsaWMgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShSYXJGaWxlVGVzdHMuY2xhc3MpOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0YWRkQ29weU1vZHVsZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIFN0cmluZyBpbiA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInNhbXBsZS5yYXIiOwotICAgICAgICBSQVJGaWxlIHJhckZpbGUgPSAoUkFSRmlsZSkgZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuQXJjaGl2ZShpbik7Ci0KLSAgICAgICAgcmFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCi0gICAgICAgIEVBUkZpbGUgbmV3RWFyRmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlRUFSRmlsZUluaXRpYWxpemVkKEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInRlc3RPdXRwdXQvQ29weVRlc3RzL25ld0VhcldpdGhSYXJDb3BpZWRNb2R1bGUuZWFyIik7Ci0KLSAgICAgICAgbmV3RWFyRmlsZS5hZGRDb3B5KHJhckZpbGUpOwotICAgICAgICBSQVJGaWxlIGNvcGllZCA9IChSQVJGaWxlKSBuZXdFYXJGaWxlLmdldE1vZHVsZUZpbGVzKCkuZ2V0KDApOwotICAgICAgICBhc3NlcnRUcnVlKGNvcGllZC5pc0RlcGxveW1lbnREZXNjcmlwdG9yU2V0KCkpOwotICAgICAgICBhc3NlcnRUcnVlKGNvcGllZC5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpID09IGNvcGllZC5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCkuZ2V0Q29udGVudHMoKS5nZXQoMCkpOwotICAgICAgICBhc3NlcnRUcnVlKGNvcGllZC5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpICE9IHJhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmFyRmlsZS5nZXRGaWxlcygpLnNpemUoKSA9PSBjb3BpZWQuZ2V0RmlsZXMoKS5zaXplKCkpOwotCi0gICAgICAgIG5ld0VhckZpbGUuc2F2ZU5vUmVvcGVuKCk7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHRlc3RleHBhbmRSYXJNb2R1bGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBTdHJpbmcgaW4gPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJzYW1wbGUucmFyIjsKLSAgICAgICAgUkFSRmlsZSByYXJGaWxlID0gKFJBUkZpbGUpIGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbkFyY2hpdmUoaW4pOwotICAgICAgICByYXJGaWxlLnNldFVSSSgic2FtcGxlLnJhciIpOwotCi0gICAgICAgIHJhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQotICAgICAgICBFQVJGaWxlIG5ld0VhckZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUVBUkZpbGVJbml0aWFsaXplZChBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJ0ZXN0T3V0cHV0L1JhclRlc3RzL25ld0VhcldpdGhSYXJNb2R1bGUuZWFyIik7Ci0gICAgICAgIG5ld0VhckZpbGUuYWRkQ29weShyYXJGaWxlKTsKLQotICAgICAgICBuZXdFYXJGaWxlLnNhdmVOb1Jlb3BlbigpOwotCi0gICAgICAgIFN0cmluZyBvdXQgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJ0ZXN0T3V0cHV0L1JhclRlc3RzL1Jhci1jb250YWluaW5nLWVhci1vdXQuZWFyIjsKLSAgICAgICAgbmV3RWFyRmlsZS5leHRyYWN0VG8ob3V0LCBBcmNoaXZlLkVYUEFORF9SQVJfRklMRVMpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBWZXJ5IGJhc2ljIG1ldGhvZCB0byBvcGVuIGFuIGFyY2hpdmUgYW5kIHNhdmUgaXQgYXMgYSBkaXJlY3RvcnkgdG8gYSBuZXcgZGVzdGluYXRpb24uICBSZXF1aXJlcyB2aXN1YWwgaW5zcGVjdGlvbgotICAgICAqIGZvciB2ZXJpZmljYXRpb24uICBOZXN0ZWQgd2FycyBhbmQgZWpiIGphcnMgd2lsbCBiZSBleHBsb2RlZCBidXQgb3RoZXIgbmVzdGVkIGphcnMgd2lsbCBub3QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T3BlbkFuZEV4dHJhY3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBTdHJpbmcgaW4gPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJzYW1wbGUucmFyIjsKLSAgICAgICAgUkFSRmlsZSByYXJGaWxlID0gKFJBUkZpbGUpIGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbkFyY2hpdmUoaW4pOwotICAgICAgICBTdHJpbmcgb3V0ID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAidGVzdE91dHB1dC9FeHBsb2RlZF9SQVJfRGlyLyI7Ci0gICAgICAgIHJhckZpbGUuZXh0cmFjdFRvQ29ubmVjdG9yRGlyZWN0b3J5KG91dCwgQXJjaGl2ZS5FWFBBTkRfQUxMKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogT3BlbnMgYW4gZWFyIGZpbGUsIGFuZCBmb3IgZWFjaCBtb2R1bGUsIHdyaXRlcyBpdCdzIGRkIGNvbXBvbmVudHMgdG8gdGhlIGNvbnNvbGUuICBSZXF1aXJlcyB2aXN1YWwgaW5zcGVjdGlvbgotICAgICAqIGZvciB2ZXJpZmljYXRpb24KLSAgICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RPcGVuQW5kUmVhZCgpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIFN0cmluZyBpbiA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInNhbXBsZS5yYXIiOwotICAgICAgICBSQVJGaWxlIHJhckZpbGUgPSAoUkFSRmlsZSkgZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuQXJjaGl2ZShpbik7Ci0KLQkJQ29ubmVjdG9yIGRkID0gcmFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCQkvL3ByaW50UkFSVG9Db25zb2xlKGRkKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdG9wZW5SYXJFYXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRUFSRmlsZSBlYXJGaWxlID0gKEVBUkZpbGUpIGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbkFyY2hpdmUoQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAidGVzdHJhci5lYXIiKTsKLQkJYXNzZXJ0VHJ1ZShlYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0Rmlyc3RNb2R1bGUoInNhbXBsZS5yYXIiKSAhPSBudWxsKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNhdmVSYXJFYXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGluID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAic2FtcGxlLnJhciI7Ci0JCVJBUkZpbGUgcmFyRmlsZSA9IChSQVJGaWxlKSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5BcmNoaXZlKGluKTsKLQkJcmFyRmlsZS5zZXRVUkkoInNhbXBsZS5yYXIiKTsKLQotICAgICAgICByYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0KLSAgICAgICAgRUFSRmlsZSBuZXdFYXJGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVFQVJGaWxlSW5pdGlhbGl6ZWQoQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAidGVzdE91dHB1dC9SYXJUZXN0cy9uZXdFYXJXaXRoUmFyTW9kdWxlX3NhdmVkLmVhciIpOwotICAgICAgICBuZXdFYXJGaWxlLmFkZENvcHkocmFyRmlsZSk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiTW9kdWxlIHdhc24ndCBmb3VuZCEiLCBuZXdFYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0Rmlyc3RNb2R1bGUoInNhbXBsZS5yYXIiKSk7Ci0KLSAgICAgICAgbmV3RWFyRmlsZS5zYXZlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEoyQ2F1dGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGluID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAic2FtcGxlLnJhciI7Ci0gICAgICAgIFJBUkZpbGUgcmFyRmlsZSA9IChSQVJGaWxlKSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5BcmNoaXZlKGluKTsKLQotICAgICAgICBDb25uZWN0b3IgZGQgPSByYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0KLSAgICAgICAgUmVzb3VyY2VBZGFwdGVyIHJkID0gZGQuZ2V0UmVzb3VyY2VBZGFwdGVyKCk7Ci0KLSAgICAgICAgRUxpc3QgbXlBdXRoTGlzdCA9IHJkLmdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcygpOwotLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTnVtYmVyIG9mIGF1dGggbWVjaGFuaXNtcyBpczogIiArIG15QXV0aExpc3Quc2l6ZSgpKTsKLS8vICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG15QXV0aExpc3Quc2l6ZSgpOyBpKyspIHsKLS8vICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBdXRoIHR5cGUgaXM6ICIgKyAoKEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKSBteUF1dGhMaXN0LmdldChpKSkuZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKCkpOwotLy8gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkF1dGggdHlwZSBpczogIiArICgoQXV0aGVudGljYXRpb25NZWNoYW5pc20pIG15QXV0aExpc3QuZ2V0KGkpKS5nZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUoKS5nZXROYW1lKCkpOwotLy8gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9SZXNvdXJjZVRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvUmVzb3VyY2VUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWNhNTEwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9SZXNvdXJjZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDEzLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLnRlc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC5zd2luZ3VpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVqYlJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcHBsaWNhdGlvbkNsaWVudEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FSkJKYXJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZUluaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5idnQuQXV0b21hdGVkQlZUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLQotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byAKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VUZXN0cyBleHRlbmRzIEFic3RyYWN0QXJjaGl2ZVRlc3QgewotCi0JLyoqCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogU3RhcnRzIHRoZSBhcHBsaWNhdGlvbi4KLQkgKiBAcGFyYW0gYXJncyBhbiBhcnJheSBvZiBjb21tYW5kLWxpbmUgYXJndW1lbnRzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oamF2YS5sYW5nLlN0cmluZ1tdIGFyZ3MpIHsKLQkJU3RyaW5nW10gY2xhc3NOYW1lID0geyJjb20uaWJtLmV0b29scy5hcmNoaXZlLnRlc3QuUmVzb3VyY2VUZXN0cyIsICItbm9sb2FkaW5nIn07Ci0JCVRlc3RSdW5uZXIubWFpbihjbGFzc05hbWUpOwotCX0KLQlwdWJsaWMgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShSZXNvdXJjZVRlc3RzLmNsYXNzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBmaW5kT2NjdXJyZW5jZXMoTGlzdCByZXNvdXJjZXMsIFN0cmluZyB1cmkpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KDEpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5zaXplKCk7IGkrKykgewotCQkJUmVzb3VyY2UgYVJlc291cmNlID0gKFJlc291cmNlKSByZXNvdXJjZXMuZ2V0KGkpOwotCQkJaWYgKHVyaS5lcXVhbHMoYVJlc291cmNlLmdldFVSSSgpLnRvU3RyaW5nKCkpKQotCQkJCXJlc3VsdC5hZGQoYVJlc291cmNlKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZUNyZWF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB1cmkgPSAiTUVUQS1JTkYvY2xpZW50LXJlc291cmNlLnhtaSI7Ci0JCUFwcGxpY2F0aW9uQ2xpZW50RmlsZSBhcHBDbGllbnRGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVBcHBsaWNhdGlvbkNsaWVudEZpbGVJbml0aWFsaXplZCgidGVzdC5qYXIiKTsKLQkJUmVzb3VyY2UgcmVzID0gbnVsbDsKLQkJYm9vbGVhbiBleGNlcHRpb25DYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXJlcyA9IGFwcENsaWVudEZpbGUuZ2V0TW9mUmVzb3VyY2UodXJpKTsKLQkJfSBjYXRjaCAoamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJZXhjZXB0aW9uQ2F1Z2h0ID0gdHJ1ZTsKLQkJCUxpc3QgZm91bmRSZXNvdXJjZXMgPSBmaW5kT2NjdXJyZW5jZXMoYXBwQ2xpZW50RmlsZS5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLCB1cmkpOwotCQkJYXNzZXJ0VHJ1ZSgiVGhlcmUgc2hvdWxkIGV4aXN0IGV4YWN0bHkgb25lIHJlc291cmNlIiwgZm91bmRSZXNvdXJjZXMuc2l6ZSgpID09IDEpOwotCQkJUmVzb3VyY2UgZm91bmRSZXNvdXJjZSA9IChSZXNvdXJjZSlmb3VuZFJlc291cmNlcy5nZXQoMCk7Ci0JCQlhc3NlcnRGYWxzZSgiVGhlIHJlc291cmNlIHNob3VsZCBiZSB1bmxvYWRlZCIsIGZvdW5kUmVzb3VyY2UuaXNMb2FkZWQoKSk7Ci0JCQlyZXMgPSBhcHBDbGllbnRGaWxlLm1ha2VNb2ZSZXNvdXJjZSh1cmkpOwotCQkJYXNzZXJ0VHJ1ZSgiUmVzb3VyY2Ugc2hvdWxkIG5vdCBiZSBudWxsIiwgcmVzICE9IG51bGwpOwotCQkJZm91bmRSZXNvdXJjZXMgPSBmaW5kT2NjdXJyZW5jZXMoYXBwQ2xpZW50RmlsZS5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLCB1cmkpOwotCQkJYXNzZXJ0VHJ1ZSgiVGhlcmUgc2hvdWxkIGV4aXN0IGV4YWN0bHkgb25lIHJlc291cmNlIiwgZm91bmRSZXNvdXJjZXMuc2l6ZSgpID09IDEpOwotCQkJZm91bmRSZXNvdXJjZSA9IChSZXNvdXJjZSlmb3VuZFJlc291cmNlcy5nZXQoMCk7Ci0JCQlhc3NlcnRUcnVlKCJUaGUgcmVzb3VyY2Ugc2hvdWxkIGV4aXN0IiwgZm91bmRSZXNvdXJjZSAhPSBudWxsKTsKLQkJCWFzc2VydEZhbHNlKCJUaGUgcmVzb3VyY2Ugc2hvdWxkIGJlIHVubG9hZGVkIiwgZm91bmRSZXNvdXJjZS5pc0xvYWRlZCgpKTsJCQotCQl9Ci0JCWFzc2VydFRydWUoIkV4Y2VwdGlvbiBzaG91bGQgaGF2ZSBiZWVuIGNhdWdodCIsIGV4Y2VwdGlvbkNhdWdodCk7Ci0JCUNvbGxlY3Rpb24gbG9hZGVkUmVzb3VyY2VzID0gYXBwQ2xpZW50RmlsZS5nZXRMb2FkZWRNb2ZSZXNvdXJjZXMoKTsKLQkJYXNzZXJ0VHJ1ZSgiTG9hZGVkIHJlc291cmNlcyBzaG91bGQgYmUgc2l6ZSAxIiwgbG9hZGVkUmVzb3VyY2VzLnNpemUoKSA9PSAxKTsKLQkJRWpiUmVmIGFSZWYgPSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21tb25GYWN0b3J5KCkuY3JlYXRlRWpiUmVmKCk7Ci0JCXJlcy5nZXRDb250ZW50cygpLmFkZChhUmVmKTsKLQkJbG9hZGVkUmVzb3VyY2VzID0gYXBwQ2xpZW50RmlsZS5nZXRMb2FkZWRNb2ZSZXNvdXJjZXMoKTsKLQkJYXNzZXJ0VHJ1ZSgiTG9hZGVkIHJlc291cmNlcyBzaG91bGQgYmUgc2l6ZSAyIiwgbG9hZGVkUmVzb3VyY2VzLnNpemUoKSA9PSAyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlc291cmNlRGlydHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRUpCSmFyRmlsZSBqYXIgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5FSkIxMUphckZpbGUoQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAiYmFua2VqYnMuamFyIik7Ci0JCUVudGVycHJpc2VCZWFuIGJlYW4gPSAoRW50ZXJwcmlzZUJlYW4pamFyLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0RW50ZXJwcmlzZUJlYW5zKCkuZ2V0KDApOwotCQkKLQkJRUFSRmlsZSBuZXdFYXIgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUVBUkZpbGVJbml0aWFsaXplZCgidGVzdCIpOwotCQlFSkJKYXJGaWxlIGNvcHlKYXIgPSAoRUpCSmFyRmlsZSkgbmV3RWFyLmFkZENvcHkoamFyKTsKLQkJCi0JCWFzc2VydEZhbHNlKCJkZCBzaG91bGQgbm90IGJlIGRpcnR5IiwgY29weUphci5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCkuaXNNb2RpZmllZCgpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCUFyY2hpdmVJbml0LmluaXQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9TYXZlVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9TYXZlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ2YzExNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvU2F2ZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLnRlc3Q7Ci0KLS8qCi0qIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNCi0qIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDEgLSBBbGwgUmlnaHRzIFJlc2VydmVkLgotKiBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlCi0qIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLgotKi8KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LnN3aW5ndWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLlJlYWRPbmx5RGlyZWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLldBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuQXJjaGl2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5idnQuQXV0b21hdGVkQlZUOwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTIvMjEvMDAgMzowNDozNiBQTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIFNhdmVUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDEuIjsgLy8kTk9OLU5MUy0xJAotICAgIC8qKgotICAgICAqIFNhdmVUZXN0cyBjb25zdHJ1Y3RvciBjb21tZW50LgotICAgICAqIEBwYXJhbSBuYW1lIGphdmEubGFuZy5TdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgU2F2ZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLSAgICBwdWJsaWMgQ29tbW9uYXJjaGl2ZUZhY3RvcnkgZ2V0QXJjaGl2ZUZhY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiBDb21tb25hcmNoaXZlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uYXJjaGl2ZUZhY3RvcnkoKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogU3RhcnRzIHRoZSBhcHBsaWNhdGlvbi4KLSAgICAgKiBAcGFyYW0gYXJncyBhbiBhcnJheSBvZiBjb21tYW5kLWxpbmUgYXJndW1lbnRzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oamF2YS5sYW5nLlN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgU3RyaW5nW10gY2xhc3NOYW1lID0geyAiY29tLmlibS5ldG9vbHMuYXJjaGl2ZS50ZXN0LlNhdmVUZXN0cyIsICItbm9sb2FkaW5nIiB9OwotICAgICAgICBUZXN0UnVubmVyLm1haW4oY2xhc3NOYW1lKTsKLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoU2F2ZVRlc3RzLmNsYXNzKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogVGhpcyBzY2VuYXJpbyB0ZXN0cyB0aGUgY2FzZSBvZiBvcGVuaW5nIGFuIGFyY2hpdmUsIG1vZGlmeWluZyBpdCdzIGNvbnRlbnRzLCBhbmQgc2F2aW5nIHRvIHRoZSBzYW1lIHVyaSBmcm9tIHdoaWNoIGl0IHdhcwotICAgICAqIGxvYWRlZC4gIFRoZSBwcm9ibGVtIGlzIHRoYXQgdGhlIHJlYWRpbmcgb2YgaW5wdXQgc3RyZWFtcyBvZiBpbmRpdmlkdWFsIGVudHJpZXMgaW4gYW4gYXJjaGl2ZSBpcyBkZWZlcnJlZCB1bnRpbCByZXF1ZXN0ZWQgdGhyb3VnaAotICAgICAqIHRoZSBhcGkgb3Igc2F2ZSB0aW1lOyB0aGVyZWZvcmUsIGFuIG9wZW4gZmlsZSBleGlzdHMgb24gdGhlIHNvdXJjZSBmaWxlLiAgVG8gZ2V0IGFyb3VuZCB0aGlzLCB0aGUgaW1wbGVtZW50YXRpb24gc2F2ZXMgdGhlIGFyY2hpdmUKLSAgICAgKiB0byBhIHRlbXAgZmlsZSwgdGhlbiBkZWxldGVzIChvciByZW5hbWVzLCBiYXNlZCBvbiBzZXR0aW5nLCB0byBiZSBpbXBsZW1lbnRlZCkgdGhlIG9sZCBmaWxlLCByZW5hbWVzIHRoZSB0ZW1wIGZpbGUsIGFuZCBkb2VzIHNvbWUKLSAgICAgKiBob3VzZWtlZXBpbmcgb24gdGhlIHNhdmVkIGFyY2hpdmUsIHdpdGggaXQncyBsb2FkIHN0cmF0ZWd5IGFuZCBjb250YWluZWQgZmlsZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2F2ZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIC8vRmlyc3QgbWFrZSBhIGNvcHkgb2Ygb3VyIHJlZmVyZW5jZSBmaWxlCi0gICAgICAgIEFyY2hpdmUgYW5BcmNoaXZlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuQXJjaGl2ZShBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJleGFtcGxlMi53YXIiKTsKLSAgICAgICAgYW5BcmNoaXZlLnNhdmVBc05vUmVvcGVuKEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInRlc3RPdXRwdXQvU2F2ZVRlc3RzL2NvcHkud2FyIik7Ci0gICAgICAgIGFuQXJjaGl2ZSA9IG51bGw7Ci0KLSAgICAgICAgV0FSRmlsZSBhV2FyRmlsZSA9IChXQVJGaWxlKSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5BcmNoaXZlKEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInRlc3RPdXRwdXQvU2F2ZVRlc3RzL2NvcHkud2FyIik7Ci0gICAgICAgIFJlYWRPbmx5RGlyZWN0b3J5IHNhbXBsZURpcmVjdG9yeSA9IGdldEFyY2hpdmVGYWN0b3J5KCkub3BlblJlYWRPbmx5RGlyZWN0b3J5KEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgIldhclRlc3RDbGFzc2VzIik7Ci0gICAgICAgIGludCBpbml0aWFsU2l6ZSA9IGFXYXJGaWxlLmdldENsYXNzZXMoKS5zaXplKCk7Ci0gICAgICAgIEZpbGUgYUZpbGUgPSBzYW1wbGVEaXJlY3RvcnkuZ2V0RmlsZUluU2VsZk9yU3ViZGlyZWN0b3J5KCJjb20vaWJtL2V0b29scy9hcmNoaXZlL3Rlc3QvV0FSRmlsZVRlc3RzLmNsYXNzIik7Ci0gICAgICAgIGFXYXJGaWxlLmFkZENvcHlDbGFzcyhhRmlsZSk7Ci0gICAgICAgIGFzc2VydFRydWUoYVdhckZpbGUuZ2V0Q2xhc3NlcygpLnNpemUoKSA9PSBpbml0aWFsU2l6ZSArIDEpOwotCi0gICAgICAgIFN0cmluZyBjbGFzc1VSSSA9IEFyY2hpdmVVdGlsLmNvbmNhdFVyaShBcmNoaXZlQ29uc3RhbnRzLldFQkFQUF9DTEFTU0VTX1VSSSwgYUZpbGUuZ2V0VVJJKCksICcvJyk7Ci0gICAgICAgIGFzc2VydFRydWUoYVdhckZpbGUuY29udGFpbnNGaWxlKGNsYXNzVVJJKSk7Ci0gICAgICAgIGFXYXJGaWxlLnNhdmUoKTsKLQotICAgICAgICBGaWxlIGNsYXNzRmlsZSA9IGFXYXJGaWxlLmdldEZpbGUoY2xhc3NVUkkpOwotICAgICAgICBhc3NlcnRUcnVlKCJGaWxlIHNob3VsZCBub3QgYmUgbnVsbCIsIGNsYXNzRmlsZSAhPSBudWxsKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiV3JvbmcgbG9hZGluZyBhcmNoaXZlIiwgY2xhc3NGaWxlLmdldExvYWRpbmdDb250YWluZXIoKSA9PSBhV2FyRmlsZSk7Ci0gICAgICAgIGFzc2VydFRydWUoIldyb25nIG9yaWdpbmFsIFVSSSIsIGNsYXNzRmlsZS5nZXRPcmlnaW5hbFVSSSgpLmVxdWFscyhjbGFzc1VSSSkpOwotCi0gICAgICAgIGFXYXJGaWxlLnNhdmVBcygidGVzdE91dHB1dC9TYXZlVGVzdHMvY29weTIud2FyIik7Ci0gICAgICAgIGFXYXJGaWxlLnNhdmUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHNjZW5hcmlvIGlzIHNpbWlsYXIgdG8gQGxpbmsgI3Rlc3RTYXZlLCBleGNlcHQgdGhhdCBpdCB0ZXN0cyB3aXRoIGEgZGlyZWN0b3J5IGluc3RlYWQgb2YgYSBqYXIgZmlsZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTYXZlRGlyZWN0b3J5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy9GaXJzdCBtYWtlIGEgY29weSBvZiBvdXIgcmVmZXJlbmNlIGZpbGUKLSAgICAgICAgQXJjaGl2ZSBhbkFyY2hpdmUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5BcmNoaXZlKEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInNhbXBsZS5lYXIiKTsKLSAgICAgICAgYW5BcmNoaXZlLnNhdmVBc05vUmVvcGVuKEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInRlc3RPdXRwdXQvU2F2ZVRlc3RzL3NhbXBsZS1jb3BpZWQuZWFyIik7Ci0gICAgICAgIGFuQXJjaGl2ZSA9IG51bGw7Ci0KLSAgICAgICAgRUFSRmlsZSBhbkVBUkZpbGUgPSAoRUFSRmlsZSkgZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuQXJjaGl2ZShBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJ0ZXN0T3V0cHV0L1NhdmVUZXN0cy9zYW1wbGUtY29waWVkLmVhciIpOwotCi0gICAgICAgIGFuRUFSRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotICAgICAgICAKLQotICAgICAgICBhbkVBUkZpbGUuZXh0cmFjdE5vUmVvcGVuKEFyY2hpdmUuRVhQQU5EX1dBUl9GSUxFUyk7Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9TZWN1cml0eVJvbGVUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L1NlY3VyaXR5Um9sZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYzBkYzQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L1NlY3VyaXR5Um9sZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLnRlc3Q7Ci0KLSAvKgotICogTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0KLSAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDEgLSBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZQotICogcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuCi0gKi8KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQuc3dpbmd1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5Um9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVKQkphckZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUpCTW9kdWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLldBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuV2ViTW9kdWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMuYnZ0LkF1dG9tYXRlZEJWVDsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDAyLzA5LzAxIDEyOjA1OjE4IEFNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgU2VjdXJpdHlSb2xlVGVzdHMgZXh0ZW5kcyBBYnN0cmFjdEFyY2hpdmVUZXN0IHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDEuIjsvLyROT04tTkxTLTEkCi0vKioKLSAqIFNlY3VyaXR5Um9sZVRlc3RzIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKiBAcGFyYW0gbmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0gKi8KLXB1YmxpYyBTZWN1cml0eVJvbGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotcHVibGljIENvbW1vbkZhY3RvcnkgZ2V0Q29tbW9uRmFjdG9yeSgpIHsKLQlyZXR1cm4gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uRmFjdG9yeSgpOwotfQotLyoqCi0gKiBTdGFydHMgdGhlIGFwcGxpY2F0aW9uLgotICogQHBhcmFtIGFyZ3MgYW4gYXJyYXkgb2YgY29tbWFuZC1saW5lIGFyZ3VtZW50cwotICovCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihqYXZhLmxhbmcuU3RyaW5nW10gYXJncykgewotCVN0cmluZ1tdIGNsYXNzTmFtZSA9IHsiY29tLmlibS5ldG9vbHMuYXJjaGl2ZS50ZXN0LlNlY3VyaXR5Um9sZVRlc3RzIiwgIi1ub2xvYWRpbmcifTsKLQlUZXN0UnVubmVyLm1haW4oY2xhc3NOYW1lKTsKLX0KLXB1YmxpYyBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3Qgc3VpdGUoKSB7Ci0JcmV0dXJuIG5ldyBUZXN0U3VpdGUoU2VjdXJpdHlSb2xlVGVzdHMuY2xhc3MpOwotfQotcHVibGljIHZvaWQgdGVzdFB1c2hEb3duQ29weSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JRUFSRmlsZSBlYXJGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuRUFSRmlsZShBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJzYW1wbGUuZWFyIik7Ci0KLQlXQVJGaWxlIHdhckZpbGUgPSAoV0FSRmlsZSllYXJGaWxlLmdldFdBUkZpbGVzKCkuZ2V0KDApOwotCi0JRUpCSmFyRmlsZSBlamJKYXJGaWxlID0gKEVKQkphckZpbGUpIGVhckZpbGUuZ2V0RUpCSmFyRmlsZXMoKS5nZXQoMCk7Ci0KLQlTZWN1cml0eVJvbGUgYVJvbGUgPSBnZXRDb21tb25GYWN0b3J5KCkuY3JlYXRlU2VjdXJpdHlSb2xlKCk7Ci0JYVJvbGUuc2V0Um9sZU5hbWUoImFkbWluaXN0cmF0b3IiKTsKLQlhUm9sZS5zZXREZXNjcmlwdGlvbigiVGhlIGFsbCBwb3dlcmZ1bCIpOwotCWVhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5nZXRTZWN1cml0eVJvbGVzKCkuYWRkKGFSb2xlKTsKLQllYXJGaWxlLnB1c2hEb3duUm9sZShhUm9sZSk7Ci0KLQlhc3NlcnRUcnVlKCJQdXNoIGRvd24gZmFpbGVkIGZvciBlamIgamFyIiwgZWpiSmFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldEFzc2VtYmx5RGVzY3JpcHRvcigpLmdldFNlY3VyaXR5Um9sZU5hbWVkKCJhZG1pbmlzdHJhdG9yIikgIT0gbnVsbCk7Ci0JYXNzZXJ0VHJ1ZSgiUHVzaCBkb3duIGZhaWxlZCBmb3Igd2FyIiwgd2FyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldFNlY3VyaXR5Um9sZU5hbWVkKCJhZG1pbmlzdHJhdG9yIikgIT0gbnVsbCk7Ci0KLQllYXJGaWxlLmNsb3NlKCk7Ci0KLX0KLXB1YmxpYyB2b2lkIHRlc3RSb2xsdXBBZGRBbmRQdXNoRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCi0JRUFSRmlsZSBlYXJGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuRUFSRmlsZShBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArInNhbXBsZS5lYXIiKTsKLQotCVdlYk1vZHVsZVJlZiB3ZWJSZWYgPSAoV2ViTW9kdWxlUmVmKWVhckZpbGUuZ2V0V2ViTW9kdWxlUmVmcygpLmdldCgwKTsKLQotCUVKQk1vZHVsZVJlZiBlamJNb2RSZWYgPSAoRUpCTW9kdWxlUmVmKSBlYXJGaWxlLmdldEVKQk1vZHVsZVJlZnMoKS5nZXQoMCk7Ci0KLQlTZWN1cml0eVJvbGUgYVJvbGUgPSBnZXRDb21tb25GYWN0b3J5KCkuY3JlYXRlU2VjdXJpdHlSb2xlKCk7Ci0JYVJvbGUuc2V0Um9sZU5hbWUoIkpvZSIpOwotCWFSb2xlLnNldERlc2NyaXB0aW9uKCJOZXcgZGVzY3JpcHRpb24iKTsKLQl3ZWJSZWYuZ2V0V2ViQXBwKCkuZ2V0U2VjdXJpdHlSb2xlcygpLmFkZChhUm9sZSk7Ci0KLQlhUm9sZSA9IGdldENvbW1vbkZhY3RvcnkoKS5jcmVhdGVTZWN1cml0eVJvbGUoKTsKLQlhUm9sZS5zZXRSb2xlTmFtZSgiYWRtaW5pc3RyYXRvciIpOwotCWFSb2xlLnNldERlc2NyaXB0aW9uKCJUaGUgYWxsIHBvd2VyZnVsIik7Ci0JCi0Jd2ViUmVmLmdldFdlYkFwcCgpLmdldFNlY3VyaXR5Um9sZXMoKS5hZGQoYVJvbGUpOwotCi0JLy9UZXN0IHRoZSByb2xsdXAKLQllYXJGaWxlLnJvbGxVcFJvbGVzKCk7Ci0JLy9XZSBjaGVhdGVkIGhlcmUgYmVjYXVzZSB3ZSBhbHJlYWR5IGtuZXcgdGhlcmUgd2VyZSB0d28gcm9sZXMgaW4gdGhlIGVqYiBqYXIKLQkvL29uZSBvZiB3aGljaCBpcyBuYW1lZCBKb2UsIGFuZCB6ZXJvIHJvbGVzIGluIHRoZSB3YXIgZmlsZQotCWFzc2VydFRydWUoIlJvbGwgdXAgbm90IHJpZ2h0IiwgZWFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldFNlY3VyaXR5Um9sZXMoKS5zaXplKCkgPT0gNSk7Ci0KLQlhUm9sZSA9IGdldENvbW1vbkZhY3RvcnkoKS5jcmVhdGVTZWN1cml0eVJvbGUoKTsKLQlhUm9sZS5zZXRSb2xlTmFtZSgibWFuYWdlciIpOwotCWFSb2xlLnNldERlc2NyaXB0aW9uKCJ0aGUgbWFuYWdlciIpOwotCWVhckZpbGUuYWRkQ29weShhUm9sZSwgd2ViUmVmLmdldE1vZHVsZSgpKTsKLQotCS8vVGVzdCB0aGUgYWRkIGFuZCByb2xsdXAKLQlhc3NlcnRUcnVlKCJBZGQgY29weSBub3QgcmlnaHQiLCBlYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0U2VjdXJpdHlSb2xlcygpLnNpemUoKSA9PSA2IAotCQkmJiBlYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuY29udGFpbnNTZWN1cml0eVJvbGUoYVJvbGUuZ2V0Um9sZU5hbWUoKSkKLQkJJiYgd2ViUmVmLmdldFdlYkFwcCgpLmNvbnRhaW5zU2VjdXJpdHlSb2xlKGFSb2xlLmdldFJvbGVOYW1lKCkpKTsKLQotCS8vVGVzdCB0aGUgcHVzaCBkb3duCi0JZWFyRmlsZS5yZW5hbWVTZWN1cml0eVJvbGUoIkpvZSIsICJndWVzdCIpOwotCi0JYXNzZXJ0VHJ1ZSgiUHVzaCBkb3duIG5vdCByaWdodCIsICFlYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuY29udGFpbnNTZWN1cml0eVJvbGUoIkpvZSIpCi0JCSYmIGVhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5jb250YWluc1NlY3VyaXR5Um9sZSgiZ3Vlc3QiKQotCQkmJiAhd2ViUmVmLmdldFdlYkFwcCgpLmNvbnRhaW5zU2VjdXJpdHlSb2xlKCJKb2UiKQotCQkmJiB3ZWJSZWYuZ2V0V2ViQXBwKCkuY29udGFpbnNTZWN1cml0eVJvbGUoImd1ZXN0IikKLQkJJiYgIWVqYk1vZFJlZi5nZXRFSkJKYXIoKS5jb250YWluc1NlY3VyaXR5Um9sZSgiSm9lIikKLQkJJiYgZWpiTW9kUmVmLmdldEVKQkphcigpLmNvbnRhaW5zU2VjdXJpdHlSb2xlKCJndWVzdCIpKTsKLQotCWVhckZpbGUuc2F2ZUFzTm9SZW9wZW4oQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyJ0ZXN0T3V0cHV0L1NlY3VyaXR5Um9sZVRlc3RzL25ld1NhbXBsZS5lYXIiKTsKLQkKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9TaW1wbGVUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L1NpbXBsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViYTg3M2IuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L1NpbXBsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzMgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLnRlc3Q7Ci0KLS8qCi0qIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNCi0qIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDEgLSBBbGwgUmlnaHRzIFJlc2VydmVkLgotKiBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlCi0qIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLgotKi8KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LnN3aW5ndWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUpCSmFyRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FSkJNb2R1bGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Nb2R1bGVGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLk1vZHVsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5WYWxpZGF0ZVhtbENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuV0FSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5XZWJNb2R1bGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuWG1sVmFsaWRhdGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uU2F2ZUZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlSW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMuYnZ0LkF1dG9tYXRlZEJWVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTIvMTEvMDAgMTA6MjY6MTEgQU0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDEuIjsgLy8kTk9OLU5MUy0xJAotICAgIC8qKgotICAgICAqIFNpbXBsZVRlc3RzIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gICAgICogQHBhcmFtIG5hbWUgamF2YS5sYW5nLlN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBTaW1wbGVUZXN0cyhTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0gICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eShDb2xsZWN0aW9uIGFkYXB0ZXJzKSB7Ci0gICAgICAgIGlmIChhZGFwdGVycy5pc0VtcHR5KCkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gYWRhcHRlcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBpZiAoaXRlci5uZXh0KCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHB1YmxpYyBDb21tb25hcmNoaXZlRmFjdG9yeSBnZXRBcmNoaXZlRmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIENvbW1vbmFyY2hpdmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21tb25hcmNoaXZlRmFjdG9yeSgpOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBTdGFydHMgdGhlIGFwcGxpY2F0aW9uLgotICAgICAqIEBwYXJhbSBhcmdzIGFuIGFycmF5IG9mIGNvbW1hbmQtbGluZSBhcmd1bWVudHMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihqYXZhLmxhbmcuU3RyaW5nW10gYXJncykgewotICAgICAgICBTdHJpbmdbXSBjbGFzc05hbWUgPSB7ICJjb20uaWJtLmV0b29scy5hcmNoaXZlLnRlc3QuU2ltcGxlVGVzdHMiLCAiLW5vbG9hZGluZyIgfTsKLSAgICAgICAgVGVzdFJ1bm5lci5tYWluKGNsYXNzTmFtZSk7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHByaW50QXBwbFRvQ29uc29sZShBcHBsaWNhdGlvbiBhcHBsKSB7Ci0KLSAgICAgICAgTGlzdCBtb2R1bGVzID0gYXBwbC5nZXRNb2R1bGVzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbW9kdWxlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG1vZHVsZXMuZ2V0KGkpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBwcmludEVKQkphclRvQ29uc29sZShFSkJKYXIgZWpiSmFyKSB7Ci0KLSAgICAgICAgTGlzdCBlamJzID0gZWpiSmFyLmdldEVudGVycHJpc2VCZWFucygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVqYnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihlamJzLmdldChpKSk7Ci0gICAgICAgIH0KLQotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBwcmludFdlYkFwcFRvQ29uc29sZShXZWJBcHAgd2ViQXBwKSB7Ci0gICAgICAgIExpc3Qgc2VydmxldHMgPSB3ZWJBcHAuZ2V0U2VydmxldHMoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZsZXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc2VydmxldHMuZ2V0KGkpKTsKLSAgICAgICAgfQotCi0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFNpbXBsZVRlc3RzLmNsYXNzKTsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgdGVzdENvbnRhaW5lck1hbmFnZWRFbnRpdHlFeHRlbnNpb25SZWFkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIENvbW1vbmFyY2hpdmVGYWN0b3J5IGZhY3RvcnkgPSBDb21tb25hcmNoaXZlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uYXJjaGl2ZUZhY3RvcnkoKTsKLSAgICAgICAgRUpCSmFyRmlsZSBqYXJGaWxlID0gKEVKQkphckZpbGUpIGZhY3Rvcnkub3BlbkFyY2hpdmUoQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAiY21wc2FtcGxlLmphciIpOwotICAgICAgICBFSkJKYXIgamFyID0gamFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotICAgICAKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgdGVzdEVKQjExSmFyQWRkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEVBUkZpbGUgX2VhckZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUVBUkZpbGVJbml0aWFsaXplZChBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJ0ZXN0T3V0cHV0L1Rlc3RFQVJFSkJBZGQuZWFyIik7Ci0gICAgICAgIENvbW1vbmFyY2hpdmVGYWN0b3J5IGZhY3RvcnkgPSBDb21tb25hcmNoaXZlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uYXJjaGl2ZUZhY3RvcnkoKTsKLSAgICAgICAgRUpCSmFyRmlsZSBqYXIgPSAoRUpCSmFyRmlsZSkgZmFjdG9yeS5vcGVuQXJjaGl2ZShBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJlamJfY29tcGF0X2VudGl0eWNtcC5qYXIiKTsKLSAgICAgICAgamFyLnNldFVSSShBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJlamJfY29tcGF0X2VudGl0eWNtcC5qYXIiKTsKLSAgICAgICAgX2VhckZpbGUuYWRkQ29weShqYXIpOwotICAgICAgICBfZWFyRmlsZS5zYXZlKCk7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHRlc3RFSkJTZXRBYnN0cmFjdFNjaGVtYU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHRlc3RTbSA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgIlRlc3RTY2hlbWEiOwotICAgICAgICBDb21tb25hcmNoaXZlRmFjdG9yeSBmYWN0b3J5ID0gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbW1vbmFyY2hpdmVGYWN0b3J5KCk7Ci0gICAgICAgIEVKQkphckZpbGUgamFyRmlsZSA9IChFSkJKYXJGaWxlKSBmYWN0b3J5Lm9wZW5BcmNoaXZlKEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgImNtcHNhbXBsZS5qYXIiKTsKLSAgICAgICAgRUpCSmFyIGphciA9IGphckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLSAgICAgICAgTGlzdCBsc3QgPSBqYXIuZ2V0Q29udGFpbmVyTWFuYWdlZEJlYW5zKCk7Ci0KLSAgICAgICAgLy9JIGtub3cgdGhpcyB3aWxsIGJlIGEgQ01QLCBzbywgbGV0cyB0cnkgc2V0L2dldCBvbiBpdC4uCi0gICAgICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wID0gKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpIGxzdC5nZXQoMCk7Ci0KLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIlNldHRpbmcgU2NoZW1hIG5hbWUgdG86ICIgKyB0ZXN0U20pOwotICAgICAgICBjbXAuc2V0QWJzdHJhY3RTY2hlbWFOYW1lKHRlc3RTbSk7Ci0gICAgICAgIC8vUmV0cmlldmUgaXQgYW5kIHNlZSBpZiBpdCBtYXRjaGVzCi0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJHZXR0aW5nIHNjaGVtYSBuYW1lOiAiICsgY21wLmdldEFic3RyYWN0U2NoZW1hTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjbXAuZ2V0QWJzdHJhY3RTY2hlbWFOYW1lKCkuZXF1YWxzKHRlc3RTbSkpOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBUaGlzIGV4Y2VyY2lzZXMgdGhlIGluZGV4IGFkYXB0ZXIgb24gQ29udGFpbmVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEluZGV4aW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEFyY2hpdmUgYW5BcmNoaXZlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuQXJjaGl2ZShBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJmb28uamFyIik7Ci0gICAgICAgIFN0cmluZyB1cmkgPSAiY29tL2libS9ldG9vbHMvYXJjaGl2ZS90ZXN0L1NpbXBsZVRlc3RzLmphdmEiOwotCi0gICAgICAgIExpc3QgZmlsZXMgPSBhbkFyY2hpdmUuZ2V0RmlsZXMoKTsKLQotICAgICAgICBGaWxlIGFGaWxlID0gYW5BcmNoaXZlLmdldEZpbGUodXJpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiQWRhcHRlciBzaG91bGQgYmUgYXR0YWNoZWQgdG8gYUZpbGUiLCAhaXNFbXB0eShhRmlsZS5lQWRhcHRlcnMoKSkpOwotCi0gICAgICAgIGZpbGVzLnJlbW92ZShhRmlsZSk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiQWRhcHRlciBzaG91bGQgbm90IGJlIGF0dGFjaGVkIHRvIGFGaWxlIiwgaXNFbXB0eShhRmlsZS5lQWRhcHRlcnMoKSkpOwotCi0gICAgICAgIGFzc2VydFRydWUoIkNvbnRhaW5zIHNob3VsZCByZXR1cm4gZmFsc2UiLCAhYW5BcmNoaXZlLmNvbnRhaW5zRmlsZSh1cmkpKTsKLQotICAgICAgICBGaWxlIGNvcHkgPSBhbkFyY2hpdmUuYWRkQ29weShhRmlsZSk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiQ29udGFpbnMgc2hvdWxkIHJldHVybiB0cnVlIiwgYW5BcmNoaXZlLmNvbnRhaW5zRmlsZSh1cmkpKTsKLQotICAgICAgICBTdHJpbmcgcmVuYW1lZFVSSSA9ICJjb20vaWJtL2dvb2JsZWR5Z29vayI7Ci0gICAgICAgIGNvcHkuc2V0VVJJKHJlbmFtZWRVUkkpOwotCi0gICAgICAgIGFzc2VydFRydWUoIkNvbnRhaW5zIHNob3VsZCByZXR1cm4gZmFsc2UgZm9yIG9sZCB1cmkiLCAhYW5BcmNoaXZlLmNvbnRhaW5zRmlsZSh1cmkpKTsKLQotICAgICAgICBhc3NlcnRUcnVlKCJDb250YWlucyBzaG91bGQgcmV0dXJuIHRydWUgZm9yIG5ldyB1cmkiLCBhbkFyY2hpdmUuY29udGFpbnNGaWxlKHJlbmFtZWRVUkkpKTsKLQotICAgIH0KLSAgICAvKioKLSAgICAgKiBUaGlzIGV4Y2VyY2lzZXMgdGhlIGluZGV4IGFkYXB0ZXIgb24gQ29udGFpbmVyCi0gICAgICogVGVzdHMgbm90aWZpY2F0aW9ucyB3aXRoIGFkZC9yZW1vdmUgb2YgbGlzdHMsIGFuZCB0aGF0IGFkYXB0ZXJzIGFyZSBzZXQgcG9zdCBjb3B5Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEluZGV4aW5nV2l0aENvbGxlY3Rpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEFyY2hpdmUgYW5BcmNoaXZlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuQXJjaGl2ZShBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJiYW5rZWpicy5qYXIiKTsKLSAgICAgICAgRUFSRmlsZSBlYXJGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVFQVJGaWxlSW5pdGlhbGl6ZWQoQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAiYmFyLmVhciIpOwotICAgICAgICBlYXJGaWxlLmFkZENvcHkoYW5BcmNoaXZlKTsKLSAgICAgICAgYW5BcmNoaXZlID0gKEFyY2hpdmUpIGVhckZpbGUuZ2V0RmlsZShBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJiYW5rZWpicy5qYXIiKTsKLQotICAgICAgICBhc3NlcnRUcnVlKCJJbmRleCBvdXQgb2Ygc3luYyIsICFhbkFyY2hpdmUuZ2V0RmlsZXMoKS5pc0VtcHR5KCkgJiYgYW5BcmNoaXZlLmlzSW5kZXhlZCgpKTsKLSAgICAgICAgTGlzdCBmaWxlcyA9IGFuQXJjaGl2ZS5nZXRGaWxlcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBGaWxlIGFGaWxlID0gKEZpbGUpIGZpbGVzLmdldChpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIkluZGV4IG91dCBvZiB3aGFjazsgY29udGFpbm1lbnQgc2hvdWxkIGJlIHRydWUiLCBhbkFyY2hpdmUuY29udGFpbnNGaWxlKGFGaWxlLmdldFVSSSgpKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJBZGFwdGVyIHNob3VsZCBiZSBhdHRhY2hlZCB0byBhRmlsZSIsICFpc0VtcHR5KGFGaWxlLmVBZGFwdGVycygpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0IGZpbGVzVG9BZGQgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5SZWFkT25seURpcmVjdG9yeShBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJXYXJUZXN0Q2xhc3NlcyIpLmdldEZpbGVzUmVjdXJzaXZlKCk7Ci0gICAgICAgIExpc3QgYWRkZWRGaWxlcyA9IGFuQXJjaGl2ZS5hZGRDb3B5RmlsZXMoZmlsZXNUb0FkZCk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiRmlsZXMgYWRkZWQgaW5jb3JyZWN0bHkiLCAhZmlsZXNUb0FkZC5pc0VtcHR5KCkgJiYgZmlsZXNUb0FkZC5zaXplKCkgPT0gYWRkZWRGaWxlcy5zaXplKCkpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWRkZWRGaWxlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgRmlsZSBhRmlsZSA9IChGaWxlKSBhZGRlZEZpbGVzLmdldChpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIkNvbnRhaW5zIHNob3VsZCBiZSB0cnVlIiwgYW5BcmNoaXZlLmNvbnRhaW5zRmlsZShhRmlsZS5nZXRVUkkoKSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiU2hvdWxkIGJlIHNhbWUgaW5zdGFuY2UiLCBhbkFyY2hpdmUuZ2V0RmlsZShhRmlsZS5nZXRVUkkoKSkgPT0gYUZpbGUpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiQWRhcHRlciBzaG91bGQgYmUgYXR0YWNoZWQgdG8gYUZpbGUiLCAhaXNFbXB0eShhRmlsZS5lQWRhcHRlcnMoKSkpOwotICAgICAgICB9Ci0gICAgICAgIGFuQXJjaGl2ZS5nZXRGaWxlcygpLnJlbW92ZUFsbChhZGRlZEZpbGVzKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFkZGVkRmlsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIEZpbGUgYUZpbGUgPSAoRmlsZSkgYWRkZWRGaWxlcy5nZXQoaSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJBZGFwdGVyIHNob3VsZCBub3QgYmUgYXR0YWNoZWQgdG8gYUZpbGUiLCBpc0VtcHR5KGFGaWxlLmVBZGFwdGVycygpKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJDb250YWlucyBzaG91bGQgcmV0dXJuIGZhbHNlIiwgIWFuQXJjaGl2ZS5jb250YWluc0ZpbGUoYUZpbGUuZ2V0VVJJKCkpKTsKLSAgICAgICAgfQotICAgICAgICBnZXRBcmNoaXZlRmFjdG9yeSgpLmNsb3NlT3BlbkFyY2hpdmVzKCk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIFZlcnkgYmFzaWMgbWV0aG9kIHRvIG9wZW4gYW4gYXJjaGl2ZSBhbmQgc2F2ZSBpdCBhcyBhIGRpcmVjdG9yeSB0byBhIG5ldyBkZXN0aW5hdGlvbi4gIFJlcXVpcmVzIHZpc3VhbCBpbnNwZWN0aW9uCi0gICAgICogZm9yIHZlcmlmaWNhdGlvbi4gIE5lc3RlZCBqYXJzIHdpbGwgbm90IGJlIGV4cGxvZGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE9wZW5BbmRFeHRyYWN0MSgpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIFN0cmluZyBpbiA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInNhbXBsZS5lYXIiOwotICAgICAgICBFQVJGaWxlIGVhckZpbGUgPSAoRUFSRmlsZSkgZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuQXJjaGl2ZShpbik7Ci0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJFQVIgc3BlYyB2ZXJzaW9uICIgKyBlYXJGaWxlLmdldFNwZWNWZXJzaW9uKCkgKyAiIGRldGVjdGVkLiIpOwotCi0gICAgICAgIFN0cmluZyBvdXQgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJ0ZXN0T3V0cHV0L1NpbXBsZVRlc3RzL3NhbXBsZS1leHBhbmRlZC1vdXQxLmVhciI7Ci0gICAgICAgIGVhckZpbGUuZXh0cmFjdFRvKG91dCwgQXJjaGl2ZS5FWFBBTkRfTk9ORSk7Ci0gICAgICAgIGVhckZpbGUuY2xvc2UoKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogVmVyeSBiYXNpYyBtZXRob2QgdG8gb3BlbiBhbiBhcmNoaXZlIGFuZCBzYXZlIGl0IGFzIGEgZGlyZWN0b3J5IHRvIGEgbmV3IGRlc3RpbmF0aW9uLiAgUmVxdWlyZXMgdmlzdWFsIGluc3BlY3Rpb24KLSAgICAgKiBmb3IgdmVyaWZpY2F0aW9uLiAgTmVzdGVkIHdhcnMgd2lsbCBiZSBleHBsb2RlZCBidXQgb3RoZXIgbmVzdGVkIGphcnMgd2lsbCBub3QuICBUaGlzIG1ldGhvZCBlbXVsYXRlcyB0aGUgd2Vic3BoZXJlIGluc3RhbGwuCi0gICAgICogdGhlIGFyY2hpdmUgaXMgb3BlbmVkIGFzIHJlYWQgb25seTsgdGVzdCB0aGF0IG5vIHRlbXAgZmlsZXMgYXJlIGNyZWF0ZWQgYnkgcHV0dGluZyBhIGJyZWFrcG9pbnQgaW4gQXJjaGl2ZVV0aWwjY3JlYXRlVGVtcEZpbGUoU3RyaW5nLCBGaWxlKQotICAgICAqIEFsc28gdGhlIGFyY2hpdmUgaXMgb3BlbmVkIHdpdGggamF2YSByZWZsZWN0aW9uIGRpc2FibGVkLiAgVmVyaWZ5IG5vIHJlZmxlY3Rpb24gb2NjdXJzIGJ5IHB1dHRpbmcgYSBicmVha3BvaW50cyBpbiB0aGUgY29uc3RydWN0b3JzCi0gICAgICogb2YgSmF2YUpES0FkYXB0ZXJGYWN0b3J5LCBhbmQgdGhlIG1ldGhvZCByZWZsZWN0VmFsdWVzKCkgaW4gZWFjaCBvZiB0aGUgc3ViY2xhc3NlcyBvZiBKZGtBZGFwdG9yLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RPcGVuQW5kRXh0cmFjdDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBTdHJpbmcgaW4gPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJzYW1wbGUuZWFyIjsKLSAgICAgICAgQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucyA9IG5ldyBBcmNoaXZlT3B0aW9ucygpOwotICAgICAgICBvcHRpb25zLnNldElzUmVhZE9ubHkodHJ1ZSk7Ci0gICAgICAgIG9wdGlvbnMuc2V0VXNlSmF2YVJlZmxlY3Rpb24oZmFsc2UpOwotICAgICAgICBFQVJGaWxlIGVhckZpbGUgPSAoRUFSRmlsZSkgZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuQXJjaGl2ZShvcHRpb25zLCBpbik7Ci0gICAgICAgIC8vVGhlIGZvbGxvd2luZyBjb2RlIGZvcmNlcyB0aGUgbG9hZCBvZiBhbGwgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMsIGp1c3QgdG8gbWFrZSBzdXJlIGphdmEgcmVmbGVjdGlvbiBkb2Vzbid0IGhhcHBlbgotICAgICAgICBMaXN0IG1vZHVsZVJlZnMgPSBlYXJGaWxlLmdldE1vZHVsZVJlZnMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVSZWZzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBNb2R1bGVSZWYgbSA9IChNb2R1bGVSZWYpIG1vZHVsZVJlZnMuZ2V0KGkpOwotICAgICAgICAgICAgbS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotICAgICAgICAgICAgCi0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgb3V0ID0gInRlc3RPdXRwdXQvU2ltcGxlVGVzdHMvc2FtcGxlLWV4cGFuZGVkLW91dDIuZWFyIjsKLSAgICAgICAgZWFyRmlsZS5leHRyYWN0VG8ob3V0LCBBcmNoaXZlLkVYUEFORF9XQVJfRklMRVMpOwotICAgICAgICBlYXJGaWxlLmNsb3NlKCk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIFZlcnkgYmFzaWMgbWV0aG9kIHRvIG9wZW4gYW4gYXJjaGl2ZSBhbmQgc2F2ZSBpdCBhcyBhIGRpcmVjdG9yeSB0byBhIG5ldyBkZXN0aW5hdGlvbi4gIFJlcXVpcmVzIHZpc3VhbCBpbnNwZWN0aW9uCi0gICAgICogZm9yIHZlcmlmaWNhdGlvbi4gIE5lc3RlZCB3YXJzIGFuZCBlamIgamFycyB3aWxsIGJlIGV4cGxvZGVkIGJ1dCBvdGhlciBuZXN0ZWQgamFycyB3aWxsIG5vdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RPcGVuQW5kRXh0cmFjdDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBTdHJpbmcgaW4gPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJzYW1wbGUuZWFyIjsKLSAgICAgICAgRUFSRmlsZSBlYXJGaWxlID0gKEVBUkZpbGUpIGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbkFyY2hpdmUoaW4pOwotICAgICAgICBTdHJpbmcgb3V0ID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAidGVzdE91dHB1dC9TaW1wbGVUZXN0cy9zYW1wbGUtZXhwYW5kZWQtb3V0My5lYXIiOwotICAgICAgICBlYXJGaWxlLmV4dHJhY3RUbyhvdXQsIEFyY2hpdmUuRVhQQU5EX1dBUl9GSUxFUyB8IEFyY2hpdmUuRVhQQU5EX0VKQkpBUl9GSUxFUyk7Ci0gICAgICAgIGVhckZpbGUuY2xvc2UoKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogT3BlbnMgYW4gZWFyIGZpbGUsIGFuZCBmb3IgZWFjaCBtb2R1bGUsIHdyaXRlcyBpdCdzIGRkIGNvbXBvbmVudHMgdG8gdGhlIGNvbnNvbGUuICBSZXF1aXJlcyB2aXN1YWwgaW5zcGVjdGlvbgotICAgICAqIGZvciB2ZXJpZmljYXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T3BlbkFuZFJlYWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBTdHJpbmcgaW4gPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJzYW1wbGUuZWFyIjsKLSAgICAgICAgRUFSRmlsZSBlYXJGaWxlID0gKEVBUkZpbGUpIGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbkFyY2hpdmUoaW4pOwotCi0gICAgICAgIEFwcGxpY2F0aW9uIGFwcGwgPSBlYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0gICAgICAgIHByaW50QXBwbFRvQ29uc29sZShhcHBsKTsKLQotICAgICAgICBMaXN0IG1vZHVsZVJlZnMgPSBlYXJGaWxlLmdldE1vZHVsZVJlZnMoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1vZHVsZVJlZnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIE1vZHVsZVJlZiBhTW9kdWxlUmVmID0gKE1vZHVsZVJlZikgbW9kdWxlUmVmcy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoYU1vZHVsZVJlZi5pc1dlYigpKSB7Ci0gICAgICAgICAgICAgICAgV2ViTW9kdWxlUmVmIHdSZWYgPSAoV2ViTW9kdWxlUmVmKSBhTW9kdWxlUmVmOwotICAgICAgICAgICAgICAgIHByaW50V2ViQXBwVG9Db25zb2xlKHdSZWYuZ2V0V2ViQXBwKCkpOwotICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYU1vZHVsZVJlZi5pc0VKQigpKSB7Ci0gICAgICAgICAgICAgICAgRUpCTW9kdWxlUmVmIGVSZWYgPSAoRUpCTW9kdWxlUmVmKSBhTW9kdWxlUmVmOwotICAgICAgICAgICAgICAgIHByaW50RUpCSmFyVG9Db25zb2xlKGVSZWYuZ2V0RUpCSmFyKCkpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIC8qKgotICAgICAqIFZlcnkgYmFzaWMgbWV0aG9kIHRvIG9wZW4gYW4gYXJjaGl2ZSBhbmQgc2F2ZSBpdCBhcyBhIGphciBmaWxlIHRvIGEgbmV3IGRlc3RpbmF0aW9uLiAgUmVxdWlyZXMgdmlzdWFsIGluc3BlY3Rpb24KLSAgICAgKiBmb3IgdmVyaWZpY2F0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE9wZW5BbmRTYXZlQXNKYXJGaWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nIGluID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAic2FtcGxlLmVhciI7Ci0gICAgICAgIEVBUkZpbGUgZWFyRmlsZSA9IChFQVJGaWxlKSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5BcmNoaXZlKGluKTsKLSAgICAgICAgU3RyaW5nIG91dCA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInRlc3RPdXRwdXQvU2ltcGxlVGVzdHMvc2FtcGxlLWNvcHkuZWFyIjsKLSAgICAgICAgZWFyRmlsZS5zYXZlQXNOb1Jlb3BlbihvdXQpOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBUZXN0IGNhc2UgY3JlYXRlZCBhcyBhIHJlc3VsdCBvZiBhIGRlZmVjdCByZXBvcnQgdGhhdCBjdXJyZW50bHkgY2Fubm90IGJlIHJlcHJvZHVjZWQ7IG9wZW4gYW4gZXhwYW5kZWQgZWFyIGZpbGUgYW5kIHNhdmUgaXQgb3V0Ci0gICAgICogYXMgYSBqYXIgZmlsZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RPcGVuRGlyZWN0b3J5QW5kU2F2ZUFzSmFyRmlsZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIFN0cmluZyBpbiA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInNhbXBsZV9leHBhbmRlZC5lYXIiOwotICAgICAgICBpbiA9IG5ldyBqYXZhLmlvLkZpbGUoaW4pLmdldEFic29sdXRlUGF0aCgpOwotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbihpbik7Ci0gICAgICAgIEVBUkZpbGUgZWFyRmlsZSA9IChFQVJGaWxlKSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5BcmNoaXZlKGluKTsKLSAgICAgICAgLy9BZGRlZCB0aGlzIGxpbmUgdG8gc2VlIGlmIGxvYWRpbmcgdGhlIGRkIHdvdWxkIG1ha2UgYSBkaWZmZXJlbmNlCi0gICAgICAgIGVhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLSAgICAgICAgU3RyaW5nIG91dCA9ICJ0ZXN0T3V0cHV0L1NpbXBsZVRlc3RzL3NhbXBsZS1qYXJyZWQuZWFyIjsKLSAgICAgICAgb3V0ID0gbmV3IGphdmEuaW8uRmlsZShvdXQpLmdldEFic29sdXRlUGF0aCgpOwotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbihvdXQpOwotICAgICAgICBlYXJGaWxlLnNhdmVBc05vUmVvcGVuKG91dCk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIEBzZWUgQXJjaGl2ZSNjYW5DbG9zZSgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFNhZmVDbG9zZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIFN0cmluZyBpbiA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInNhbXBsZS5lYXIiOwotICAgICAgICBFQVJGaWxlIGVhckZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5FQVJGaWxlKGluKTsKLSAgICAgICAgTGlzdCBtb2R1bGVzID0gZWFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldE1vZHVsZXMoKTsKLSAgICAgICAgRUpCSmFyRmlsZSBlamJKYXJGaWxlID0gbnVsbDsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1vZHVsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIE1vZHVsZSBhTW9kdWxlID0gKE1vZHVsZSkgbW9kdWxlcy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoYU1vZHVsZS5pc0VqYk1vZHVsZSgpKSB7Ci0gICAgICAgICAgICAgICAgZWpiSmFyRmlsZSA9IChFSkJKYXJGaWxlKSBlYXJGaWxlLmdldEZpbGUoYU1vZHVsZS5nZXRVcmkoKSk7Ci0gICAgICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIkVKQkphciBzcGVjIHZlcnNpb24gIiArIGVqYkphckZpbGUuZ2V0U3BlY1ZlcnNpb24oKSArICIgZGV0ZWN0ZWQuIik7Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydFRydWUoIkVKQkphckZpbGUgc2hvdWxkIG5vdCBiZSBudWxsIiwgZWpiSmFyRmlsZSAhPSBudWxsKTsKLQotICAgICAgICBFQVJGaWxlIG5ld0VhckZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUVBUkZpbGVJbml0aWFsaXplZCgidGVzdE91dHB1dC9TaW1wbGVUZXN0cy9zYWZlQ2xvc2UxLmVhciIpOwotICAgICAgICBuZXdFYXJGaWxlLmFkZENvcHkoZWpiSmFyRmlsZSk7Ci0gICAgICAgIGFzc2VydFRydWUoIWVhckZpbGUuZ2V0RGVwZW5kZW50T3BlbkFyY2hpdmVzKCkuaXNFbXB0eSgpICYmICFlamJKYXJGaWxlLmdldERlcGVuZGVudE9wZW5BcmNoaXZlcygpLmlzRW1wdHkoKSk7Ci0KLSAgICAgICAgbmV3RWFyRmlsZS5zYXZlKCk7Ci0gICAgICAgIGFzc2VydFRydWUoZWFyRmlsZS5nZXREZXBlbmRlbnRPcGVuQXJjaGl2ZXMoKS5pc0VtcHR5KCkgJiYgZWpiSmFyRmlsZS5nZXREZXBlbmRlbnRPcGVuQXJjaGl2ZXMoKS5pc0VtcHR5KCkpOwotICAgICAgICBlYXJGaWxlLmNsb3NlKCk7Ci0gICAgICAgIG5ld0VhckZpbGUuY2xvc2UoKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogQ01WQyBkZWZlY3QgOTk1NDQgLSBJZiBhIHNhdmUgZmFpbHMgYW5kIHRoZSBmaWxlIGRpZG4ndCBleGlzdCwgb25lIHNob3VsZCBub3QKLSAgICAgKiBiZSBjcmVhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFNhdmVGYWlsdXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nIGluID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAic2FtcGxlLmVhciI7Ci0gICAgICAgIFN0cmluZyBvdXQgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJ0ZXN0T3V0cHV0L1NpbXBsZVRlc3RzL3NhdmVGYWlsdXJlLmVhciI7Ci0gICAgICAgIEVBUkZpbGUgZWFyRmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbkVBUkZpbGUoaW4pOwotICAgICAgICBMaXN0IG1vZHVsZXMgPSBlYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0TW9kdWxlcygpOwotICAgICAgICBFSkJKYXJGaWxlIGVqYkphckZpbGUgPSBudWxsOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbW9kdWxlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgTW9kdWxlIGFNb2R1bGUgPSAoTW9kdWxlKSBtb2R1bGVzLmdldChpKTsKLSAgICAgICAgICAgIGlmIChhTW9kdWxlLmlzRWpiTW9kdWxlKCkpIHsKLSAgICAgICAgICAgICAgICBlamJKYXJGaWxlID0gKEVKQkphckZpbGUpIGVhckZpbGUuZ2V0RmlsZShhTW9kdWxlLmdldFVyaSgpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydFRydWUoIkVKQkphckZpbGUgc2hvdWxkIG5vdCBiZSBudWxsIiwgZWpiSmFyRmlsZSAhPSBudWxsKTsKLQotICAgICAgICBFQVJGaWxlIG5ld0VhckZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUVBUkZpbGVJbml0aWFsaXplZChvdXQpOwotICAgICAgICBuZXdFYXJGaWxlLmFkZENvcHkoZWpiSmFyRmlsZSk7Ci0gICAgICAgIGVqYkphckZpbGUuY2xvc2UoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG5ld0VhckZpbGUuc2F2ZSgpOwotICAgICAgICB9IGNhdGNoIChTYXZlRmFpbHVyZUV4Y2VwdGlvbiBleHBlY3RlZCkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFeHBlY3RlZCBzYXZlIGZhaWx1cmUgb2NjdXJyZWQiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIkZpbGUgc2hvdWxkIG5vdCBleGlzdCIsICEobmV3IGphdmEuaW8uRmlsZShvdXQpLmV4aXN0cygpKSk7Ci0gICAgICAgICAgICBnZXRBcmNoaXZlRmFjdG9yeSgpLmNsb3NlT3BlbkFyY2hpdmVzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiU2F2ZSBzaG91bGQgaGF2ZSBmYWlsZWQiLCBmYWxzZSk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIE9wZW5zIGFuIGVhciBmaWxlLCBtYWtlcyBhIGZldyBjaGFuZ2VzIHRvIGVuc3VyZSB0aGUgeG1sIGlzIG5vdCB2YWxpZCwgYW5kIHZhbGlkYXRlcyB0aGUgeG1sIGluIGFsbCB0aGUgZGRzOyB2ZXJpZmllcyB0aGF0Ci0gICAgICogc2F4IGV4Y2VwdGlvbnMgYXJlIGNvbGxlY3RlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RYbWxWYWxpZGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nIGluID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAic2FtcGxlLmVhciI7Ci0gICAgICAgIEVBUkZpbGUgZWFyRmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbkVBUkZpbGUoaW4pOwotCi0gICAgICAgIEFwcGxpY2F0aW9uIGFwcGwgPSBlYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0gICAgICAgIGFwcGwuZ2V0U2VjdXJpdHlSb2xlcygpLmFkZChDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21tb25GYWN0b3J5KCkuY3JlYXRlU2VjdXJpdHlSb2xlKCkpOwotCi0gICAgICAgIExpc3QgbW9kdWxlRmlsZXMgPSBlYXJGaWxlLmdldE1vZHVsZUZpbGVzKCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVGaWxlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgTW9kdWxlRmlsZSBhTW9kdWxlRmlsZSA9IChNb2R1bGVGaWxlKSBtb2R1bGVGaWxlcy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoYU1vZHVsZUZpbGUuaXNXQVJGaWxlKCkpIHsKLSAgICAgICAgICAgICAgICBXQVJGaWxlIGFXYXJGaWxlID0gKFdBUkZpbGUpIGFNb2R1bGVGaWxlOwotICAgICAgICAgICAgICAgIGFXYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0U2VydmxldHMoKS5hZGQoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJhcHBsaWNhdGlvbkZhY3RvcnkoKS5jcmVhdGVTZXJ2bGV0KCkpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhTW9kdWxlRmlsZS5pc0VKQkphckZpbGUoKSkgewotICAgICAgICAgICAgICAgIEVKQkphckZpbGUgYW5FamJKYXJGaWxlID0gKEVKQkphckZpbGUpIGFNb2R1bGVGaWxlOwotICAgICAgICAgICAgICAgIGFuRWpiSmFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldEVudGVycHJpc2VCZWFucygpLmFkZChFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFamJGYWN0b3J5KCkuY3JlYXRlRW50aXR5KCkpOwotICAgICAgICAgICAgICAgIGFuRWpiSmFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldEFzc2VtYmx5RGVzY3JpcHRvcigpLmdldFNlY3VyaXR5Um9sZXMoKS5hZGQoQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uRmFjdG9yeSgpLmNyZWF0ZVNlY3VyaXR5Um9sZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBDb21tYW5kIGNtZCA9IG5ldyBWYWxpZGF0ZVhtbENvbW1hbmQoZWFyRmlsZSk7Ci0gICAgICAgIGNtZC5leGVjdXRlKCk7Ci0gICAgICAgIExpc3QgZXJyb3JzID0gKExpc3QpIGNtZC5nZXRSZXN1bHQoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVG90YWwgdmFsaWRhdGlvbiBlcnJvcnMgc2hvdWxkIGJlIDMsIGluc3RlYWQgb2YgIitlcnJvcnMuc2l6ZSgpLCBlcnJvcnMuc2l6ZSgpID09IDMpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotICAgICAgICAgICAgWG1sVmFsaWRhdGlvblJlc3VsdCByZXN1bHQgPSAoWG1sVmFsaWRhdGlvblJlc3VsdCkgZXJyb3JzLmdldChpKTsKLSAgICAgICAgICAgIGlmIChpID09IDEpCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGVqYiBtb2R1bGUgc2hvdWxkIGhhdmUgMiBlcnJvcnMgaW5zdGVhZCBvZiAiKyByZXN1bHQuZ2V0Q2F1Z2h0RXhjZXB0aW9ucygpLnNpemUoKSwgcmVzdWx0LmdldENhdWdodEV4Y2VwdGlvbnMoKS5zaXplKCkgPT0gMik7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHdlYiBtb2R1bGUgc2hvdWxkIGhhdmUgMSBlcnJvciBpbnN0ZWFkIG9mICIrIHJlc3VsdC5nZXRDYXVnaHRFeGNlcHRpb25zKCkuc2l6ZSgpLCByZXN1bHQuZ2V0Q2F1Z2h0RXhjZXB0aW9ucygpLnNpemUoKSA9PSAxKTsKLSAgICAgICAgfQotICAgICAgICBlYXJGaWxlLmNsb3NlKCk7Ci0gICAgfQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIEFyY2hpdmVJbml0LmluaXQoKTsKLSAgICB9Ci0gICAgCi0gICAJcHVibGljIHZvaWQgdGVzdFJlYWRFbXB0eVRhZ3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgIAkJU3RyaW5nIHVyaSA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgIkNIS0oyODBYLmphciI7Ci0gICAJCUVKQkphckZpbGUgamFyZmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbkVKQkphckZpbGUodXJpKTsKLSAgIAkJRUpCSmFyIGphciA9IGphcmZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLSAgIAkJU2Vzc2lvbiBzZXNzID0gKFNlc3Npb24pIGphci5nZXRFbnRlcnByaXNlQmVhbnMoKS5nZXQoMCk7Ci0gICAJCUVudGl0eSBlbnRpdHkgPSAoRW50aXR5KSBqYXIuZ2V0RW50ZXJwcmlzZUJlYW5zKCkuZ2V0KDEpOwotICAgCQlhc3NlcnRGYWxzZSgiVmFsdWUgc2hvdWxkIGJlIHVuc2V0IiwgZW50aXR5LmlzU2V0UmVlbnRyYW50KCkpOwotCQlhc3NlcnRGYWxzZSgiVmFsdWUgc2hvdWxkIGJlIHVuc2V0Iiwgc2Vzcy5pc1NldFNlc3Npb25UeXBlKCkpOwotCQlhc3NlcnRGYWxzZSgiVmFsdWUgc2hvdWxkIGJlIHVuc2V0Iiwgc2Vzcy5pc1NldFRyYW5zYWN0aW9uVHlwZSgpKTsgCi19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvVGVzdEludmFsaWRYbWxNdWx0aXBsaWNpdHkuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9UZXN0SW52YWxpZFhtbE11bHRpcGxpY2l0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzhkY2VkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9UZXN0SW52YWxpZFhtbE11bHRpcGxpY2l0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gRGVjIDIsIDIwMDMKLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC5zd2luZ3VpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5XQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5EZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5idnQuQXV0b21hdGVkQlZUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLklXcmFwcGVkRXhjZXB0aW9uOwotCi0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdEludmFsaWRYbWxNdWx0aXBsaWNpdHkgZXh0ZW5kcyBBYnN0cmFjdEFyY2hpdmVUZXN0IHsKLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIFRlc3RJbnZhbGlkWG1sTXVsdGlwbGljaXR5KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFN0YXJ0cyB0aGUgYXBwbGljYXRpb24uCi0JICogQHBhcmFtIGFyZ3MgYW4gYXJyYXkgb2YgY29tbWFuZC1saW5lIGFyZ3VtZW50cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKGphdmEubGFuZy5TdHJpbmdbXSBhcmdzKSB7Ci0JCVN0cmluZ1tdIGNsYXNzTmFtZSA9IHsgImNvbS5pYm0uZXRvb2xzLmFyY2hpdmUudGVzdC5UZXN0SW52YWxpZFhtbE11bHRpcGxpY2l0eSIsICItbm9sb2FkaW5nIiB9OwotCQlUZXN0UnVubmVyLm1haW4oY2xhc3NOYW1lKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoVGVzdEludmFsaWRYbWxNdWx0aXBsaWNpdHkuY2xhc3MpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0MSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgdXJpID0gIEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgIkJhZEpzcENvbmZpZy53YXIiOwotCQlydW5UZXN0KHVyaSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3QyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB1cmkgPSAgQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAiQmFkTG9naW5Db25maWcud2FyIjsKLQkJcnVuVGVzdCh1cmkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0MygpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgdXJpID0gIEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgIkJhZFNlc3Npb25Db25maWcud2FyIjsKLQkJcnVuVGVzdCh1cmkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBydW5UZXN0KFN0cmluZyB1cmkpIHRocm93cyBFeGNlcHRpb24gewotCQlJV3JhcHBlZEV4Y2VwdGlvbiBleCA9IG51bGw7Ci0JCVdBUkZpbGUgd2FyID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuV0FSRmlsZSh1cmkpOwotCQl0cnkgewotCQkJd2FyLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JCX0gY2F0Y2ggKERlcGxveW1lbnREZXNjcmlwdG9yTG9hZEV4Y2VwdGlvbiBkZGV4KSB7Ci0JCQlleCA9IGRkZXg7Ci0JCX0KLQkJYXNzZXJ0Tm90TnVsbCgiRXhjZXB0aW9uIHNob3VsZCBoYXZlIGJlZW4gY2F1Z2h0IiwgZXgpOwotCQlFeGNlcHRpb24gaW5uZXIgPSBleC5nZXROZXN0ZWRFeGNlcHRpb24oKTsKLQkJCi0JCXdoaWxlIChleCAhPSBudWxsKSB7Ci0JCQlpZiAoaW5uZXIgaW5zdGFuY2VvZiBJV3JhcHBlZEV4Y2VwdGlvbikgewotCQkJCWV4ID0gKElXcmFwcGVkRXhjZXB0aW9uKWlubmVyOwotCQkJCWlmIChleC5nZXROZXN0ZWRFeGNlcHRpb24oKSAhPSBudWxsKQotCQkJCQlpbm5lciA9IGV4LmdldE5lc3RlZEV4Y2VwdGlvbigpOwotCQkJfSBlbHNlIAotCQkJCWV4ID0gbnVsbDsKLQkJfQotCQkKLQkJYXNzZXJ0VHJ1ZSgiVGhlIGV4Y2VwdGlvbiBzaG91bGQgYmUgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIiwgaW5uZXIgaW5zdGFuY2VvZiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24pOwotCQl3YXIuY2xvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvVGVzdE1vZHVsZUNsYXNzTG9hZGluZy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L1Rlc3RNb2R1bGVDbGFzc0xvYWRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVjN2NlNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvVGVzdE1vZHVsZUNsYXNzTG9hZGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLnRlc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LnN3aW5ndWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFDbGFzc0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGwuQ29tbW9uYXJjaGl2ZUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMuYnZ0LkF1dG9tYXRlZEJWVDsKLQotCi1wdWJsaWMgY2xhc3MgVGVzdE1vZHVsZUNsYXNzTG9hZGluZyBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBzdGF0aWMgU3RyaW5nIHRlc3RDbGFzcyA9ICJjbGllbnQuU3VidHJhY3QiOwotICAgIAotICAgIAotICAgIAotICAgIC8qKgotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBUZXN0TW9kdWxlQ2xhc3NMb2FkaW5nKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBUZXN0TW9kdWxlQ2xhc3NMb2FkaW5nKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotCXB1YmxpYyBDb21tb25hcmNoaXZlRmFjdG9yeSBnZXRBcmNoaXZlRmFjdG9yeSgpIHsKLQkJcmV0dXJuIENvbW1vbmFyY2hpdmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21tb25hcmNoaXZlRmFjdG9yeSgpOwotCX0KLQkvKioKLQkgKiBTdGFydHMgdGhlIGFwcGxpY2F0aW9uLgotCSAqIEBwYXJhbSBhcmdzIGFuIGFycmF5IG9mIGNvbW1hbmQtbGluZSBhcmd1bWVudHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihqYXZhLmxhbmcuU3RyaW5nW10gYXJncykgewotCQlTdHJpbmdbXSBjbGFzc05hbWUgPSB7ImNvbS5pYm0uZXRvb2xzLmFyY2hpdmUudGVzdC5UZXN0TW9kdWxlQ2xhc3NMb2FkaW5nIiwgIi1ub2xvYWRpbmcifTsKLQkJVGVzdFJ1bm5lci5tYWluKGNsYXNzTmFtZSk7Ci0JfQotCXB1YmxpYyBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKFRlc3RNb2R1bGVDbGFzc0xvYWRpbmcuY2xhc3MpOwotCX0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdEFkZE1vZHVsZUNsYXNzTG9hZGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmdbXSBmaWxlcyA9IHsgIlBST1RPLmVhciIsIlNFSWluQW5vdGhlckphci5lYXIiLCAiU0VJaW5XRUItSU5GX2xpYl9qYXIuZWFyIiB9OwotCi0gICAgICAgIGlmIChmaWxlcy5sZW5ndGggPT0gMCkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZTogYXJncyBzcGVjaWZ5IGZ1bGwgcGF0aCB0byBlYXIgZmlsZXMuIik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgLy8gY29tLmlibS53ZWJzcGhlcmUubW9kZWxzLmNvbmZpZy5pbml0LkNvbmZpZ0luaXQuaW5pdCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBmaWxlc1tpXTsgICAKLQkJCUNvbW1vbmFyY2hpdmVGYWN0b3J5IGZhY3RvcnkgPSBDb21tb25hcmNoaXZlRmFjdG9yeUltcGwuZ2V0QWN0aXZlRmFjdG9yeSgpOwotCi0JCQlTdHJpbmcgaW4gPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArIGZpbGVzW2ldOwotICAgICAgICAgICAgdHJ5IHsKLQkJCQlFQVJGaWxlIGVhckZpbGUgPSBmYWN0b3J5Lm9wZW5FQVJGaWxlIChpbik7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuICgidXJpOiAiICsgZWFyRmlsZS5nZXRVUkkoKSk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJUZXN0aW5nICIgKyBlYXJGaWxlLmdldFVSSSgpKTsKLSAgICAgICAgICAgICAgICBkb01vZHVsZXMoZWFyRmlsZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBkb01vZHVsZXMoRUFSRmlsZSBlYXJGaWxlKSB7Ci0JCUxpc3QgbW9kdWxlcyA9IGVhckZpbGUuZ2V0TW9kdWxlRmlsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlBcmNoaXZlIG1vZHVsZSA9IChBcmNoaXZlKSBtb2R1bGVzLmdldChpKTsKLQkJCVN5c3RlbS5vdXQucHJpbnQoIlx0TG9va2luZyBmb3IgY2xhc3MgIiArIHRlc3RDbGFzcyArICIgaW4gbW9kdWxlICIgKyBtb2R1bGUuZ2V0VVJJKCkpOwotCQkJZG9Mb2FkKG1vZHVsZSwgdGVzdENsYXNzKTsKLQkJfQotCX0gLy8gdmFsaWRhdGVNb2R1bGVzCi0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGRvTG9hZChBcmNoaXZlIG1vZHVsZSwgU3RyaW5nIHRlc3RDbGFzcykgewotCQl0cnkgewotCQkJSmF2YUNsYXNzIGphdmFDbGFzcyA9Ci0JCQkJKEphdmFDbGFzcykgSmF2YUNsYXNzSW1wbC5yZWZsZWN0KHRlc3RDbGFzcywgbW9kdWxlLmdldFJlc291cmNlU2V0KCkpOwotCQkJaWYgKCEoamF2YUNsYXNzKS5pc0V4aXN0aW5nVHlwZSgpKSB7Ci0JCQkJLy8gVGhpcyBpcyB3aGF0IGhhcHBlbnMgaWYgdGhlIGNsYXNzIGNhbid0IGJlIGxvYWRlZC4KLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0gTk9UIEZPVU5EIC0gaXNFeGlzdGluZ1R5cGUgcmV0dXJucyBmYWxzZS4iKTsKLQkJCX0gZWxzZSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIgLSBmb3VuZDogaXNFeGlzdGluZ1R5cGUgcmV0dXJucyB0cnVlLiIpOwotCQkJfQotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvV0FSRmlsZVRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvV0FSRmlsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3YzEyNmUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L1dBUkZpbGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0OwotCi0gLyoKLSAqIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNCi0gKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAxIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUKLSAqIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLgotICovCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LnN3aW5ndWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5SZWFkT25seURpcmVjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5XQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsLkFyY2hpdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMuYnZ0LkF1dG9tYXRlZEJWVDsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDEyLzE1LzAwIDI6MjY6MDQgUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBXQVJGaWxlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAxLiI7Ly8kTk9OLU5MUy0xJAotLyoqCi0gKiBXQVJGaWxlVGVzdHMgY29uc3RydWN0b3IgY29tbWVudC4KLSAqIEBwYXJhbSBuYW1lIGphdmEubGFuZy5TdHJpbmcKLSAqLwotcHVibGljIFdBUkZpbGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotcHVibGljIENvbW1vbmFyY2hpdmVGYWN0b3J5IGdldEFyY2hpdmVGYWN0b3J5KCkgewotCXJldHVybiBDb21tb25hcmNoaXZlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uYXJjaGl2ZUZhY3RvcnkoKTsKLX0KLS8qKgotICogU3RhcnRzIHRoZSBhcHBsaWNhdGlvbi4KLSAqIEBwYXJhbSBhcmdzIGFuIGFycmF5IG9mIGNvbW1hbmQtbGluZSBhcmd1bWVudHMKLSAqLwotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oamF2YS5sYW5nLlN0cmluZ1tdIGFyZ3MpIHsKLQlTdHJpbmdbXSBjbGFzc05hbWUgPSB7ImNvbS5pYm0uZXRvb2xzLmFyY2hpdmUudGVzdC5XQVJGaWxlVGVzdHMiLCAiLW5vbG9hZGluZyJ9OwotCVRlc3RSdW5uZXIubWFpbihjbGFzc05hbWUpOwotfQotcHVibGljIHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuVGVzdCBzdWl0ZSgpIHsKLQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShXQVJGaWxlVGVzdHMuY2xhc3MpOwotfQotcHVibGljIHZvaWQgdGVzdEFkZENvcHlDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCi0JV0FSRmlsZSBhV2FyRmlsZSA9IChXQVJGaWxlKWdldEFyY2hpdmVGYWN0b3J5KCkub3BlbkFyY2hpdmUoQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyJleGFtcGxlMi53YXIiKTsKLQotCVJlYWRPbmx5RGlyZWN0b3J5IHNhbXBsZURpcmVjdG9yeSA9IGdldEFyY2hpdmVGYWN0b3J5KCkub3BlblJlYWRPbmx5RGlyZWN0b3J5KEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsiV2FyVGVzdENsYXNzZXMiKTsKLQotCWludCBpbml0aWFsU2l6ZSA9IGFXYXJGaWxlLmdldENsYXNzZXMoKS5zaXplKCk7Ci0KLQlGaWxlIGFGaWxlID0gc2FtcGxlRGlyZWN0b3J5LmdldEZpbGVJblNlbGZPclN1YmRpcmVjdG9yeSgiY29tL2libS9ldG9vbHMvYXJjaGl2ZS90ZXN0L1dBUkZpbGVUZXN0cy5jbGFzcyIpOwotCi0JYVdhckZpbGUuYWRkQ29weUNsYXNzKGFGaWxlKTsKLQlhc3NlcnRUcnVlKGFXYXJGaWxlLmdldENsYXNzZXMoKS5zaXplKCkgPT0gaW5pdGlhbFNpemUrMSk7Ci0KLQlTdHJpbmcgY2xhc3NVUkkgPSBBcmNoaXZlVXRpbC5jb25jYXRVcmkoQXJjaGl2ZUNvbnN0YW50cy5XRUJBUFBfQ0xBU1NFU19VUkksIGFGaWxlLmdldFVSSSgpLCAnLycpOwotCWFzc2VydFRydWUoYVdhckZpbGUuY29udGFpbnNGaWxlKGNsYXNzVVJJKSk7Ci0JLy9TeXN0ZW0ub3V0LnByaW50bG4oYVdhckZpbGUuZ2V0VVJJKCkrIiBjb250YWlucyBjbGFzcyAiK2NsYXNzVVJJKTsKLQotCWFXYXJGaWxlLnNhdmVBc05vUmVvcGVuKEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsidGVzdE91dHB1dC9XYXJUZXN0cy9hZGRDb3B5Q2xhc3Mud2FyIik7Ci0KLX0KLQkKLXB1YmxpYyB2b2lkIHRlc3RBZGRDb3B5TGliKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQlXQVJGaWxlIGFXYXJGaWxlID0gKFdBUkZpbGUpZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuQXJjaGl2ZShBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJleGFtcGxlMi53YXIiKTsKLQotCUFyY2hpdmUgbGliID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuQXJjaGl2ZShBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJmb28uamFyIik7Ci0KLQlpbnQgaW5pdGlhbFNpemUgPSBhV2FyRmlsZS5nZXRMaWJzKCkuc2l6ZSgpOwotCi0JYVdhckZpbGUuYWRkQ29weUxpYihsaWIpOwotCWFzc2VydFRydWUoYVdhckZpbGUuZ2V0TGlicygpLnNpemUoKSA9PSBpbml0aWFsU2l6ZSsxKTsKLQotCVN0cmluZyBsaWJVUkkgPSBBcmNoaXZlVXRpbC5jb25jYXRVcmkoQXJjaGl2ZUNvbnN0YW50cy5XRUJBUFBfTElCX1VSSSwgbGliLmdldFVSSSgpLCAnLycpOwotCWFzc2VydFRydWUoYVdhckZpbGUuY29udGFpbnNGaWxlKGxpYlVSSSkpOwotCS8vU3lzdGVtLm91dC5wcmludGxuKGFXYXJGaWxlLmdldFVSSSgpKyIgY29udGFpbnMgbGliICIrbGliVVJJKTsKLQotCWFXYXJGaWxlLnNhdmVBc05vUmVvcGVuKCJ0ZXN0T3V0cHV0L1dhclRlc3RzL2FkZENvcHlMaWIud2FyIik7Ci0KLX0KLQkKLXB1YmxpYyB2b2lkIHRlc3RMaXN0Q2xhc3Nlc0FuZExpYnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCVdBUkZpbGUgYVdhckZpbGUgPSAoV0FSRmlsZSlnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5BcmNoaXZlKEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgImV4YW1wbGUyLndhciIpOwotCi0JTGlzdCBsaWJzID0gYVdhckZpbGUuZ2V0TGlicygpOwotCUxpc3QgY2xhc3NlcyA9IGFXYXJGaWxlLmdldENsYXNzZXMoKTsKLQlMaXN0IHJlc291cmNlcyA9IGFXYXJGaWxlLmdldFJlc291cmNlcygpOwotLy8JU3lzdGVtLm91dC5wcmludGxuKCJXQVIgc3BlYyB2ZXJzaW9uICIrYVdhckZpbGUuZ2V0U3BlY1ZlcnNpb24oKSsiIGRldGVjdGVkLiIpOwotLy8JU3lzdGVtLm91dC5wcmludGxuKCJleGFtcGxlMi53YXIgY29udGFpbnMgIitjbGFzc2VzLnNpemUoKSsgIiBmaWxlcyBpbiBjbGFzc2VzIik7Ci0vLwlTeXN0ZW0ub3V0LnByaW50bG4oImV4YW1wbGUyLndhciBjb250YWlucyAiK2xpYnMuc2l6ZSgpKyAiIGxpYnMiKTsKLS8vCVN5c3RlbS5vdXQucHJpbnRsbigiZXhhbXBsZTIud2FyIGNvbnRhaW5zICIrcmVzb3VyY2VzLnNpemUoKSsgIiByZXNvdXJjZXMiKTsKLQotfQotCQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0dXRpbGl0aWVzL0VBdHRyaWJ1dGVEZXNjcmlwdG9yLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3R1dGlsaXRpZXMvRUF0dHJpYnV0ZURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg1MDA3OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3R1dGlsaXRpZXMvRUF0dHJpYnV0ZURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIE1heSAxLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0dXRpbGl0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi0vKioKLSAqIEBhdXRob3IgYWRtaW5pc3RyYXRvcgotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBFQXR0cmlidXRlRGVzY3JpcHRvciB7Ci0JCi0JRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmU7Ci0JRUNsYXNzIG1ldGFDbGFzczsKLQkKLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZURlc2NyaXB0b3IoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIEVDbGFzcyBtZXRhQ2xhc3MpIHsKLQkJdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsKLQkJdGhpcy5tZXRhQ2xhc3MgPSBtZXRhQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWV0YUNsYXNzKCkgewotCQlyZXR1cm4gbWV0YUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjbGFzczEKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXRhQ2xhc3MoRUNsYXNzIGNsYXNzMSkgewotCQltZXRhQ2xhc3MgPSBjbGFzczE7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7Ci0JCUVBdHRyaWJ1dGVEZXNjcmlwdG9yIG8gPSAoRUF0dHJpYnV0ZURlc2NyaXB0b3Ipb2JqZWN0OwotCQlyZXR1cm4gby5nZXRGZWF0dXJlKCkgPT0gZ2V0RmVhdHVyZSgpICYmIG8uZ2V0TWV0YUNsYXNzKCkgPT0gZ2V0TWV0YUNsYXNzKCk7Ci0JfQotCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIGZlYXR1cmUuaGFzaENvZGUoKSBeIG1ldGFDbGFzcy5oYXNoQ29kZSgpOwotCX0KLQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RmVhdHVyZSgpIHsKLQkJcmV0dXJuIGZlYXR1cmU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGF0dHJpYnV0ZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZlYXR1cmUoRUF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLQkJdGhpcy5mZWF0dXJlID0gYXR0cmlidXRlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0dXRpbGl0aWVzL0VNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3IuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdHV0aWxpdGllcy9FTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0M2Y5MTUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0dXRpbGl0aWVzL0VNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxMyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUudGVzdHV0aWxpdGllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhQ2xhc3NJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLQotcHVibGljIGNsYXNzIEVNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3IgewotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGF2Q2xhc3NbXTsKLQlwcm90ZWN0ZWQgc3RhdGljIGludCBjb3VudCA9IDA7Ci0JcHJvdGVjdGVkIHN0YXRpYyBSYW5kb20gcmFuZG9tR2VuZXJhdG9yID0gbmV3IFJhbmRvbSgpOwotCXByb3RlY3RlZCBzdGF0aWMgaW50IG1heE51bWJlck9mUHJvamVjdHNDcmVhdGVkID0gMTAwMDsKLQlwcm90ZWN0ZWQgc3RhdGljIE1hcCBlbnVtTWFwID0gbmV3IEhhc2hNYXAoKTsKLQlwcm90ZWN0ZWQgc3RhdGljIGludCBwYXJhbUNvdW50OwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nW10gbGFuZ0FycmF5ID0gbmV3IFN0cmluZ1tdIHsgIkVOIiwiRlIiLCJERSIsIkpQIiwiQ04iLCJCUiIsIlNQIn07Ci0JcHJvdGVjdGVkIHN0YXRpYyBpbnQgbGFuZ0NvdW50ID0gMDsgIAotCXByb3RlY3RlZCBzdGF0aWMgTWFwIGJvb2xlYW5NYXAgPSBuZXcgSGFzaE1hcCgpOwotCXByb3RlY3RlZCBzdGF0aWMgTWFwIGF0dEluZGV4ID0gbmV3IEhhc2hNYXAoKTsKLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gc3BlY2lhbE51bWJlckdlbiA9IGZhbHNlOwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGh0dHBBcnJheVtdID0gbnVsbDsKLQlwcm90ZWN0ZWQgc3RhdGljIGludCBodHRwQXJyYXlJbmRleCA9IDA7Ci0JCi0JcHVibGljIHN0YXRpYyBpbnQgdmVyc2lvbjsKLQlwdWJsaWMgc3RhdGljIGludCBtb2R1bGVUeXBlOwotCS8vc3RhdGljIHZlcnNpb25zCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkVSU0lPTl8xXzIgPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZFUlNJT05fMV8zID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWRVJTSU9OXzFfNCA9IDI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUFBJQ0FUSU9OID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUFBfQ0xJRU5UID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05ORUNUT1IgPSAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVKQiA9IDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0VCID0gNDsKLQkKLSAgICBwdWJsaWMgRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvcigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlc2V0Q291bnQoKSB7Ci0gICAgCWNvdW50ID0gMDsKLSAgICAJcmV0dXJuOwotICAgIH0KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVBdHRyaWJ1dGUoRUF0dHJpYnV0ZSBhdHQsIEVPYmplY3Qgb2JqKXsKLQkJcmV0dXJuIGNyZWF0ZUF0dHJpYnV0ZShuZXcgRUF0dHJpYnV0ZURlc2NyaXB0b3IoYXR0LG9iai5lQ2xhc3MoKSkpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVBdHRyaWJ1dGUoRUF0dHJpYnV0ZSBhdHQsIEVDbGFzcyBlQ2xhc3MpewotCQlyZXR1cm4gY3JlYXRlQXR0cmlidXRlKG5ldyBFQXR0cmlidXRlRGVzY3JpcHRvcihhdHQsZUNsYXNzKSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZUF0dHJpYnV0ZShFQXR0cmlidXRlIGF0dCwgRU9iamVjdCBvYmosIGJvb2xlYW4gc3BlY2lhbCl7Ci0JCXNwZWNpYWxOdW1iZXJHZW4gPSBzcGVjaWFsOwotCQlyZXR1cm4gY3JlYXRlQXR0cmlidXRlKG5ldyBFQXR0cmlidXRlRGVzY3JpcHRvcihhdHQsb2JqLmVDbGFzcygpKSk7Ci0JfQotCQkJCi0JcHVibGljIHN0YXRpYyBPYmplY3QgY3JlYXRlQXR0cmlidXRlKEVBdHRyaWJ1dGUgYXR0LCBFT2JqZWN0IG9iaiwgIGJvb2xlYW4gc3BlY2lhbCwgaW50IHZlciwgaW50IG1vZFR5cGUpIHsKLQkgICBzcGVjaWFsTnVtYmVyR2VuID0gc3BlY2lhbDsKLQkgICB2ZXJzaW9uID0gdmVyOwotCSAgIG1vZHVsZVR5cGUgPSBtb2RUeXBlOwotCSAgIHJldHVybiBjcmVhdGVBdHRyaWJ1dGUobmV3IEVBdHRyaWJ1dGVEZXNjcmlwdG9yKGF0dCxvYmouZUNsYXNzKCkpKTsKLSAgIH0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgT2JqZWN0IGNyZWF0ZUF0dHJpYnV0ZShFQXR0cmlidXRlRGVzY3JpcHRvciBhdHQpIHsKLQkJRUNsYXNzaWZpZXIgbWV0YSA9IGF0dC5nZXRGZWF0dXJlKCkuZ2V0RVR5cGUoKTsKLQkJaWYgKG1ldGEgaW5zdGFuY2VvZiBFRW51bSAmJiBhdHQuZ2V0RmVhdHVyZSgpLmlzTWFueSgpKXsKLQkJCUxpc3QgY29sbGVjdGlvbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNvbGxlY3Rpb24uYWRkKGNyZWF0ZUVudW0oYXR0KSk7Ci0JCQlyZXR1cm4gY29sbGVjdGlvbjsKLQkJfQotCQllbHNlIGlmIChtZXRhIGluc3RhbmNlb2YgRUVudW0pCi0JCQlyZXR1cm4gY3JlYXRlRW51bShhdHQpOwotCQllbHNlIGlmICgodmVyc2lvbiA9PSBWRVJTSU9OXzFfMyB8fCB2ZXJzaW9uID09IFZFUlNJT05fMV8yKSAmJiBhdHQuZ2V0RmVhdHVyZSgpLmVxdWFscyhXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEhUVFBNZXRob2RUeXBlX0h0dHBNZXRob2QoKSkpCi0JCQlyZXR1cm4gY3JlYXRlU3BlY2lhbEh0dHBNZXRob2RzRm9yMTMoKTsKLQkJZWxzZSBpZiAodmVyc2lvbiA9PSBWRVJTSU9OXzFfMyAmJiBhdHQuZ2V0RmVhdHVyZSgpLmVxdWFscyhDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRFSkJMb2NhbFJlZl9Mb2NhbCgpKSkKLQkJCXJldHVybiBnZW5lcmF0ZVJhbmRvbUF0dHJpYnV0ZVN0cmluZyhuZXcgRUF0dHJpYnV0ZURlc2NyaXB0b3IoQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RWpiUmVmX1JlbW90ZSgpLCBhdHQuZ2V0TWV0YUNsYXNzKCkpKTsKLQkJZWxzZSBpZiAodmVyc2lvbiA9PSBWRVJTSU9OXzFfMyAmJiBhdHQuZ2V0RmVhdHVyZSgpLmVxdWFscyhDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRFSkJMb2NhbFJlZl9Mb2NhbEhvbWUoKSkpCi0JCQlyZXR1cm4gZ2VuZXJhdGVSYW5kb21BdHRyaWJ1dGVTdHJpbmcobmV3IEVBdHRyaWJ1dGVEZXNjcmlwdG9yKENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldEVqYlJlZl9Ib21lKCksYXR0LmdldE1ldGFDbGFzcygpKSk7Ci0JCWVsc2UgaWYgKGF0dC5nZXRGZWF0dXJlKCkuZ2V0TmFtZSgpLmVxdWFscygicGFybXMiKSkKLQkJCXJldHVybiBjcmVhdGVQYXJhbXMoYXR0KTsKLQkJZWxzZSBpZiAoYXR0LmdldEZlYXR1cmUoKS5nZXROYW1lKCkuc3RhcnRzV2l0aCgibG9jYXRpb24iKSAmJiB2ZXJzaW9uID09IFZFUlNJT05fMV80KQotCQkJcmV0dXJuIGNyZWF0ZUxvY2F0aW9uKGF0dCk7Ci0JCWVsc2UgaWYgKGF0dC5nZXRGZWF0dXJlKCkuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoImxvY2FsZSIpICYmIHZlcnNpb24gPT0gVkVSU0lPTl8xXzQpCi0JCQlyZXR1cm4gY3JlYXRlTG9jYWxlKCk7Ci0JCWVsc2UgaWYgKGF0dC5nZXRGZWF0dXJlKCkuZ2V0TmFtZSgpLmVxdWFscygibGFuZyIpKQotCQkJcmV0dXJuIGNyZWF0ZUxhbmcoYXR0KTsKLQkJZWxzZSBpZiAoYXR0LmdldEZlYXR1cmUoKS5nZXROYW1lKCkuZXF1YWxzKCJ2ZXJzaW9uIikpCi0JCQlpZiAoYXR0LmdldEZlYXR1cmUoKSA9PSBFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250YWluZXJNYW5hZ2VkRW50aXR5X1ZlcnNpb24oKSkgCi0JCQkJcmV0dXJuICIyLngiOwotCQkJZWxzZQotCQkJCXJldHVybiBjcmVhdGVWZXJzaW9uKGF0dCk7Ci0JCWVsc2UgaWYgKGF0dC5nZXRGZWF0dXJlKCkuZ2V0TmFtZSgpLmVxdWFscygibWltZVR5cGUiKSAmJiB2ZXJzaW9uID09IFZFUlNJT05fMV80KQotCQkJcmV0dXJuICJ0ZXh0L3BsYWluIjsKLQkJZWxzZSBpZiAoYXR0LmdldEZlYXR1cmUoKS5nZXROYW1lKCkuZXF1YWxzKCJlcnJvckNvZGUiKSAmJiB2ZXJzaW9uID09IFZFUlNJT05fMV80KQotCQkJcmV0dXJuICI0MDQiOwotCQllbHNlIGlmIChhdHQuZ2V0RmVhdHVyZSgpLmdldE5hbWUoKS5lcXVhbHMoImZvcm1Mb2dpblBhZ2UiKSAmJiB2ZXJzaW9uID09IFZFUlNJT05fMV80KQotCQkJcmV0dXJuICIvdGVzdEZvcm1Mb2dpblBhZ2UiOwotCQllbHNlIGlmIChhdHQuZ2V0RmVhdHVyZSgpLmdldE5hbWUoKS5lcXVhbHMoImZvcm1FcnJvclBhZ2UiKSAmJiB2ZXJzaW9uID09IFZFUlNJT05fMV80KQotCQkJcmV0dXJuICIvdGVzdEZvcm1FcnJvcnBhZ2UiOwotCQllbHNlIGlmKGF0dC5nZXRGZWF0dXJlKCkuZ2V0TmFtZSgpLmVxdWFscygibGluayIpICYmIHZlcnNpb24gPT0gVkVSU0lPTl8xXzQpCi0JCQlyZXR1cm4gInJvbGVOYW1lXzAiOwotCQllbHNlIGlmKGF0dC5nZXRGZWF0dXJlKCkuZ2V0TmFtZSgpLmVxdWFscygic3BlY1ZlcnNpb24iKSAmJiB2ZXJzaW9uID09IFZFUlNJT05fMV80KQotCQkJcmV0dXJuICIxLjUiOwotCQllbHNlIGlmIChhdHQuZ2V0RmVhdHVyZSgpLmlzTWFueSgpKQotCQkJcmV0dXJuIGNyZWF0ZUNvbGxlY3Rpb24oYXR0KTsKLQkJc3dpdGNoIChtZXRhLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIEVjb3JlUGFja2FnZS5FU1RSSU5HOgotCQkJCXJldHVybiBnZW5lcmF0ZVJhbmRvbUF0dHJpYnV0ZVN0cmluZyhhdHQpOwotCQkJY2FzZSBFY29yZVBhY2thZ2UuRUJPT0xFQU5fT0JKRUNUOgotCQkJY2FzZSBFY29yZVBhY2thZ2UuRUJPT0xFQU46Ci0JCQkJcmV0dXJuIGdlbmVyYXRlUmFuZG9tQm9vbGVhbihhdHQpOwotCQkJY2FzZSBFY29yZVBhY2thZ2UuRUlOVEVHRVJfT0JKRUNUOgotCQkJY2FzZSBFY29yZVBhY2thZ2UuRUlOVDoKLQkJCQlyZXR1cm4gZ2VuZXJhdGVSYW5kb21JbnRlZ2VyKGF0dCk7Ci0JCQljYXNlIEVjb3JlUGFja2FnZS5FRkxPQVRfT0JKRUNUOgotCQkJY2FzZSBFY29yZVBhY2thZ2UuRUZMT0FUOgotCQkJCXJldHVybiBnZW5lcmF0ZVJhbmRvbUZsb2F0KGF0dCk7Ci0JCQljYXNlIEVjb3JlUGFja2FnZS5FQ0hBUkFDVEVSX09CSkVDVDoKLQkJCWNhc2UgRWNvcmVQYWNrYWdlLkVDSEFSOgotCQkJCXJldHVybiBnZW5lcmF0ZVJhbmRvbUNoYXIoYXR0KTsKLQkJCWNhc2UgRWNvcmVQYWNrYWdlLkVMT05HX09CSkVDVDoKLQkJCWNhc2UgRWNvcmVQYWNrYWdlLkVMT05HOgotCQkJCXJldHVybiBnZW5lcmF0ZVJhbmRvbUxvbmcoKTsKLQkJCWNhc2UgRWNvcmVQYWNrYWdlLkVCWVRFX09CSkVDVDoKLQkJCWNhc2UgRWNvcmVQYWNrYWdlLkVCWVRFOgotCQkJCXJldHVybiBnZW5lcmF0ZVJhbmRvbUJ5dGUoKTsKLQkJCWNhc2UgRWNvcmVQYWNrYWdlLkVET1VCTEVfT0JKRUNUOgotCQkJY2FzZSBFY29yZVBhY2thZ2UuRURPVUJMRToKLQkJCQlyZXR1cm4gZ2VuZXJhdGVSYW5kb21Eb3VibGUoKTsKLQkJCWNhc2UgRWNvcmVQYWNrYWdlLkVTSE9SVF9PQkpFQ1Q6Ci0JCQljYXNlIEVjb3JlUGFja2FnZS5FU0hPUlQ6Ci0JCQkJcmV0dXJuIGdlbmVyYXRlUmFuZG9tU2hvcnQoYXR0KTsKLQkJCWNhc2UgRWNvcmVQYWNrYWdlLkVKQVZBX09CSkVDVDoKLQkJCQlyZXR1cm4gZ2VuZXJhdGVSYW5kb21PYmplY3QoYXR0KTsKLQkJCX0KLQkJcmV0dXJuIG51bGw7Ci0gICAgfQotCi0JLyoqCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIE9iamVjdCBjcmVhdGVMb2NhbGUoKSB7Ci0gICAgICAgIHJldHVybiAiZW5fVVMiOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBhdHQKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGNyZWF0ZUxvY2F0aW9uKEVBdHRyaWJ1dGVEZXNjcmlwdG9yIGF0dCkgewotICAgICAgICBTdHJpbmcgdGVtcCA9IGdlbmVyYXRlUmFuZG9tQXR0cmlidXRlU3RyaW5nKGF0dCk7Ci0gICAgICAgIHJldHVybiAiLy4iICsgdGVtcDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEVPYmplY3QgY3JlYXRlSmF2YUNsYXNzUHJveHkoRVN0cnVjdHVyYWxGZWF0dXJlIHJlZiwgRU9iamVjdCBlT2JqZWN0KSB7Ci0JCWlmIChhdkNsYXNzID09IG51bGwpIHsKLQkJCWF2Q2xhc3MgPSBuZXcgU3RyaW5nW10geyAiamF2YS51dGlsLkhhc2hUYWJsZSIsICJqYXZhLnV0aWwuTGlzdCIsICJqYXZhLnNxbC5EYXRhIiwgImphdmEubGFuZy5JbnRlZ2VyIiwgImphdmEubGFuZy5TdHJpbmciIH07Ci0JCX0KLQkJRUF0dHJpYnV0ZURlc2NyaXB0b3IgZmVhdHVyZSA9IG5ldyBFQXR0cmlidXRlRGVzY3JpcHRvcihyZWYsZU9iamVjdC5lQ2xhc3MoKSk7Ci0JCWlmICghYXR0SW5kZXguY29udGFpbnNLZXkoZmVhdHVyZSkpCi0JCQlhdHRJbmRleC5wdXQoZmVhdHVyZSwgbmV3IEludGVnZXIoMCkpOwotCQlpbnQgY2xhc3NJbmRleCA9ICgoSW50ZWdlcilhdHRJbmRleC5nZXQoZmVhdHVyZSkpLmludFZhbHVlKCk7Ci0JCVN0cmluZyBuYW1lID0gYXZDbGFzc1tjbGFzc0luZGV4XTsKLQkJY2xhc3NJbmRleCsrOwotCQlpZiAoY2xhc3NJbmRleCA9PSA1KQotCQkJY2xhc3NJbmRleCA9IDA7Ci0JCWF0dEluZGV4LnB1dChmZWF0dXJlLG5ldyBJbnRlZ2VyKGNsYXNzSW5kZXgpKTsKLQkJcmV0dXJuIEphdmFDbGFzc0ltcGwuY3JlYXRlQ2xhc3NSZWYobmFtZSk7Ci0JfQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIE9iamVjdCBjcmVhdGVTcGVjaWFsSHR0cE1ldGhvZHNGb3IxMygpIHsKLQkJaWYgKGh0dHBBcnJheSA9PSBudWxsKQotCQkJaHR0cEFycmF5ID0gbmV3IFN0cmluZ1tdIHsKLQkJCQkiR0VUIiwKLQkJCQkiUE9TVCIsCi0JCQkJIlBVVCIsCi0JCQkJIkRFTEVURSIsCi0JCQkJIkhFQUQiLAotCQkJCSJPUFRJT05TIiwKLQkJCQkiVFJBQ0UiCi0JCQl9OwotCQlpZiAoaHR0cEFycmF5SW5kZXggPj0gaHR0cEFycmF5Lmxlbmd0aCkKLQkJCWh0dHBBcnJheUluZGV4ID0gMDsKLQkJT2JqZWN0IGhvbGRlciA9IGh0dHBBcnJheVtodHRwQXJyYXlJbmRleF07IAkKLQkJaHR0cEFycmF5SW5kZXgrKzsKLQkJcmV0dXJuIGhvbGRlcjsKLQl9Ci0KLQkvKioKLSAgICAgKiBAcGFyYW0gYXR0Ci0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGNyZWF0ZVZlcnNpb24oRUF0dHJpYnV0ZURlc2NyaXB0b3IgYXR0KSB7Ci0JCVN0cmluZyB2ZXJzaW9uSG9sZGVyID0gIiI7Ci0JCXN3aXRjaCAobW9kdWxlVHlwZSkgewotCQljYXNlIEFQUElDQVRJT04gOgotCQkJaWYodmVyc2lvbiA9PSBWRVJTSU9OXzFfMikgewotCQkJCXZlcnNpb25Ib2xkZXIgPSAiMS4yIjsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWVsc2UgaWYodmVyc2lvbiA9PSBWRVJTSU9OXzFfMyl7Ci0JCQkJdmVyc2lvbkhvbGRlciA9ICIxLjMiOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdmVyc2lvbkhvbGRlciA9ICIxLjQiOwotCQkJCWJyZWFrOwotCQkJfQotCQljYXNlIEFQUF9DTElFTlQgOgotCQkJaWYodmVyc2lvbiA9PSBWRVJTSU9OXzFfMikgewotCQkJCXZlcnNpb25Ib2xkZXIgPSAiMS4yIjsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWVsc2UgaWYodmVyc2lvbiA9PSBWRVJTSU9OXzFfMykgewotCQkJCXZlcnNpb25Ib2xkZXIgPSAiMS4zIjsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXZlcnNpb25Ib2xkZXIgPSAiMS40IjsKLQkJCQlicmVhazsKLQkJCX0KLQkJY2FzZSBFSkIgOgotCQkJaWYodmVyc2lvbiA9PSBWRVJTSU9OXzFfMikgewotCQkJCXZlcnNpb25Ib2xkZXIgPSAiMS4xIjsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWVsc2UgaWYodmVyc2lvbiA9PSBWRVJTSU9OXzFfMykgewotCQkJCXZlcnNpb25Ib2xkZXIgPSAiMi4wIjsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXZlcnNpb25Ib2xkZXIgPSAiMi4xIjsKLQkJCQlicmVhazsKLQkJCX0KLQkJY2FzZSBDT05ORUNUT1IgOgotCQkJaWYodmVyc2lvbiA9PSBWRVJTSU9OXzFfMikgewotCQkJCXZlcnNpb25Ib2xkZXIgPSAiMS4wIjsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWVsc2UgaWYodmVyc2lvbiA9PSBWRVJTSU9OXzFfMykgewotCQkJCXZlcnNpb25Ib2xkZXIgPSAiMS4wIjsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWVsc2UgeyAKLQkJCQl2ZXJzaW9uSG9sZGVyID0gIjEuNSI7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCWNhc2UgV0VCIDoKLQkJCWlmKHZlcnNpb24gPT0gVkVSU0lPTl8xXzIpIHsKLQkJCQl2ZXJzaW9uSG9sZGVyID0gIjIuMiI7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlIGlmKHZlcnNpb24gPT0gVkVSU0lPTl8xXzMpIHsKLQkJCQl2ZXJzaW9uSG9sZGVyID0gIjIuMyI7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlIHsgCi0JCQkJdmVyc2lvbkhvbGRlciA9ICIyLjQiOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gdmVyc2lvbkhvbGRlcjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIE9iamVjdCBjcmVhdGVQYXJhbXMoRUF0dHJpYnV0ZURlc2NyaXB0b3IgYXR0KSB7Ci0JCWlmIChwYXJhbUNvdW50ID09IDApewotCQkJcGFyYW1Db3VudCsrOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJZWxzZSBpZiAocGFyYW1Db3VudCA9PSAxKXsKLQkJCXBhcmFtQ291bnQrKzsKLQkJCXJldHVybiAiIjsKLQkJfQotCQlTdHJpbmcgciA9ICIiOwotCQlmb3IgKGludCBpID0gMSA7IGkgPCBwYXJhbUNvdW50IDtpKyspewotCQkJciArPSBnZW5lcmF0ZVJhbmRvbUF0dHJpYnV0ZVN0cmluZyhhdHQpICsgIiAiOwotCQl9Ci0JCXBhcmFtQ291bnQrKzsKLQkJaWYgKHBhcmFtQ291bnQgPT0gNSkKLQkJCXBhcmFtQ291bnQgPSAwOwotCQlyZXR1cm4gcjsKLQkJCi0JfQotCi0KLQlwcm90ZWN0ZWQgc3RhdGljIE9iamVjdCBjcmVhdGVMYW5nKEVBdHRyaWJ1dGVEZXNjcmlwdG9yIGF0dCkgewotCQlTdHJpbmcgbmFtZSA9IGxhbmdBcnJheVtsYW5nQ291bnRdOwotCQlsYW5nQ291bnQrKzsKLQkJaWYgKGxhbmdDb3VudCA9PSA3KQotCQkJbGFuZ0NvdW50ID0gMDsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBPYmplY3QgY3JlYXRlQ29sbGVjdGlvbihFQXR0cmlidXRlRGVzY3JpcHRvciBhdHQpIHsKLQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWxpc3QuYWRkKGdlbmVyYXRlUmFuZG9tQXR0cmlidXRlU3RyaW5nKGF0dCkpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQotCXByb3RlY3RlZCBzdGF0aWMgT2JqZWN0IGdlbmVyYXRlUmFuZG9tT2JqZWN0KEVBdHRyaWJ1dGVEZXNjcmlwdG9yIGF0dCkgewotCSAgICByZXR1cm4gZ2VuZXJhdGVSYW5kb21BdHRyaWJ1dGVTdHJpbmcoYXR0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIE9iamVjdCBjcmVhdGVFbnVtKEVBdHRyaWJ1dGVEZXNjcmlwdG9yIGF0dCkgewotCQlFRW51bSBhbkVudW0gPSAoRUVudW0pIGF0dC5nZXRGZWF0dXJlKCkuZ2V0RVR5cGUoKTsKLQkJaWYgKCFlbnVtTWFwLmNvbnRhaW5zS2V5KGF0dCkpewotCQkJaWYgKGF0dC5nZXRGZWF0dXJlKCkuZ2V0TmFtZSgpLmVxdWFscygiYXV0aE1ldGhvZCIpKQotCQkJCWVudW1NYXAucHV0KGF0dCxuZXcgSW50ZWdlcigxKSk7Ci0JCQllbHNlIAotCQkJCWVudW1NYXAucHV0KGF0dCxuZXcgSW50ZWdlcigwKSk7Ci0JCX0KLQkJaW50IHBvcyA9ICgoSW50ZWdlcillbnVtTWFwLmdldChhdHQpKS5pbnRWYWx1ZSgpOwotCQlFTGlzdCBsaXRlcmFscyA9IGFuRW51bS5nZXRFTGl0ZXJhbHMoKTsKLQkJaW50IHNpemUgPSBsaXRlcmFscy5zaXplKCk7Ci0JCWlmIChwb3MgPT0gc2l6ZSkKLQkJCXBvcyA9IDA7Ci0JCU9iamVjdCBob2xkZXIgPSBhbkVudW0uZ2V0RUVudW1MaXRlcmFsKHBvcykuZ2V0SW5zdGFuY2UoKTsKLQkJcG9zKys7Ci0JCWVudW1NYXAucHV0KGF0dCxuZXcgSW50ZWdlcihwb3MpKTsKLQkJcmV0dXJuIGhvbGRlcjsKLQkgICAgCi0JfQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdlbmVyYXRlUmFuZG9tQ2xhc3NuYW1lKEVBdHRyaWJ1dGVEZXNjcmlwdG9yIGF0dCkgewotCQlyZXR1cm4gImNvbS5mb28uIiArIGdlbmVyYXRlUmFuZG9tQXR0cmlidXRlU3RyaW5nKGF0dCk7Ci0JfQotCi0JLy9SRVZJU0lUCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBPYmplY3QgZ2VuZXJhdGVSYW5kb21TaG9ydChFQXR0cmlidXRlRGVzY3JpcHRvciBhdHQpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTaG9ydChnZW5lcmF0ZVJhbmRvbUF0dHJpYnV0ZVN0cmluZyhhdHQpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIE9iamVjdCBnZW5lcmF0ZVJhbmRvbURvdWJsZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBEb3VibGUocmFuZG9tR2VuZXJhdG9yLm5leHREb3VibGUoKSk7Ci0gICAgfQotCS8vUkVWSVNJVAotICAgIHByb3RlY3RlZCBzdGF0aWMgT2JqZWN0IGdlbmVyYXRlUmFuZG9tQnl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBCeXRlKCJieXRlIik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBPYmplY3QgZ2VuZXJhdGVSYW5kb21Mb25nKCkgewotICAgICAgICByZXR1cm4gbmV3IExvbmcocmFuZG9tR2VuZXJhdG9yLm5leHRMb25nKCkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgT2JqZWN0IGdlbmVyYXRlUmFuZG9tQ2hhcihFQXR0cmlidXRlRGVzY3JpcHRvciBhdHQpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDaGFyYWN0ZXIoZ2VuZXJhdGVSYW5kb21BdHRyaWJ1dGVTdHJpbmcoYXR0KS5jaGFyQXQoMCkpOwotICAgIH0KLQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBPYmplY3QgZ2VuZXJhdGVSYW5kb21GbG9hdChFQXR0cmlidXRlRGVzY3JpcHRvciBhdHQpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBGbG9hdChyYW5kb21HZW5lcmF0b3IubmV4dEZsb2F0KCkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgT2JqZWN0IGdlbmVyYXRlUmFuZG9tSW50ZWdlcihFQXR0cmlidXRlRGVzY3JpcHRvciBhdHQpIHsKLSAgICAJcmV0dXJuIG5ldyBJbnRlZ2VyKGdlbmVyYXRlTnVtYmVyKGF0dCkpOwotICAgIH0KLSAgICAKLSAgICAKLSAgICBwcm90ZWN0ZWQgc3RhdGljIE9iamVjdCBnZW5lcmF0ZVJhbmRvbUJvb2xlYW4oRUF0dHJpYnV0ZURlc2NyaXB0b3IgYXR0KSB7Ci0JCWlmICghYm9vbGVhbk1hcC5jb250YWluc0tleShhdHQpKXsKLQkJCWJvb2xlYW5NYXAucHV0KGF0dCxuZXcgQm9vbGVhbih0cnVlKSk7Ci0JCX0KLQkJQm9vbGVhbiBob2xkZXIgPSAoQm9vbGVhbilib29sZWFuTWFwLmdldChhdHQpOwotCQlib29sZWFuTWFwLnB1dChhdHQsIG5ldyBCb29sZWFuKCFob2xkZXIuYm9vbGVhblZhbHVlKCkpKTsKLQkJcmV0dXJuIGhvbGRlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZW5lcmF0ZVJhbmRvbUF0dHJpYnV0ZVN0cmluZyhFQXR0cmlidXRlRGVzY3JpcHRvciBhdHQpIHsKLQkJcmV0dXJuIGF0dC5nZXRGZWF0dXJlKCkuZ2V0TmFtZSgpICsgIl8iICsgZ2VuZXJhdGVOdW1iZXIoYXR0KTsKLQl9Ci0JcHJvdGVjdGVkIHN0YXRpYyBpbnQgZ2VuZXJhdGVOdW1iZXIoRUF0dHJpYnV0ZURlc2NyaXB0b3IgYXR0KSB7Ci0JCWlmKCFzcGVjaWFsTnVtYmVyR2VuKQotCQkJcmV0dXJuIGNvdW50ICsrOwotCQllbHNlewotCQkJaWYoIWF0dEluZGV4LmNvbnRhaW5zS2V5KGF0dCkpCi0JCQkJYXR0SW5kZXgucHV0KGF0dCwgbmV3IEludGVnZXIoMCkpOwotCQkJaW50IGhvbGRlciA9ICgoSW50ZWdlcikgYXR0SW5kZXguZ2V0KGF0dCkpLmludFZhbHVlKCk7Ci0JCQlhdHRJbmRleC5wdXQoYXR0LCBuZXcgSW50ZWdlcihob2xkZXIrMSkpOwotCQkJcmV0dXJuIGhvbGRlcjsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZXNldCgpewotCQljb3VudCA9IDA7Ci0JCWVudW1NYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlodHRwQXJyYXlJbmRleCA9IDA7Ci0JCXBhcmFtQ291bnQgPSAwOwotCQlsYW5nQ291bnQgPSAwOyAgCi0JCWJvb2xlYW5NYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlhdHRJbmRleCA9IG5ldyBIYXNoTWFwKCk7Ci0JCXNwZWNpYWxOdW1iZXJHZW4gPSBmYWxzZTsKLQkJVGVzdFV0aWxpdGllcy5yZXNldCgpOwotCQlKMkVFVmVyc2lvbkNoZWNrLmN1cl9UYWdzID0gbnVsbDsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdHV0aWxpdGllcy9KMkVFVmVyc2lvbkNoZWNrLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3R1dGlsaXRpZXMvSjJFRVZlcnNpb25DaGVjay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODExMzY3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdHV0aWxpdGllcy9KMkVFVmVyc2lvbkNoZWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gQXByIDE0LCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLnRlc3R1dGlsaXRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkNsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotCi1wdWJsaWMgY2xhc3MgSjJFRVZlcnNpb25DaGVjayB7Ci0JcHVibGljIGludCB2ZXJzaW9uOwotCS8vc3RhdGljIHZlcnNpb25zCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkVSU0lPTl8xXzIgPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZFUlNJT05fMV8zID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWRVJTSU9OXzFfNCA9IDI7Ci0JCi0JLy9tb2R1bGVzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVBQSUNBVElPTiA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVBQX0NMSUVOVCA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVE9SID0gMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFSkIgPSAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdFQiA9IDQ7Ci0KLQlwdWJsaWMgc3RhdGljIExpc3QgY3VyX1RhZ3M7Ci0JcHJpdmF0ZSBzdGF0aWMgQ29tbW9uUGFja2FnZSBDT00gPSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRTsKLQotICAgIHB1YmxpYyBKMkVFVmVyc2lvbkNoZWNrKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2hlY2tBdHRyaWJ1dGVWZXJzaW9uKEVBdHRyaWJ1dGUgYXR0LCBpbnQgdmVyc2lvbiwgaW50IHR5cGUpewotCQkvL1RPRE86IEFkZCB2ZXJzaW9uIDEuMiBleGNsdWRlcwotCQlpZih2ZXJzaW9uID09IFZFUlNJT05fMV8zIHx8IHZlcnNpb24gPT0gVkVSU0lPTl8xXzIpewotCQkJaWYoY3VyX1RhZ3MgPT0gbnVsbCl7Ci0JCQkJY3VyX1RhZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJcG9wdWxhdGVfMV8zTGlzdCh0eXBlKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmKHZlcnNpb24gPT0gVkVSU0lPTl8xXzQpewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCWlmKGN1cl9UYWdzLmNvbnRhaW5zKGF0dCkgfHwgY3VyX1RhZ3MuY29udGFpbnMoYXR0LmdldEVUeXBlKCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgCi0gICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja1JlZmVyZW5jZVZlcnNpb24oRVN0cnVjdHVyYWxGZWF0dXJlIHJlZiwgaW50IHZlcnNpb24sIGludCB0eXBlKXsKLQkJLy9UT0RPOiBBZGQgdmVyc2lvbiAxLjIgZXhjbHVkZXMKLQkJaWYodmVyc2lvbiA9PSBWRVJTSU9OXzFfMyB8fCB2ZXJzaW9uID09IFZFUlNJT05fMV8yKXsKLQkJCWlmKGN1cl9UYWdzID09IG51bGwpewotCQkJCWN1cl9UYWdzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCXBvcHVsYXRlXzFfM0xpc3QodHlwZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZih2ZXJzaW9uID09IFZFUlNJT05fMV80KXsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlpZihjdXJfVGFncy5jb250YWlucyhyZWYpIHx8IGN1cl9UYWdzLmNvbnRhaW5zKHJlZi5nZXRFVHlwZSgpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0gICAgfQotICAgICAgIAotCXByaXZhdGUgc3RhdGljIHZvaWQgcG9wdWxhdGVfMV8yTGlzdChpbnQgdHlwZSkgewotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCWNhc2UgQVBQSUNBVElPTiA6Ci0JCQkJcG9wdWxhdGVfMV8yQXBwbGljYXRpb24oKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQVBQX0NMSUVOVCA6Ci0JCQkJcG9wdWxhdGVfMV8yQXBwQ2xpZW50KCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVKQiA6Ci0JCQkJcG9wdWxhdGVfMV8yRUpCKCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIENPTk5FQ1RPUiA6Ci0JCQkJcG9wdWxhdGVfMV8yRUpCKCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFdFQiA6Ci0JCQkJcG9wdWxhdGVfMV8yV2ViKCk7Ci0JCQlkZWZhdWx0IDoKLQkJCQlicmVhazsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIHBvcHVsYXRlXzFfM0xpc3QoaW50IHR5cGUpIHsKLQkJc3dpdGNoICh0eXBlKSB7Ci0JCQljYXNlIEFQUElDQVRJT04gOgotCQkJCXBvcHVsYXRlXzFfM0FwcGxpY2F0aW9uKCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEFQUF9DTElFTlQgOgotCQkJCXBvcHVsYXRlXzFfM0FwcENsaWVudCgpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFSkIgOgotCQkJCXBvcHVsYXRlXzFfM0VKQigpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBDT05ORUNUT1IgOgotCQkJCXBvcHVsYXRlXzFfM0VKQigpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBXRUIgOgotCQkJCXBvcHVsYXRlXzFfM1dlYigpOwotCQkJZGVmYXVsdCA6Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHBvcHVsYXRlXzFfMkFwcGxpY2F0aW9uKCl7Ci0JCXBvcHVsYXRlXzFfM0FwcGxpY2F0aW9uKCk7Ci0gICAgfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwb3B1bGF0ZV8xXzJBcHBDbGllbnQoKXsKLQkJcG9wdWxhdGVfMV8zQXBwQ2xpZW50KCk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgcG9wdWxhdGVfMV8yRUpCKCl7Ci0JCXBvcHVsYXRlXzFfM0VKQigpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIHBvcHVsYXRlXzFfMkNvbm5lY3RvcigpewotCQlwb3B1bGF0ZV8xXzNDb25uZWN0b3IoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwb3B1bGF0ZV8xXzJXZWIoKXsKLQkJcG9wdWxhdGVfMV8zV2ViKCk7Ci0JfQotCi0JLy8xLjMKLQlwcml2YXRlIHN0YXRpYyB2b2lkIHBvcHVsYXRlXzFfM0FwcGxpY2F0aW9uKCl7Ci0JCUNvbW1vblBhY2thZ2UgQ09NID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCWN1cl9UYWdzLmFkZChDT00uZ2V0SWNvblR5cGUoKSk7Ci0JCWN1cl9UYWdzLmFkZChDT00uZ2V0RGlzcGxheU5hbWUoKSk7Ci0JCWN1cl9UYWdzLmFkZChDT00uZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCWN1cl9UYWdzLmFkZChDT00uZ2V0RGVzY3JpcHRpb25Hcm91cCgpKTsKLQkJY3VyX1RhZ3MuYWRkKENPTS5nZXRTZWN1cml0eUlkZW50aXR5X0Rlc2NyaXB0aW9ucygpKTsKLQkJY3VyX1RhZ3MuYWRkKEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25fVmVyc2lvbigpKTsJCi0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgcG9wdWxhdGVfMV8zQXBwQ2xpZW50KCl7Ci0JCWN1cl9UYWdzLmFkZChDT00uZ2V0SWNvblR5cGUoKSk7Ci0JCWN1cl9UYWdzLmFkZChDT00uZ2V0RGlzcGxheU5hbWUoKSk7Ci0JCWN1cl9UYWdzLmFkZChDT00uZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCWN1cl9UYWdzLmFkZChDT00uZ2V0RGVzY3JpcHRpb25Hcm91cCgpKTsKLQkJY3VyX1RhZ3MuYWRkKENsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uQ2xpZW50X1ZlcnNpb24oKSk7Ci0JCWN1cl9UYWdzLmFkZChDbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbkNsaWVudF9TZXJ2aWNlUmVmcygpKTsKLQkJY3VyX1RhZ3MuYWRkKENsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uQ2xpZW50X01lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSk7Ci0JCWN1cl9UYWdzLmFkZChDbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbkNsaWVudF9NZXNzYWdlRGVzdGluYXRpb25zKCkpOwotCQljdXJfVGFncy5hZGQoQ09NLmdldE1lc3NhZ2VEZXN0aW5hdGlvbigpKTsKLQkJY3VyX1RhZ3MuYWRkKENPTS5nZXRNZXNzYWdlRGVzdGluYXRpb25SZWYoKSk7Ci0JCS8vY3VyX1RhZ3MuYWRkKENsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uQ2xpZW50X1NlcnZpY2VSZWZzKCkpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIHBvcHVsYXRlXzFfM0Nvbm5lY3RvcigpewotCQljdXJfVGFncy5hZGQoQ09NLmdldEljb25UeXBlKCkpOwotCQljdXJfVGFncy5hZGQoQ09NLmdldERpc3BsYXlOYW1lKCkpOwotCQljdXJfVGFncy5hZGQoQ09NLmdldERlc2NyaXB0aW9uKCkpOwotCQljdXJfVGFncy5hZGQoQ09NLmdldERlc2NyaXB0aW9uR3JvdXAoKSk7Ci0JCWN1cl9UYWdzLmFkZChKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcigpKTsKLQkJY3VyX1RhZ3MuYWRkKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldEluYm91bmRSZXNvdXJjZUFkYXB0ZXIoKSk7Ci0JCWN1cl9UYWdzLmFkZChKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRBZG1pbk9iamVjdCgpKTsKLQkJY3VyX1RhZ3MuYWRkKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbm5lY3Rvcl9WZXJzaW9uKCkpOwotCX0KLQkKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHBvcHVsYXRlXzFfM0VKQigpIHsKLQkJY3VyX1RhZ3MuYWRkKENPTS5nZXRJY29uVHlwZSgpKTsKLQkJY3VyX1RhZ3MuYWRkKENPTS5nZXREaXNwbGF5TmFtZSgpKTsKLQkJY3VyX1RhZ3MuYWRkKENPTS5nZXREZXNjcmlwdGlvbigpKTsKLQkJY3VyX1RhZ3MuYWRkKENPTS5nZXREZXNjcmlwdGlvbkdyb3VwKCkpOwotCQljdXJfVGFncy5hZGQoRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RUpCSmFyX1ZlcnNpb24oKSk7Ci0JCWN1cl9UYWdzLmFkZChFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXNzaW9uX1NlcnZpY2VFbmRwb2ludCgpKTsKLQkJY3VyX1RhZ3MuYWRkKENPTS5nZXRKTkRJRW52UmVmc0dyb3VwX01lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSk7Ci0JCWN1cl9UYWdzLmFkZChDT00uZ2V0Sk5ESUVudlJlZnNHcm91cF9TZXJ2aWNlUmVmcygpKTsKLQkJY3VyX1RhZ3MuYWRkKEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldE1lc3NhZ2VEcml2ZW5fTWVzc2FnaW5nVHlwZSgpKTsKLQkJY3VyX1RhZ3MuYWRkKEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldE1lc3NhZ2VEcml2ZW5fTWVzc2FnZURlc3RpbmF0aW9uKCkpOwotCQljdXJfVGFncy5hZGQoRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWVzc2FnZURyaXZlbl9MaW5rKCkpOwotCQljdXJfVGFncy5hZGQoRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWVzc2FnZURyaXZlbl9BY3RpdmF0aW9uQ29uZmlnKCkpOwkKLSAgICB9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHBvcHVsYXRlXzFfM1dlYigpewotCQljdXJfVGFncy5hZGQoQ09NLmdldEljb25UeXBlKCkpOwotCQljdXJfVGFncy5hZGQoQ09NLmdldERpc3BsYXlOYW1lKCkpOwotCQljdXJfVGFncy5hZGQoQ09NLmdldERlc2NyaXB0aW9uKCkpOwotCQljdXJfVGFncy5hZGQoQ09NLmdldERlc2NyaXB0aW9uR3JvdXAoKSk7Ci0JCWN1cl9UYWdzLmFkZChXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYkFwcF9WZXJzaW9uKCkpOwotCQljdXJfVGFncy5hZGQoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJBcHBfSnNwQ29uZmlnKCkpOwotCQljdXJfVGFncy5hZGQoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJBcHBfTWVzc2FnZURlc3RpbmF0aW9ucygpKTsKLQkJY3VyX1RhZ3MuYWRkKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViQXBwX0xvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdHV0aWxpdGllcy9UZXN0VXRpbGl0aWVzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3R1dGlsaXRpZXMvVGVzdFV0aWxpdGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Zjc3OGVjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdHV0aWxpdGllcy9UZXN0VXRpbGl0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gQXByIDMsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLnRlc3R1dGlsaXRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLQotLyoqCi0gKiBAYXV0aG9yIGFkbWluaXN0cmF0b3IKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgIGNsYXNzIFRlc3RVdGlsaXRpZXMgZXh0ZW5kcyBFY29yZVV0aWwgewotCXByaXZhdGUgc3RhdGljIE1hcCBvYmplY3RNYXAgPSBuZXcgSGFzaE1hcCgpOwotCXByaXZhdGUgc3RhdGljIE1hcCBzdWJzZXRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JCi0JLyoqCi0JCSAqIFJldHVybnMgdGhlIGZpcnN0IGNvbGxlY3Rpb24gbWVtYmVyIHRoYXQge0BsaW5rIEVDbGFzc2lmaWVyI2lzSW5zdGFuY2UgaXMgYW4gaW5zdGFuY2V9IG9mIHRoZSB0eXBlLgotCQkgKiBAcGFyYW0gb2JqZWN0cyBhIGNvbGxlY3Rpb24gb2Ygb2JqZWN0cyB0byBjaGVjay4KLQkJICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgb2Ygb2JqZWN0IHRvIGZpbmQuCi0JCSAqIEByZXR1cm4gdGhlIGZpcnN0IG9iamVjdCBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRPYmplY3RCeVR5cGUoUmVzb3VyY2UgcmVzLCBFQ2xhc3NpZmllciB0eXBlLCBib29sZWFuIGlzTWFueSkgewotCQkJaWYgKGlzTWFueSkKLQkJCQlyZXR1cm4gZ2V0Q29udGFpbmVkQ29sbGVjdGlvbkJ5VHlwZShyZXMuZ2V0Q29udGVudHMoKSwgdHlwZSk7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIGdldENvbnRhaW5lZE9iamVjdEJ5VHlwZShyZXMuZ2V0Q29udGVudHMoKSwgdHlwZSk7Ci0JCX0KLQotCQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRDb250YWluZWRPYmplY3RCeVR5cGUoTGlzdCBsaXN0LCBFQ2xhc3NpZmllciB0eXBlKSB7Ci0JCQlPYmplY3QgZm91bmQ7Ci0JCQlmb3VuZCA9IGdldE9iamVjdHNCeVR5cGUobGlzdCwgdHlwZSk7Ci0JCQlpZiAoZm91bmQgIT0gbnVsbCAmJiAhKChDb2xsZWN0aW9uKWZvdW5kKS5pc0VtcHR5KCkpCi0JCQkJcmV0dXJuIGV4dHJhY3RPYmplY3QoKExpc3QpIGZvdW5kLHR5cGUpOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQlFT2JqZWN0IG9iaiA9IChFT2JqZWN0KSBsaXN0LmdldChpKTsKLQkJCQlmb3VuZCA9IGdldENvbnRhaW5lZE9iamVjdEJ5VHlwZShvYmouZUNvbnRlbnRzKCksIHR5cGUpOwotCQkJCWlmIChmb3VuZCAhPSBudWxsKQotCQkJCQlyZXR1cm4gZm91bmQ7Ci0JCQl9Ci0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0Q29udGFpbmVkQ29sbGVjdGlvbkJ5VHlwZShMaXN0IGxpc3QsIEVDbGFzc2lmaWVyIHR5cGUpIHsKLQkJCUxpc3QgZm91bmQ7Ci0JCQlmb3VuZCA9IChMaXN0KWdldE9iamVjdHNCeVR5cGUobGlzdCwgdHlwZSk7Ci0JCQlpZiAoZm91bmQgIT0gbnVsbCAmJiAhZm91bmQuaXNFbXB0eSgpKQotCQkJCXJldHVybiBleHRyYWN0U3Vic2V0KGZvdW5kLCB0eXBlKTsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJRU9iamVjdCBvYmogPSAoRU9iamVjdCkgbGlzdC5nZXQoaSk7Ci0JCQkJZm91bmQgPSAoTGlzdCkgZ2V0Q29udGFpbmVkQ29sbGVjdGlvbkJ5VHlwZShvYmouZUNvbnRlbnRzKCksIHR5cGUpOwotCQkJCWlmIChmb3VuZCAhPSBudWxsKQotCQkJCQlyZXR1cm4gZm91bmQ7Ci0JCQl9Ci0KLQkJCXJldHVybiBudWxsOwotCQkKLQkJCi0JCQotCQl9Ci0JCi0JCXB1YmxpYyBzdGF0aWMgTGlzdCBleHRyYWN0U3Vic2V0KExpc3QgZm91bmQsIEVDbGFzc2lmaWVyIHR5cGUpIHsKLQkJCWlmICghc3Vic2V0TWFwLmNvbnRhaW5zS2V5KHR5cGUpKXsKLQkJCQlzdWJzZXRNYXAucHV0KHR5cGUsbmV3IEludGVnZXIoMSkpOwotCQkJfQotCQkJaW50IHBvcyA9ICgoSW50ZWdlcilzdWJzZXRNYXAuZ2V0KHR5cGUpKS5pbnRWYWx1ZSgpOwotCQkKLQkJCWlmIChwb3MgPT0gZm91bmQuc2l6ZSgpKQotCQkJCXBvcyA9IDE7Ci0JCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcG9zOyBpKyspCi0JCQkJcmVzdWx0LmFkZChmb3VuZC5nZXQoaSkpOwotCQkJcG9zKys7Ci0JCQlzdWJzZXRNYXAucHV0KHR5cGUsbmV3IEludGVnZXIocG9zKSk7CQotCQkKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkKLQkJcHVibGljIHN0YXRpYyBPYmplY3QgZXh0cmFjdE9iamVjdChMaXN0IGZvdW5kLCBFQ2xhc3NpZmllciB0eXBlKSB7Ci0JCQlpZiAoIW9iamVjdE1hcC5jb250YWluc0tleSh0eXBlKSl7Ci0JCQkJb2JqZWN0TWFwLnB1dCh0eXBlLG5ldyBJbnRlZ2VyKDApKTsKLQkJCX0KLQkJCWludCBwb3MgPSAoKEludGVnZXIpb2JqZWN0TWFwLmdldCh0eXBlKSkuaW50VmFsdWUoKTsKLQkJCi0JCQlpZiAocG9zID09IGZvdW5kLnNpemUoKSkKLQkJCQlwb3MgPSAwOwotCQkJT2JqZWN0IGhvbGRlciA9IGZvdW5kLmdldChwb3MpOwotCQkJcG9zKys7Ci0JCQlvYmplY3RNYXAucHV0KHR5cGUsbmV3IEludGVnZXIocG9zKSk7CQotCQkKLQkJCXJldHVybiBob2xkZXI7Ci0JCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZXNldCgpewotCQlzdWJzZXRNYXAuY2xlYXIoKTsKLQkJb2JqZWN0TWFwLmNsZWFyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29yZS90ZXN0cy9idnQvQXV0b21hdGVkQlZULmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb3JlL3Rlc3RzL2J2dC9BdXRvbWF0ZWRCVlQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQwNjg5YS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb3JlL3Rlc3RzL2J2dC9BdXRvbWF0ZWRCVlQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEFwciAxLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLmJ2dDsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuZW1mdGVzdHMuQWxsVGVzdHM7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIAotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBBdXRvbWF0ZWRCVlQgZXh0ZW5kcyBUZXN0U3VpdGUgewotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgYmFzZURpcmVjdG9yeSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKSArIGphdmEuaW8uRmlsZS5zZXBhcmF0b3JDaGFyICsgImNvbW1vbkFyY2hpdmVSZXNvdXJjZXMiICsgamF2YS5pby5GaWxlLnNlcGFyYXRvckNoYXI7Ci0gICAgCi0gICAgc3RhdGljIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElQbHVnaW5EZXNjcmlwdG9yIHBsdWdpbkRlc2NyaXB0b3IgPSBQbGF0Zm9ybS5nZXRQbHVnaW5SZWdpc3RyeSgpLmdldFBsdWdpbkRlc2NyaXB0b3IoIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMiKTsKLSAgICAgICAgICAgIFVSTCB1cmwgPSBwbHVnaW5EZXNjcmlwdG9yLmdldEluc3RhbGxVUkwoKTsgCi0gICAgICAgIAlBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSA9IFBsYXRmb3JtLmFzTG9jYWxVUkwodXJsKS5nZXRGaWxlKCkgKyAiY29tbW9uQXJjaGl2ZVJlc291cmNlcyIrIGphdmEuaW8uRmlsZS5zZXBhcmF0b3JDaGFyOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeyAKLQkJCVN5c3RlbS5lcnIucHJpbnRsbigiVXNpbmcgd29ya2luZyBkaXJlY3Rvcnkgc2luY2UgYSB3b3Jrc3BhY2UgVVJMIGNvdWxkIG5vdCBiZSBsb2NhdGVkLiIpOwotCQl9IAotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgaW50IHVuaW1wbGVtZW50ZWRNZXRob2RzOwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgICAgICB1bmltcGxlbWVudGVkTWV0aG9kcyA9IDA7Ci0gICAgICAgIFRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotICAgICAgICBpZiAodW5pbXBsZW1lbnRlZE1ldGhvZHMgPiAwKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuQ2FsbHMgdG8gd2FyblVuaW1wbDogIiArIHVuaW1wbGVtZW50ZWRNZXRob2RzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBBdXRvbWF0ZWRCVlQoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IChUZXN0U3VpdGUpIEF1dG9tYXRlZEJWVC5zdWl0ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN1aXRlLnRlc3RDb3VudCgpOyBpKyspIHsKLSAgICAgICAgICAgIGFkZFRlc3Qoc3VpdGUudGVzdEF0KGkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgiVGVzdCBmb3Igb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS5idnQiKTsKLSAgICAgICAgLy8kSlVuaXQtQkVHSU4kCi0gICAgICAgIC8vVE9ETzogTWFrZSB0aGUgQXJjaGl2ZSBUZXN0IFdvcmsKLSAgICAgICAvLyBzdWl0ZS5hZGRUZXN0KEFsbEFyY2hpdmVUZXN0c0phdmEuc3VpdGUoKSk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoQWxsVGVzdHMuc3VpdGUoKSk7Ci0gICAgICAgIC8vc3VpdGUuYWRkVGVzdChBbGxKYXZhVGVzdHNKYXZhLnN1aXRlKCkpOwotICAgICAgICAvLyRKVW5pdC1FTkQkCi0gICAgICAgIHJldHVybiBzdWl0ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb3JlL3Rlc3RzL2J2dC9BdXRvbWF0ZWRCVlRFY2xpcHNlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb3JlL3Rlc3RzL2J2dC9BdXRvbWF0ZWRCVlRFY2xpcHNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4YjAwN2QuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29yZS90ZXN0cy9idnQvQXV0b21hdGVkQlZURWNsaXBzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDI1LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLmJ2dDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbHVnaW5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEF1dG9tYXRlZEJWVEVjbGlwc2UgZXh0ZW5kcyBBdXRvbWF0ZWRCVlQgewotCQotCXB1YmxpYyBBdXRvbWF0ZWRCVlRFY2xpcHNlKCl7Ci0JCXN1cGVyKCk7Ci0JCUlQbHVnaW5EZXNjcmlwdG9yIHBsdWdpbkRlc2NyaXB0b3IgPSBQbGF0Zm9ybS5nZXRQbHVnaW5SZWdpc3RyeSgpLmdldFBsdWdpbkRlc2NyaXB0b3IoIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMiKTsKLSAgICAgICAgVVJMIHVybCA9IHBsdWdpbkRlc2NyaXB0b3IuZ2V0SW5zdGFsbFVSTCgpOwotICAgICAgICB0cnkgewotICAgICAgICAJQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgPSBQbGF0Zm9ybS5hc0xvY2FsVVJMKHVybCkuZ2V0RmlsZSgpICsgImNvbW1vbkFyY2hpdmVSZXNvdXJjZXMiKyBqYXZhLmlvLkZpbGUuc2VwYXJhdG9yQ2hhcjsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VtZmxvYWQvTG9hZEpheFJQQ01hcE91dHNpZGVXb3Jrc3BhY2UuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VtZmxvYWQvTG9hZEpheFJQQ01hcE91dHNpZGVXb3Jrc3BhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFiZjFkZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lbWZsb2FkL0xvYWRKYXhSUENNYXBPdXRzaWRlV29ya3NwYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVtZmxvYWQ7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbHVnaW5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRGlhZ25vc3RpYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuVVJJQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5VUklDb252ZXJ0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFSW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBSZXNvdXJjZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuRU1GMkRPTVJlbmRlcmVyRmFjdG9yeTsKLQotCi1wdWJsaWMgY2xhc3MgTG9hZEpheFJQQ01hcE91dHNpZGVXb3Jrc3BhY2UgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JCi0JLy9wdWJsaWMgc3RhdGljIFN0cmluZyBiYXNlRGlyZWN0b3J5ID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpICArIGphdmEuaW8uRmlsZS5zZXBhcmF0b3JDaGFyICsgInRlc3REYXRhIiArIGphdmEuaW8uRmlsZS5zZXBhcmF0b3JDaGFyICsgIndlYnNlcnZpY2VzIiArIGphdmEuaW8uRmlsZS5zZXBhcmF0b3JDaGFyICsgIk1FVEEtSU5GIiArIGphdmEuaW8uRmlsZS5zZXBhcmF0b3JDaGFyOwotICAgCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBMb2FkIGFsbCB0aGUgYXJndW1lbnQgZmlsZSBwYXRocyBvciBVUklzIGFzIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIGFyZ3MgdGhlIGZpbGUgcGF0aHMgb3IgVVJJcy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdGVzdExvYWRGaWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQlJUGx1Z2luRGVzY3JpcHRvciBwbHVnaW5EZXNjcmlwdG9yID0gUGxhdGZvcm0uZ2V0UGx1Z2luUmVnaXN0cnkoKS5nZXRQbHVnaW5EZXNjcmlwdG9yKCJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzIik7Ci0gICAgICAgIFVSTCB1cmwgPSBwbHVnaW5EZXNjcmlwdG9yLmdldEluc3RhbGxVUkwoKTsgCi0gICAgICAgIFN0cmluZyBiYXNlRGlyZWN0b3J5ID0gUGxhdGZvcm0uYXNMb2NhbFVSTCh1cmwpLmdldEZpbGUoKSArICJ0ZXN0RGF0YSIgKyBqYXZhLmlvLkZpbGUuc2VwYXJhdG9yQ2hhciArICJ3ZWJzZXJ2aWNlcyIgKyBqYXZhLmlvLkZpbGUuc2VwYXJhdG9yQ2hhciArICJNRVRBLUlORiIgKyBqYXZhLmlvLkZpbGUuc2VwYXJhdG9yQ2hhcjsKLQkJCi0JLy8gQ2FsbCBKMkVFIEluaXQoKTsKLQkJCi0JSjJFRUluaXQuaW5pdCgpOwotCS8vIENyZWF0ZSBhIHJlc291cmNlIHNldCB0byBob2xkIHRoZSByZXNvdXJjZXMuCi0JLy8KLQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsKLQlKMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkgPSBuZXcgSjJFRVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KCk7Ci0JcmVzb3VyY2VTZXQuc2V0UmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkocmVnaXN0cnkpOwotCVVSSUNvbnZlcnRlciBjb252ID0gbmV3IFVSSUNvbnZlcnRlckltcGwoKTsKLQlyZXNvdXJjZVNldC5zZXRVUklDb252ZXJ0ZXIoY29udik7Ci0JRU1GMkRPTVJlbmRlcmVyRmFjdG9yeS5JTlNUQU5DRS5zZXRWYWxpZGF0aW5nKGZhbHNlKTsKLQkKLQkJCVVSSSB1cmkgPSBVUkkuY3JlYXRlRmlsZVVSSShiYXNlRGlyZWN0b3J5ICsgIkFubnVpdHlTZXJ2aWNlc19tYXBwaW5nLnhtbCIpOwotCQkJcmVnaXN0cnkucmVnaXN0ZXJMYXN0RmlsZVNlZ21lbnQodXJpLmxhc3RTZWdtZW50KCksIG5ldyBKYXhycGNtYXBSZXNvdXJjZUZhY3RvcnkoRU1GMkRPTVJlbmRlcmVyRmFjdG9yeS5JTlNUQU5DRSkpOwotCi0JCQl0cnkgewotCQkJCS8vIERlbWFuZCBsb2FkIHJlc291cmNlIGZvciB0aGlzIGZpbGUuCi0JCQkJLy8KLQkJCQlKYXhycGNtYXBSZXNvdXJjZSBqYXhycGNtYXBSZXMgPSAoSmF4cnBjbWFwUmVzb3VyY2UpcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UodXJpLCB0cnVlKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxvYWRlZCAiICsgdXJpKTsKLQkJCQlqYXhycGNtYXBSZXMuZ2V0Q29udGVudHMoKTsKLQotCQkJfQotCQkJY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJQcm9ibGVtIGxvYWRpbmcgIiArIHVyaSk7Ci0JCQkJZXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBQcmludHMgZGlhZ25vc3RpY3Mgd2l0aCBpbmRlbnRhdGlvbi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHBhcmFtIGRpYWdub3N0aWMgdGhlIGRpYWdub3N0aWMgdG8gcHJpbnQuCi0gKiBAcGFyYW0gaW5kZW50IHRoZSBpbmRlbnRhdGlvbiBmb3IgcHJpbnRpbmcuCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXByb3RlY3RlZCBzdGF0aWMgdm9pZCBwcmludERpYWdub3N0aWMoRGlhZ25vc3RpYyBkaWFnbm9zdGljLCBTdHJpbmcgaW5kZW50KSB7Ci0JU3lzdGVtLm91dC5wcmludChpbmRlbnQpOwotCVN5c3RlbS5vdXQucHJpbnRsbihkaWFnbm9zdGljLmdldE1lc3NhZ2UoKSk7Ci0JZm9yIChJdGVyYXRvciBpID0gZGlhZ25vc3RpYy5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsKLQkJcHJpbnREaWFnbm9zdGljKChEaWFnbm9zdGljKWkubmV4dCgpLCBpbmRlbnQgKyAiICAiKTsKLQl9Ci19Ci0JfQotCi0KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZW1mbG9hZC9Mb2FkV2ViU2VydmljZXNPdXRzaWRlV29ya3NwYWNlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lbWZsb2FkL0xvYWRXZWJTZXJ2aWNlc091dHNpZGVXb3Jrc3BhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQyYzViMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lbWZsb2FkL0xvYWRXZWJTZXJ2aWNlc091dHNpZGVXb3Jrc3BhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZW1mbG9hZDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuVVJJQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5VUklDb252ZXJ0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkRpYWdub3N0aWNpYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVJbml0OwotCi0KLXB1YmxpYyBjbGFzcyBMb2FkV2ViU2VydmljZXNPdXRzaWRlV29ya3NwYWNlIGV4dGVuZHMgVGVzdENhc2UgewotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJhc2VEaXJlY3RvcnkgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIikgICsgamF2YS5pby5GaWxlLnNlcGFyYXRvckNoYXIgKyAidGVzdERhdGEiICsgamF2YS5pby5GaWxlLnNlcGFyYXRvckNoYXIgKyAid2Vic2VydmljZXMiICsgamF2YS5pby5GaWxlLnNlcGFyYXRvckNoYXIgKyAiTUVUQS1JTkYiICsgamF2YS5pby5GaWxlLnNlcGFyYXRvckNoYXI7Ci0gICAKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIExvYWQgYWxsIHRoZSBhcmd1bWVudCBmaWxlIHBhdGhzIG9yIFVSSXMgYXMgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gYXJncyB0aGUgZmlsZSBwYXRocyBvciBVUklzLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0TG9hZEZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JLy8gQ2FsbCBKMkVFIEluaXQoKTsKLQkJCi0JSjJFRUluaXQuaW5pdCgpOwotCS8vIENyZWF0ZSBhIHJlc291cmNlIHNldCB0byBob2xkIHRoZSByZXNvdXJjZXMuCi0JLy8KLQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsKLQlyZXNvdXJjZVNldC5zZXRSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeShuZXcgSjJFRVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KCkpOwotCVVSSUNvbnZlcnRlciBjb252ID0gbmV3IFVSSUNvbnZlcnRlckltcGwoKTsKLQlyZXNvdXJjZVNldC5zZXRVUklDb252ZXJ0ZXIoY29udik7Ci0JCi0JCQlVUkkgdXJpID0gVVJJLmNyZWF0ZUZpbGVVUkkoYmFzZURpcmVjdG9yeSArICJ3ZWJzZXJ2aWNlcy54bWwiKTsKLQotCQkJdHJ5IHsKLQkJCQkvLyBEZW1hbmQgbG9hZCByZXNvdXJjZSBmb3IgdGhpcyBmaWxlLgotCQkJCS8vCi0JCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZSh1cmksIHRydWUpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTG9hZGVkICIgKyB1cmkpOwotCi0JCQkJLy8gVmFsaWRhdGUgdGhlIGNvbnRlbnRzIG9mIHRoZSBsb2FkZWQgcmVzb3VyY2UuCi0JCQkJLy8KLQkJCQlmb3IgKEl0ZXJhdG9yIGogPSByZXNvdXJjZS5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOyApIHsKLQkJCQkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3Qpai5uZXh0KCk7Ci0JCQkJCURpYWdub3N0aWMgZGlhZ25vc3RpYyA9IERpYWdub3N0aWNpYW4uSU5TVEFOQ0UudmFsaWRhdGUoZU9iamVjdCk7Ci0JCQkJCWlmIChkaWFnbm9zdGljLmdldFNldmVyaXR5KCkgIT0gRGlhZ25vc3RpYy5PSykgewotCQkJCQkJcHJpbnREaWFnbm9zdGljKGRpYWdub3N0aWMsICIiKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUHJvYmxlbSBsb2FkaW5nICIgKyB1cmkpOwotCQkJCWV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogUHJpbnRzIGRpYWdub3N0aWNzIHdpdGggaW5kZW50YXRpb24uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBwYXJhbSBkaWFnbm9zdGljIHRoZSBkaWFnbm9zdGljIHRvIHByaW50LgotICogQHBhcmFtIGluZGVudCB0aGUgaW5kZW50YXRpb24gZm9yIHByaW50aW5nLgotICogQGdlbmVyYXRlZAotICovCi1wcm90ZWN0ZWQgc3RhdGljIHZvaWQgcHJpbnREaWFnbm9zdGljKERpYWdub3N0aWMgZGlhZ25vc3RpYywgU3RyaW5nIGluZGVudCkgewotCVN5c3RlbS5vdXQucHJpbnQoaW5kZW50KTsKLQlTeXN0ZW0ub3V0LnByaW50bG4oZGlhZ25vc3RpYy5nZXRNZXNzYWdlKCkpOwotCWZvciAoSXRlcmF0b3IgaSA9IGRpYWdub3N0aWMuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7Ci0JCXByaW50RGlhZ25vc3RpYygoRGlhZ25vc3RpYylpLm5leHQoKSwgaW5kZW50ICsgIiAgIik7Ci0JfQotfQotCX0KLQotCi0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL3Rlc3QvQXBwbGljYXRpb25GYWN0b3J5VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vdGVzdC9BcHBsaWNhdGlvbkZhY3RvcnlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhYmE4NmIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vdGVzdC9BcHBsaWNhdGlvbkZhY3RvcnlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLnRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkNvbm5lY3Rvck1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5FamJNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uSmF2YUNsaWVudE1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5Nb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uV2ViTW9kdWxlOwotCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb25GYWN0b3J5VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCSBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKXsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoQXBwbGljYXRpb25GYWN0b3J5VGVzdC5jbGFzcyk7Ci0gICAgfQotCSAgCi0gICAgcHVibGljIEFwcGxpY2F0aW9uRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25GYWN0b3J5KCk7Ci0gICAgfQotCi0gICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUFwcGxpY2F0aW9uKCkgewotCi0gICAgICAgIEFwcGxpY2F0aW9uRmFjdG9yeSBvYmpBcHBsaWNhdGlvbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBBcHBsaWNhdGlvbiByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQXBwbGljYXRpb25GYWN0b3J5LmNyZWF0ZUFwcGxpY2F0aW9uKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlTW9kdWxlKCkgewotCi0gICAgICAgIEFwcGxpY2F0aW9uRmFjdG9yeSBvYmpBcHBsaWNhdGlvbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBNb2R1bGUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakFwcGxpY2F0aW9uRmFjdG9yeS5jcmVhdGVNb2R1bGUoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVXZWJNb2R1bGUoKSB7Ci0KLSAgICAgICAgQXBwbGljYXRpb25GYWN0b3J5IG9iakFwcGxpY2F0aW9uRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFdlYk1vZHVsZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQXBwbGljYXRpb25GYWN0b3J5LmNyZWF0ZVdlYk1vZHVsZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUphdmFDbGllbnRNb2R1bGUoKSB7Ci0KLSAgICAgICAgQXBwbGljYXRpb25GYWN0b3J5IG9iakFwcGxpY2F0aW9uRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEphdmFDbGllbnRNb2R1bGUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakFwcGxpY2F0aW9uRmFjdG9yeS5jcmVhdGVKYXZhQ2xpZW50TW9kdWxlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlRWpiTW9kdWxlKCkgewotCi0gICAgICAgIEFwcGxpY2F0aW9uRmFjdG9yeSBvYmpBcHBsaWNhdGlvbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBFamJNb2R1bGUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakFwcGxpY2F0aW9uRmFjdG9yeS5jcmVhdGVFamJNb2R1bGUoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVDb25uZWN0b3JNb2R1bGUoKSB7Ci0KLSAgICAgICAgQXBwbGljYXRpb25GYWN0b3J5IG9iakFwcGxpY2F0aW9uRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIENvbm5lY3Rvck1vZHVsZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQXBwbGljYXRpb25GYWN0b3J5LmNyZWF0ZUNvbm5lY3Rvck1vZHVsZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICAKLSAgICAKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL3Rlc3QvQXBwbGljYXRpb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi90ZXN0L0FwcGxpY2F0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDUzYjcyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL3Rlc3QvQXBwbGljYXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi50ZXN0OwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5Nb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0cy5FYXJFTUZUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUudGVzdHV0aWxpdGllcy5FTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eVJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkR1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uUmVzb3VyY2VMb2FkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb25UZXN0IGV4dGVuZHMgRWFyRU1GVGVzdCB7Ci0KLQkgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29tbW9uRmFjdG9yeSBDT01NT05GQUNUT1JZID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uRmFjdG9yeSgpOwotCSBwdWJsaWMgQXBwbGljYXRpb25GYWN0b3J5IGdldEluc3RhbmNlKCkgewotICAgICAgICByZXR1cm4gQXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbkZhY3RvcnkoKTsKLSAgICB9Ci0gICAgLyoqCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgQXBwbGljYXRpb25UZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW5pdCgpIHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24sIFJlc291cmNlTG9hZEV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkJRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvci5yZXNldCgpOwotICAgICAgICBjcmVhdGVFQVIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0X2NvbnRhaW5zU2VjdXJpdHlSb2xlKCkgewotCQkKLSAgICAgICAgQXBwbGljYXRpb24gb2JqQXBwbGljYXRpb24gPSBnZXRJbnN0YW5jZSgpLmNyZWF0ZUFwcGxpY2F0aW9uKCk7Ci0gICAgICAgIFN0cmluZyBuYW1lID0icm9sZTEiIDsKLSAgICAgICAgU3RyaW5nIG5hbWUyID0icm9sZTIiIDsKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICByZXRWYWx1ZSA9IG9iakFwcGxpY2F0aW9uLmNvbnRhaW5zU2VjdXJpdHlSb2xlKG5hbWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsIGZhbHNlKSA7Ci0gICAgICAgIFNlY3VyaXR5Um9sZSByb2xlID0gQ09NTU9ORkFDVE9SWS5jcmVhdGVTZWN1cml0eVJvbGUoKTsKLQkJcm9sZS5zZXRSb2xlTmFtZShuYW1lKTsKLSAgICAgICAgb2JqQXBwbGljYXRpb24uZ2V0U2VjdXJpdHlSb2xlcygpLmFkZChyb2xlKTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpBcHBsaWNhdGlvbi5jb250YWluc1NlY3VyaXR5Um9sZShuYW1lKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLCB0cnVlKSA7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQXBwbGljYXRpb24uY29udGFpbnNTZWN1cml0eVJvbGUobmFtZTIpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsIGZhbHNlKSA7Ci0gICAgICAgCi0gICAgfQotCi0gIC8qIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TW9kdWxlKCkgewotCi0gICAgICAgIEFwcGxpY2F0aW9uIG9iakFwcGxpY2F0aW9uID0gZ2V0SW5zdGFuY2UoKS5jcmVhdGVBcHBsaWNhdGlvbigpOwotICAgICAgICBTdHJpbmcgdXJpID0gIiI7Ci0gICAgICAgIE1vZHVsZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQXBwbGljYXRpb24uZ2V0TW9kdWxlKHVyaSk7Ci0gICAgfSovCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE1vZHVsZV8yKCkgewotCi0gICAgICAgIEFwcGxpY2F0aW9uIG9iakFwcGxpY2F0aW9uID0gZ2V0SW5zdGFuY2UoKS5jcmVhdGVBcHBsaWNhdGlvbigpOwotICAgICAgICBNb2R1bGUgbW9kdWxlID0gZ2V0SW5zdGFuY2UoKS5jcmVhdGVNb2R1bGUoKTsKLSAgICAgICAgU3RyaW5nIHVyaSA9ICJ1cmkxIjsKLSAgICAgICAgU3RyaW5nIGFsdEREID0gImFsdEREMSI7Ci0gICAgICAgIG1vZHVsZS5zZXRVcmkodXJpKTsKLSAgICAgICAgbW9kdWxlLnNldEFsdEREKGFsdEREKTsKLSAgICAgICAgb2JqQXBwbGljYXRpb24uZ2V0TW9kdWxlcygpLmFkZChtb2R1bGUpOwotICAgICAgICBNb2R1bGUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakFwcGxpY2F0aW9uLmdldE1vZHVsZSh1cmksIGFsdEREKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG1vZHVsZSxyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRGaXJzdE1vZHVsZSgpIHsKLQotICAgIAkgQXBwbGljYXRpb24gb2JqQXBwbGljYXRpb24gPSBnZXRJbnN0YW5jZSgpLmNyZWF0ZUFwcGxpY2F0aW9uKCk7Ci0gICAgICAgICBNb2R1bGUgbW9kdWxlID0gZ2V0SW5zdGFuY2UoKS5jcmVhdGVNb2R1bGUoKTsKLSAgICAgICAgIE1vZHVsZSBtb2R1bGUyID0gZ2V0SW5zdGFuY2UoKS5jcmVhdGVNb2R1bGUoKTsKLSAgICAgICAgIE1vZHVsZSBtb2R1bGUzID0gZ2V0SW5zdGFuY2UoKS5jcmVhdGVNb2R1bGUoKTsKLSAgICAgICAgIFN0cmluZyB1cmkgPSAidXJpMSI7Ci0gICAgICAgICBTdHJpbmcgdXJpMiA9ICJ1cmkyIiA7Ci0gICAgICAgICBTdHJpbmcgYWx0REQgPSAiYWx0REQxIjsKLSAgICAgICAgIFN0cmluZyBhbHRERDIgPSAiYWx0REQyIiA7Ci0gICAgICAgICAKLSAgICAgICAgIG1vZHVsZS5zZXRVcmkodXJpKTsKLSAgICAgICAgIG1vZHVsZS5zZXRBbHRERChhbHRERCk7Ci0gICAgICAgICAKLSAgICAgICAgIG1vZHVsZTIuc2V0VXJpKHVyaTIpOwotICAgICAgICAgbW9kdWxlMi5zZXRBbHRERChhbHRERDIpOwotICAgICAgICAgCi0gICAgICAgICBtb2R1bGUzLnNldFVyaSh1cmkyKTsKLSAgICAgICAgIG1vZHVsZTMuc2V0QWx0REQoYWx0REQpOwotICAgICAgICAgCi0gICAgICAgICBvYmpBcHBsaWNhdGlvbi5nZXRNb2R1bGVzKCkuYWRkKG1vZHVsZSk7Ci0gICAgICAgICBvYmpBcHBsaWNhdGlvbi5nZXRNb2R1bGVzKCkuYWRkKG1vZHVsZTIpOwotICAgICAgICAgb2JqQXBwbGljYXRpb24uZ2V0TW9kdWxlcygpLmFkZChtb2R1bGUzKTsKLSAgICAgICAgIE1vZHVsZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgICByZXRWYWx1ZSA9IG9iakFwcGxpY2F0aW9uLmdldEZpcnN0TW9kdWxlKHVyaTIpOwotICAgICAgICAgYXNzZXJ0RXF1YWxzKG1vZHVsZTIscmV0VmFsdWUpOwotICAgICAgICAgCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRNb2R1bGVIYXZpbmdBbHRERCgpIHsKLQotICAgIAkgQXBwbGljYXRpb24gb2JqQXBwbGljYXRpb24gPSBnZXRJbnN0YW5jZSgpLmNyZWF0ZUFwcGxpY2F0aW9uKCk7Ci0gICAgICAgICBNb2R1bGUgbW9kdWxlID0gZ2V0SW5zdGFuY2UoKS5jcmVhdGVNb2R1bGUoKTsKLSAgICAgICAgIFN0cmluZyB1cmkgPSAidXJpMSI7Ci0gICAgICAgICBTdHJpbmcgYWx0REQgPSAiYWx0REQxIjsKLSAgICAgICAgIG1vZHVsZS5zZXRVcmkodXJpKTsKLSAgICAgICAgIG1vZHVsZS5zZXRBbHRERChhbHRERCk7Ci0gICAgICAgICBvYmpBcHBsaWNhdGlvbi5nZXRNb2R1bGVzKCkuYWRkKG1vZHVsZSk7Ci0gICAgICAgICBNb2R1bGUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICAgcmV0VmFsdWUgPSBvYmpBcHBsaWNhdGlvbi5nZXRNb2R1bGVIYXZpbmdBbHRERChhbHRERCk7Ci0gICAgICAgICBhc3NlcnRFcXVhbHMobW9kdWxlLHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFNlY3VyaXR5Um9sZU5hbWVkKCkgewotCi0gICAgCSBBcHBsaWNhdGlvbiBvYmpBcHBsaWNhdGlvbiA9IGdldEluc3RhbmNlKCkuY3JlYXRlQXBwbGljYXRpb24oKTsKLSAgICAgICAgIFN0cmluZyBuYW1lID0icm9sZTEiIDsKLSAgICAgICAgIFN0cmluZyBuYW1lMiA9InJvbGUyIiA7Ci0gICAgICAgICBTZWN1cml0eVJvbGUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICAgcmV0VmFsdWUgPSBvYmpBcHBsaWNhdGlvbi5nZXRTZWN1cml0eVJvbGVOYW1lZChuYW1lKTsKLSAgICAgICAgIGFzc2VydE51bGwocmV0VmFsdWUpOwotICAgICAgICAgU2VjdXJpdHlSb2xlIHJvbGUgPSBDT01NT05GQUNUT1JZLmNyZWF0ZVNlY3VyaXR5Um9sZSgpOwotIAkJIHJvbGUuc2V0Um9sZU5hbWUobmFtZSk7Ci0gICAgICAgICBvYmpBcHBsaWNhdGlvbi5nZXRTZWN1cml0eVJvbGVzKCkuYWRkKHJvbGUpOwotICAgICAgICAgcmV0VmFsdWUgPSBvYmpBcHBsaWNhdGlvbi5nZXRTZWN1cml0eVJvbGVOYW1lZChuYW1lKTsKLSAgICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSwgcm9sZSkgOwotICAgICAgICAgcmV0VmFsdWUgPSBvYmpBcHBsaWNhdGlvbi5nZXRTZWN1cml0eVJvbGVOYW1lZChuYW1lMik7Ci0gICAgICAgICBhc3NlcnROdWxsKHJldFZhbHVlKTsKLSAgICAgICAgCi0gICAgfQotCi0gIC8qICBwdWJsaWMgdm9pZCB0ZXN0X2lzVmVyc2lvbjFfMkRlc2NyaXB0b3IoKSB7Ci0KLSAgICAgICAgQXBwbGljYXRpb24gb2JqQXBwbGljYXRpb24gPSBnZXRJbnN0YW5jZSgpLmNyZWF0ZUFwcGxpY2F0aW9uKCk7Ci0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpBcHBsaWNhdGlvbi5pc1ZlcnNpb24xXzJEZXNjcmlwdG9yKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9pc1ZlcnNpb24xXzNEZXNjcmlwdG9yKCkgewotCi0gICAgICAgIEFwcGxpY2F0aW9uIG9iakFwcGxpY2F0aW9uID0gZ2V0SW5zdGFuY2UoKS5jcmVhdGVBcHBsaWNhdGlvbigpOwotICAgICAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQXBwbGljYXRpb24uaXNWZXJzaW9uMV8zRGVzY3JpcHRvcigpOwotICAgIH0qLwotCi0gLyogICBwdWJsaWMgdm9pZCB0ZXN0X2dldFZlcnNpb24oKSB7Ci0KLSAgICAgICAgQXBwbGljYXRpb24gb2JqQXBwbGljYXRpb24gPSBnZXRJbnN0YW5jZSgpLmNyZWF0ZUFwcGxpY2F0aW9uKCk7Ci0gICAgICAgIFN0cmluZyByZXRWYWx1ZSA9ICIiOwotICAgICAgICByZXRWYWx1ZSA9IG9iakFwcGxpY2F0aW9uLmdldFZlcnNpb24oKTsKLSAgICB9Ki8KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0VmVyc2lvbklEKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGluaXQoKTsKLSAgICAJQXBwbGljYXRpb25SZXNvdXJjZSBERCA9IChBcHBsaWNhdGlvblJlc291cmNlKSBlYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLSAgICAgICAgREQuc2V0VmVyc2lvbklEKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEKTsKLQkJc2V0VmVyc2lvbihWRVJTSU9OXzFfNCk7Ci0JCXNldE1vZHVsZVR5cGUoQVBQX0NMSUVOVCk7Ci0JCXBvcHVsYXRlUm9vdChERC5nZXRSb290T2JqZWN0KCkpOwotICAgICAgICBpbnQgcmV0VmFsdWUgPSAwOwotICAgICAgICByZXRWYWx1ZSA9IERELmdldEFwcGxpY2F0aW9uKCkuZ2V0VmVyc2lvbklEKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfNCk7Ci0gICAgICAgIERELnNldFZlcnNpb25JRChKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCk7Ci0JCXNldFZlcnNpb24oVkVSU0lPTl8xXzMpOwotCQlyZXRWYWx1ZSA9IERELmdldEFwcGxpY2F0aW9uKCkuZ2V0VmVyc2lvbklEKCk7Ci0JICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfMyk7Ci0JICAgIERELnNldFZlcnNpb25JRChKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRCk7Ci0JCXNldFZlcnNpb24oVkVSU0lPTl8xXzIpOwotCQlyZXRWYWx1ZSA9IERELmdldEFwcGxpY2F0aW9uKCkuZ2V0VmVyc2lvbklEKCk7Ci0JICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfMik7ICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEoyRUVWZXJzaW9uSUQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBSZXNvdXJjZUxvYWRFeGNlcHRpb24sIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQotICAgIAlpbml0KCk7Ci0gICAgIAlBcHBsaWNhdGlvblJlc291cmNlIEREID0gKEFwcGxpY2F0aW9uUmVzb3VyY2UpIGVhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotICAgICAgICBERC5zZXRWZXJzaW9uSUQoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQpOwotIAkJc2V0VmVyc2lvbihWRVJTSU9OXzFfNCk7Ci0gCQlzZXRNb2R1bGVUeXBlKEFQUF9DTElFTlQpOwotIAkJcG9wdWxhdGVSb290KERELmdldFJvb3RPYmplY3QoKSk7Ci0gICAgICAgIGludCByZXRWYWx1ZSA9IDA7Ci0gICAgICAgIHJldFZhbHVlID0gREQuZ2V0QXBwbGljYXRpb24oKS5nZXRKMkVFVmVyc2lvbklEKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfNCk7Ci0gICAgICAgIERELnNldFZlcnNpb25JRChKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCk7Ci0gCQlzZXRWZXJzaW9uKFZFUlNJT05fMV8zKTsKLSAJCXJldFZhbHVlID0gREQuZ2V0QXBwbGljYXRpb24oKS5nZXRKMkVFVmVyc2lvbklEKCk7Ci0gCSAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzMpOwotIAkgICAgREQuc2V0VmVyc2lvbklEKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEKTsKLSAJCXNldFZlcnNpb24oVkVSU0lPTl8xXzIpOwotIAkJcmV0VmFsdWUgPSBERC5nZXRBcHBsaWNhdGlvbigpLmdldEoyRUVWZXJzaW9uSUQoKTsKLSAJICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfMik7ICAKLSAJICAgIAotICAgICAgICAKLSAgICB9Ci0KLSAgLyogIHB1YmxpYyB2b2lkIHRlc3Rfc2V0VmVyc2lvbigpIHsKLQotICAgICAgICBBcHBsaWNhdGlvbiBvYmpBcHBsaWNhdGlvbiA9IGdldEluc3RhbmNlKCkuY3JlYXRlQXBwbGljYXRpb24oKTsKLSAgICAgICAgU3RyaW5nIG5ld1ZlcnNpb24gPSAiIjsKLSAgICAgICAgb2JqQXBwbGljYXRpb24uc2V0VmVyc2lvbihuZXdWZXJzaW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFNlY3VyaXR5Um9sZXMoKSB7Ci0KLSAgICAgICAgQXBwbGljYXRpb24gb2JqQXBwbGljYXRpb24gPSBnZXRJbnN0YW5jZSgpLmNyZWF0ZUFwcGxpY2F0aW9uKCk7Ci0gICAgICAgIEVMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpBcHBsaWNhdGlvbi5nZXRTZWN1cml0eVJvbGVzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRNb2R1bGVzKCkgewotCi0gICAgICAgIEFwcGxpY2F0aW9uIG9iakFwcGxpY2F0aW9uID0gZ2V0SW5zdGFuY2UoKS5jcmVhdGVBcHBsaWNhdGlvbigpOwotICAgICAgICBFTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQXBwbGljYXRpb24uZ2V0TW9kdWxlcygpOwotICAgIH0qLwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgQXBwbGljYXRpb25UZXN0KCJ0ZXN0X2dldFZlcnNpb25JRCIpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgQXBwbGljYXRpb25UZXN0KCJ0ZXN0X2dldEoyRUVWZXJzaW9uSUQiKSk7Ci0JCQotCQlzdWl0ZS5hZGRUZXN0KG5ldyBBcHBsaWNhdGlvblRlc3QoInRlc3RfZ2V0U2VjdXJpdHlSb2xlTmFtZWQiKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEFwcGxpY2F0aW9uVGVzdCgidGVzdF9nZXRNb2R1bGVIYXZpbmdBbHRERCIpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgQXBwbGljYXRpb25UZXN0KCJ0ZXN0X2NvbnRhaW5zU2VjdXJpdHlSb2xlIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBBcHBsaWNhdGlvblRlc3QoInRlc3RfZ2V0TW9kdWxlXzIiKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEFwcGxpY2F0aW9uVGVzdCgidGVzdF9nZXRGaXJzdE1vZHVsZSIpKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xpZW50L3Rlc3QvQXBwbGljYXRpb25DbGllbnRUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jbGllbnQvdGVzdC9BcHBsaWNhdGlvbkNsaWVudFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZlMzQxNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jbGllbnQvdGVzdC9BcHBsaWNhdGlvbkNsaWVudFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC50ZXN0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0cy5BcHBDbGllbnRFTUZUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUudGVzdHV0aWxpdGllcy5FTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQ2xpZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5SZXNvdXJjZUxvYWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBBcHBsaWNhdGlvbkNsaWVudFRlc3QgZXh0ZW5kcyBBcHBDbGllbnRFTUZUZXN0IHsKLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIEFwcGxpY2F0aW9uQ2xpZW50VGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQkJCi0JfQotCXByaXZhdGUgdm9pZCBpbml0KCkgdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiwgUmVzb3VyY2VMb2FkRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotCQlFTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yLnJlc2V0KCk7Ci0gICAgICAgIGNyZWF0ZUVBUigpOwotICAgICAgICBjcmVhdGVBcHBDbGllbnQoKTsKLQl9Ci0JcHJpdmF0ZSBBcHBsaWNhdGlvbkNsaWVudCBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIENsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldENsaWVudEZhY3RvcnkoKS5jcmVhdGVBcHBsaWNhdGlvbkNsaWVudCgpOwotCX0KLSAgCi0gIAotICAgIHB1YmxpYyBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgQXBwbGljYXRpb25DbGllbnRUZXN0KCJ0ZXN0X2dldFZlcnNpb25JRCIpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgQXBwbGljYXRpb25DbGllbnRUZXN0KCJ0ZXN0X2dldEoyRUVWZXJzaW9uSUQiKSk7Ci0JCQotCQlzdWl0ZS5hZGRUZXN0KG5ldyBBcHBsaWNhdGlvbkNsaWVudFRlc3QoInRlc3RfZ2V0Q2FsbGJhY2tIYW5kbGVyQ2xhc3NOYW1lIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBBcHBsaWNhdGlvbkNsaWVudFRlc3QoInRlc3Rfc2V0Q2FsbGJhY2tIYW5kbGVyQ2xhc3NOYW1lIikpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldENhbGxiYWNrSGFuZGxlckNsYXNzTmFtZSgpIHsKLSAgICAgICAgQXBwbGljYXRpb25DbGllbnQgb2JqQXBwbGljYXRpb25DbGllbnQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgY2FsbEJhY2tIYW5kbGVyTmFtZSA9ICJUZXN0Q2FsbEJhY2tIYW5kbGVyTmFtZSIgOwotICAgICAgICBvYmpBcHBsaWNhdGlvbkNsaWVudC5zZXRDYWxsYmFja0hhbmRsZXJDbGFzc05hbWUoY2FsbEJhY2tIYW5kbGVyTmFtZSk7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgcmV0VmFsdWUgPSAiIjsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpBcHBsaWNhdGlvbkNsaWVudC5nZXRDYWxsYmFja0hhbmRsZXJDbGFzc05hbWUoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNhbGxCYWNrSGFuZGxlck5hbWUsIHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldENhbGxiYWNrSGFuZGxlckNsYXNzTmFtZSgpIHsKLQotICAgIAlBcHBsaWNhdGlvbkNsaWVudCBvYmpBcHBsaWNhdGlvbkNsaWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBjYWxsQmFja0hhbmRsZXJOYW1lID0gIlRlc3RDYWxsQmFja0hhbmRsZXJOYW1lIiA7Ci0gICAgICAgIG9iakFwcGxpY2F0aW9uQ2xpZW50LnNldENhbGxiYWNrSGFuZGxlckNsYXNzTmFtZShjYWxsQmFja0hhbmRsZXJOYW1lKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyByZXRWYWx1ZSA9ICIiOwotICAgICAgICByZXRWYWx1ZSA9IG9iakFwcGxpY2F0aW9uQ2xpZW50LmdldENhbGxiYWNrSGFuZGxlckNsYXNzTmFtZSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2FsbEJhY2tIYW5kbGVyTmFtZSwgcmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0VmVyc2lvbklEKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgCWluaXQoKTsKLSAgICAJQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZSBERCA9IChBcHBsaWNhdGlvbkNsaWVudFJlc291cmNlKSBhcHBDbGllbnRGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLSAgICAgICAgREQuc2V0VmVyc2lvbklEKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEKTsKLQkJc2V0VmVyc2lvbihWRVJTSU9OXzFfNCk7Ci0JCXNldE1vZHVsZVR5cGUoQVBQX0NMSUVOVCk7Ci0JCXBvcHVsYXRlUm9vdChERC5nZXRSb290T2JqZWN0KCkpOwotICAgICAgICBpbnQgcmV0VmFsdWUgPSAwOwotICAgICAgICByZXRWYWx1ZSA9IERELmdldEFwcGxpY2F0aW9uQ2xpZW50KCkuZ2V0VmVyc2lvbklEKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfNCk7Ci0gICAgICAgIERELnNldFZlcnNpb25JRChKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCk7Ci0JCXNldFZlcnNpb24oVkVSU0lPTl8xXzMpOwotCQlyZXRWYWx1ZSA9IERELmdldEFwcGxpY2F0aW9uQ2xpZW50KCkuZ2V0VmVyc2lvbklEKCk7Ci0JICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfMyk7Ci0JICAgIERELnNldFZlcnNpb25JRChKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRCk7Ci0JCXNldFZlcnNpb24oVkVSU0lPTl8xXzIpOwotCQlyZXRWYWx1ZSA9IERELmdldEFwcGxpY2F0aW9uQ2xpZW50KCkuZ2V0VmVyc2lvbklEKCk7Ci0JICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfMik7Ci0gICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0SjJFRVZlcnNpb25JRCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIAlpbml0KCk7Ci0gICAgCUFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2UgREQgPSAoQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZSkgYXBwQ2xpZW50RmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0gICAgICAgIERELnNldFZlcnNpb25JRChKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCk7Ci0JCXNldFZlcnNpb24oVkVSU0lPTl8xXzQpOwotCQlzZXRNb2R1bGVUeXBlKEFQUF9DTElFTlQpOwotCQlwb3B1bGF0ZVJvb3QoREQuZ2V0Um9vdE9iamVjdCgpKTsKLSAgICAgICAgaW50IHJldFZhbHVlID0gMDsKLSAgICAgICAgcmV0VmFsdWUgPSBERC5nZXRBcHBsaWNhdGlvbkNsaWVudCgpLmdldEoyRUVWZXJzaW9uSUQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV80KTsKLSAgICAgICAgREQuc2V0VmVyc2lvbklEKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEKTsKLQkJc2V0VmVyc2lvbihWRVJTSU9OXzFfMyk7Ci0JCXJldFZhbHVlID0gREQuZ2V0QXBwbGljYXRpb25DbGllbnQoKS5nZXRKMkVFVmVyc2lvbklEKCk7Ci0JICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfMyk7Ci0JICAgIERELnNldFZlcnNpb25JRChKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRCk7Ci0JCXNldFZlcnNpb24oVkVSU0lPTl8xXzIpOwotCQlyZXRWYWx1ZSA9IERELmdldEFwcGxpY2F0aW9uQ2xpZW50KCkuZ2V0SjJFRVZlcnNpb25JRCgpOwotCSAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzIpOwotICAgIH0KLQotIC8qICAgcHVibGljIHZvaWQgdGVzdF9nZXRWZXJzaW9uKCkgewotCi0gICAgICAgIEFwcGxpY2F0aW9uQ2xpZW50IG9iakFwcGxpY2F0aW9uQ2xpZW50ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIHJldFZhbHVlID0gIiI7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQXBwbGljYXRpb25DbGllbnQuZ2V0VmVyc2lvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0VmVyc2lvbigpIHsKLQotICAgICAgICBBcHBsaWNhdGlvbkNsaWVudCBvYmpBcHBsaWNhdGlvbkNsaWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBuZXdWZXJzaW9uID0gIiI7Ci0gICAgICAgIG9iakFwcGxpY2F0aW9uQ2xpZW50LnNldFZlcnNpb24obmV3VmVyc2lvbik7Ci0gICAgfSovCi0KLSAgICAvKnB1YmxpYyB2b2lkIHRlc3RfZ2V0UmVzb3VyY2VSZWZzKCkgewotCi0gICAgICAgIEFwcGxpY2F0aW9uQ2xpZW50IG9iakFwcGxpY2F0aW9uQ2xpZW50ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRUxpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakFwcGxpY2F0aW9uQ2xpZW50LmdldFJlc291cmNlUmVmcygpOwotICAgIH0KLSovCi0gICAvKiBwdWJsaWMgdm9pZCB0ZXN0X2dldEVudmlyb25tZW50UHJvcHMoKSB7Ci0KLSAgICAgICAgQXBwbGljYXRpb25DbGllbnQgb2JqQXBwbGljYXRpb25DbGllbnQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBFTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQXBwbGljYXRpb25DbGllbnQuZ2V0RW52aXJvbm1lbnRQcm9wcygpOwotICAgIH0qLwotCi0gIC8qICBwdWJsaWMgdm9pZCB0ZXN0X2dldEVqYlJlZmVyZW5jZXMoKSB7Ci0KLSAgICAgICAgQXBwbGljYXRpb25DbGllbnQgb2JqQXBwbGljYXRpb25DbGllbnQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBFTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQXBwbGljYXRpb25DbGllbnQuZ2V0RWpiUmVmZXJlbmNlcygpOwotICAgIH0qLwotCi0gIC8qICBwdWJsaWMgdm9pZCB0ZXN0X2dldFJlc291cmNlRW52UmVmcygpIHsKLQotICAgICAgICBBcHBsaWNhdGlvbkNsaWVudCBvYmpBcHBsaWNhdGlvbkNsaWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpBcHBsaWNhdGlvbkNsaWVudC5nZXRSZXNvdXJjZUVudlJlZnMoKTsKLSAgICB9Ki8KLQotICAgLyogcHVibGljIHZvaWQgdGVzdF9nZXRDYWxsYmFja0hhbmRsZXIoKSB7Ci0KLSAgICAgICAgQXBwbGljYXRpb25DbGllbnQgb2JqQXBwbGljYXRpb25DbGllbnQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBKYXZhQ2xhc3MgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakFwcGxpY2F0aW9uQ2xpZW50LmdldENhbGxiYWNrSGFuZGxlcigpOwotICAgIH0qLwotCi0gICAvKiBwdWJsaWMgdm9pZCB0ZXN0X3NldENhbGxiYWNrSGFuZGxlcigpIHsKLQotICAgICAgICBBcHBsaWNhdGlvbkNsaWVudCBvYmpBcHBsaWNhdGlvbkNsaWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEphdmFDbGFzcyBuZXdDYWxsYmFja0hhbmRsZXIgPSBudWxsOwotICAgICAgICBvYmpBcHBsaWNhdGlvbkNsaWVudC5zZXRDYWxsYmFja0hhbmRsZXIobmV3Q2FsbGJhY2tIYW5kbGVyKTsKLSAgICB9Ki8KLQotICAvKiAgcHVibGljIHZvaWQgdGVzdF9nZXRTZXJ2aWNlUmVmcygpIHsKLQotICAgICAgICBBcHBsaWNhdGlvbkNsaWVudCBvYmpBcHBsaWNhdGlvbkNsaWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpBcHBsaWNhdGlvbkNsaWVudC5nZXRTZXJ2aWNlUmVmcygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpIHsKLQotICAgICAgICBBcHBsaWNhdGlvbkNsaWVudCBvYmpBcHBsaWNhdGlvbkNsaWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpBcHBsaWNhdGlvbkNsaWVudC5nZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRNZXNzYWdlRGVzdGluYXRpb25zKCkgewotCi0gICAgICAgIEFwcGxpY2F0aW9uQ2xpZW50IG9iakFwcGxpY2F0aW9uQ2xpZW50ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRUxpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakFwcGxpY2F0aW9uQ2xpZW50LmdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKTsKLSAgICB9Ki8KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xpZW50L3Rlc3QvQ2xpZW50RmFjdG9yeVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC90ZXN0L0NsaWVudEZhY3RvcnlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNTQxZDIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xpZW50L3Rlc3QvQ2xpZW50RmFjdG9yeVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LnRlc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQ2xpZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQ2xpZW50UGFja2FnZTsKLQotcHVibGljIGNsYXNzIENsaWVudEZhY3RvcnlUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHJpdmF0ZSBDbGllbnRGYWN0b3J5IGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gQ2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q2xpZW50RmFjdG9yeSgpOwotCX0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X0NsaWVudEZhY3RvcnkoKSB7Ci0gICAgICAgIENsaWVudEZhY3RvcnkgdG1wQ2xpZW50RmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwodG1wQ2xpZW50RmFjdG9yeSk7Ci0gICAgfQotCi0gICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUFwcGxpY2F0aW9uQ2xpZW50KCkgewotCi0gICAgICAgIENsaWVudEZhY3Rvcnkgb2JqQ2xpZW50RmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEFwcGxpY2F0aW9uQ2xpZW50IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDbGllbnRGYWN0b3J5LmNyZWF0ZUFwcGxpY2F0aW9uQ2xpZW50KCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKENsaWVudEZhY3RvcnlUZXN0LmNsYXNzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0L0NvbW1vbkZhY3RvcnlUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdC9Db21tb25GYWN0b3J5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTI4NjljLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0L0NvbW1vbkZhY3RvcnlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24udGVzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGlzcGxheU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVKQkxvY2FsUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FamJSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVudkVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5JY29uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSWRlbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvblJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUGFyYW1WYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJlc291cmNlRW52UmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNvdXJjZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUnVuQXNTcGVjaWZpZWRJZGVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlJZGVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eVJvbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlVzZUNhbGxlcklkZW50aXR5OwotCi1wdWJsaWMgY2xhc3MgQ29tbW9uRmFjdG9yeVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIENvbW1vbkZhY3RvcnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21tb25GYWN0b3J5KCk7Ci0JfQotCQotICAgIHB1YmxpYyB2b2lkIHRlc3RfQ29tbW9uRmFjdG9yeSgpIHsKLQotICAgICAgICBDb21tb25GYWN0b3J5IHRtcENvbW1vbkZhY3RvcnkgPWdldEluc3RhbmNlKCk7Ci0gICAgfQotCi0gICAKLSAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlRWpiUmVmKCkgewotCi0gICAgICAgIENvbW1vbkZhY3Rvcnkgb2JqQ29tbW9uRmFjdG9yeSA9Z2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRWpiUmVmIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb21tb25GYWN0b3J5LmNyZWF0ZUVqYlJlZigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUVudkVudHJ5KCkgewotCi0gICAgICAgIENvbW1vbkZhY3Rvcnkgb2JqQ29tbW9uRmFjdG9yeSA9Z2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRW52RW50cnkgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNvbW1vbkZhY3RvcnkuY3JlYXRlRW52RW50cnkoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVSZXNvdXJjZVJlZigpIHsKLQotICAgICAgICBDb21tb25GYWN0b3J5IG9iakNvbW1vbkZhY3RvcnkgPWdldEluc3RhbmNlKCk7Ci0gICAgICAgIFJlc291cmNlUmVmIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb21tb25GYWN0b3J5LmNyZWF0ZVJlc291cmNlUmVmKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlU2VjdXJpdHlSb2xlUmVmKCkgewotCi0gICAgICAgIENvbW1vbkZhY3Rvcnkgb2JqQ29tbW9uRmFjdG9yeSA9Z2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU2VjdXJpdHlSb2xlUmVmIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb21tb25GYWN0b3J5LmNyZWF0ZVNlY3VyaXR5Um9sZVJlZigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZVNlY3VyaXR5Um9sZSgpIHsKLQotICAgICAgICBDb21tb25GYWN0b3J5IG9iakNvbW1vbkZhY3RvcnkgPWdldEluc3RhbmNlKCk7Ci0gICAgICAgIFNlY3VyaXR5Um9sZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29tbW9uRmFjdG9yeS5jcmVhdGVTZWN1cml0eVJvbGUoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVSZXNvdXJjZUVudlJlZigpIHsKLQotICAgICAgICBDb21tb25GYWN0b3J5IG9iakNvbW1vbkZhY3RvcnkgPWdldEluc3RhbmNlKCk7Ci0gICAgICAgIFJlc291cmNlRW52UmVmIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb21tb25GYWN0b3J5LmNyZWF0ZVJlc291cmNlRW52UmVmKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlRUpCTG9jYWxSZWYoKSB7Ci0KLSAgICAgICAgQ29tbW9uRmFjdG9yeSBvYmpDb21tb25GYWN0b3J5ID1nZXRJbnN0YW5jZSgpOwotICAgICAgICBFSkJMb2NhbFJlZiByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29tbW9uRmFjdG9yeS5jcmVhdGVFSkJMb2NhbFJlZigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZVJ1bkFzU3BlY2lmaWVkSWRlbnRpdHkoKSB7Ci0KLSAgICAgICAgQ29tbW9uRmFjdG9yeSBvYmpDb21tb25GYWN0b3J5ID1nZXRJbnN0YW5jZSgpOwotICAgICAgICBSdW5Bc1NwZWNpZmllZElkZW50aXR5IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb21tb25GYWN0b3J5LmNyZWF0ZVJ1bkFzU3BlY2lmaWVkSWRlbnRpdHkoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVJZGVudGl0eSgpIHsKLQotICAgICAgICBDb21tb25GYWN0b3J5IG9iakNvbW1vbkZhY3RvcnkgPWdldEluc3RhbmNlKCk7Ci0gICAgICAgIElkZW50aXR5IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb21tb25GYWN0b3J5LmNyZWF0ZUlkZW50aXR5KCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlSWNvblR5cGUoKSB7Ci0KLSAgICAgICAgQ29tbW9uRmFjdG9yeSBvYmpDb21tb25GYWN0b3J5ID1nZXRJbnN0YW5jZSgpOwotICAgICAgICBJY29uVHlwZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29tbW9uRmFjdG9yeS5jcmVhdGVJY29uVHlwZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZURpc3BsYXlOYW1lKCkgewotCi0gICAgICAgIENvbW1vbkZhY3Rvcnkgb2JqQ29tbW9uRmFjdG9yeSA9Z2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRGlzcGxheU5hbWUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNvbW1vbkZhY3RvcnkuY3JlYXRlRGlzcGxheU5hbWUoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVNZXNzYWdlRGVzdGluYXRpb25SZWYoKSB7Ci0KLSAgICAgICAgQ29tbW9uRmFjdG9yeSBvYmpDb21tb25GYWN0b3J5ID1nZXRJbnN0YW5jZSgpOwotICAgICAgICBNZXNzYWdlRGVzdGluYXRpb25SZWYgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNvbW1vbkZhY3RvcnkuY3JlYXRlTWVzc2FnZURlc3RpbmF0aW9uUmVmKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlTWVzc2FnZURlc3RpbmF0aW9uKCkgewotCi0gICAgICAgIENvbW1vbkZhY3Rvcnkgb2JqQ29tbW9uRmFjdG9yeSA9Z2V0SW5zdGFuY2UoKTsKLSAgICAgICAgTWVzc2FnZURlc3RpbmF0aW9uIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb21tb25GYWN0b3J5LmNyZWF0ZU1lc3NhZ2VEZXN0aW5hdGlvbigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZVBhcmFtVmFsdWUoKSB7Ci0KLSAgICAgICAgQ29tbW9uRmFjdG9yeSBvYmpDb21tb25GYWN0b3J5ID1nZXRJbnN0YW5jZSgpOwotICAgICAgICBQYXJhbVZhbHVlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb21tb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWUoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVEZXNjcmlwdGlvbkdyb3VwKCkgewotCi0gICAgICAgIENvbW1vbkZhY3Rvcnkgb2JqQ29tbW9uRmFjdG9yeSA9Z2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRGVzY3JpcHRpb25Hcm91cCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29tbW9uRmFjdG9yeS5jcmVhdGVEZXNjcmlwdGlvbkdyb3VwKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlU2VjdXJpdHlJZGVudGl0eSgpIHsKLQotICAgICAgICBDb21tb25GYWN0b3J5IG9iakNvbW1vbkZhY3RvcnkgPWdldEluc3RhbmNlKCk7Ci0gICAgICAgIFNlY3VyaXR5SWRlbnRpdHkgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNvbW1vbkZhY3RvcnkuY3JlYXRlU2VjdXJpdHlJZGVudGl0eSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZVVzZUNhbGxlcklkZW50aXR5KCkgewotCi0gICAgICAgIENvbW1vbkZhY3Rvcnkgb2JqQ29tbW9uRmFjdG9yeSA9Z2V0SW5zdGFuY2UoKTsKLSAgICAgICAgVXNlQ2FsbGVySWRlbnRpdHkgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNvbW1vbkZhY3RvcnkuY3JlYXRlVXNlQ2FsbGVySWRlbnRpdHkoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVEZXNjcmlwdGlvbigpIHsKLQotICAgICAgICBDb21tb25GYWN0b3J5IG9iakNvbW1vbkZhY3RvcnkgPWdldEluc3RhbmNlKCk7Ci0gICAgICAgIERlc2NyaXB0aW9uIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb21tb25GYWN0b3J5LmNyZWF0ZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlUU5hbWUoKSB7Ci0KLSAgICAgICAgQ29tbW9uRmFjdG9yeSBvYmpDb21tb25GYWN0b3J5ID1nZXRJbnN0YW5jZSgpOwotICAgICAgICBRTmFtZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29tbW9uRmFjdG9yeS5jcmVhdGVRTmFtZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUxpc3RlbmVyKCkgewotCi0gICAgICAgIENvbW1vbkZhY3Rvcnkgb2JqQ29tbW9uRmFjdG9yeSA9Z2V0SW5zdGFuY2UoKTsKLSAgICAgICAgTGlzdGVuZXIgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNvbW1vbkZhY3RvcnkuY3JlYXRlTGlzdGVuZXIoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCgpIHsKLQotICAgICAgICBDb21tb25GYWN0b3J5IG9iakNvbW1vbkZhY3RvcnkgPWdldEluc3RhbmNlKCk7Ci0gICAgICAgIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb21tb25GYWN0b3J5LmNyZWF0ZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLSAKLSAgICAKLSAgICAvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShDb21tb25GYWN0b3J5VGVzdC5jbGFzcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3QvQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdC9Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJkNzZmNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdC9Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLnRlc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXA7Ci0KLXB1YmxpYyBjbGFzcyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoKTsKLQl9Ci0JCi0gIC8qICBwdWJsaWMgdm9pZCB0ZXN0X2dldFNtYWxsSWNvbigpIHsKLSAgICAgICAgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgb2JqQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgcmV0VmFsdWUgPSAiIjsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cC5nZXRTbWFsbEljb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFNtYWxsSWNvbigpIHsKLQotICAgICAgICBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCBvYmpDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCA9ICBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgbmV3U21hbGxJY29uID0gIiI7Ci0gICAgICAgIG9iakNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwLnNldFNtYWxsSWNvbihuZXdTbWFsbEljb24pOwotICAgIH0gKi8KLQotICAgLyogcHVibGljIHZvaWQgdGVzdF9zZXRTbWFsbEljb25HZW4oKSB7Ci0KLSAgICAgICAgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgb2JqQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgPSAgZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIG5ld1NtYWxsSWNvbiA9ICIiOwotICAgICAgICBvYmpDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cC5zZXRTbWFsbEljb25HZW4obmV3U21hbGxJY29uKTsKLSAgICB9Ki8KLQotICAvKiAgcHVibGljIHZvaWQgdGVzdF9nZXRMYXJnZUljb24oKSB7Ci0KLSAgICAgICAgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgb2JqQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgPSAgZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIHJldFZhbHVlID0gIiI7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAuZ2V0TGFyZ2VJY29uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRMYXJnZUljb24oKSB7Ci0KLSAgICAgICAgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgb2JqQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgPSAgZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIG5ld0xhcmdlSWNvbiA9ICIiOwotICAgICAgICBvYmpDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cC5zZXRMYXJnZUljb24obmV3TGFyZ2VJY29uKTsKLSAgICB9ICovCi0KLSAgIC8qcHVibGljIHZvaWQgdGVzdF9zZXRMYXJnZUljb25HZW4oKSB7Ci0KLSAgICAgICAgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgb2JqQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgPSAgZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIG5ld0xhcmdlSWNvbiA9ICIiOwotICAgICAgICBvYmpDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cC5zZXRMYXJnZUljb25HZW4obmV3TGFyZ2VJY29uKTsKLSAgICB9Ki8KLQotICAgLyogcHVibGljIHZvaWQgdGVzdF9nZXREZXNjcmlwdGlvbigpIHsKLQotICAgICAgICBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCBvYmpDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCA9ICBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgcmV0VmFsdWUgPSAiIjsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cC5nZXREZXNjcmlwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0RGVzY3JpcHRpb24oKSB7Ci0KLSAgICAgICAgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgb2JqQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgPSAgZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIG5ld0Rlc2NyaXB0aW9uID0gIiI7Ci0gICAgICAgIG9iakNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwLnNldERlc2NyaXB0aW9uKG5ld0Rlc2NyaXB0aW9uKTsKLSAgICB9Ci0qLwotICAgCi0gICAvKiBwdWJsaWMgdm9pZCB0ZXN0X3NldERlc2NyaXB0aW9uR2VuKCkgewotCi0gICAgICAgIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIG9iakNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwID0gIGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBuZXdEZXNjcmlwdGlvbiA9ICIiOwotICAgICAgICBvYmpDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cC5zZXREZXNjcmlwdGlvbkdlbihuZXdEZXNjcmlwdGlvbik7Ci0gICAgfSovCi0KLSAgICAvKiBwdWJsaWMgdm9pZCB0ZXN0X2dldERpc3BsYXlOYW1lKCkgewotCi0gICAgICAgIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIG9iakNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwID0gIGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyByZXRWYWx1ZSA9ICIiOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwLmdldERpc3BsYXlOYW1lKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXREaXNwbGF5TmFtZSgpIHsKLQotICAgICAgICBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCBvYmpDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCA9ICBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgbmV3RGlzcGxheU5hbWUgPSAiIjsKLSAgICAgICAgb2JqQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAuc2V0RGlzcGxheU5hbWUobmV3RGlzcGxheU5hbWUpOwotICAgIH0qLwotCi0gICAvKnB1YmxpYyB2b2lkIHRlc3Rfc2V0RGlzcGxheU5hbWVHZW4oKSB7Ci0KLSAgICAgICAgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgb2JqQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgPSAgZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIG5ld0Rpc3BsYXlOYW1lID0gIiI7Ci0gICAgICAgIG9iakNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwLnNldERpc3BsYXlOYW1lR2VuKG5ld0Rpc3BsYXlOYW1lKTsKLSAgICB9Ki8KLQotICAgCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdC9FamJSZWZUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdC9FamJSZWZUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMTBhZGUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3QvRWpiUmVmVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLnRlc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FSkJMb2NhbFJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRWpiUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Bc3NlbWJseURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlNlc3Npb247Ci0KLXB1YmxpYyBjbGFzcyBFamJSZWZUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRWpiRmFjdG9yeSBFSkJGQUNUT1JZID0gRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RWpiRmFjdG9yeSgpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbW1vbkZhY3RvcnkgQ09NTU9ORkFDVE9SWSA9IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldENvbW1vbkZhY3RvcnkoKTsKLQkKLQlwcml2YXRlIEVqYlJlZiBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIENPTU1PTkZBQ1RPUlkuY3JlYXRlRWpiUmVmKCk7Ci0JfQotCQotICAgIHB1YmxpYyB2b2lkIHRlc3RfRWpiUmVmKCkgewotICAgICAgICBFamJSZWYgdG1wRWpiUmVmID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh0bXBFamJSZWYpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TGlua2VkRWpiKCkgewotICAgIAkKLSAgICAJRUpCSmFyIG9iakVKQkphciA9IEVKQkZBQ1RPUlkuY3JlYXRlRUpCSmFyKCk7Ci0gICAgICAgIEFzc2VtYmx5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gRUpCRkFDVE9SWS5jcmVhdGVBc3NlbWJseURlc2NyaXB0b3IoKTsKLSAgICAgICAgb2JqRUpCSmFyLnNldEFzc2VtYmx5RGVzY3JpcHRvcihkZXNjcmlwdG9yKTsKLSAgICAgICAgIAotICAgIAlFamJSZWYgZWpiUmVmID0gQ09NTU9ORkFDVE9SWS5jcmVhdGVFamJSZWYoKTsKLSAgICAJU2Vzc2lvbiBzZXNzaW9uMSA9IEVKQkZBQ1RPUlkuY3JlYXRlU2Vzc2lvbigpOwotICAgIAlTdHJpbmcgbmFtZTEgPSAiTmFtZTEiOwotICAgIAlzZXNzaW9uMS5zZXROYW1lKG5hbWUxKTsKLSAgICAJCi0gICAgCVNlc3Npb24gc2Vzc2lvbjIgPSBFSkJGQUNUT1JZLmNyZWF0ZVNlc3Npb24oKTsKLSAgICAJU3RyaW5nIG5hbWUyID0gIk5hbWUyIjsKLSAgICAJc2Vzc2lvbjIuc2V0TmFtZShuYW1lMik7Ci0gICAgCQotICAgIAllamJSZWYuc2V0TGluayhuYW1lMik7Ci0gICAgCWVqYlJlZi5zZXROYW1lKCJFamJSZWZfIiArIG5hbWUyKTsKLSAgICAJCi0gICAgCW9iakVKQkphci5nZXRFbnRlcnByaXNlQmVhbnMoKS5hZGQoc2Vzc2lvbjEpOwotICAgIAlvYmpFSkJKYXIuZ2V0RW50ZXJwcmlzZUJlYW5zKCkuYWRkKHNlc3Npb24yKTsKLSAgICAgICAgRW50ZXJwcmlzZUJlYW4gcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IGVqYlJlZi5nZXRMaW5rZWRFamIob2JqRUpCSmFyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHNlc3Npb24yLHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzRXF1aXZhbGVudCgpIHsKLQotICAgIAlFSkJKYXIgb2JqRUpCSmFyID0gRUpCRkFDVE9SWS5jcmVhdGVFSkJKYXIoKTsKLSAgICAgICAgQXNzZW1ibHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBFSkJGQUNUT1JZLmNyZWF0ZUFzc2VtYmx5RGVzY3JpcHRvcigpOwotICAgICAgICBvYmpFSkJKYXIuc2V0QXNzZW1ibHlEZXNjcmlwdG9yKGRlc2NyaXB0b3IpOwotICAgICAgICAgCi0gICAgCUVqYlJlZiBlamJSZWYxID0gQ09NTU9ORkFDVE9SWS5jcmVhdGVFamJSZWYoKTsKLSAgICAJRWpiUmVmIGVqYlJlZjIgPSBDT01NT05GQUNUT1JZLmNyZWF0ZUVqYlJlZigpOwotICAgIAlTZXNzaW9uIHNlc3Npb24xID0gRUpCRkFDVE9SWS5jcmVhdGVTZXNzaW9uKCk7Ci0gICAgCVN0cmluZyBuYW1lMSA9ICJOYW1lMSI7Ci0gICAgCXNlc3Npb24xLnNldE5hbWUobmFtZTEpOwotICAgIAkKLSAgICAJU2Vzc2lvbiBzZXNzaW9uMiA9IEVKQkZBQ1RPUlkuY3JlYXRlU2Vzc2lvbigpOwotICAgIAlTdHJpbmcgbmFtZTIgPSAiTmFtZTIiOwotICAgIAlzZXNzaW9uMi5zZXROYW1lKG5hbWUyKTsKLSAgICAJCi0gICAgCWVqYlJlZjEuc2V0TGluayhuYW1lMik7Ci0gICAgCWVqYlJlZjEuc2V0TmFtZSgiRWpiUmVmXyIgKyBuYW1lMik7Ci0gICAgCQotICAgIAllamJSZWYyLnNldExpbmsobmFtZTIpOwotICAgIAllamJSZWYyLnNldE5hbWUoIkVqYlJlZl8iICsgbmFtZTIpOwotICAgIAkKLSAgICAJU3RyaW5nIGhvbWUxID0gImhvbWUxIjsKLSAgICAJU3RyaW5nIGhvbWUyID0gImhvbWUyIiA7Ci0gICAgCVN0cmluZyByZW1vdGUxID0gInJlbW90ZTEiIDsKLSAgICAJU3RyaW5nIHJlbW90ZTIgPSAicmVtb3RlMiI7Ci0gICAgCQotICAgIAllamJSZWYxLnNldEhvbWUoaG9tZTEpOwotICAgIAllamJSZWYyLnNldEhvbWUoaG9tZTEpOwotICAgIAkKLSAgICAJZWpiUmVmMS5zZXRSZW1vdGUocmVtb3RlMSk7Ci0gICAgCWVqYlJlZjIuc2V0UmVtb3RlKHJlbW90ZTEpOwotICAgIAkKLSAgICAJb2JqRUpCSmFyLmdldEVudGVycHJpc2VCZWFucygpLmFkZChzZXNzaW9uMSk7Ci0gICAgCW9iakVKQkphci5nZXRFbnRlcnByaXNlQmVhbnMoKS5hZGQoc2Vzc2lvbjIpOwotICAgIAkKLSAgICAJYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICByZXRWYWx1ZSA9IGVqYlJlZjEuaXNFcXVpdmFsZW50KGVqYlJlZjIpOwkKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLHRydWUpOwotICAgICAgICAKLSAgICAgICAgZWpiUmVmMi5zZXRSZW1vdGUocmVtb3RlMik7Ci0gICAgICAgIHJldFZhbHVlID0gZWpiUmVmMS5pc0VxdWl2YWxlbnQoZWpiUmVmMik7CQotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsZmFsc2UpOwotICAgICAgICAKLSAgICAgICAgZWpiUmVmMi5zZXRSZW1vdGUocmVtb3RlMSk7Ci0gICAgICAgIGVqYlJlZjIuc2V0SG9tZShob21lMik7Ci0gICAgICAgIHJldFZhbHVlID0gZWpiUmVmMS5pc0VxdWl2YWxlbnQoZWpiUmVmMik7CQotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsZmFsc2UpOwotICAgICAgICAKLSAgICAgICAgZWpiUmVmMi5zZXRIb21lKGhvbWUxKTsKLSAgICAgICAgZWpiUmVmMi5zZXRMaW5rKG5hbWUxKTsKLSAgICAgICAgcmV0VmFsdWUgPSBlamJSZWYxLmlzRXF1aXZhbGVudChlamJSZWYyKTsJCi0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxmYWxzZSk7Ci0gICAgICAgIAotICAgICAgICBlamJSZWYyLnNldExpbmsobmFtZTIpOwotICAgICAgICBlamJSZWYyLnNldE5hbWUoIkVqYlJlZl8iICsgbmFtZTEpOwotICAgICAgICByZXRWYWx1ZSA9IGVqYlJlZjEuaXNFcXVpdmFsZW50KGVqYlJlZjIpOwkKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLGZhbHNlKTsKLSAgICAgICAgCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9pc0xpbmtlZCgpIHsKLQotICAgIAlTZXNzaW9uIHNlc3Npb24xID0gRUpCRkFDVE9SWS5jcmVhdGVTZXNzaW9uKCk7Ci0gICAgCVN0cmluZyBuYW1lMSA9ICJOYW1lMSI7Ci0gICAgCXNlc3Npb24xLnNldE5hbWUobmFtZTEpOwotICAgICAgICBFamJSZWYgb2JqRWpiUmVmID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVqYlJlZi5pc0xpbmtlZChzZXNzaW9uMSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSwgZmFsc2UpOwotICAgICAgICAKLSAgICAgICAgb2JqRWpiUmVmLnNldExpbmsobmFtZTEpOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVqYlJlZi5pc0xpbmtlZChzZXNzaW9uMSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSwgdHJ1ZSk7Ci0gICAgICAgIAotICAgICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzTG9jYWwoKSB7Ci0KLSAgICAgICAgRWpiUmVmIG9iakVqYlJlZiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFamJSZWYuaXNMb2NhbCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsZmFsc2UpOwotICAgICAgICBFSkJMb2NhbFJlZiBvYmpMb2NhbFJlZiA9IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldENvbW1vbkZhY3RvcnkoKS5jcmVhdGVFSkJMb2NhbFJlZigpOwotICAgICAgICByZXRWYWx1ZSA9IG9iakxvY2FsUmVmLmlzTG9jYWwoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLHRydWUpOwotICAgIH0KLQotICAgLyogcHVibGljIHZvaWQgdGVzdF9nZXROYW1lKCkgewotCi0gICAgICAgIEVqYlJlZiBvYmpFamJSZWYgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgcmV0VmFsdWUgPSAiIjsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFamJSZWYuZ2V0TmFtZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0TmFtZSgpIHsKLQotICAgICAgICBFamJSZWYgb2JqRWpiUmVmID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIG5ld05hbWUgPSAiIjsKLSAgICAgICAgb2JqRWpiUmVmLnNldE5hbWUobmV3TmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRUeXBlKCkgewotCi0gICAgICAgIEVqYlJlZiBvYmpFamJSZWYgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBFamJSZWZUeXBlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFamJSZWYuZ2V0VHlwZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0VHlwZSgpIHsKLQotICAgICAgICBFamJSZWYgb2JqRWpiUmVmID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRWpiUmVmVHlwZSBuZXdUeXBlID0gbnVsbDsKLSAgICAgICAgb2JqRWpiUmVmLnNldFR5cGUobmV3VHlwZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF91bnNldFR5cGUoKSB7Ci0KLSAgICAgICAgRWpiUmVmIG9iakVqYlJlZiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIG9iakVqYlJlZi51bnNldFR5cGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzU2V0VHlwZSgpIHsKLQotICAgICAgICBFamJSZWYgb2JqRWpiUmVmID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVqYlJlZi5pc1NldFR5cGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEhvbWUoKSB7Ci0KLSAgICAgICAgRWpiUmVmIG9iakVqYlJlZiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyByZXRWYWx1ZSA9ICIiOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVqYlJlZi5nZXRIb21lKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRIb21lKCkgewotCi0gICAgICAgIEVqYlJlZiBvYmpFamJSZWYgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgbmV3SG9tZSA9ICIiOwotICAgICAgICBvYmpFamJSZWYuc2V0SG9tZShuZXdIb21lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFJlbW90ZSgpIHsKLQotICAgICAgICBFamJSZWYgb2JqRWpiUmVmID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIHJldFZhbHVlID0gIiI7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRWpiUmVmLmdldFJlbW90ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0UmVtb3RlKCkgewotCi0gICAgICAgIEVqYlJlZiBvYmpFamJSZWYgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgbmV3UmVtb3RlID0gIiI7Ci0gICAgICAgIG9iakVqYlJlZi5zZXRSZW1vdGUobmV3UmVtb3RlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldExpbmsoKSB7Ci0KLSAgICAgICAgRWpiUmVmIG9iakVqYlJlZiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyByZXRWYWx1ZSA9ICIiOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVqYlJlZi5nZXRMaW5rKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRMaW5rKCkgewotCi0gICAgICAgIEVqYlJlZiBvYmpFamJSZWYgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgbmV3TGluayA9ICIiOwotICAgICAgICBvYmpFamJSZWYuc2V0TGluayhuZXdMaW5rKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldERlc2NyaXB0aW9uKCkgewotCi0gICAgICAgIEVqYlJlZiBvYmpFamJSZWYgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgbmV3RGVzY3JpcHRpb24gPSAiIjsKLSAgICAgICAgb2JqRWpiUmVmLnNldERlc2NyaXB0aW9uKG5ld0Rlc2NyaXB0aW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldERlc2NyaXB0aW9uKCkgewotCi0gICAgICAgIEVqYlJlZiBvYmpFamJSZWYgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgcmV0VmFsdWUgPSAiIjsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFamJSZWYuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldERlc2NyaXB0aW9ucygpIHsKLQotICAgICAgICBFamJSZWYgb2JqRWpiUmVmID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRUxpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVqYlJlZi5nZXREZXNjcmlwdGlvbnMoKTsKLSAgICB9Ki8KLSAgICAKLSAgICAvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShFamJSZWZUZXN0LmNsYXNzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdC9MaXN0ZW5lclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0L0xpc3RlbmVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDA4NWVjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0L0xpc3RlbmVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24udGVzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkxpc3RlbmVyOwotCi1wdWJsaWMgY2xhc3MgTGlzdGVuZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHJpdmF0ZSBMaXN0ZW5lciBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpc3RlbmVyKCk7Ci0JfQotICAgLyogcHVibGljIHZvaWQgdGVzdF9nZXRMaXN0ZW5lckNsYXNzKCkgewotICAgICAgICBMaXN0ZW5lciBvYmpMaXN0ZW5lciA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEphdmFDbGFzcyByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTGlzdGVuZXIuZ2V0TGlzdGVuZXJDbGFzcygpOwotICAgIH0gCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldExpc3RlbmVyQ2xhc3MoKSB7Ci0KLSAgICAgICAgTGlzdGVuZXIgb2JqTGlzdGVuZXIgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBKYXZhQ2xhc3MgbmV3TGlzdGVuZXJDbGFzcyA9IG51bGw7Ci0gICAgICAgIG9iakxpc3RlbmVyLnNldExpc3RlbmVyQ2xhc3MobmV3TGlzdGVuZXJDbGFzcyk7Ci0gICAgfSovCi0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TGlzdGVuZXJDbGFzc05hbWUoKSB7Ci0KLSAgICAgICAgTGlzdGVuZXIgb2JqTGlzdGVuZXIgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgbGlzdGVuZXJDbGFzc05hbWUgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkxpc3RlbmVyMSIgOwotICAgICAgICBvYmpMaXN0ZW5lci5zZXRMaXN0ZW5lckNsYXNzTmFtZShsaXN0ZW5lckNsYXNzTmFtZSk7Ci0gICAgICAgIFN0cmluZyByZXRWYWx1ZSA9ICIiOwotICAgICAgICByZXRWYWx1ZSA9IG9iakxpc3RlbmVyLmdldExpc3RlbmVyQ2xhc3NOYW1lKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhsaXN0ZW5lckNsYXNzTmFtZSwgcmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0TGlzdGVuZXJDbGFzc05hbWUoKSB7Ci0KLSAgICAgICAgTGlzdGVuZXIgb2JqTGlzdGVuZXIgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgbGlzdGVuZXJDbGFzc05hbWUgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkxpc3RlbmVyMSI7Ci0gICAgICAgIG9iakxpc3RlbmVyLnNldExpc3RlbmVyQ2xhc3NOYW1lKGxpc3RlbmVyQ2xhc3NOYW1lKTsKLSAgICAgICAgU3RyaW5nIHJldFZhbHVlID0gIiI7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTGlzdGVuZXIuZ2V0TGlzdGVuZXJDbGFzc05hbWUoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGxpc3RlbmVyQ2xhc3NOYW1lLCByZXRWYWx1ZSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKExpc3RlbmVyVGVzdC5jbGFzcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdC9RTmFtZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0L1FOYW1lVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjViZjgwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0L1FOYW1lVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24udGVzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lOwotCi1wdWJsaWMgY2xhc3MgUU5hbWVUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCQotCXByaXZhdGUgUU5hbWUgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVRTmFtZSgpOwotCX0KLQotICAvKiAgcHVibGljIHZvaWQgdGVzdF9nZXROYW1lc3BhY2VVUkkoKSB7Ci0KLSAgICAgICAgUU5hbWUgb2JqUU5hbWUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgcmV0VmFsdWUgPSAiIjsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICB9Ci0KLSAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0TmFtZXNwYWNlVVJJKCkgewotCi0gICAgICAgIFFOYW1lIG9ialFOYW1lID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIG5ld05hbWVzcGFjZVVSSSA9ICIiOwotICAgICAgICBvYmpRTmFtZS5zZXROYW1lc3BhY2VVUkkobmV3TmFtZXNwYWNlVVJJKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldExvY2FsUGFydCgpIHsKLQotICAgICAgICBRTmFtZSBvYmpRTmFtZSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyByZXRWYWx1ZSA9ICIiOwotICAgICAgICByZXRWYWx1ZSA9IG9ialFOYW1lLmdldExvY2FsUGFydCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0TG9jYWxQYXJ0KCkgewotCi0gICAgICAgIFFOYW1lIG9ialFOYW1lID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIG5ld0xvY2FsUGFydCA9ICIiOwotICAgICAgICBvYmpRTmFtZS5zZXRMb2NhbFBhcnQobmV3TG9jYWxQYXJ0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldENvbWJpbmVkUU5hbWUoKSB7Ci0KLSAgICAgICAgUU5hbWUgb2JqUU5hbWUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgcmV0VmFsdWUgPSAiIjsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpRTmFtZS5nZXRDb21iaW5lZFFOYW1lKCk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldENvbWJpbmVkUU5hbWUoKSB7Ci0KLSAgICAgICAgUU5hbWUgb2JqUU5hbWUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgbmV3Q29tYmluZWRRTmFtZSA9ICIiOwotICAgICAgICBvYmpRTmFtZS5zZXRDb21iaW5lZFFOYW1lKG5ld0NvbWJpbmVkUU5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0SW50ZXJuYWxQcmVmaXhPck5zVVJJKCkgewotCi0gICAgICAgIFFOYW1lIG9ialFOYW1lID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIHJldFZhbHVlID0gIiI7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqUU5hbWUuZ2V0SW50ZXJuYWxQcmVmaXhPck5zVVJJKCk7Ci0gICAgfQotCi0gICAgCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldEludGVybmFsUHJlZml4T3JOc1VSSSgpIHsKLQotICAgICAgICBRTmFtZSBvYmpRTmFtZSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBuZXdJbnRlcm5hbFByZWZpeE9yTnNVUkkgPSAiIjsKLSAgICAgICAgb2JqUU5hbWUuc2V0SW50ZXJuYWxQcmVmaXhPck5zVVJJKG5ld0ludGVybmFsUHJlZml4T3JOc1VSSSk7Ci0gICAgfSovCi0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0VmFsdWVzKCkgewotCi0gICAgICAgIFFOYW1lIG9ialFOYW1lID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIHByZWZpeCA9ICJwcmVmaXgxIjsKLSAgICAgICAgU3RyaW5nIG5zVVJJID0gIm5zVVJJMSI7Ci0gICAgICAgIFN0cmluZyBsb2NhbFBhcnQgPSAibG9jYWxQYXJ0MSI7Ci0gICAgICAgIG9ialFOYW1lLnNldFZhbHVlcyhwcmVmaXgsIG5zVVJJLCBsb2NhbFBhcnQpOwotICAgICAgICBhc3NlcnRFcXVhbHMocHJlZml4LG9ialFOYW1lLmdldEludGVybmFsUHJlZml4T3JOc1VSSSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG5zVVJJLG9ialFOYW1lLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGxvY2FsUGFydCxvYmpRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKFFOYW1lVGVzdC5jbGFzcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvQ29tbW9uRXhhbXBsZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL0NvbW1vbkV4YW1wbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM5MzBjNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvQ29tbW9uRXhhbXBsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ29tbW9uRXhhbXBsZS5qYXZhLHYgMS4xIDIwMDUvMDgvMjMgMDM6MzE6MDAgY2JyaWRnaGEgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24udGVzdHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5EaWFnbm9zdGljaWFuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNSVJlc291cmNlRmFjdG9yeUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRWpiUmVmOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHNhbXBsZSB1dGlsaXR5IGZvciB0aGUgJzxlbT48Yj5jb21tb248L2I+PC9lbT4nIHBhY2thZ2UuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbW1vbkV4YW1wbGUgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogTG9hZCBhbGwgdGhlIGFyZ3VtZW50IGZpbGUgcGF0aHMgb3IgVVJJcyBhcyBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBhcmdzIHRoZSBmaWxlIHBhdGhzIG9yIFVSSXMuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJLy8gQ3JlYXRlIGEgcmVzb3VyY2Ugc2V0IHRvIGhvbGQgdGhlIHJlc291cmNlcy4KLQkJLy8KLQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7Ci0JCQotCQkvLyBSZWdpc3RlciB0aGUgYXBwcm9wcmlhdGUgcmVzb3VyY2UgZmFjdG9yeSB0byBoYW5kbGUgYWxsIGZpbGUgZXh0ZW50aW9ucy4KLQkJLy8KLQkJcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkoKS5nZXRFeHRlbnNpb25Ub0ZhY3RvcnlNYXAoKS5wdXQKLQkJCShSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5LkRFRkFVTFRfRVhURU5TSU9OLCAKLQkJCSBuZXcgWE1JUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKLQotCQkvLyBSZWdpc3RlciB0aGUgcGFja2FnZSB0byBlbnN1cmUgaXQgaXMgYXZhaWxhYmxlIGR1cmluZyBsb2FkaW5nLgotCQkvLwotCQlyZXNvdXJjZVNldC5nZXRQYWNrYWdlUmVnaXN0cnkoKS5wdXQKLQkJCShDb21tb25QYWNrYWdlLmVOU19VUkksIAotCQkJIENvbW1vblBhY2thZ2UuZUlOU1RBTkNFKTsKLSAgICAgICAgCi0JCS8vIElmIHRoZXJlIGFyZSBubyBhcmd1bWVudHMsIGVtaXQgYW4gYXBwcm9wcmlhdGUgdXNhZ2UgbWVzc2FnZS4KLQkJLy8KLQkJaWYgKGFyZ3MubGVuZ3RoID09IDApIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRW50ZXIgYSBsaXN0IG9mIGZpbGUgcGF0aHMgb3IgVVJJcyB0aGF0IGhhdmUgY29udGVudCBsaWtlIHRoaXM6Iik7Ci0JCQl0cnkgewotCQkJCVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VTZXQuY3JlYXRlUmVzb3VyY2UoVVJJLmNyZWF0ZVVSSSgiaHR0cDovLy9NeS5jb21tb24iKSk7Ci0JCQkJRWpiUmVmIHJvb3QgPSBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFamJSZWYoKTsKLQkJCQlyZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChyb290KTsKLQkJCQlyZXNvdXJjZS5zYXZlKFN5c3RlbS5vdXQsIG51bGwpOwotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCWV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCS8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIGFyZ3VtZW50cy4KLQkJCS8vCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyArK2kpIHsKLQkJCQkvLyBDb25zdHJ1Y3QgdGhlIFVSSSBmb3IgdGhlIGluc3RhbmNlIGZpbGUuCi0JCQkJLy8gVGhlIGFyZ3VtZW50IGlzIHRyZWF0ZWQgYXMgYSBmaWxlIHBhdGggb25seSBpZiBpdCBkZW5vdGVzIGFuIGV4aXN0aW5nIGZpbGUuCi0JCQkJLy8gT3RoZXJ3aXNlLCBpdCdzIGRpcmVjdGx5IHRyZWF0ZWQgYXMgYSBVUkwuCi0JCQkJLy8KLQkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShhcmdzWzBdKTsKLQkJCQlVUkkgdXJpID0gZmlsZS5pc0ZpbGUoKSA/IFVSSS5jcmVhdGVGaWxlVVJJKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOiBVUkkuY3JlYXRlVVJJKGFyZ3NbMF0pOwotCi0JCQkJdHJ5IHsKLQkJCQkJLy8gRGVtYW5kIGxvYWQgcmVzb3VyY2UgZm9yIHRoaXMgZmlsZS4KLQkJCQkJLy8KLQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZSh1cmksIHRydWUpOwotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxvYWRlZCAiICsgdXJpKTsKLQotCQkJCQkvLyBWYWxpZGF0ZSB0aGUgY29udGVudHMgb2YgdGhlIGxvYWRlZCByZXNvdXJjZS4KLQkJCQkJLy8KLQkJCQkJZm9yIChJdGVyYXRvciBqID0gcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOyBqLmhhc05leHQoKTsgKSB7Ci0JCQkJCQlFT2JqZWN0IGVPYmplY3QgPSAoRU9iamVjdClqLm5leHQoKTsKLQkJCQkJCURpYWdub3N0aWMgZGlhZ25vc3RpYyA9IERpYWdub3N0aWNpYW4uSU5TVEFOQ0UudmFsaWRhdGUoZU9iamVjdCk7Ci0JCQkJCQlpZiAoZGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsKLQkJCQkJCQlwcmludERpYWdub3N0aWMoZGlhZ25vc3RpYywgIiIpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByb2JsZW0gbG9hZGluZyAiICsgdXJpKTsKLQkJCQkJZXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFByaW50cyBkaWFnbm9zdGljcyB3aXRoIGluZGVudGF0aW9uLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBkaWFnbm9zdGljIHRoZSBkaWFnbm9zdGljIHRvIHByaW50LgotCSAqIEBwYXJhbSBpbmRlbnQgdGhlIGluZGVudGF0aW9uIGZvciBwcmludGluZy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHByaW50RGlhZ25vc3RpYyhEaWFnbm9zdGljIGRpYWdub3N0aWMsIFN0cmluZyBpbmRlbnQpIHsKLQkJU3lzdGVtLm91dC5wcmludChpbmRlbnQpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oZGlhZ25vc3RpYy5nZXRNZXNzYWdlKCkpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBkaWFnbm9zdGljLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgewotCQkJcHJpbnREaWFnbm9zdGljKChEaWFnbm9zdGljKWkubmV4dCgpLCBpbmRlbnQgKyAiICAiKTsKLQkJfQotCX0KLQotfSAvL0NvbW1vbkV4YW1wbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9Db21tb25UZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL0NvbW1vblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMWU5MzAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL0NvbW1vblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENvbW1vblRlc3RzLmphdmEsdiAxLjEgMjAwNS8wOC8yMyAwMzozMTowMCBjYnJpZGdoYSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSB0ZXN0IHN1aXRlIGZvciB0aGUgJzxlbT48Yj5jb21tb248L2I+PC9lbT4nIHBhY2thZ2UuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbW1vblRlc3RzIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IENvbW1vblRlc3RzKCJjb21tb24gVGVzdHMiKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb21tb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLX0gLy9Db21tb25UZXN0cwpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL0NvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL0NvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjRhZDI0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBUZXN0LmphdmEsdiAxLjEgMjAwNS8wOC8yMyAwMzozMTowMCBjYnJpZGdoYSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi50ZXN0czsKLQotaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbXBhdGliaWxpdHkgRGVzY3JpcHRpb24gR3JvdXA8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cFRlc3QgZXh0ZW5kcyBEZXNjcmlwdGlvbkdyb3VwVGVzdCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlUZXN0UnVubmVyLnJ1bihDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cFRlc3QuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgQ29tcGF0aWJpbGl0eSBEZXNjcmlwdGlvbiBHcm91cCB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgQ29tcGF0aWJpbGl0eSBEZXNjcmlwdGlvbiBHcm91cCB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCBnZXRGaXh0dXJlKCkgewotCQlyZXR1cm4gKENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKWZpeHR1cmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNldEZpeHR1cmUoQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNldEZpeHR1cmUobnVsbCk7Ci0JfQotCi19IC8vQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBUZXN0CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvRGVzY3JpcHRpb25Hcm91cFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9EZXNjcmlwdGlvbkdyb3VwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGYwMjcxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9EZXNjcmlwdGlvbkdyb3VwVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBEZXNjcmlwdGlvbkdyb3VwVGVzdC5qYXZhLHYgMS4xIDIwMDUvMDgvMjMgMDM6MzE6MDAgY2JyaWRnaGEgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24udGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlc2NyaXB0aW9uIEdyb3VwPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGVzY3JpcHRpb25Hcm91cFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JLyoqCi0JICogVGhlIGZpeHR1cmUgZm9yIHRoaXMgRGVzY3JpcHRpb24gR3JvdXAgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEZXNjcmlwdGlvbkdyb3VwIGZpeHR1cmUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlUZXN0UnVubmVyLnJ1bihEZXNjcmlwdGlvbkdyb3VwVGVzdC5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBEZXNjcmlwdGlvbiBHcm91cCB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGVzY3JpcHRpb25Hcm91cFRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZml4dHVyZSBmb3IgdGhpcyBEZXNjcmlwdGlvbiBHcm91cCB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Rml4dHVyZShEZXNjcmlwdGlvbkdyb3VwIGZpeHR1cmUpIHsKLQkJdGhpcy5maXh0dXJlID0gZml4dHVyZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIERlc2NyaXB0aW9uIEdyb3VwIHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIERlc2NyaXB0aW9uR3JvdXAgZ2V0Rml4dHVyZSgpIHsKLQkJcmV0dXJuIGZpeHR1cmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNldEZpeHR1cmUoQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25Hcm91cCgpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2V0Rml4dHVyZShudWxsKTsKLQl9Ci0KLX0gLy9EZXNjcmlwdGlvbkdyb3VwVGVzdApkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL0Rlc2NyaXB0aW9uVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL0Rlc2NyaXB0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWEzZDhhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9EZXNjcmlwdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRGVzY3JpcHRpb25UZXN0LmphdmEsdiAxLjEgMjAwNS8wOC8yMyAwMzozMTowMCBjYnJpZGdoYSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGVzY3JpcHRpb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCS8qKgotCSAqIFRoZSBmaXh0dXJlIGZvciB0aGlzIERlc2NyaXB0aW9uIHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGVzY3JpcHRpb24gZml4dHVyZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVRlc3RSdW5uZXIucnVuKERlc2NyaXB0aW9uVGVzdC5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBEZXNjcmlwdGlvbiB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGVzY3JpcHRpb25UZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgRGVzY3JpcHRpb24gdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZpeHR1cmUoRGVzY3JpcHRpb24gZml4dHVyZSkgewotCQl0aGlzLmZpeHR1cmUgPSBmaXh0dXJlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgRGVzY3JpcHRpb24gdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRGVzY3JpcHRpb24gZ2V0Rml4dHVyZSgpIHsKLQkJcmV0dXJuIGZpeHR1cmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNldEZpeHR1cmUoQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb24oKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNldEZpeHR1cmUobnVsbCk7Ci0JfQotCi19IC8vRGVzY3JpcHRpb25UZXN0CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvRGlzcGxheU5hbWVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvRGlzcGxheU5hbWVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiODAzOTEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL0Rpc3BsYXlOYW1lVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBEaXNwbGF5TmFtZVRlc3QuamF2YSx2IDEuMSAyMDA1LzA4LzIzIDAzOjMxOjAwIGNicmlkZ2hhIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGlzcGxheU5hbWU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGlzcGxheSBOYW1lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlzcGxheU5hbWVUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCS8qKgotCSAqIFRoZSBmaXh0dXJlIGZvciB0aGlzIERpc3BsYXkgTmFtZSB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpc3BsYXlOYW1lIGZpeHR1cmUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlUZXN0UnVubmVyLnJ1bihEaXNwbGF5TmFtZVRlc3QuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgRGlzcGxheSBOYW1lIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaXNwbGF5TmFtZVRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZml4dHVyZSBmb3IgdGhpcyBEaXNwbGF5IE5hbWUgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZpeHR1cmUoRGlzcGxheU5hbWUgZml4dHVyZSkgewotCQl0aGlzLmZpeHR1cmUgPSBmaXh0dXJlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgRGlzcGxheSBOYW1lIHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIERpc3BsYXlOYW1lIGdldEZpeHR1cmUoKSB7Ci0JCXJldHVybiBmaXh0dXJlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzZXRGaXh0dXJlKENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURpc3BsYXlOYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzZXRGaXh0dXJlKG51bGwpOwotCX0KLQotfSAvL0Rpc3BsYXlOYW1lVGVzdApkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL0VKQkxvY2FsUmVmVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL0VKQkxvY2FsUmVmVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTQzZDRhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9FSkJMb2NhbFJlZlRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRUpCTG9jYWxSZWZUZXN0LmphdmEsdiAxLjEgMjAwNS8wOC8yMyAwMzozMTowMCBjYnJpZGdoYSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi50ZXN0czsKLQotaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVKQkxvY2FsUmVmOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVKQiBMb2NhbCBSZWY8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFSkJMb2NhbFJlZlRlc3QgZXh0ZW5kcyBFamJSZWZUZXN0IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVRlc3RSdW5uZXIucnVuKEVKQkxvY2FsUmVmVGVzdC5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBFSkIgTG9jYWwgUmVmIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFSkJMb2NhbFJlZlRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBFSkIgTG9jYWwgUmVmIHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVKQkxvY2FsUmVmIGdldEZpeHR1cmUoKSB7Ci0JCXJldHVybiAoRUpCTG9jYWxSZWYpZml4dHVyZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2V0Rml4dHVyZShDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFSkJMb2NhbFJlZigpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2V0Rml4dHVyZShudWxsKTsKLQl9Ci0KLX0gLy9FSkJMb2NhbFJlZlRlc3QKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9FamJSZWZUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvRWpiUmVmVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTU4N2U5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9FamJSZWZUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEVqYlJlZlRlc3QuamF2YSx2IDEuMSAyMDA1LzA4LzIzIDAzOjMxOjAwIGNicmlkZ2hhIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRWpiUmVmOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVqYiBSZWY8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFamJSZWZUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCS8qKgotCSAqIFRoZSBmaXh0dXJlIGZvciB0aGlzIEVqYiBSZWYgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFamJSZWYgZml4dHVyZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVRlc3RSdW5uZXIucnVuKEVqYlJlZlRlc3QuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgRWpiIFJlZiB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWpiUmVmVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBmaXh0dXJlIGZvciB0aGlzIEVqYiBSZWYgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZpeHR1cmUoRWpiUmVmIGZpeHR1cmUpIHsKLQkJdGhpcy5maXh0dXJlID0gZml4dHVyZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIEVqYiBSZWYgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRWpiUmVmIGdldEZpeHR1cmUoKSB7Ci0JCXJldHVybiBmaXh0dXJlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzZXRGaXh0dXJlKENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUVqYlJlZigpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2V0Rml4dHVyZShudWxsKTsKLQl9Ci0KLX0gLy9FamJSZWZUZXN0CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvRW52RW50cnlUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvRW52RW50cnlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMmMwYmUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL0VudkVudHJ5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBFbnZFbnRyeVRlc3QuamF2YSx2IDEuMSAyMDA1LzA4LzIzIDAzOjMxOjAwIGNicmlkZ2hhIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRW52RW50cnk7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RW52IEVudHJ5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRW52RW50cnlUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCS8qKgotCSAqIFRoZSBmaXh0dXJlIGZvciB0aGlzIEVudiBFbnRyeSB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVudkVudHJ5IGZpeHR1cmUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlUZXN0UnVubmVyLnJ1bihFbnZFbnRyeVRlc3QuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgRW52IEVudHJ5IHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFbnZFbnRyeVRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZml4dHVyZSBmb3IgdGhpcyBFbnYgRW50cnkgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZpeHR1cmUoRW52RW50cnkgZml4dHVyZSkgewotCQl0aGlzLmZpeHR1cmUgPSBmaXh0dXJlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgRW52IEVudHJ5IHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVudkVudHJ5IGdldEZpeHR1cmUoKSB7Ci0JCXJldHVybiBmaXh0dXJlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzZXRGaXh0dXJlKENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUVudkVudHJ5KCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzZXRGaXh0dXJlKG51bGwpOwotCX0KLQotfSAvL0VudkVudHJ5VGVzdApkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL0ljb25UeXBlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL0ljb25UeXBlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGJiZmU1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9JY29uVHlwZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogSWNvblR5cGVUZXN0LmphdmEsdiAxLjEgMjAwNS8wOC8yMyAwMzozMTowMCBjYnJpZGdoYSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkljb25UeXBlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkljb24gVHlwZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEljb25UeXBlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQkvKioKLQkgKiBUaGUgZml4dHVyZSBmb3IgdGhpcyBJY29uIFR5cGUgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJY29uVHlwZSBmaXh0dXJlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJVGVzdFJ1bm5lci5ydW4oSWNvblR5cGVUZXN0LmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IEljb24gVHlwZSB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSWNvblR5cGVUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgSWNvbiBUeXBlIHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGaXh0dXJlKEljb25UeXBlIGZpeHR1cmUpIHsKLQkJdGhpcy5maXh0dXJlID0gZml4dHVyZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIEljb24gVHlwZSB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJY29uVHlwZSBnZXRGaXh0dXJlKCkgewotCQlyZXR1cm4gZml4dHVyZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2V0Rml4dHVyZShDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJY29uVHlwZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2V0Rml4dHVyZShudWxsKTsKLQl9Ci0KLX0gLy9JY29uVHlwZVRlc3QKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9JZGVudGl0eVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9JZGVudGl0eVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg4MGRmZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvSWRlbnRpdHlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IElkZW50aXR5VGVzdC5qYXZhLHYgMS4xIDIwMDUvMDgvMjMgMDM6MzE6MDAgY2JyaWRnaGEgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24udGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5JZGVudGl0eTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JZGVudGl0eTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIElkZW50aXR5VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQkvKioKLQkgKiBUaGUgZml4dHVyZSBmb3IgdGhpcyBJZGVudGl0eSB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElkZW50aXR5IGZpeHR1cmUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlUZXN0UnVubmVyLnJ1bihJZGVudGl0eVRlc3QuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgSWRlbnRpdHkgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElkZW50aXR5VGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBmaXh0dXJlIGZvciB0aGlzIElkZW50aXR5IHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGaXh0dXJlKElkZW50aXR5IGZpeHR1cmUpIHsKLQkJdGhpcy5maXh0dXJlID0gZml4dHVyZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIElkZW50aXR5IHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElkZW50aXR5IGdldEZpeHR1cmUoKSB7Ci0JCXJldHVybiBmaXh0dXJlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzZXRGaXh0dXJlKENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlkZW50aXR5KCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzZXRGaXh0dXJlKG51bGwpOwotCX0KLQotfSAvL0lkZW50aXR5VGVzdApkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL0pORElFbnZSZWZzR3JvdXBUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvSk5ESUVudlJlZnNHcm91cFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ0MWMwMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvSk5ESUVudlJlZnNHcm91cFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogSk5ESUVudlJlZnNHcm91cFRlc3QuamF2YSx2IDEuMSAyMDA1LzA4LzIzIDAzOjMxOjAwIGNicmlkZ2hhIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLnRlc3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkpORElFbnZSZWZzR3JvdXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Sk5ESSBFbnYgUmVmcyBHcm91cDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEpORElFbnZSZWZzR3JvdXBUZXN0IGV4dGVuZHMgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBUZXN0IHsKLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IEpOREkgRW52IFJlZnMgR3JvdXAgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEpORElFbnZSZWZzR3JvdXBUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgSk5ESSBFbnYgUmVmcyBHcm91cCB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBKTkRJRW52UmVmc0dyb3VwIGdldEZpeHR1cmUoKSB7Ci0JCXJldHVybiAoSk5ESUVudlJlZnNHcm91cClmaXh0dXJlOwotCX0KLQotfSAvL0pORElFbnZSZWZzR3JvdXBUZXN0CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvTGlzdGVuZXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvTGlzdGVuZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwY2JhNTguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL0xpc3RlbmVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBMaXN0ZW5lclRlc3QuamF2YSx2IDEuMSAyMDA1LzA4LzIzIDAzOjMxOjAwIGNicmlkZ2hhIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLnRlc3RzOwotCi1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTGlzdGVuZXI7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TGlzdGVuZXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBMaXN0ZW5lclRlc3QgZXh0ZW5kcyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cFRlc3QgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJVGVzdFJ1bm5lci5ydW4oTGlzdGVuZXJUZXN0LmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IExpc3RlbmVyIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0ZW5lclRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBMaXN0ZW5lciB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBMaXN0ZW5lciBnZXRGaXh0dXJlKCkgewotCQlyZXR1cm4gKExpc3RlbmVyKWZpeHR1cmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNldEZpeHR1cmUoQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTGlzdGVuZXIoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNldEZpeHR1cmUobnVsbCk7Ci0JfQotCi19IC8vTGlzdGVuZXJUZXN0CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvTWVzc2FnZURlc3RpbmF0aW9uUmVmVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL01lc3NhZ2VEZXN0aW5hdGlvblJlZlRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU0YTY4Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvTWVzc2FnZURlc3RpbmF0aW9uUmVmVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBNZXNzYWdlRGVzdGluYXRpb25SZWZUZXN0LmphdmEsdiAxLjEgMjAwNS8wOC8yMyAwMzozMTowMCBjYnJpZGdoYSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvblJlZjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VEZXN0aW5hdGlvblJlZlRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JLyoqCi0JICogVGhlIGZpeHR1cmUgZm9yIHRoaXMgTWVzc2FnZSBEZXN0aW5hdGlvbiBSZWYgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXNzYWdlRGVzdGluYXRpb25SZWYgZml4dHVyZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVRlc3RSdW5uZXIucnVuKE1lc3NhZ2VEZXN0aW5hdGlvblJlZlRlc3QuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgTWVzc2FnZSBEZXN0aW5hdGlvbiBSZWYgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1lc3NhZ2VEZXN0aW5hdGlvblJlZlRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZml4dHVyZSBmb3IgdGhpcyBNZXNzYWdlIERlc3RpbmF0aW9uIFJlZiB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Rml4dHVyZShNZXNzYWdlRGVzdGluYXRpb25SZWYgZml4dHVyZSkgewotCQl0aGlzLmZpeHR1cmUgPSBmaXh0dXJlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgTWVzc2FnZSBEZXN0aW5hdGlvbiBSZWYgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTWVzc2FnZURlc3RpbmF0aW9uUmVmIGdldEZpeHR1cmUoKSB7Ci0JCXJldHVybiBmaXh0dXJlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzZXRGaXh0dXJlKENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1lc3NhZ2VEZXN0aW5hdGlvblJlZigpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2V0Rml4dHVyZShudWxsKTsKLQl9Ci0KLX0gLy9NZXNzYWdlRGVzdGluYXRpb25SZWZUZXN0CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvTWVzc2FnZURlc3RpbmF0aW9uVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL01lc3NhZ2VEZXN0aW5hdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThiZWY0MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvTWVzc2FnZURlc3RpbmF0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBNZXNzYWdlRGVzdGluYXRpb25UZXN0LmphdmEsdiAxLjEgMjAwNS8wOC8yMyAwMzozMTowMCBjYnJpZGdoYSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi50ZXN0czsKLQotaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZURlc3RpbmF0aW9uVGVzdCBleHRlbmRzIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwVGVzdCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlUZXN0UnVubmVyLnJ1bihNZXNzYWdlRGVzdGluYXRpb25UZXN0LmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IE1lc3NhZ2UgRGVzdGluYXRpb24gdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1lc3NhZ2VEZXN0aW5hdGlvblRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBNZXNzYWdlIERlc3RpbmF0aW9uIHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIE1lc3NhZ2VEZXN0aW5hdGlvbiBnZXRGaXh0dXJlKCkgewotCQlyZXR1cm4gKE1lc3NhZ2VEZXN0aW5hdGlvbilmaXh0dXJlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzZXRGaXh0dXJlKENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1lc3NhZ2VEZXN0aW5hdGlvbigpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2V0Rml4dHVyZShudWxsKTsKLQl9Ci0KLX0gLy9NZXNzYWdlRGVzdGluYXRpb25UZXN0CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvUGFyYW1WYWx1ZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9QYXJhbVZhbHVlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjY4MzI4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9QYXJhbVZhbHVlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQYXJhbVZhbHVlVGVzdC5qYXZhLHYgMS4xIDIwMDUvMDgvMjMgMDM6MzE6MDAgY2JyaWRnaGEgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24udGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5QYXJhbVZhbHVlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBhcmFtIFZhbHVlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUGFyYW1WYWx1ZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JLyoqCi0JICogVGhlIGZpeHR1cmUgZm9yIHRoaXMgUGFyYW0gVmFsdWUgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQYXJhbVZhbHVlIGZpeHR1cmUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlUZXN0UnVubmVyLnJ1bihQYXJhbVZhbHVlVGVzdC5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBQYXJhbSBWYWx1ZSB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGFyYW1WYWx1ZVRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZml4dHVyZSBmb3IgdGhpcyBQYXJhbSBWYWx1ZSB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Rml4dHVyZShQYXJhbVZhbHVlIGZpeHR1cmUpIHsKLQkJdGhpcy5maXh0dXJlID0gZml4dHVyZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIFBhcmFtIFZhbHVlIHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFBhcmFtVmFsdWUgZ2V0Rml4dHVyZSgpIHsKLQkJcmV0dXJuIGZpeHR1cmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNldEZpeHR1cmUoQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUGFyYW1WYWx1ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2V0Rml4dHVyZShudWxsKTsKLQl9Ci0KLX0gLy9QYXJhbVZhbHVlVGVzdApkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL1FOYW1lVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL1FOYW1lVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDg4YjFkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9RTmFtZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUU5hbWVUZXN0LmphdmEsdiAxLjEgMjAwNS8wOC8yMyAwMzozMTowMCBjYnJpZGdoYSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlFOYW1lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUU5hbWVUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCS8qKgotCSAqIFRoZSBmaXh0dXJlIGZvciB0aGlzIFFOYW1lIHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUU5hbWUgZml4dHVyZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVRlc3RSdW5uZXIucnVuKFFOYW1lVGVzdC5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBRTmFtZSB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUU5hbWVUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgUU5hbWUgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZpeHR1cmUoUU5hbWUgZml4dHVyZSkgewotCQl0aGlzLmZpeHR1cmUgPSBmaXh0dXJlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgUU5hbWUgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgUU5hbWUgZ2V0Rml4dHVyZSgpIHsKLQkJcmV0dXJuIGZpeHR1cmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNldEZpeHR1cmUoQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUU5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNldEZpeHR1cmUobnVsbCk7Ci0JfQotCi19IC8vUU5hbWVUZXN0CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvUmVzb3VyY2VFbnZSZWZUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvUmVzb3VyY2VFbnZSZWZUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlYmM0NzAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL1Jlc291cmNlRW52UmVmVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBSZXNvdXJjZUVudlJlZlRlc3QuamF2YSx2IDEuMSAyMDA1LzA4LzIzIDAzOjMxOjAwIGNicmlkZ2hhIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUmVzb3VyY2VFbnZSZWY7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmVzb3VyY2UgRW52IFJlZjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlRW52UmVmVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQkvKioKLQkgKiBUaGUgZml4dHVyZSBmb3IgdGhpcyBSZXNvdXJjZSBFbnYgUmVmIHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUmVzb3VyY2VFbnZSZWYgZml4dHVyZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVRlc3RSdW5uZXIucnVuKFJlc291cmNlRW52UmVmVGVzdC5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBSZXNvdXJjZSBFbnYgUmVmIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUVudlJlZlRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZml4dHVyZSBmb3IgdGhpcyBSZXNvdXJjZSBFbnYgUmVmIHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGaXh0dXJlKFJlc291cmNlRW52UmVmIGZpeHR1cmUpIHsKLQkJdGhpcy5maXh0dXJlID0gZml4dHVyZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIFJlc291cmNlIEVudiBSZWYgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgUmVzb3VyY2VFbnZSZWYgZ2V0Rml4dHVyZSgpIHsKLQkJcmV0dXJuIGZpeHR1cmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNldEZpeHR1cmUoQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUmVzb3VyY2VFbnZSZWYoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNldEZpeHR1cmUobnVsbCk7Ci0JfQotCi19IC8vUmVzb3VyY2VFbnZSZWZUZXN0CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvUmVzb3VyY2VSZWZUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvUmVzb3VyY2VSZWZUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxYjYwMWQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL1Jlc291cmNlUmVmVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBSZXNvdXJjZVJlZlRlc3QuamF2YSx2IDEuMSAyMDA1LzA4LzIzIDAzOjMxOjAwIGNicmlkZ2hhIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUmVzb3VyY2VSZWY7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmVzb3VyY2UgUmVmPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VSZWZUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCS8qKgotCSAqIFRoZSBmaXh0dXJlIGZvciB0aGlzIFJlc291cmNlIFJlZiB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJlc291cmNlUmVmIGZpeHR1cmUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlUZXN0UnVubmVyLnJ1bihSZXNvdXJjZVJlZlRlc3QuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgUmVzb3VyY2UgUmVmIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZVJlZlRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZml4dHVyZSBmb3IgdGhpcyBSZXNvdXJjZSBSZWYgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZpeHR1cmUoUmVzb3VyY2VSZWYgZml4dHVyZSkgewotCQl0aGlzLmZpeHR1cmUgPSBmaXh0dXJlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgUmVzb3VyY2UgUmVmIHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFJlc291cmNlUmVmIGdldEZpeHR1cmUoKSB7Ci0JCXJldHVybiBmaXh0dXJlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzZXRGaXh0dXJlKENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJlc291cmNlUmVmKCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzZXRGaXh0dXJlKG51bGwpOwotCX0KLQotfSAvL1Jlc291cmNlUmVmVGVzdApkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL1J1bkFzU3BlY2lmaWVkSWRlbnRpdHlUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvUnVuQXNTcGVjaWZpZWRJZGVudGl0eVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzEzMzkwNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvUnVuQXNTcGVjaWZpZWRJZGVudGl0eVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUnVuQXNTcGVjaWZpZWRJZGVudGl0eVRlc3QuamF2YSx2IDEuMSAyMDA1LzA4LzIzIDAzOjMxOjAwIGNicmlkZ2hhIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLnRlc3RzOwotCi1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUnVuQXNTcGVjaWZpZWRJZGVudGl0eTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SdW4gQXMgU3BlY2lmaWVkIElkZW50aXR5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUnVuQXNTcGVjaWZpZWRJZGVudGl0eVRlc3QgZXh0ZW5kcyBTZWN1cml0eUlkZW50aXR5VGVzdCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlUZXN0UnVubmVyLnJ1bihSdW5Bc1NwZWNpZmllZElkZW50aXR5VGVzdC5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBSdW4gQXMgU3BlY2lmaWVkIElkZW50aXR5IHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSdW5Bc1NwZWNpZmllZElkZW50aXR5VGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIFJ1biBBcyBTcGVjaWZpZWQgSWRlbnRpdHkgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgUnVuQXNTcGVjaWZpZWRJZGVudGl0eSBnZXRGaXh0dXJlKCkgewotCQlyZXR1cm4gKFJ1bkFzU3BlY2lmaWVkSWRlbnRpdHkpZml4dHVyZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2V0Rml4dHVyZShDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSdW5Bc1NwZWNpZmllZElkZW50aXR5KCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzZXRGaXh0dXJlKG51bGwpOwotCX0KLQotfSAvL1J1bkFzU3BlY2lmaWVkSWRlbnRpdHlUZXN0CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvU2VjdXJpdHlJZGVudGl0eVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9TZWN1cml0eUlkZW50aXR5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTk2NDU3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9TZWN1cml0eUlkZW50aXR5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBTZWN1cml0eUlkZW50aXR5VGVzdC5qYXZhLHYgMS4xIDIwMDUvMDgvMjMgMDM6MzE6MDAgY2JyaWRnaGEgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24udGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eUlkZW50aXR5OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlY3VyaXR5IElkZW50aXR5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU2VjdXJpdHlJZGVudGl0eVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JLyoqCi0JICogVGhlIGZpeHR1cmUgZm9yIHRoaXMgU2VjdXJpdHkgSWRlbnRpdHkgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTZWN1cml0eUlkZW50aXR5IGZpeHR1cmUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlUZXN0UnVubmVyLnJ1bihTZWN1cml0eUlkZW50aXR5VGVzdC5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBTZWN1cml0eSBJZGVudGl0eSB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VjdXJpdHlJZGVudGl0eVRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZml4dHVyZSBmb3IgdGhpcyBTZWN1cml0eSBJZGVudGl0eSB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Rml4dHVyZShTZWN1cml0eUlkZW50aXR5IGZpeHR1cmUpIHsKLQkJdGhpcy5maXh0dXJlID0gZml4dHVyZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIFNlY3VyaXR5IElkZW50aXR5IHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFNlY3VyaXR5SWRlbnRpdHkgZ2V0Rml4dHVyZSgpIHsKLQkJcmV0dXJuIGZpeHR1cmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNldEZpeHR1cmUoQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2VjdXJpdHlJZGVudGl0eSgpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2V0Rml4dHVyZShudWxsKTsKLQl9Ci0KLX0gLy9TZWN1cml0eUlkZW50aXR5VGVzdApkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL1NlY3VyaXR5Um9sZVJlZlRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9TZWN1cml0eVJvbGVSZWZUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NGI2MzMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL1NlY3VyaXR5Um9sZVJlZlRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogU2VjdXJpdHlSb2xlUmVmVGVzdC5qYXZhLHYgMS4xIDIwMDUvMDgvMjMgMDM6MzE6MDAgY2JyaWRnaGEgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24udGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eVJvbGVSZWY7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2VjdXJpdHkgUm9sZSBSZWY8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWN1cml0eVJvbGVSZWZUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCS8qKgotCSAqIFRoZSBmaXh0dXJlIGZvciB0aGlzIFNlY3VyaXR5IFJvbGUgUmVmIHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU2VjdXJpdHlSb2xlUmVmIGZpeHR1cmUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlUZXN0UnVubmVyLnJ1bihTZWN1cml0eVJvbGVSZWZUZXN0LmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IFNlY3VyaXR5IFJvbGUgUmVmIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTZWN1cml0eVJvbGVSZWZUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgU2VjdXJpdHkgUm9sZSBSZWYgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZpeHR1cmUoU2VjdXJpdHlSb2xlUmVmIGZpeHR1cmUpIHsKLQkJdGhpcy5maXh0dXJlID0gZml4dHVyZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIFNlY3VyaXR5IFJvbGUgUmVmIHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFNlY3VyaXR5Um9sZVJlZiBnZXRGaXh0dXJlKCkgewotCQlyZXR1cm4gZml4dHVyZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2V0Rml4dHVyZShDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZWN1cml0eVJvbGVSZWYoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNldEZpeHR1cmUobnVsbCk7Ci0JfQotCi19IC8vU2VjdXJpdHlSb2xlUmVmVGVzdApkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL1NlY3VyaXR5Um9sZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9TZWN1cml0eVJvbGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxMTRhM2UuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL1NlY3VyaXR5Um9sZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogU2VjdXJpdHlSb2xlVGVzdC5qYXZhLHYgMS4xIDIwMDUvMDgvMjMgMDM6MzE6MDAgY2JyaWRnaGEgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24udGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eVJvbGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2VjdXJpdHkgUm9sZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNlY3VyaXR5Um9sZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JLyoqCi0JICogVGhlIGZpeHR1cmUgZm9yIHRoaXMgU2VjdXJpdHkgUm9sZSB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFNlY3VyaXR5Um9sZSBmaXh0dXJlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJVGVzdFJ1bm5lci5ydW4oU2VjdXJpdHlSb2xlVGVzdC5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBTZWN1cml0eSBSb2xlIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTZWN1cml0eVJvbGVUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgU2VjdXJpdHkgUm9sZSB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Rml4dHVyZShTZWN1cml0eVJvbGUgZml4dHVyZSkgewotCQl0aGlzLmZpeHR1cmUgPSBmaXh0dXJlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgU2VjdXJpdHkgUm9sZSB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBTZWN1cml0eVJvbGUgZ2V0Rml4dHVyZSgpIHsKLQkJcmV0dXJuIGZpeHR1cmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNldEZpeHR1cmUoQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2VjdXJpdHlSb2xlKCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzZXRGaXh0dXJlKG51bGwpOwotCX0KLQotfSAvL1NlY3VyaXR5Um9sZVRlc3QKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9Vc2VDYWxsZXJJZGVudGl0eVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9Vc2VDYWxsZXJJZGVudGl0eVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNjYjNhOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvVXNlQ2FsbGVySWRlbnRpdHlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFVzZUNhbGxlcklkZW50aXR5VGVzdC5qYXZhLHYgMS4xIDIwMDUvMDgvMjMgMDM6MzE6MDAgY2JyaWRnaGEgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24udGVzdHM7Ci0KLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Vc2VDYWxsZXJJZGVudGl0eTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Vc2UgQ2FsbGVyIElkZW50aXR5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVXNlQ2FsbGVySWRlbnRpdHlUZXN0IGV4dGVuZHMgU2VjdXJpdHlJZGVudGl0eVRlc3QgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJVGVzdFJ1bm5lci5ydW4oVXNlQ2FsbGVySWRlbnRpdHlUZXN0LmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IFVzZSBDYWxsZXIgSWRlbnRpdHkgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVzZUNhbGxlcklkZW50aXR5VGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIFVzZSBDYWxsZXIgSWRlbnRpdHkgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVXNlQ2FsbGVySWRlbnRpdHkgZ2V0Rml4dHVyZSgpIHsKLQkJcmV0dXJuIChVc2VDYWxsZXJJZGVudGl0eSlmaXh0dXJlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzZXRGaXh0dXJlKENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVVzZUNhbGxlcklkZW50aXR5KCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzZXRGaXh0dXJlKG51bGwpOwotCX0KLQotfSAvL1VzZUNhbGxlcklkZW50aXR5VGVzdApkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29yZS9hcGkvdGVzdC9BbGxDb3JlQVBJVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvcmUvYXBpL3Rlc3QvQWxsQ29yZUFQSVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkZDAxMzAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29yZS9hcGkvdGVzdC9BbGxDb3JlQVBJVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEFwciAxLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLmFwaS50ZXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMuYXBpLkFsbEFQSVRlc3Q7Ci0KLS8qKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEFsbENvcmVBUElUZXN0cyB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoIlRlc3QgZm9yIEoyRUUgQ29yZSBBcGkgVGVzdCIpOwotICAgICAgICAvLyRKVW5pdC1CRUdJTiQKLQkJc3VpdGUuYWRkVGVzdChBbGxBUElUZXN0LnN1aXRlKCkpOwotCi0JCS8vJEpVbml0LUVORCQKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihqYXZhLmxhbmcuU3RyaW5nW10gYXJncykgewotCQlqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5tYWluKG5ldyBTdHJpbmdbXSB7IEFsbENvcmVBUElUZXN0cy5jbGFzcy5nZXROYW1lKCkgfSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb3JlL2FwaS90ZXN0L0F1dG9tYXRlZEFQSUJWVC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29yZS9hcGkvdGVzdC9BdXRvbWF0ZWRBUElCVlQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUyNGFmZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb3JlL2FwaS90ZXN0L0F1dG9tYXRlZEFQSUJWVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gQXByIDEsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byAKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUuYXBpLnRlc3Q7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbHVnaW5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLQotCi0vKioKLSAqIEBhdXRob3IganNob2xsCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEF1dG9tYXRlZEFQSUJWVCBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBiYXNlRGlyZWN0b3J5ID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpICsgamF2YS5pby5GaWxlLnNlcGFyYXRvckNoYXIgKyAiY29tbW9uQXJjaGl2ZVJlc291cmNlcyIgKyBqYXZhLmlvLkZpbGUuc2VwYXJhdG9yQ2hhcjsKLSAgICAKLSAgICBzdGF0aWMgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgSVBsdWdpbkRlc2NyaXB0b3IgcGx1Z2luRGVzY3JpcHRvciA9IFBsYXRmb3JtLmdldFBsdWdpblJlZ2lzdHJ5KCkuZ2V0UGx1Z2luRGVzY3JpcHRvcigib3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cyIpOwotICAgICAgICAgICAgVVJMIHVybCA9IHBsdWdpbkRlc2NyaXB0b3IuZ2V0SW5zdGFsbFVSTCgpOyAKLSAgICAgICAgCUF1dG9tYXRlZEFQSUJWVC5iYXNlRGlyZWN0b3J5ID0gUGxhdGZvcm0uYXNMb2NhbFVSTCh1cmwpLmdldEZpbGUoKSArICJjb21tb25BcmNoaXZlUmVzb3VyY2VzIisgamF2YS5pby5GaWxlLnNlcGFyYXRvckNoYXI7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7IAotCQkJU3lzdGVtLmVyci5wcmludGxuKCJVc2luZyB3b3JraW5nIGRpcmVjdG9yeSBzaW5jZSBhIHdvcmtzcGFjZSBVUkwgY291bGQgbm90IGJlIGxvY2F0ZWQuIik7Ci0JCX0gCi0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBpbnQgdW5pbXBsZW1lbnRlZE1ldGhvZHM7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIHVuaW1wbGVtZW50ZWRNZXRob2RzID0gMDsKLSAgICAgICAgVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci0gICAgICAgIGlmICh1bmltcGxlbWVudGVkTWV0aG9kcyA+IDApIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5DYWxscyB0byB3YXJuVW5pbXBsOiAiICsgdW5pbXBsZW1lbnRlZE1ldGhvZHMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIEF1dG9tYXRlZEFQSUJWVCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgVGVzdFN1aXRlIHN1aXRlID0gKFRlc3RTdWl0ZSkgQXV0b21hdGVkQVBJQlZULnN1aXRlKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3VpdGUudGVzdENvdW50KCk7IGkrKykgewotICAgICAgICAgICAgYWRkVGVzdChzdWl0ZS50ZXN0QXQoaSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCJUZXN0IGZvciBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLmFwaS5idnQiKTsKLSAgICAgICAgLy8kSlVuaXQtQkVHSU4kCi0gICAgICAgIHN1aXRlLmFkZFRlc3QoQWxsQ29yZUFQSVRlc3RzLnN1aXRlKCkpOwotICAgICAgICAvLyRKVW5pdC1FTkQkCi0gICAgICAgIHJldHVybiBzdWl0ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb3JlL3Rlc3RzL2FwaS9BbGxBUElUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb3JlL3Rlc3RzL2FwaS9BbGxBUElUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxYTE4YzIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29yZS90ZXN0cy9hcGkvQWxsQVBJVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDE4LCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLmFwaTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi50ZXN0LkFwcGxpY2F0aW9uRmFjdG9yeVRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24udGVzdC5BcHBsaWNhdGlvblRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LnRlc3QuQXBwbGljYXRpb25DbGllbnRUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC50ZXN0LkNsaWVudEZhY3RvcnlUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi50ZXN0LkNvbW1vbkZhY3RvcnlUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi50ZXN0LkVqYlJlZlRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLnRlc3QuTGlzdGVuZXJUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi50ZXN0LlFOYW1lVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIudGVzdC5Bc3NlbWJseURlc2NyaXB0b3JUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi50ZXN0LkNNUEF0dHJpYnV0ZVRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLnRlc3QuQ01SRmllbGRUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi50ZXN0LkNvbnRhaW5lck1hbmFnZWRFbnRpdHlUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi50ZXN0LkVKQlJlbGF0aW9uVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIudGVzdC5FSkJSZWxhdGlvbnNoaXBSb2xlVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIudGVzdC5FamJGYWN0b3J5VGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIudGVzdC5FbnRpdHlUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi50ZXN0Lk1ldGhvZEVsZW1lbnRUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi50ZXN0Lk1ldGhvZFBlcm1pc3Npb25UZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi50ZXN0LlF1ZXJ5TWV0aG9kVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIudGVzdC5RdWVyeVRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLnRlc3QuU2Vzc2lvblRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnRlc3QuQ29ubmVjdG9yVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudGVzdC5KY2FGYWN0b3J5VGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AudGVzdC5Kc3BGYWN0b3J5VGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi50ZXN0LldlYmFwcGxpY2F0aW9uRmFjdG9yeVRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi50ZXN0LldzY29tbW9uRmFjdG9yeVRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLnRlc3QuV3NkZEZhY3RvcnlUZXN0OwotCi0KLQotLyoqCi0gKiBAYXV0aG9yIEFkbWluCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgQWxsQVBJVGVzdCAgZXh0ZW5kcyBUZXN0U3VpdGUgewotCi0JIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpewotICAgICAgICByZXR1cm4gbmV3IEFsbEFQSVRlc3QoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEFsbEFQSVRlc3QoKXsKLSAgICAgICAgc3VwZXIoIkoyRUUgQ29yZSBBUEkgVGVzdHMiKTsKLSAgICAgICAgYWRkVGVzdChBcHBsaWNhdGlvbkZhY3RvcnlUZXN0LnN1aXRlKCkpOwotICAgICAgICBhZGRUZXN0KEFwcGxpY2F0aW9uVGVzdC5zdWl0ZSgpKTsKLSAgICAgICAgYWRkVGVzdChBcHBsaWNhdGlvbkNsaWVudFRlc3Quc3VpdGUoKSk7Ci0gICAgICAgIGFkZFRlc3QoQ2xpZW50RmFjdG9yeVRlc3Quc3VpdGUoKSk7Ci0gICAgICAgIGFkZFRlc3QoQ29tbW9uRmFjdG9yeVRlc3Quc3VpdGUoKSk7Ci0gICAgICAgIGFkZFRlc3QoRWpiUmVmVGVzdC5zdWl0ZSgpKTsKLSAgICAgICAgYWRkVGVzdChMaXN0ZW5lclRlc3Quc3VpdGUoKSk7Ci0gICAgICAgIGFkZFRlc3QoUU5hbWVUZXN0LnN1aXRlKCkpOwotICAgICAgICBhZGRUZXN0KEFzc2VtYmx5RGVzY3JpcHRvclRlc3Quc3VpdGUoKSk7Ci0gICAgICAgIGFkZFRlc3QoQ01QQXR0cmlidXRlVGVzdC5zdWl0ZSgpKTsKLSAgICAgICAgYWRkVGVzdChDTVJGaWVsZFRlc3Quc3VpdGUoKSk7Ci0gICAgICAgIGFkZFRlc3QoQ29udGFpbmVyTWFuYWdlZEVudGl0eVRlc3Quc3VpdGUoKSk7Ci0gICAgICAgIGFkZFRlc3QoRWpiRmFjdG9yeVRlc3Quc3VpdGUoKSk7Ci0gICAgICAgIGFkZFRlc3QoRUpCUmVsYXRpb25zaGlwUm9sZVRlc3Quc3VpdGUoKSk7Ci0gICAgICAgIGFkZFRlc3QoRUpCUmVsYXRpb25UZXN0LnN1aXRlKCkpOwotICAgICAgICBhZGRUZXN0KEVudGl0eVRlc3Quc3VpdGUoKSk7Ci0gICAgICAgIGFkZFRlc3QoTWV0aG9kRWxlbWVudFRlc3Quc3VpdGUoKSk7Ci0gICAgICAgIGFkZFRlc3QoTWV0aG9kUGVybWlzc2lvblRlc3Quc3VpdGUoKSk7Ci0gICAgICAgIGFkZFRlc3QoUXVlcnlNZXRob2RUZXN0LnN1aXRlKCkpOwotICAgICAgICBhZGRUZXN0KFF1ZXJ5VGVzdC5zdWl0ZSgpKTsKLSAgICAgICAgYWRkVGVzdChTZXNzaW9uVGVzdC5zdWl0ZSgpKTsKLSAgICAgICAgYWRkVGVzdChDb25uZWN0b3JUZXN0LnN1aXRlKCkpOwotICAgICAgICBhZGRUZXN0KEpjYUZhY3RvcnlUZXN0LnN1aXRlKCkpOwotICAgICAgICBhZGRUZXN0KEpzcEZhY3RvcnlUZXN0LnN1aXRlKCkpOwotICAgICAgICBhZGRUZXN0KFdlYmFwcGxpY2F0aW9uRmFjdG9yeVRlc3Quc3VpdGUoKSk7Ci0gICAgICAgIGFkZFRlc3QoV3Njb21tb25GYWN0b3J5VGVzdC5zdWl0ZSgpKTsKLSAgICAgICAgYWRkVGVzdChXc2RkRmFjdG9yeVRlc3Quc3VpdGUoKSk7Ci0gICAgICAgIAotICAgIH0KLQkKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L0Fzc2VtYmx5RGVzY3JpcHRvclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L0Fzc2VtYmx5RGVzY3JpcHRvclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg3NmU0Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9Bc3NlbWJseURlc2NyaXB0b3JUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIudGVzdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5Um9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQXNzZW1ibHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZFBlcm1pc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZFRyYW5zYWN0aW9uOwotCi1wdWJsaWMgY2xhc3MgQXNzZW1ibHlEZXNjcmlwdG9yVGVzdCBleHRlbmRzIEVqYkVNRlRlc3RCYXNlIHsKLQotICAgIC8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIEFzc2VtYmx5RGVzY3JpcHRvclRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQkKLQlwdWJsaWMgdm9pZCB0ZXN0X2dldE1ldGhvZFBlcm1pc3Npb25NZXRob2RFbGVtZW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQlpbml0KCk7Ci0JCUVKQlJlc291cmNlIEREID0gKEVKQlJlc291cmNlKSBlamJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLQkJQXNzZW1ibHlEZXNjcmlwdG9yIGFzc2VtYmx5RGVzY3JpcHRvciA9IERELmdldEVKQkphcigpLmdldEFzc2VtYmx5RGVzY3JpcHRvcigpOwotCQlhc3NlcnROb3ROdWxsKGFzc2VtYmx5RGVzY3JpcHRvcik7Ci0JCUxpc3QgZW50ZXJwcmlzZUJlYW5zID0gREQuZ2V0RUpCSmFyKCkuZ2V0RW50ZXJwcmlzZUJlYW5zKCk7Ci0JCUVudGVycHJpc2VCZWFuIGViMSA9IChFbnRlcnByaXNlQmVhbillbnRlcnByaXNlQmVhbnMuZ2V0KDApOwotCQlMaXN0IG1ldGhvZFBlcm1pc3Npb25MaXN0ID0gYXNzZW1ibHlEZXNjcmlwdG9yLmdldE1ldGhvZFBlcm1pc3Npb25NZXRob2RFbGVtZW50cyhlYjEpOwotCQkKLQkJCi0JCUxpc3QgYWxsTWV0aG9kRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgcGVybWlzc2lvbnMgPSBhc3NlbWJseURlc2NyaXB0b3IuZ2V0TWV0aG9kUGVybWlzc2lvbnMoKTsKLQkJTWV0aG9kUGVybWlzc2lvbiBwZXJtaXNzaW9uOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBlcm1pc3Npb25zLnNpemUoKTsgaSsrKXsKLQkJCXBlcm1pc3Npb24gPSAoTWV0aG9kUGVybWlzc2lvbikgcGVybWlzc2lvbnMuZ2V0KGkpOwotCQkJYWxsTWV0aG9kRWxlbWVudHMuYWRkQWxsKHBlcm1pc3Npb24uZ2V0TWV0aG9kRWxlbWVudHMoZWIxKSk7IAotCQl9Ci0JCWFzc2VydEVxdWFscyhtZXRob2RQZXJtaXNzaW9uTGlzdCxhbGxNZXRob2RFbGVtZW50cyk7Ci0JCQotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gZXhwZWN0ZWQKLQkgKiBAcGFyYW0gYWN0dWFsCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydEVxdWFscyhMaXN0IGV4cGVjdGVkLCBMaXN0IGFjdHVhbCkgewotCQlhc3NlcnRFcXVhbHMoYWN0dWFsLnNpemUoKSwgZXhwZWN0ZWQuc2l6ZSgpKTsKLQkJZm9yIChpbnQgeD0wOyB4PCBleHBlY3RlZC5zaXplKCk7ICsreCkgewotCQkJT2JqZWN0IG8gPSBleHBlY3RlZC5nZXQoeCk7Ci0JCQlhc3NlcnRFcXVhbHMoYWN0dWFsLmNvbnRhaW5zKG8pLCB0cnVlKTsKLQkJfQotCi0JfQotCQotICAgIHB1YmxpYyBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgQXNzZW1ibHlEZXNjcmlwdG9yVGVzdCgidGVzdF9nZXRNZXRob2RQZXJtaXNzaW9uTWV0aG9kRWxlbWVudHMiKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEFzc2VtYmx5RGVzY3JpcHRvclRlc3QoInRlc3RfZ2V0TWV0aG9kVHJhbnNhY3Rpb25NZXRob2RFbGVtZW50cyIpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgQXNzZW1ibHlEZXNjcmlwdG9yVGVzdCgidGVzdF9nZXRTZWN1cml0eVJvbGVOYW1lZCIpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgQXNzZW1ibHlEZXNjcmlwdG9yVGVzdCgidGVzdF9yZW5hbWVTZWN1cml0eVJvbGUiKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEFzc2VtYmx5RGVzY3JpcHRvclRlc3QoInRlc3RfcmVtb3ZlRGF0YSIpKTsKLQkJCi0JCQotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JCi0gIC8qICBwdWJsaWMgdm9pZCB0ZXN0X2dldE1ldGhvZFBlcm1pc3Npb24oKSB7Ci0KLSAgICAgICAgQXNzZW1ibHlEZXNjcmlwdG9yIG9iakFzc2VtYmx5RGVzY3JpcHRvciA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIExpc3Qgc2VjdXJpdHlSb2xlc0xpc3QgPSBudWxsOwotICAgICAgICBNZXRob2RQZXJtaXNzaW9uIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpBc3NlbWJseURlc2NyaXB0b3IKLSAgICAgICAgICAgICAgICAuZ2V0TWV0aG9kUGVybWlzc2lvbihzZWN1cml0eVJvbGVzTGlzdCk7Ci0gICAgfSAqLwotCi0gCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE1ldGhvZFRyYW5zYWN0aW9uTWV0aG9kRWxlbWVudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAJaW5pdCgpOwotICAgIAlFSkJSZXNvdXJjZSBERCA9IChFSkJSZXNvdXJjZSkgZWpiRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0JCUFzc2VtYmx5RGVzY3JpcHRvciBhc3NlbWJseURlc2NyaXB0b3IgPSBERC5nZXRFSkJKYXIoKS5nZXRBc3NlbWJseURlc2NyaXB0b3IoKTsKLQkJYXNzZXJ0Tm90TnVsbChhc3NlbWJseURlc2NyaXB0b3IpOwotCQlMaXN0IGVudGVycHJpc2VCZWFucyA9IERELmdldEVKQkphcigpLmdldEVudGVycHJpc2VCZWFucygpOwotCQlFbnRlcnByaXNlQmVhbiBlYjEgPSAoRW50ZXJwcmlzZUJlYW4pZW50ZXJwcmlzZUJlYW5zLmdldCgwKTsKLQkJTGlzdCBtZXRob2RUcmFuc2FjdGlvbkxpc3QgPSBhc3NlbWJseURlc2NyaXB0b3IuZ2V0TWV0aG9kVHJhbnNhY3Rpb25NZXRob2RFbGVtZW50cyhlYjEpOwotCQkKLQkJCi0JCUxpc3QgYWxsTWV0aG9kRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgdHJhbnNhY3Rpb25zID0gYXNzZW1ibHlEZXNjcmlwdG9yLmdldE1ldGhvZFRyYW5zYWN0aW9ucygpOwotCQlNZXRob2RUcmFuc2FjdGlvbiB0cmFuc2FjdGlvbjsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0cmFuc2FjdGlvbnMuc2l6ZSgpOyBpKyspewotCQkJdHJhbnNhY3Rpb24gPSAoTWV0aG9kVHJhbnNhY3Rpb24pIHRyYW5zYWN0aW9ucy5nZXQoaSk7Ci0JCQlhbGxNZXRob2RFbGVtZW50cy5hZGRBbGwodHJhbnNhY3Rpb24uZ2V0TWV0aG9kRWxlbWVudHMoZWIxKSk7IAotCQl9Ci0JCWFzc2VydEVxdWFscyhtZXRob2RUcmFuc2FjdGlvbkxpc3QsYWxsTWV0aG9kRWxlbWVudHMpOwotICAgIH0KLQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0X2dldFNlY3VyaXR5Um9sZU5hbWVkKCl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaW5pdCgpOwotCQlFSkJSZXNvdXJjZSBERCA9IChFSkJSZXNvdXJjZSkgZWpiRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0JCUFzc2VtYmx5RGVzY3JpcHRvciBhc3NlbWJseURlc2NyaXB0b3IgPSBERC5nZXRFSkJKYXIoKS5nZXRBc3NlbWJseURlc2NyaXB0b3IoKTsKLQkJYXNzZXJ0Tm90TnVsbChhc3NlbWJseURlc2NyaXB0b3IpOwotCQlTZWN1cml0eVJvbGUgc2VjdXJpdHlSb2xlPSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21tb25GYWN0b3J5KCkuY3JlYXRlU2VjdXJpdHlSb2xlKCk7Ci0JCVN0cmluZyBzZWN1cml0eVJvbGVOYW1lID0gInRlc3RSb2xlIjsKLQkJc2VjdXJpdHlSb2xlLnNldFJvbGVOYW1lKHNlY3VyaXR5Um9sZU5hbWUpOwotCQlhc3NlbWJseURlc2NyaXB0b3IuZ2V0U2VjdXJpdHlSb2xlcygpLmFkZChzZWN1cml0eVJvbGUpOwotCQlTZWN1cml0eVJvbGUgcmV0VmFsdWUgPSBhc3NlbWJseURlc2NyaXB0b3IuZ2V0U2VjdXJpdHlSb2xlTmFtZWQoc2VjdXJpdHlSb2xlTmFtZSkgOwotCQlhc3NlcnRFcXVhbHMocmV0VmFsdWUsc2VjdXJpdHlSb2xlKTsKLQl9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlbmFtZVNlY3VyaXR5Um9sZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIAlpbml0KCk7Ci0gICAgCUVKQlJlc291cmNlIEREID0gKEVKQlJlc291cmNlKSBlamJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLQkJQXNzZW1ibHlEZXNjcmlwdG9yIGFzc2VtYmx5RGVzY3JpcHRvciA9IERELmdldEVKQkphcigpLmdldEFzc2VtYmx5RGVzY3JpcHRvcigpOwotCQlhc3NlcnROb3ROdWxsKGFzc2VtYmx5RGVzY3JpcHRvcik7Ci0JCVN0cmluZyBzZWN1cml0eVJvbGVOYW1lID0gInRlc3RSb2xlIjsKLQkJCi0JCVNlY3VyaXR5Um9sZSBzZWN1cml0eVJvbGU9IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldENvbW1vbkZhY3RvcnkoKS5jcmVhdGVTZWN1cml0eVJvbGUoKTsKLQkJCi0JCXNlY3VyaXR5Um9sZS5zZXRSb2xlTmFtZShzZWN1cml0eVJvbGVOYW1lKTsKLQkJYXNzZW1ibHlEZXNjcmlwdG9yLmdldFNlY3VyaXR5Um9sZXMoKS5hZGQoc2VjdXJpdHlSb2xlKTsKLQkJU3RyaW5nIG5ld1NlY3VyaXR5Um9sZU5hbWUgPSAibmV3VGVzdFJvbGUiIDsKLQkJU2VjdXJpdHlSb2xlIHJldFZhbHVlID0gYXNzZW1ibHlEZXNjcmlwdG9yLmdldFNlY3VyaXR5Um9sZU5hbWVkKG5ld1NlY3VyaXR5Um9sZU5hbWUpIDsKLQkJYXNzZXJ0TnVsbChyZXRWYWx1ZSk7Ci0JCWFzc2VtYmx5RGVzY3JpcHRvci5yZW5hbWVTZWN1cml0eVJvbGUoc2VjdXJpdHlSb2xlTmFtZSwKLQkJCQkJbmV3U2VjdXJpdHlSb2xlTmFtZSk7Ci0JCXJldFZhbHVlID0gYXNzZW1ibHlEZXNjcmlwdG9yLmdldFNlY3VyaXR5Um9sZU5hbWVkKG5ld1NlY3VyaXR5Um9sZU5hbWUpIDsKLQkJYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0JCQotICAgIH0KLQotICAgLyogcHVibGljIHZvaWQgdGVzdF9nZXRNZXRob2RQZXJtaXNzaW9ucygpIHsKLQotICAgICAgICBBc3NlbWJseURlc2NyaXB0b3Igb2JqQXNzZW1ibHlEZXNjcmlwdG9yID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRUxpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakFzc2VtYmx5RGVzY3JpcHRvci5nZXRNZXRob2RQZXJtaXNzaW9ucygpOwotICAgIH0qLwotCi0gICAvKiBwdWJsaWMgdm9pZCB0ZXN0X2dldE1ldGhvZFRyYW5zYWN0aW9ucygpIHsKLQotICAgICAgICBBc3NlbWJseURlc2NyaXB0b3Igb2JqQXNzZW1ibHlEZXNjcmlwdG9yID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRUxpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakFzc2VtYmx5RGVzY3JpcHRvci5nZXRNZXRob2RUcmFuc2FjdGlvbnMoKTsKLSAgICB9ICovCi0KLSAgLyogIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RWpiSmFyKCkgewotCi0gICAgICAgIEFzc2VtYmx5RGVzY3JpcHRvciBvYmpBc3NlbWJseURlc2NyaXB0b3IgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBFSkJKYXIgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakFzc2VtYmx5RGVzY3JpcHRvci5nZXRFamJKYXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldEVqYkphcigpIHsKLQotICAgICAgICBBc3NlbWJseURlc2NyaXB0b3Igb2JqQXNzZW1ibHlEZXNjcmlwdG9yID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRUpCSmFyIG5ld0VqYkphciA9IG51bGw7Ci0gICAgICAgIG9iakFzc2VtYmx5RGVzY3JpcHRvci5zZXRFamJKYXIobmV3RWpiSmFyKTsKLSAgICB9ICovCi0KLSAgLyogIHB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VjdXJpdHlSb2xlcygpIHsKLQotICAgICAgICBBc3NlbWJseURlc2NyaXB0b3Igb2JqQXNzZW1ibHlEZXNjcmlwdG9yID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRUxpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakFzc2VtYmx5RGVzY3JpcHRvci5nZXRTZWN1cml0eVJvbGVzKCk7Ci0gICAgfSovCi0KLSAvKiAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RXhjbHVkZUxpc3QoKSB7Ci0KLSAgICAgICAgQXNzZW1ibHlEZXNjcmlwdG9yIG9iakFzc2VtYmx5RGVzY3JpcHRvciA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEV4Y2x1ZGVMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpBc3NlbWJseURlc2NyaXB0b3IuZ2V0RXhjbHVkZUxpc3QoKTsKLSAgICB9ICovCi0KLSAgIAotCi0gICAvKiBwdWJsaWMgdm9pZCB0ZXN0X3NldEV4Y2x1ZGVMaXN0KCkgewotCi0gICAgICAgIEFzc2VtYmx5RGVzY3JpcHRvciBvYmpBc3NlbWJseURlc2NyaXB0b3IgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBFeGNsdWRlTGlzdCBuZXdFeGNsdWRlTGlzdCA9IG51bGw7Ci0gICAgICAgIG9iakFzc2VtYmx5RGVzY3JpcHRvci5zZXRFeGNsdWRlTGlzdChuZXdFeGNsdWRlTGlzdCk7Ci0gICAgfSAqLwotCi0gLyogICBwdWJsaWMgdm9pZCB0ZXN0X2dldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKSB7Ci0KLSAgICAgICAgQXNzZW1ibHlEZXNjcmlwdG9yIG9iakFzc2VtYmx5RGVzY3JpcHRvciA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpBc3NlbWJseURlc2NyaXB0b3IuZ2V0TWVzc2FnZURlc3RpbmF0aW9ucygpOwotICAgIH0gKi8KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlRGF0YSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIAlpbml0KCk7Ci0gICAgCUVKQlJlc291cmNlIEREID0gKEVKQlJlc291cmNlKSBlamJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLQkJQXNzZW1ibHlEZXNjcmlwdG9yIGFzc2VtYmx5RGVzY3JpcHRvciA9IERELmdldEVKQkphcigpLmdldEFzc2VtYmx5RGVzY3JpcHRvcigpOwotCQlhc3NlcnROb3ROdWxsKGFzc2VtYmx5RGVzY3JpcHRvcik7Ci0JCUxpc3QgZW50ZXJwcmlzZUJlYW5zID0gREQuZ2V0RUpCSmFyKCkuZ2V0RW50ZXJwcmlzZUJlYW5zKCk7Ci0JCUVudGVycHJpc2VCZWFuIGViMSA9IChFbnRlcnByaXNlQmVhbillbnRlcnByaXNlQmVhbnMuZ2V0KDApOwotCQlMaXN0IG1ldGhvZFRyYW5zYWN0aW9uTGlzdCA9IGFzc2VtYmx5RGVzY3JpcHRvci5nZXRNZXRob2RUcmFuc2FjdGlvbk1ldGhvZEVsZW1lbnRzKGViMSk7Ci0JCUxpc3QgbWV0aG9kUGVybWlzc2lvbkxpc3QgPSBhc3NlbWJseURlc2NyaXB0b3IuZ2V0TWV0aG9kUGVybWlzc2lvbk1ldGhvZEVsZW1lbnRzKGViMSk7Ci0JCWFzc2VydEVxdWFscyhtZXRob2RUcmFuc2FjdGlvbkxpc3Quc2l6ZSgpID4gMCwgdHJ1ZSk7Ci0JCWFzc2VydEVxdWFscyhtZXRob2RQZXJtaXNzaW9uTGlzdC5zaXplKCkgPiAwLCB0cnVlKTsgCi0JCQotCQlhc3NlbWJseURlc2NyaXB0b3IucmVtb3ZlRGF0YShlYjEpOwotCQkKLQkJbWV0aG9kVHJhbnNhY3Rpb25MaXN0ID0gYXNzZW1ibHlEZXNjcmlwdG9yLmdldE1ldGhvZFRyYW5zYWN0aW9uTWV0aG9kRWxlbWVudHMoZWIxKTsKLQkJbWV0aG9kUGVybWlzc2lvbkxpc3QgPSBhc3NlbWJseURlc2NyaXB0b3IuZ2V0TWV0aG9kUGVybWlzc2lvbk1ldGhvZEVsZW1lbnRzKGViMSk7Ci0JCWFzc2VydEVxdWFscyhtZXRob2RUcmFuc2FjdGlvbkxpc3Quc2l6ZSgpID09IDAsIHRydWUpOwotCQlhc3NlcnRFcXVhbHMobWV0aG9kUGVybWlzc2lvbkxpc3Quc2l6ZSgpID09IDAsIHRydWUpOyAKLSAgICAgICAgCi0gICAgCQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3Rlc3QvQ01QQXR0cmlidXRlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3Rlc3QvQ01QQXR0cmlidXRlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2FmYzBkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L0NNUEF0dHJpYnV0ZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi50ZXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5DTVBBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLQotcHVibGljIGNsYXNzIENNUEF0dHJpYnV0ZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIEVqYkZhY3RvcnkgRUpCRkFDVE9SWSA9IEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVqYkZhY3RvcnkoKTsKLQkKLQlwdWJsaWMgQ01QQXR0cmlidXRlVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBDTVBBdHRyaWJ1dGUgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFamJGYWN0b3J5KCkuY3JlYXRlQ01QQXR0cmlidXRlKCk7Ci0JCi0JfSAgCi0gICAvKiBwdWJsaWMgdm9pZCB0ZXN0X2dldEZpZWxkKCkgewotCi0gICAgICAgIENNUEF0dHJpYnV0ZSBvYmpDTVBBdHRyaWJ1dGUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBGaWVsZCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ01QQXR0cmlidXRlLmdldEZpZWxkKCk7Ci0gICAgfSAqLwotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRHZXR0ZXJOYW1lKCkgewotICAgICAgICBDTVBBdHRyaWJ1dGUgb2JqQ01QQXR0cmlidXRlID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSAiYXR0ck5hbWUiIDsKLSAgICAgICAgU3RyaW5nIGdldHRlck5hbWUgPSAiZ2V0IiArIG5hbWUuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkgKyAobmFtZS5sZW5ndGgoKSA+IDEgPyBuYW1lLnN1YnN0cmluZygxKSA6ICIiKTsKLSAgICAgICAgb2JqQ01QQXR0cmlidXRlLnNldE5hbWUobmFtZSk7Ci0gICAgICAgIFN0cmluZyByZXRWYWx1ZSA9IG9iakNNUEF0dHJpYnV0ZS5nZXRHZXR0ZXJOYW1lKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhnZXR0ZXJOYW1lLHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE9yaWdpbmF0aW5nVHlwZSgpIHsKLSAgICAgICAgQ01QQXR0cmlidXRlIG9iakNNUEF0dHJpYnV0ZSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEphdmFIZWxwZXJzIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDTVBBdHRyaWJ1dGUuZ2V0T3JpZ2luYXRpbmdUeXBlKCk7Ci0gICAgICAgIGFzc2VydE51bGwocmV0VmFsdWUpOwotICAgICAgICBKYXZhSGVscGVycyBuZXdWYWx1ZSA9IEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDbGFzc1JlZigiamF2YS5sYW5nLlN0cmluZyIpOwotICAgICAgICBvYmpDTVBBdHRyaWJ1dGUuc2V0T3JpZ2luYXRpbmdUeXBlKG5ld1ZhbHVlKTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDTVBBdHRyaWJ1dGUuZ2V0T3JpZ2luYXRpbmdUeXBlKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxuZXdWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRTZXR0ZXJOYW1lKCkgewotICAgIAkgIENNUEF0dHJpYnV0ZSBvYmpDTVBBdHRyaWJ1dGUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICAgIFN0cmluZyBuYW1lID0gImF0dHJOYW1lIiA7Ci0gICAgICAgICAgU3RyaW5nIHNldHRlck5hbWUgPSAic2V0IiArIG5hbWUuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkgKyAobmFtZS5sZW5ndGgoKSA+IDEgPyBuYW1lLnN1YnN0cmluZygxKSA6ICIiKTsKLSAgICAgICAgICBvYmpDTVBBdHRyaWJ1dGUuc2V0TmFtZShuYW1lKTsKLSAgICAgICAgICBTdHJpbmcgcmV0VmFsdWUgPSBvYmpDTVBBdHRyaWJ1dGUuZ2V0U2V0dGVyTmFtZSgpOwotICAgICAgICAgIGFzc2VydEVxdWFscyhzZXR0ZXJOYW1lLHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQ01QQXR0cmlidXRlIG9iakNNUEF0dHJpYnV0ZSA9IGdldEluc3RhbmNlKCk7Ci0JCVN0cmluZyBuYW1lID0gImF0dHJOYW1lIiA7Ci0gICAgICAgIG9iakNNUEF0dHJpYnV0ZS5zZXROYW1lKG5hbWUpOwotICAgICAgIEphdmFIZWxwZXJzIG5ld1ZhbHVlID0gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNsYXNzUmVmKCJqYXZhLmxhbmcuU3RyaW5nIik7Ci0gICAgICAgIG9iakNNUEF0dHJpYnV0ZS5zZXRFVHlwZShuZXdWYWx1ZSk7Ci0gICAgICAgIEphdmFIZWxwZXJzIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDTVBBdHRyaWJ1dGUuZ2V0VHlwZSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMobmV3VmFsdWUscmV0VmFsdWUpOwotICAgICAgICAKLQkJCi0gICAgfQotCi0gIAotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzQ01SRmllbGQoKSB7Ci0gICAgCUNNUEF0dHJpYnV0ZSBvYmpDTVBBdHRyaWJ1dGUgPSBnZXRJbnN0YW5jZSgpOwotICAgIAlib29sZWFuIHJldFZhbHVlID0gb2JqQ01QQXR0cmlidXRlLmlzQ01SRmllbGQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLGZhbHNlKTsKLSAgICAgICAgb2JqQ01QQXR0cmlidXRlID0gRUpCRkFDVE9SWS5jcmVhdGVDTVJGaWVsZCgpOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNNUEF0dHJpYnV0ZS5pc0NNUkZpZWxkKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSx0cnVlKTsKLSAgICAgICAgCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9pc0tleSgpIHsKLSAgICAJRUpCSmFyIGphciA9IEVKQkZBQ1RPUlkuY3JlYXRlRUpCSmFyKCk7Ci0gICAgCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgZW50aXR5ID0gRUpCRkFDVE9SWS5jcmVhdGVDb250YWluZXJNYW5hZ2VkRW50aXR5KCk7Ci0gICAgCWVudGl0eS5zZXROYW1lKCJGb28iKTsKLSAgICAJamFyLmdldEVudGVycHJpc2VCZWFucygpLmFkZChlbnRpdHkpOwotICAgICAgICBDTVBBdHRyaWJ1dGUgb2JqQ01QQXR0cmlidXRlID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgb2JqQ01QQXR0cmlidXRlLnNldE5hbWUoImZvb0F0dHIiKTsKLSAgICAgICAgZW50aXR5LmdldFBlcnNpc3RlbnRBdHRyaWJ1dGVzKCkuYWRkKG9iakNNUEF0dHJpYnV0ZSk7Ci0gICAgICAgIEphdmFIZWxwZXJzIG5ld1ZhbHVlID0gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNsYXNzUmVmKCJqYXZhLmxhbmcuU3RyaW5nIik7Ci0gICAgICAgIG9iakNNUEF0dHJpYnV0ZS5zZXRFVHlwZShuZXdWYWx1ZSk7Ci0gICAgICAgICgoQ29udGFpbmVyTWFuYWdlZEVudGl0eSlqYXIuZ2V0RW50ZXJwcmlzZUJlYW5OYW1lZChlbnRpdHkuZ2V0TmFtZSgpKSkuZ2V0Q01QQXR0cmlidXRlKCkuYWRkKG9iakNNUEF0dHJpYnV0ZSk7Ci0gICAgICAgIENNUEF0dHJpYnV0ZSByZXRBdHRyaWJ1dGUgPSAoQ01QQXR0cmlidXRlKWVudGl0eS5nZXRDTVBBdHRyaWJ1dGUoKS5nZXQoMCk7Ci0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgcmV0VmFsdWUgPSByZXRBdHRyaWJ1dGUuaXNLZXkoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLGZhbHNlKTsKLSAgICAgICAgTGlzdCBsaXN0ID0gZW50aXR5LmdldEtleUF0dHJpYnV0ZXMoKTsKLSAgICAgICAgbGlzdC5hZGQob2JqQ01QQXR0cmlidXRlKTsKLSAgICAgICAgcmV0VmFsdWUgPSByZXRBdHRyaWJ1dGUuaXNLZXkoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNQcmltS2V5RmllbGQoKSB7Ci0gICAgCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgZW50aXR5ID0gRUpCRkFDVE9SWS5jcmVhdGVDb250YWluZXJNYW5hZ2VkRW50aXR5KCk7Ci0gICAgICAgIENNUEF0dHJpYnV0ZSBvYmpDTVBBdHRyaWJ1dGUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBMaXN0IGxpc3QgPSBlbnRpdHkuZ2V0Q01QQXR0cmlidXRlKCk7Ci0gICAgICAgIGVudGl0eS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlcygpLmFkZChvYmpDTVBBdHRyaWJ1dGUpOwotICAgICAgICBsaXN0LmFkZChvYmpDTVBBdHRyaWJ1dGUpOwotICAgICAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ01QQXR0cmlidXRlLmlzUHJpbUtleUZpZWxkKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxmYWxzZSk7Ci0gICAgICAgIGVudGl0eS5zZXRQcmltS2V5RmllbGQob2JqQ01QQXR0cmlidXRlKTsKLSAgICAgICAgcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDTVBBdHRyaWJ1dGUuaXNQcmltS2V5RmllbGQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0T3JpZ2luYXRpbmdUeXBlKCkgewotCi0gICAgCUNNUEF0dHJpYnV0ZSBvYmpDTVBBdHRyaWJ1dGUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBKYXZhSGVscGVycyByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ01QQXR0cmlidXRlLmdldE9yaWdpbmF0aW5nVHlwZSgpOwotICAgICAgICBhc3NlcnROdWxsKHJldFZhbHVlKTsKLSAgICAgICAgSmF2YUhlbHBlcnMgbmV3VmFsdWUgPSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2xhc3NSZWYoImphdmEubGFuZy5TdHJpbmciKTsKLSAgICAgICAgb2JqQ01QQXR0cmlidXRlLnNldE9yaWdpbmF0aW5nVHlwZShuZXdWYWx1ZSk7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ01QQXR0cmlidXRlLmdldE9yaWdpbmF0aW5nVHlwZSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsbmV3VmFsdWUpOwotICAgIH0KLQotICAgLyogcHVibGljIHZvaWQgdGVzdF9nZXREZXNjcmlwdGlvbigpIHsKLQotICAgICAgICBDTVBBdHRyaWJ1dGUgb2JqQ01QQXR0cmlidXRlID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIHJldFZhbHVlID0gIiI7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ01QQXR0cmlidXRlLmdldERlc2NyaXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXREZXNjcmlwdGlvbigpIHsKLQotICAgICAgICBDTVBBdHRyaWJ1dGUgb2JqQ01QQXR0cmlidXRlID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIG5ld0Rlc2NyaXB0aW9uID0gIiI7Ci0gICAgICAgIG9iakNNUEF0dHJpYnV0ZS5zZXREZXNjcmlwdGlvbihuZXdEZXNjcmlwdGlvbik7Ci0gICAgfSovCi0KLSAgCi0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdF9pc0Rlcml2ZWQoKSB7Ci0KLSAgICAJIENNUEF0dHJpYnV0ZSBvYmpDTVBBdHRyaWJ1dGUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICAgYm9vbGVhbiBhQm9vbGVhbiA9IGZhbHNlOwotICAgICAgICAgb2JqQ01QQXR0cmlidXRlLnNldERlcml2ZWQoYUJvb2xlYW4pOwotICAgICAgICAgYm9vbGVhbiByZXRWYWwgPSBvYmpDTVBBdHRyaWJ1dGUuaXNEZXJpdmVkKCk7Ci0gICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsLGFCb29sZWFuKTsKLSAgICAgICAgIGFCb29sZWFuID0gdHJ1ZTsKLSAgICAgICAgIG9iakNNUEF0dHJpYnV0ZS5zZXREZXJpdmVkKGFCb29sZWFuKTsKLSAgICAgICAgIHJldFZhbCA9IG9iakNNUEF0dHJpYnV0ZS5pc0Rlcml2ZWQoKTsKLSAgICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWwsYUJvb2xlYW4pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0RGVyaXZlZCgpIHsKLQotICAgICAgICBDTVBBdHRyaWJ1dGUgb2JqQ01QQXR0cmlidXRlID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgYm9vbGVhbiBhQm9vbGVhbiA9IGZhbHNlOwotICAgICAgICBvYmpDTVBBdHRyaWJ1dGUuc2V0RGVyaXZlZChhQm9vbGVhbik7Ci0gICAgICAgIGJvb2xlYW4gcmV0VmFsID0gb2JqQ01QQXR0cmlidXRlLmlzRGVyaXZlZCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsLGFCb29sZWFuKTsKLSAgICAgICAgYUJvb2xlYW4gPSB0cnVlOwotICAgICAgICBvYmpDTVBBdHRyaWJ1dGUuc2V0RGVyaXZlZChhQm9vbGVhbik7Ci0gICAgICAgIHJldFZhbCA9IG9iakNNUEF0dHJpYnV0ZS5pc0Rlcml2ZWQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbCxhQm9vbGVhbik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShDTVBBdHRyaWJ1dGVUZXN0LmNsYXNzKTsKLQl9Ci0KLSAgIAotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3Rlc3QvQ01SRmllbGRUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9DTVJGaWVsZFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRjNzRiMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9DTVJGaWVsZFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLnRlc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01SRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlbGF0aW9uc2hpcFJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci0KLXB1YmxpYyBjbGFzcyBDTVJGaWVsZFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJvdGVjdGVkIEVqYkZhY3RvcnkgRUpCRkFDVE9SWSA9IEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVqYkZhY3RvcnkoKTsKLQotCXByaXZhdGUgQ01SRmllbGQgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBFSkJGQUNUT1JZLmNyZWF0ZUNNUkZpZWxkKCk7Ci0JfQotCQotICAgcHVibGljIHZvaWQgdGVzdF9nZXRDb2xsZWN0aW9uVHlwZU5hbWUoKSB7Ci0JICAgCUNNUkZpZWxkIG9iakNNUkZpZWxkID0gZ2V0SW5zdGFuY2UoKTsKLQkgICAgU3RyaW5nIHR5cGVOYW1lID0gInRlc3ROYW1lIjsKLQkgICAgb2JqQ01SRmllbGQuc2V0Q29sbGVjdGlvblR5cGVOYW1lKHR5cGVOYW1lKTsKLQkgICAgU3RyaW5nIHJldFZhbHVlID0gIiI7Ci0JICAgIHJldFZhbHVlID0gb2JqQ01SRmllbGQuZ2V0Q29sbGVjdGlvblR5cGVOYW1lKCk7Ci0JICAgIGFzc2VydEVxdWFscyh0eXBlTmFtZSxyZXRWYWx1ZSk7Ci0gICAgfQotCi0gCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRDb2xsZWN0aW9uVHlwZU5hbWUoKSB7Ci0KLSAgICAgICAgQ01SRmllbGQgb2JqQ01SRmllbGQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgdHlwZU5hbWUgPSAidGVzdE5hbWUiOwotICAgICAgICBvYmpDTVJGaWVsZC5zZXRDb2xsZWN0aW9uVHlwZU5hbWUodHlwZU5hbWUpOwotICAgICAgICBTdHJpbmcgcmV0VmFsdWUgPSAiIjsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDTVJGaWVsZC5nZXRDb2xsZWN0aW9uVHlwZU5hbWUoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHR5cGVOYW1lLHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFJvbGUoKSB7Ci0gICAgCSBDTVJGaWVsZCBvYmpDTVJGaWVsZCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgICBFSkJSZWxhdGlvbnNoaXBSb2xlIG5ld1JvbGUgPSBFSkJGQUNUT1JZLmNyZWF0ZUVKQlJlbGF0aW9uc2hpcFJvbGUoKTsKLSAgICAgICAgIG5ld1JvbGUuc2V0TmFtZSgiUm9sZTEiKTsKLSAgICAgICAgIG9iakNNUkZpZWxkLnNldFJvbGUobmV3Um9sZSk7Ci0gICAgICAgICBFSkJSZWxhdGlvbnNoaXBSb2xlIHJldFZhbHVlID0gb2JqQ01SRmllbGQuZ2V0Um9sZSgpOwotICAgICAgICAgYXNzZXJ0RXF1YWxzKG5ld1JvbGUscmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0Um9sZSgpIHsKLSAgICAgICAgQ01SRmllbGQgb2JqQ01SRmllbGQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBFSkJSZWxhdGlvbnNoaXBSb2xlIG5ld1JvbGUgPSBFSkJGQUNUT1JZLmNyZWF0ZUVKQlJlbGF0aW9uc2hpcFJvbGUoKTsKLSAgICAgICAgbmV3Um9sZS5zZXROYW1lKCJSb2xlMSIpOwotICAgICAgICBvYmpDTVJGaWVsZC5zZXRSb2xlKG5ld1JvbGUpOwotICAgICAgICBFSkJSZWxhdGlvbnNoaXBSb2xlIHJldFZhbHVlID0gb2JqQ01SRmllbGQuZ2V0Um9sZSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMobmV3Um9sZSxyZXRWYWx1ZSk7Ci0gICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0Q29sbGVjdGlvblR5cGUoKSB7Ci0KLSAgICAJIENNUkZpZWxkIG9iakNNUkZpZWxkID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgIEphdmFDbGFzcyBuZXdDb2xsZWN0aW9uVHlwZSA9IEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVKYXZhQ2xhc3MoKTsKLSAgICAgICAgIG9iakNNUkZpZWxkLnNldENvbGxlY3Rpb25UeXBlKG5ld0NvbGxlY3Rpb25UeXBlKTsKLSAgICAgICAgIEphdmFDbGFzcyByZXRWYWwgPSBvYmpDTVJGaWVsZC5nZXRDb2xsZWN0aW9uVHlwZSgpOwotICAgICAgICAgYXNzZXJ0RXF1YWxzKG5ld0NvbGxlY3Rpb25UeXBlLHJldFZhbCk7Ci0gICAgfQotCi0gICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldENvbGxlY3Rpb25UeXBlKCkgewotCi0gICAgICAgIENNUkZpZWxkIG9iakNNUkZpZWxkID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgSmF2YUNsYXNzIG5ld0NvbGxlY3Rpb25UeXBlID0gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUphdmFDbGFzcygpOwotICAgICAgICBvYmpDTVJGaWVsZC5zZXRDb2xsZWN0aW9uVHlwZShuZXdDb2xsZWN0aW9uVHlwZSk7Ci0gICAgICAgIEphdmFDbGFzcyByZXRWYWwgPSBvYmpDTVJGaWVsZC5nZXRDb2xsZWN0aW9uVHlwZSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMobmV3Q29sbGVjdGlvblR5cGUscmV0VmFsKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShDTVJGaWVsZFRlc3QuY2xhc3MpOwotCX0KLQotCi0gICAKLSAgICAKLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3Rlc3QvQ29udGFpbmVyTWFuYWdlZEVudGl0eVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L0NvbnRhaW5lck1hbmFnZWRFbnRpdHlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyN2VmZjkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3Rlc3QvQ29udGFpbmVyTWFuYWdlZEVudGl0eVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4OCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi50ZXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YVJlZkZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5DTVBBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBDb250YWluZXJNYW5hZ2VkRW50aXR5VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFamJGYWN0b3J5IEVKQkZBQ1RPUlkgPSBFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFamJGYWN0b3J5KCk7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKENvbnRhaW5lck1hbmFnZWRFbnRpdHlUZXN0LmNsYXNzKTsKLQl9Ci0JCi0JcHJpdmF0ZSBDb250YWluZXJNYW5hZ2VkRW50aXR5IGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gRUpCRkFDVE9SWS5jcmVhdGVDb250YWluZXJNYW5hZ2VkRW50aXR5KCk7Ci0JfQotICAgIHB1YmxpYyB2b2lkIHRlc3RfYWRkS2V5QXR0cmlidXRlTmFtZSgpIHsKLSAgICAJQ29udGFpbmVyTWFuYWdlZEVudGl0eSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgQ01QQXR0cmlidXRlIGNtcEF0dHJpYnV0ZSA9IEVKQkZBQ1RPUlkuY3JlYXRlQ01QQXR0cmlidXRlKCk7Ci0gICAgICAgIExpc3QgcGVyc2lzdGVudEF0dHJpYnV0ZXMgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmdldFBlcnNpc3RlbnRBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIHBlcnNpc3RlbnRBdHRyaWJ1dGVzLmFkZChjbXBBdHRyaWJ1dGUpOwotICAgICAgICBTdHJpbmcgYXR0ck5hbWUgPSAiYXR0cjEiIDsKLSAgICAgICAgY21wQXR0cmlidXRlLnNldE5hbWUoYXR0ck5hbWUpOwotICAgICAgICBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmFkZEtleUF0dHJpYnV0ZU5hbWUoYXR0ck5hbWUpOwotICAgICAgICBMaXN0IGtleXMgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmdldEtleUF0dHJpYnV0ZXMoKTsKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGtleXMuY29udGFpbnMoY21wQXR0cmlidXRlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLHRydWUpOwotICAgfQotCi0gICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2FkZFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSB7Ci0gICAgICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEZpZWxkIGFGaWVsZCA9IEphdmFSZWZGYWN0b3J5SW1wbC5nZXRBY3RpdmVGYWN0b3J5KCkuY3JlYXRlRmllbGQoKTsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSJhdHRyMSIgOwotICAgICAgICBhRmllbGQuc2V0TmFtZShuYW1lKTsKLSAgICAgICAgQ01QQXR0cmlidXRlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmFkZFBlcnNpc3RlbnRBdHRyaWJ1dGUoYUZpZWxkKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKG5hbWUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2FkZFBlcnNpc3RlbnRBdHRyaWJ1dGVOYW1lKCkgewotCi0gICAgICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBuYW1lID0iYXR0cjEiIDsKLSAgICAgICAgQ01QQXR0cmlidXRlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmFkZFBlcnNpc3RlbnRBdHRyaWJ1dGVOYW1lKG5hbWUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUobmFtZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRLZXlBdHRyaWJ1dGUoKSB7Ci0gICAgICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIENNUEF0dHJpYnV0ZSBjbXBBdHRyaWJ1dGUgPSBFSkJGQUNUT1JZLmNyZWF0ZUNNUEF0dHJpYnV0ZSgpOwotICAgICAgICBMaXN0IHBlcnNpc3RlbnRBdHRyaWJ1dGVzID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlcygpOwotICAgICAgICBwZXJzaXN0ZW50QXR0cmlidXRlcy5hZGQoY21wQXR0cmlidXRlKTsKLSAgICAgICAgU3RyaW5nIGF0dHJOYW1lID0gImF0dHIxIiA7Ci0gICAgICAgIGNtcEF0dHJpYnV0ZS5zZXROYW1lKGF0dHJOYW1lKTsKLSAgICAgICAgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5hZGRLZXlBdHRyaWJ1dGVOYW1lKGF0dHJOYW1lKTsKLSAgICAgICAgQ01QQXR0cmlidXRlIHJldFZhbHVlID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5nZXRLZXlBdHRyaWJ1dGUoYXR0ck5hbWUpOwotICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsY21wQXR0cmlidXRlKTsKLSAgICAgICAgCi0gICAgfQotCi0gIAotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UHJpbWFyeUtleUF0dHJpYnV0ZSgpIHsKLQotCSAgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgIENNUEF0dHJpYnV0ZSBjbXBBdHRyaWJ1dGUgPSBFSkJGQUNUT1JZLmNyZWF0ZUNNUEF0dHJpYnV0ZSgpOwotICAgICAgTGlzdCBwZXJzaXN0ZW50QXR0cmlidXRlcyA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZXMoKTsKLSAgICAgIHBlcnNpc3RlbnRBdHRyaWJ1dGVzLmFkZChjbXBBdHRyaWJ1dGUpOwotICAgICAgU3RyaW5nIGF0dHJOYW1lID0gImF0dHIxIiA7Ci0gICAgICBjbXBBdHRyaWJ1dGUuc2V0TmFtZShhdHRyTmFtZSk7Ci0gICAgICBDTVBBdHRyaWJ1dGUgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmdldFByaW1hcnlLZXlBdHRyaWJ1dGUoKTsKLSAgICAgIGFzc2VydE5vdFNhbWUocmV0VmFsdWUsY21wQXR0cmlidXRlKTsKLSAgICAgIG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuc2V0UHJpbUtleUZpZWxkKGNtcEF0dHJpYnV0ZSk7Ci0gICAgICByZXRWYWx1ZSA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuZ2V0UHJpbWFyeUtleUF0dHJpYnV0ZSgpOwotICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLGNtcEF0dHJpYnV0ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9pc0NvbnRhaW5lck1hbmFnZWRFbnRpdHkoKSB7Ci0KLSAgICAgICAgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuaXNDb250YWluZXJNYW5hZ2VkRW50aXR5KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSx0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzS2V5QXR0cmlidXRlKCkgewotCi0gICAgCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIENNUEF0dHJpYnV0ZSBjbXBBdHRyaWJ1dGUgPSBFSkJGQUNUT1JZLmNyZWF0ZUNNUEF0dHJpYnV0ZSgpOwotICAgICAgICBMaXN0IHBlcnNpc3RlbnRBdHRyaWJ1dGVzID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlcygpOwotICAgICAgICBwZXJzaXN0ZW50QXR0cmlidXRlcy5hZGQoY21wQXR0cmlidXRlKTsKLSAgICAgICAgU3RyaW5nIGF0dHJOYW1lID0gImF0dHIxIiA7Ci0gICAgICAgIGNtcEF0dHJpYnV0ZS5zZXROYW1lKGF0dHJOYW1lKTsKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuaXNLZXlBdHRyaWJ1dGUoY21wQXR0cmlidXRlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLGZhbHNlKTsKLSAgICAgICAgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5hZGRLZXlBdHRyaWJ1dGVOYW1lKGF0dHJOYW1lKTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmlzS2V5QXR0cmlidXRlKGNtcEF0dHJpYnV0ZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSx0cnVlKTsKLSAgICAgICAgCi0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlUGVyc2lzdGVudEF0dHJpYnV0ZV8yKCkgewotICAgIAlDb250YWluZXJNYW5hZ2VkRW50aXR5IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBDTVBBdHRyaWJ1dGUgY21wQXR0cmlidXRlID0gRUpCRkFDVE9SWS5jcmVhdGVDTVBBdHRyaWJ1dGUoKTsKLSAgICAgICAgTGlzdCBwZXJzaXN0ZW50QXR0cmlidXRlcyA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgcGVyc2lzdGVudEF0dHJpYnV0ZXMuYWRkKGNtcEF0dHJpYnV0ZSk7Ci0gICAgICAgIFN0cmluZyBhdHRyTmFtZSA9ICJhdHRyMSIgOwotICAgICAgICBjbXBBdHRyaWJ1dGUuc2V0TmFtZShhdHRyTmFtZSk7Ci0gICAgICAgIENNUEF0dHJpYnV0ZSByZXRWYWx1ZSA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZShhdHRyTmFtZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkucmVtb3ZlUGVyc2lzdGVudEF0dHJpYnV0ZShhdHRyTmFtZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZShhdHRyTmFtZSk7Ci0gICAgICAgIGFzc2VydE51bGwocmV0VmFsdWUpOwotICAgIH0KLSAgICAKLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSB7Ci0KLSAgICAJIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgICBGaWVsZCBhRmllbGQgPSBKYXZhUmVmRmFjdG9yeUltcGwuZ2V0QWN0aXZlRmFjdG9yeSgpLmNyZWF0ZUZpZWxkKCk7Ci0gICAgICAgICBTdHJpbmcgbmFtZSA9ImF0dHIxIiA7Ci0gICAgICAgICBhRmllbGQuc2V0TmFtZShuYW1lKTsKLSAgICAgICAgIENNUEF0dHJpYnV0ZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgICByZXRWYWx1ZSA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuYWRkUGVyc2lzdGVudEF0dHJpYnV0ZShhRmllbGQpOwotICAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgICAgICAKLSAgICAgICAgIHJldFZhbHVlID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKG5hbWUpOwotICAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgICAgICAKLSAgICAgICAgIHJldFZhbHVlID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5yZW1vdmVQZXJzaXN0ZW50QXR0cmlidXRlKGFGaWVsZCk7Ci0gICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICAgICAgIAotICAgICAgICAgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUobmFtZSk7Ci0gICAgICAgICBhc3NlcnROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRQcmltS2V5RmllbGQoKSB7Ci0KLSAgCSAgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgQ01QQXR0cmlidXRlIGNtcEF0dHJpYnV0ZSA9IEVKQkZBQ1RPUlkuY3JlYXRlQ01QQXR0cmlidXRlKCk7Ci0gICAgICAgIExpc3QgcGVyc2lzdGVudEF0dHJpYnV0ZXMgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmdldFBlcnNpc3RlbnRBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIHBlcnNpc3RlbnRBdHRyaWJ1dGVzLmFkZChjbXBBdHRyaWJ1dGUpOwotICAgICAgICBTdHJpbmcgYXR0ck5hbWUgPSAiYXR0cjEiIDsKLSAgICAgICAgY21wQXR0cmlidXRlLnNldE5hbWUoYXR0ck5hbWUpOwotICAgICAgICBDTVBBdHRyaWJ1dGUgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmdldFByaW1LZXlGaWVsZCgpOwotICAgICAgICBhc3NlcnROb3RTYW1lKHJldFZhbHVlLGNtcEF0dHJpYnV0ZSk7Ci0gICAgICAgIG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuc2V0UHJpbUtleUZpZWxkKGNtcEF0dHJpYnV0ZSk7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5nZXRQcmltS2V5RmllbGQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLGNtcEF0dHJpYnV0ZSk7Ci0gIH0KLQotICAgCi0gICAgcHVibGljIHZvaWQgdGVzdF9pc1ZlcnNpb24xX1goKSB7Ci0gICAgICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuc2V0VmVyc2lvbihDb250YWluZXJNYW5hZ2VkRW50aXR5LlZFUlNJT05fMV9YKTsKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuaXNWZXJzaW9uMV9YKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSx0cnVlKTsKLSAgICAgICAgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5zZXRWZXJzaW9uKENvbnRhaW5lck1hbmFnZWRFbnRpdHkuVkVSU0lPTl8yX1gpOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuaXNWZXJzaW9uMV9YKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9pc1ZlcnNpb24yX1goKSB7Ci0KLSAgICAJIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgICBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LnNldFZlcnNpb24oQ29udGFpbmVyTWFuYWdlZEVudGl0eS5WRVJTSU9OXzJfWCk7Ci0gICAgICAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7Ci0gICAgICAgICByZXRWYWx1ZSA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuaXNWZXJzaW9uMl9YKCk7Ci0gICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsdHJ1ZSk7Ci0gICAgICAgICBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LnNldFZlcnNpb24oQ29udGFpbmVyTWFuYWdlZEVudGl0eS5WRVJTSU9OXzFfWCk7Ci0gICAgICAgICByZXRWYWx1ZSA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuaXNWZXJzaW9uMl9YKCk7Ci0gICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsZmFsc2UpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2xpc3RQZXJzaXN0ZW50RmllbGROYW1lcygpIHsKLQotICAgIAlDb250YWluZXJNYW5hZ2VkRW50aXR5IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBDTVBBdHRyaWJ1dGUgY21wQXR0cmlidXRlMSA9IEVKQkZBQ1RPUlkuY3JlYXRlQ01QQXR0cmlidXRlKCk7Ci0gICAgICAgIFN0cmluZyBhdHRyTmFtZTEgPSAiYXR0cjEiIDsKLSAgICAgICAgY21wQXR0cmlidXRlMS5zZXROYW1lKGF0dHJOYW1lMSk7Ci0gICAgICAgIAotICAgICAgICBDTVBBdHRyaWJ1dGUgY21wQXR0cmlidXRlMiA9IEVKQkZBQ1RPUlkuY3JlYXRlQ01QQXR0cmlidXRlKCk7Ci0gICAgICAgIFN0cmluZyBhdHRyTmFtZTIgPSAiYXR0cjIiIDsKLSAgICAgICAgY21wQXR0cmlidXRlMi5zZXROYW1lKGF0dHJOYW1lMik7Ci0gICAgICAgIAotICAgICAgICBMaXN0IHBlcnNpc3RlbnRBdHRyaWJ1dGVzID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlcygpOwotICAgICAgICBwZXJzaXN0ZW50QXR0cmlidXRlcy5hZGQoY21wQXR0cmlidXRlMSk7Ci0gICAgICAgIHBlcnNpc3RlbnRBdHRyaWJ1dGVzLmFkZChjbXBBdHRyaWJ1dGUyKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZ1tdIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5Lmxpc3RQZXJzaXN0ZW50RmllbGROYW1lcygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLmxlbmd0aCA9PSAyLCB0cnVlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKChyZXRWYWx1ZVswXT09YXR0ck5hbWUxIHx8IHJldFZhbHVlWzFdPT1hdHRyTmFtZTEpICwgdHJ1ZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygocmV0VmFsdWVbMF09PWF0dHJOYW1lMiB8fCByZXRWYWx1ZVsxXT09YXR0ck5hbWUyKSAsIHRydWUpOwotICAgICAgICAgCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9pc1Vua25vd25QcmltYXJ5S2V5KCkgewotCi0gICAgICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuc2V0UHJpbWFyeUtleU5hbWUoImphdmEubGFuZy5TdHJpbmciKTsKLSAgICAgICAgCi0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmlzVW5rbm93blByaW1hcnlLZXkoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLGZhbHNlKTsKLSAgICAgICAgCi0gICAgICAgIG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuc2V0UHJpbWFyeUtleU5hbWUoImphdmEubGFuZy5PYmplY3QiKTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmlzVW5rbm93blByaW1hcnlLZXkoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLHRydWUpOwotICAgICAgICAKLSAgICAgICAgCi0gICAgfQotICAKLSAgICAvLyBUT0RPCi0gICAvKiBwdWJsaWMgdm9pZCB0ZXN0X21ha2VQcmltS2V5RmllbGRQcm94eSgpIHsKLQotICAgICAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5Lm1ha2VQcmltS2V5RmllbGRQcm94eSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0QWxsQXZhaWxhYmxlUXVlcnlNZXRob2RzKCkgewotCi0gICAgICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIExpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuZ2V0QWxsQXZhaWxhYmxlUXVlcnlNZXRob2RzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRBdmFpbGFibGVTZWxlY3RRdWVyeU1ldGhvZHMoKSB7Ci0KLSAgICAgICAgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eQotICAgICAgICAgICAgICAgIC5nZXRBdmFpbGFibGVTZWxlY3RRdWVyeU1ldGhvZHMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEF2YWlsYWJsZUZpbmRRdWVyeU1ldGhvZHMoKSB7Ci0KLSAgICAgICAgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5nZXRBdmFpbGFibGVGaW5kUXVlcnlNZXRob2RzKCk7Ci0gICAgfSAqLwotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRDTVBWZXJzaW9uSUQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQotICAgICAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LnNldFZlcnNpb24oQ29udGFpbmVyTWFuYWdlZEVudGl0eS5WRVJTSU9OXzFfWCk7Ci0gICAgICAgIGludCByZXRWYWx1ZSA9IDA7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5nZXRDTVBWZXJzaW9uSUQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8xXzFfSUQsIHJldFZhbHVlKTsKLSAgICAgICAgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5zZXRWZXJzaW9uKENvbnRhaW5lck1hbmFnZWRFbnRpdHkuVkVSU0lPTl8yX1gpOwotICAgICAgICAKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmdldENNUFZlcnNpb25JRCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMF9JRCwgcmV0VmFsdWUpOwotICAgICAgICAKLSAgICB9Ci0gIAotICAgCi0KLSAgLyogIHB1YmxpYyB2b2lkIHRlc3RfZ2V0Q01SRmllbGRzKCkgewotCi0gICAgICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIExpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuZ2V0Q01SRmllbGRzKCk7Ci0gICAgfQotCi0gICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFJvbGVzKCkgewotCi0gICAgICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIExpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuZ2V0Um9sZXMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFJvbGUoKSB7Ci0gICAgICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVKQlJlbGF0aW9uc2hpcFJvbGUgcm9sZSA9IEVKQkZBQ1RPUlkuY3JlYXRlRUpCUmVsYXRpb25zaGlwUm9sZSgpOwotICAgICAgICBTdHJpbmcgcm9sZU5hbWUgPSAicm9sZTEiOwotICAgICAgICByb2xlLnNldE5hbWUocm9sZU5hbWUpOwotICAgICAgICBDb21tb25SZWxhdGlvbnNoaXBSb2xlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmdldFJvbGUocm9sZU5hbWUpOwotICAgICAgICBhc3NlcnROdWxsKHJldFZhbHVlKTsKLSAgICAgICAgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5nZXRSb2xlcygpLmFkZChyb2xlKTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmdldFJvbGUocm9sZU5hbWUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRGaWx0ZXJlZEZlYXR1cmVzKCkgewotCi0gICAgICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVKQkV4dGVuc2lvbkZpbHRlciBhRmlsdGVyID0gbnVsbDsKLSAgICAgICAgTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5nZXRGaWx0ZXJlZEZlYXR1cmVzKGFGaWx0ZXIpOwotICAgIH0gKi8KLQotICAgIC8qIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpIHsKLQotICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgU3RyaW5nIGFOYW1lID0gIiI7Ci0gICAgQ01QQXR0cmlidXRlIHJldFZhbHVlID0gbnVsbDsKLSAgICByZXRWYWx1ZSA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZShhTmFtZSk7Ci19Ki8KLQotICAgIAotICAgIC8qIHB1YmxpYyB2b2lkIHRlc3RfZ2V0VmVyc2lvbigpIHsKLQotICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgU3RyaW5nIHJldFZhbHVlID0gIiI7Ci0gICAgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmdldFZlcnNpb24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRWZXJzaW9uKCkgewotCi0gICAgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICBTdHJpbmcgbmV3VmVyc2lvbiA9ICIiOwotICAgIG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuc2V0VmVyc2lvbihuZXdWZXJzaW9uKTsKLX0qLwotCi0vKiBwdWJsaWMgdm9pZCB0ZXN0X2dldEFic3RyYWN0U2NoZW1hTmFtZSgpIHsKLQotICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgU3RyaW5nIHJldFZhbHVlID0gIiI7Ci0gICAgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmdldEFic3RyYWN0U2NoZW1hTmFtZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEFic3RyYWN0U2NoZW1hTmFtZSgpIHsKLQotICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgU3RyaW5nIG5ld0Fic3RyYWN0U2NoZW1hTmFtZSA9ICIiOwotICAgIG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkKLSAgICAgICAgICAgIC5zZXRBYnN0cmFjdFNjaGVtYU5hbWUobmV3QWJzdHJhY3RTY2hlbWFOYW1lKTsKLX0qLwotCi0vKiAgcHVibGljIHZvaWQgdGVzdF9nZXRQZXJzaXN0ZW50QXR0cmlidXRlcygpIHsKLQotICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgRUxpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgIHJldFZhbHVlID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlcygpOwotfSovCi0KLS8qcHVibGljIHZvaWQgdGVzdF9nZXRLZXlBdHRyaWJ1dGVzKCkgewotCi0gICAgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICBFTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmdldEtleUF0dHJpYnV0ZXMoKTsKLX0qLwotCi0vKiBwdWJsaWMgdm9pZCB0ZXN0X2dldFF1ZXJpZXMoKSB7Ci0KLSAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkgPSBnZXRJbnN0YW5jZSgpOwotICAgIEVMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICByZXRWYWx1ZSA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuZ2V0UXVlcmllcygpOwotfSovCi0KLS8qICBwdWJsaWMgdm9pZCB0ZXN0X2dldENNUEF0dHJpYnV0ZSgpIHsKLQotICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgRUxpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgIHJldFZhbHVlID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5nZXRDTVBBdHRyaWJ1dGUoKTsKLX0qLwotCi0vKiAgcHVibGljIHZvaWQgdGVzdF9nZXRQcmltS2V5RmllbGQoKSB7Ci0KLSAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkgPSBnZXRJbnN0YW5jZSgpOwotICAgIENNUEF0dHJpYnV0ZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmdldFByaW1LZXlGaWVsZCgpOwotfSovCi0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L0VKQkphclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L0VKQkphclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg0ZjI5MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9FSkJKYXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ODkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIudGVzdDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVqYlJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Bc3NlbWJseURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlbGF0aW9uc2hpcFJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXNzYWdlRHJpdmVuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5SZWxhdGlvbnNoaXBzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Sb2xlU291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5TZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgRUpCSmFyVGVzdCBleHRlbmRzICBFamJFTUZUZXN0QmFzZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21tb25GYWN0b3J5IENPTU1PTkZBQ1RPUlkgPSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21tb25GYWN0b3J5KCk7Ci0JcHVibGljIEVKQkphclRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCXByaXZhdGUgRUpCSmFyIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZUVKQkphcigpOwotCX0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X0VKQkphcigpIHsKLSAgICAgICAgRUpCSmFyIHRtcEVKQkphciA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwodG1wRUpCSmFyKTsKLSAgICB9Ci0gICAgCi0gICAKLSAgICAKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY29udGFpbnNDb250YWluZXJNYW5hZ2VkQmVhbnMoKSB7Ci0KLSAgICAgICAgRUpCSmFyIG9iakVKQkphciA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVTZXNzaW9uKCk7Ci0gICAgICAgIG9iakVKQkphci5nZXRFbnRlcnByaXNlQmVhbnMoKS5hZGQoc2Vzc2lvbik7Ci0gICAgICAgIAotICAgICAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRUpCSmFyLmNvbnRhaW5zQ29udGFpbmVyTWFuYWdlZEJlYW5zKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxmYWxzZSk7Ci0gICAgICAgIAotICAgICAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IGVudGl0eSA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVDb250YWluZXJNYW5hZ2VkRW50aXR5KCk7Ci0gICAgICAgIG9iakVKQkphci5nZXRFbnRlcnByaXNlQmVhbnMoKS5hZGQoZW50aXR5KTsKLSAgICAgICAgCi0gICAgICAgIHJldFZhbHVlID0gb2JqRUpCSmFyLmNvbnRhaW5zQ29udGFpbmVyTWFuYWdlZEJlYW5zKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSx0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NvbnRhaW5zU2VjdXJpdHlSb2xlKCkgewotCi0gICAgICAgIEVKQkphciBvYmpFSkJKYXIgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBBc3NlbWJseURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVBc3NlbWJseURlc2NyaXB0b3IoKTsKLSAgICAgICAgb2JqRUpCSmFyLnNldEFzc2VtYmx5RGVzY3JpcHRvcihkZXNjcmlwdG9yKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBzZWN1cml0eVJvbGVOYW1lID0gInRlc3RSb2xlIjsKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVKQkphci5jb250YWluc1NlY3VyaXR5Um9sZShzZWN1cml0eVJvbGVOYW1lKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLCBmYWxzZSk7Ci0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgU2VjdXJpdHlSb2xlIHNlY3VyaXR5Um9sZT0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uRmFjdG9yeSgpLmNyZWF0ZVNlY3VyaXR5Um9sZSgpOwotCQlzZWN1cml0eVJvbGUuc2V0Um9sZU5hbWUoc2VjdXJpdHlSb2xlTmFtZSk7Ci0JCWRlc2NyaXB0b3IuZ2V0U2VjdXJpdHlSb2xlcygpLmFkZChzZWN1cml0eVJvbGUpOwotCQlyZXRWYWx1ZSA9IG9iakVKQkphci5jb250YWluc1NlY3VyaXR5Um9sZShzZWN1cml0eVJvbGVOYW1lKSA7Ci0JCWFzc2VydEVxdWFscyhyZXRWYWx1ZSx0cnVlKTsKLSAgICB9Ci0gICAgCi0gICAgCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEJlYW5NYW5hZ2VkQmVhbnMoKSB7Ci0gICAgICAgIEVKQkphciBvYmpFSkJKYXIgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlU2Vzc2lvbigpOwotICAgICAgICBvYmpFSkJKYXIuZ2V0RW50ZXJwcmlzZUJlYW5zKCkuYWRkKHNlc3Npb24pOwotICAgICAgICAKLSAgICAgICAgTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRUpCSmFyLmdldEJlYW5NYW5hZ2VkQmVhbnMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLnNpemUoKT09MCx0cnVlKTsKLSAgICAgICAgCi0gICAgICAgIEVudGl0eSBlbnRpdHkgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlRW50aXR5KCk7Ci0gICAgICAgIG9iakVKQkphci5nZXRFbnRlcnByaXNlQmVhbnMoKS5hZGQoZW50aXR5KTsKLSAgICAgICAgCi0gICAgICAgIHJldFZhbHVlID0gb2JqRUpCSmFyLmdldEJlYW5NYW5hZ2VkQmVhbnMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLnNpemUoKT09MSx0cnVlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLmdldCgwKSxlbnRpdHkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0Q29udGFpbmVyTWFuYWdlZEJlYW5zKCkgewotICAgIAkKLSAgICAgICAgRUpCSmFyIG9iakVKQkphciA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVTZXNzaW9uKCk7Ci0gICAgICAgIG9iakVKQkphci5nZXRFbnRlcnByaXNlQmVhbnMoKS5hZGQoc2Vzc2lvbik7Ci0gICAgICAgIAotICAgICAgICBMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJKYXIuZ2V0Q29udGFpbmVyTWFuYWdlZEJlYW5zKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZS5zaXplKCk9PTAsdHJ1ZSk7Ci0gICAgICAgIAotICAgICAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IGVudGl0eSA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVDb250YWluZXJNYW5hZ2VkRW50aXR5KCk7Ci0gICAgICAgIG9iakVKQkphci5nZXRFbnRlcnByaXNlQmVhbnMoKS5hZGQoZW50aXR5KTsKLSAgICAgICAgCi0gICAgICAgIHJldFZhbHVlID0gb2JqRUpCSmFyLmdldENvbnRhaW5lck1hbmFnZWRCZWFucygpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUuc2l6ZSgpPT0xLHRydWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUuZ2V0KDApLGVudGl0eSk7Ci0gICAgfQotICAgIAotICAgCi0gICAgCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEVKQjExQ29udGFpbmVyTWFuYWdlZEJlYW5zKCkgewotCi0gICAgCSAgRUpCSmFyIG9iakVKQkphciA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZVNlc3Npb24oKTsKLSAgICAgICAgICBvYmpFSkJKYXIuZ2V0RW50ZXJwcmlzZUJlYW5zKCkuYWRkKHNlc3Npb24pOwotICAgICAgICAgIAotICAgICAgICAgIExpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICAgIHJldFZhbHVlID0gb2JqRUpCSmFyLmdldEVKQjExQ29udGFpbmVyTWFuYWdlZEJlYW5zKCk7Ci0gICAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLnNpemUoKT09MCx0cnVlKTsKLSAgICAgICAgICAKLSAgICAgICAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IGVudGl0eTEgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpOwotICAgICAgICAgIG9iakVKQkphci5nZXRFbnRlcnByaXNlQmVhbnMoKS5hZGQoZW50aXR5MSk7Ci0gICAgICAgICAgZW50aXR5MS5zZXRWZXJzaW9uKENvbnRhaW5lck1hbmFnZWRFbnRpdHkuVkVSU0lPTl8xX1gpOwotICAgICAgICAgIAotICAgICAgICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgZW50aXR5MiA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVDb250YWluZXJNYW5hZ2VkRW50aXR5KCk7Ci0gICAgICAgICAgb2JqRUpCSmFyLmdldEVudGVycHJpc2VCZWFucygpLmFkZChlbnRpdHkyKTsKLSAgICAgICAgICBlbnRpdHkyLnNldFZlcnNpb24oQ29udGFpbmVyTWFuYWdlZEVudGl0eS5WRVJTSU9OXzJfWCk7Ci0gICAgICAgICAgCi0gICAgICAgICAgCi0gICAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJKYXIuZ2V0RUpCMTFDb250YWluZXJNYW5hZ2VkQmVhbnMoKTsKLSAgICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUuc2l6ZSgpPT0xLHRydWUpOwotICAgICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZS5nZXQoMCksZW50aXR5MSk7Ci0gICAgfQotICAgICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RUpCMjBDb250YWluZXJNYW5hZ2VkQmVhbnMoKSB7Ci0KLSAgCSAgRUpCSmFyIG9iakVKQkphciA9IGdldEluc3RhbmNlKCk7Ci0gICAgICBTZXNzaW9uIHNlc3Npb24gPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlU2Vzc2lvbigpOwotICAgICAgb2JqRUpCSmFyLmdldEVudGVycHJpc2VCZWFucygpLmFkZChzZXNzaW9uKTsKLSAgICAgIAotICAgICAgTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICByZXRWYWx1ZSA9IG9iakVKQkphci5nZXRFSkIyMENvbnRhaW5lck1hbmFnZWRCZWFucygpOwotICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLnNpemUoKT09MCx0cnVlKTsKLSAgICAgIAotICAgICAgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBlbnRpdHkxID0gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZUNvbnRhaW5lck1hbmFnZWRFbnRpdHkoKTsKLSAgICAgIG9iakVKQkphci5nZXRFbnRlcnByaXNlQmVhbnMoKS5hZGQoZW50aXR5MSk7Ci0gICAgICBlbnRpdHkxLnNldFZlcnNpb24oQ29udGFpbmVyTWFuYWdlZEVudGl0eS5WRVJTSU9OXzFfWCk7Ci0gICAgICAKLSAgICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgZW50aXR5MiA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVDb250YWluZXJNYW5hZ2VkRW50aXR5KCk7Ci0gICAgICBvYmpFSkJKYXIuZ2V0RW50ZXJwcmlzZUJlYW5zKCkuYWRkKGVudGl0eTIpOwotICAgICAgZW50aXR5Mi5zZXRWZXJzaW9uKENvbnRhaW5lck1hbmFnZWRFbnRpdHkuVkVSU0lPTl8yX1gpOwotICAgICAgCi0gICAgICAKLSAgICAgIHJldFZhbHVlID0gb2JqRUpCSmFyLmdldEVKQjIwQ29udGFpbmVyTWFuYWdlZEJlYW5zKCk7Ci0gICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUuc2l6ZSgpPT0xLHRydWUpOwotICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLmdldCgwKSxlbnRpdHkyKTsKLSAgICB9Ci0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE1lc3NhZ2VEcml2ZW5CZWFucygpIHsKLSAgICAgICAgRUpCSmFyIG9iakVKQkphciA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVTZXNzaW9uKCk7Ci0gICAgICAgIG9iakVKQkphci5nZXRFbnRlcnByaXNlQmVhbnMoKS5hZGQoc2Vzc2lvbik7Ci0gICAgICAgIAotICAgICAgICBMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJKYXIuZ2V0TWVzc2FnZURyaXZlbkJlYW5zKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZS5zaXplKCk9PTAsdHJ1ZSk7Ci0gICAgICAgIAotICAgICAgICBNZXNzYWdlRHJpdmVuIG1lc3NhZ2VEcml2ZW4gPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlTWVzc2FnZURyaXZlbigpOwotICAgICAgICBvYmpFSkJKYXIuZ2V0RW50ZXJwcmlzZUJlYW5zKCkuYWRkKG1lc3NhZ2VEcml2ZW4pOwotICAgICAgICAKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJKYXIuZ2V0TWVzc2FnZURyaXZlbkJlYW5zKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZS5zaXplKCk9PTEsdHJ1ZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZS5nZXQoMCksbWVzc2FnZURyaXZlbik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRFamJSZWxhdGlvbnMoKSB7Ci0KLSAgICAgICAgRUpCSmFyIG9iakVKQkphciA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFJlbGF0aW9uc2hpcHMgcmVsYXRpb25zaGlwcyA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVSZWxhdGlvbnNoaXBzKCk7Ci0gICAgICAgIG9iakVKQkphci5zZXRSZWxhdGlvbnNoaXBMaXN0KHJlbGF0aW9uc2hpcHMpOwotICAgICAgICByZWxhdGlvbnNoaXBzLnNldEVqYkphcihvYmpFSkJKYXIpOwotICAgICAgICBFTGlzdCBlamJSZWxhdGlvbnMgPSByZWxhdGlvbnNoaXBzLmdldEVqYlJlbGF0aW9ucygpOwotICAgICAgICBMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJKYXIuZ2V0RWpiUmVsYXRpb25zKCk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoZWpiUmVsYXRpb25zLHJldFZhbHVlKTsKLSAgICB9Ci0gICAgCi0KLSAgIAotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRFbnRlcnBpc2VCZWFuRnJvbVJlZigpIHsKLSAgICAJCi0gICAgCUVKQkphciBvYmpFSkJKYXIgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBBc3NlbWJseURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVBc3NlbWJseURlc2NyaXB0b3IoKTsKLSAgICAgICAgb2JqRUpCSmFyLnNldEFzc2VtYmx5RGVzY3JpcHRvcihkZXNjcmlwdG9yKTsKLSAgICAgICAgIAotICAgIAlFamJSZWYgZWpiUmVmID0gQ09NTU9ORkFDVE9SWS5jcmVhdGVFamJSZWYoKTsKLSAgICAJU2Vzc2lvbiBzZXNzaW9uMSA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVTZXNzaW9uKCk7Ci0gICAgCVN0cmluZyBuYW1lMSA9ICJOYW1lMSI7Ci0gICAgCXNlc3Npb24xLnNldE5hbWUobmFtZTEpOwotICAgIAkKLSAgICAJU2Vzc2lvbiBzZXNzaW9uMiA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVTZXNzaW9uKCk7Ci0gICAgCVN0cmluZyBuYW1lMiA9ICJOYW1lMiI7Ci0gICAgCXNlc3Npb24yLnNldE5hbWUobmFtZTIpOwotICAgIAkKLSAgICAJZWpiUmVmLnNldExpbmsobmFtZTIpOwotICAgIAllamJSZWYuc2V0TmFtZSgiRWpiUmVmXyIgKyBuYW1lMik7Ci0gICAgCQotICAgIAlvYmpFSkJKYXIuZ2V0RW50ZXJwcmlzZUJlYW5zKCkuYWRkKHNlc3Npb24xKTsKLSAgICAJb2JqRUpCSmFyLmdldEVudGVycHJpc2VCZWFucygpLmFkZChzZXNzaW9uMik7Ci0gICAgCQotICAgICAgICBFbnRlcnByaXNlQmVhbiByZXRWYWx1ZSA9IG9iakVKQkphci5nZXRFbnRlcnBpc2VCZWFuRnJvbVJlZihlamJSZWYpOwotICAgICAgICBhc3NlcnRFcXVhbHMoc2Vzc2lvbjIscmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RW50ZXJwcmlzZUJlYW5OYW1lZCgpIHsKLQotICAgIAlFSkJKYXIgb2JqRUpCSmFyID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgQXNzZW1ibHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlQXNzZW1ibHlEZXNjcmlwdG9yKCk7Ci0gICAgICAgIG9iakVKQkphci5zZXRBc3NlbWJseURlc2NyaXB0b3IoZGVzY3JpcHRvcik7Ci0gICAgICAgICAKLSAgICAJU2Vzc2lvbiBzZXNzaW9uMSA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVTZXNzaW9uKCk7Ci0gICAgCVN0cmluZyBuYW1lMSA9ICJOYW1lMSI7Ci0gICAgCXNlc3Npb24xLnNldE5hbWUobmFtZTEpOwotICAgIAkKLSAgICAJU2Vzc2lvbiBzZXNzaW9uMiA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVTZXNzaW9uKCk7Ci0gICAgCVN0cmluZyBuYW1lMiA9ICJOYW1lMiI7Ci0gICAgCXNlc3Npb24yLnNldE5hbWUobmFtZTIpOwotICAgIAkKLSAgICAgICAgCQotICAgIAlvYmpFSkJKYXIuZ2V0RW50ZXJwcmlzZUJlYW5zKCkuYWRkKHNlc3Npb24xKTsKLSAgICAJb2JqRUpCSmFyLmdldEVudGVycHJpc2VCZWFucygpLmFkZChzZXNzaW9uMik7Ci0gICAgCQotICAgICAgICBFbnRlcnByaXNlQmVhbiByZXRWYWx1ZSA9IG9iakVKQkphci5nZXRFbnRlcnByaXNlQmVhbk5hbWVkKG5hbWUyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHNlc3Npb24yLHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEVudGVycHJpc2VCZWFuc1dpdGhSZWZlcmVuY2UoKSB7Ci0KLSAgICAJRUpCSmFyIG9iakVKQkphciA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEFzc2VtYmx5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZUFzc2VtYmx5RGVzY3JpcHRvcigpOwotICAgICAgICBvYmpFSkJKYXIuc2V0QXNzZW1ibHlEZXNjcmlwdG9yKGRlc2NyaXB0b3IpOwotICAgICAgICAgCi0gICAgCVNlc3Npb24gc2Vzc2lvbjEgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlU2Vzc2lvbigpOwotICAgIAlTdHJpbmcgbmFtZTEgPSAiTmFtZTEiOwotICAgIAlzZXNzaW9uMS5zZXROYW1lKG5hbWUxKTsKLSAgICAJCi0gICAgCVNlc3Npb24gc2Vzc2lvbjIgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlU2Vzc2lvbigpOwotICAgIAlTdHJpbmcgbmFtZTIgPSAiTmFtZTIiOwotICAgIAlzZXNzaW9uMi5zZXROYW1lKG5hbWUyKTsKLSAgICAJCi0gICAgICAgIAkKLSAgICAJb2JqRUpCSmFyLmdldEVudGVycHJpc2VCZWFucygpLmFkZChzZXNzaW9uMSk7Ci0gICAgCW9iakVKQkphci5nZXRFbnRlcnByaXNlQmVhbnMoKS5hZGQoc2Vzc2lvbjIpOwotICAgIAkKLSAgICAJSmF2YUNsYXNzIGphdmFDbGFzczEgPSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2xhc3NSZWYoImphdmEubGFuZy5TdHJpbmciKSA7Ci0gICAgCUphdmFDbGFzcyBqYXZhQ2xhc3MyID0gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNsYXNzUmVmKCJqYXZhLnV0aWwuTGlzdCIpIDsKLSAgICAJCi0gICAgCXNlc3Npb24xLnNldEVqYkNsYXNzKGphdmFDbGFzczEpOwotICAgIAlzZXNzaW9uMi5zZXRFamJDbGFzcyhqYXZhQ2xhc3MyKTsKLSAgICAJCi0gICAgICAgICBqYXZhLnV0aWwuTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgICByZXRWYWx1ZSA9IG9iakVKQkphci5nZXRFbnRlcnByaXNlQmVhbnNXaXRoUmVmZXJlbmNlKGphdmFDbGFzczEpOwotICAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLnNpemUoKT09MSwgdHJ1ZSk7Ci0gICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUuY29udGFpbnMoc2Vzc2lvbjEpLCB0cnVlKTsKLSAgICAgICAgIAotICAgICAgICAgc2Vzc2lvbjIuc2V0SG9tZUludGVyZmFjZShqYXZhQ2xhc3MxKTsKLSAgICAgICAgIHJldFZhbHVlID0gb2JqRUpCSmFyLmdldEVudGVycHJpc2VCZWFuc1dpdGhSZWZlcmVuY2UoamF2YUNsYXNzMSk7Ci0gICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUuc2l6ZSgpPT0yLCB0cnVlKTsKLSAgICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZS5jb250YWlucyhzZXNzaW9uMSksIHRydWUpOwotICAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLmNvbnRhaW5zKHNlc3Npb24yKSwgdHJ1ZSk7Ci0gICAgICAgICAKLSAgICB9Ci0gICAgCi0gIAotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRFbnRlcnByaXNlQmVhbldpdGhSZWZlcmVuY2UoKSB7Ci0gICAgCQotICAgIAlFSkJKYXIgb2JqRUpCSmFyID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgQXNzZW1ibHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlQXNzZW1ibHlEZXNjcmlwdG9yKCk7Ci0gICAgICAgIG9iakVKQkphci5zZXRBc3NlbWJseURlc2NyaXB0b3IoZGVzY3JpcHRvcik7Ci0gICAgICAgICAKLSAgICAJU2Vzc2lvbiBzZXNzaW9uMSA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVTZXNzaW9uKCk7Ci0gICAgCVN0cmluZyBuYW1lMSA9ICJOYW1lMSI7Ci0gICAgCXNlc3Npb24xLnNldE5hbWUobmFtZTEpOwotICAgIAkKLSAgICAJU2Vzc2lvbiBzZXNzaW9uMiA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVTZXNzaW9uKCk7Ci0gICAgCVN0cmluZyBuYW1lMiA9ICJOYW1lMiI7Ci0gICAgCXNlc3Npb24yLnNldE5hbWUobmFtZTIpOwotICAgIAkKLSAgICAgICAgCQotICAgIAlvYmpFSkJKYXIuZ2V0RW50ZXJwcmlzZUJlYW5zKCkuYWRkKHNlc3Npb24xKTsKLSAgICAJb2JqRUpCSmFyLmdldEVudGVycHJpc2VCZWFucygpLmFkZChzZXNzaW9uMik7Ci0gICAgCQotICAgIAlKYXZhQ2xhc3MgamF2YUNsYXNzMSA9IEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDbGFzc1JlZigiamF2YS5sYW5nLlN0cmluZyIpIDsKLSAgICAJCi0gICAgCXNlc3Npb24xLnNldEVqYkNsYXNzKGphdmFDbGFzczEpOwotICAgIAlzZXNzaW9uMi5zZXRFamJDbGFzcyhqYXZhQ2xhc3MxKTsKLSAgICAJCi0gICAgCUVudGVycHJpc2VCZWFuIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJKYXIuZ2V0RW50ZXJwcmlzZUJlYW5XaXRoUmVmZXJlbmNlKGphdmFDbGFzczEpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsIHNlc3Npb24xKTsKLSAgICAgICAgCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRTZXNzaW9uQmVhbnMoKSB7ICAgICAKLSAgICAgICAgRUpCSmFyIG9iakVKQkphciA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIE1lc3NhZ2VEcml2ZW4gbWVzc2FnZURyaXZlbiA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVNZXNzYWdlRHJpdmVuKCk7Ci0gICAgICAgIG9iakVKQkphci5nZXRFbnRlcnByaXNlQmVhbnMoKS5hZGQobWVzc2FnZURyaXZlbik7Ci0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRUpCSmFyLmdldFNlc3Npb25CZWFucygpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUuc2l6ZSgpPT0wLHRydWUpOwotICAgICAgICAKLSAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZVNlc3Npb24oKTsKLSAgICAgICAgb2JqRUpCSmFyLmdldEVudGVycHJpc2VCZWFucygpLmFkZChzZXNzaW9uKTsKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICByZXRWYWx1ZSA9IG9iakVKQkphci5nZXRTZXNzaW9uQmVhbnMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLnNpemUoKT09MSx0cnVlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLmNvbnRhaW5zKHNlc3Npb24pLCB0cnVlKTsKLSAgICAgICAgCi0gICAgfQotCi0KLSAgIC8qIHB1YmxpYyB2b2lkIHRlc3RfcmVuYW1lU2VjdXJpdHlSb2xlKCkgewotICAgICAgICBFSkJKYXIgb2JqRUpCSmFyID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgamF2YS5sYW5nLlN0cmluZyBleGlzdGluZ1JvbGVOYW1lID0gIiI7Ci0gICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmV3Um9sZU5hbWUgPSAiIjsKLSAgICAgICAgb2JqRUpCSmFyLnJlbmFtZVNlY3VyaXR5Um9sZShleGlzdGluZ1JvbGVOYW1lLCBuZXdSb2xlTmFtZSk7Ci0gICAgfSAqLwotCi0gIC8qIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RWpiQ2xpZW50SmFyKCkgewotCi0gICAgICAgIEVKQkphciBvYmpFSkJKYXIgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgcmV0VmFsdWUgPSAiIjsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJKYXIuZ2V0RWpiQ2xpZW50SmFyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRFamJDbGllbnRKYXIoKSB7Ci0KLSAgICAgICAgRUpCSmFyIG9iakVKQkphciA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBuZXdFamJDbGllbnRKYXIgPSAiIjsKLSAgICAgICAgb2JqRUpCSmFyLnNldEVqYkNsaWVudEphcihuZXdFamJDbGllbnRKYXIpOwotICAgIH0qLwotCi0gIC8qICBwdWJsaWMgdm9pZCB0ZXN0X2dldFZlcnNpb24oKSB7Ci0KLSAgICAgICAgRUpCSmFyIG9iakVKQkphciA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyByZXRWYWx1ZSA9ICIiOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVKQkphci5nZXRWZXJzaW9uKCk7Ci0gICAgfSovCi0gICAgCi0gICAKLSAgICAKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0VmVyc2lvbklEKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAJaW5pdCgpOwotICAgIAlFSkJSZXNvdXJjZSBERCA9IChFSkJSZXNvdXJjZSkgZWpiRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0gICAgICAgIERELnNldFZlcnNpb25JRChKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCk7Ci0JCXNldFZlcnNpb24oVkVSU0lPTl8xXzQpOwotCQlzZXRNb2R1bGVUeXBlKEVKQik7Ci0JCXBvcHVsYXRlUm9vdChERC5nZXRSb290T2JqZWN0KCkpOwotICAgICAgICBpbnQgcmV0VmFsdWUgPSAwOwotICAgICAgICByZXRWYWx1ZSA9IERELmdldEVKQkphcigpLmdldFZlcnNpb25JRCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMV9JRCk7Ci0gICAgICAgIAotICAgICAgICBERC5zZXRWZXJzaW9uSUQoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpOwotCQlzZXRWZXJzaW9uKFZFUlNJT05fMV8zKTsKLQkJcmV0VmFsdWUgPSBERC5nZXRFSkJKYXIoKS5nZXRWZXJzaW9uSUQoKTsKLQkgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzBfSUQpOwotCSAgICAKLQkgICAgREQuc2V0VmVyc2lvbklEKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEKTsKLQkJc2V0VmVyc2lvbihWRVJTSU9OXzFfMik7Ci0JCXJldFZhbHVlID0gREQuZ2V0RUpCSmFyKCkuZ2V0VmVyc2lvbklEKCk7Ci0JICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMV8xX0lEKTsJICAgIAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0SjJFRVZlcnNpb25JRCgpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgCWluaXQoKTsKLSAgICAJRUpCUmVzb3VyY2UgREQgPSAoRUpCUmVzb3VyY2UpIGVqYkZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotICAgICAgICBERC5zZXRWZXJzaW9uSUQoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQpOwotCQlzZXRWZXJzaW9uKFZFUlNJT05fMV80KTsKLQkJc2V0TW9kdWxlVHlwZShFSkIpOwotCQlwb3B1bGF0ZVJvb3QoREQuZ2V0Um9vdE9iamVjdCgpKTsKLSAgICAgICAgaW50IHJldFZhbHVlID0gMDsKLSAgICAgICAgcmV0VmFsdWUgPSBERC5nZXRFSkJKYXIoKS5nZXRKMkVFVmVyc2lvbklEKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCk7Ci0gICAgICAgIAotICAgICAgICBERC5zZXRWZXJzaW9uSUQoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpOwotCQlzZXRWZXJzaW9uKFZFUlNJT05fMV8zKTsKLQkJcmV0VmFsdWUgPSBERC5nZXRFSkJKYXIoKS5nZXRKMkVFVmVyc2lvbklEKCk7Ci0JICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCk7Ci0JICAgIAotCSAgICBERC5zZXRWZXJzaW9uSUQoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQpOwotCQlzZXRWZXJzaW9uKFZFUlNJT05fMV8yKTsKLQkJcmV0VmFsdWUgPSBERC5nZXRFSkJKYXIoKS5nZXRKMkVFVmVyc2lvbklEKCk7Ci0JICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRCk7Ci0gICAgfQotCi0gIC8qICBwdWJsaWMgdm9pZCB0ZXN0X3NldFZlcnNpb24oKSB7Ci0KLSAgICAgICAgRUpCSmFyIG9iakVKQkphciA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBuZXdWZXJzaW9uID0gIiI7Ci0gICAgICAgIG9iakVKQkphci5zZXRWZXJzaW9uKG5ld1ZlcnNpb24pOwotICAgIH0qLwotCi0gIC8qICBwdWJsaWMgdm9pZCB0ZXN0X2dldEFzc2VtYmx5RGVzY3JpcHRvcigpIHsKLQotICAgICAgICBFSkJKYXIgb2JqRUpCSmFyID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgQXNzZW1ibHlEZXNjcmlwdG9yIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJKYXIuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCk7Ci0gICAgfQotCi0gCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldEFzc2VtYmx5RGVzY3JpcHRvcigpIHsKLQotICAgICAgICBFSkJKYXIgb2JqRUpCSmFyID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgQXNzZW1ibHlEZXNjcmlwdG9yIG5ld0Fzc2VtYmx5RGVzY3JpcHRvciA9IG51bGw7Ci0gICAgICAgIG9iakVKQkphci5zZXRBc3NlbWJseURlc2NyaXB0b3IobmV3QXNzZW1ibHlEZXNjcmlwdG9yKTsKLSAgICB9Ki8KLQotICAgLyogcHVibGljIHZvaWQgdGVzdF9nZXRFbnRlcnByaXNlQmVhbnMoKSB7Ci0KLSAgICAgICAgRUpCSmFyIG9iakVKQkphciA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJKYXIuZ2V0RW50ZXJwcmlzZUJlYW5zKCk7Ci0gICAgfSovCi0KLSAgIC8qIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UmVsYXRpb25zaGlwTGlzdCgpIHsKLQotICAgICAgICBFSkJKYXIgb2JqRUpCSmFyID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgUmVsYXRpb25zaGlwcyByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRUpCSmFyLmdldFJlbGF0aW9uc2hpcExpc3QoKTsKLSAgICB9Ci0KLSAKLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0UmVsYXRpb25zaGlwTGlzdCgpIHsKLQotICAgICAgICBFSkJKYXIgb2JqRUpCSmFyID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgUmVsYXRpb25zaGlwcyBuZXdSZWxhdGlvbnNoaXBMaXN0ID0gbnVsbDsKLSAgICAgICAgb2JqRUpCSmFyLnNldFJlbGF0aW9uc2hpcExpc3QobmV3UmVsYXRpb25zaGlwTGlzdCk7Ci0gICAgfQotKi8KLSAgIAotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRFSkJSZWxhdGlvbigpIHsKLSAgICAJIEVKQkphciBvYmpFSkJKYXIgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICAgUmVsYXRpb25zaGlwcyByZWxhdGlvbnNoaXBzID0gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZVJlbGF0aW9uc2hpcHMoKTsKLSAgICAgICAgIG9iakVKQkphci5zZXRSZWxhdGlvbnNoaXBMaXN0KHJlbGF0aW9uc2hpcHMpOwotICAgICAgICAgcmVsYXRpb25zaGlwcy5zZXRFamJKYXIob2JqRUpCSmFyKTsKLSAgICAgICAKLSAgICAgICAgIEVKQlJlbGF0aW9uIHJlbGF0aW9uID0gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZUVKQlJlbGF0aW9uKCk7Ci0gICAgICAgICBTdHJpbmcgYVJlbGF0aW9uTmFtZSA9ICJSZWxhdGlvbjEiOwotICAgICAgICAgcmVsYXRpb24uc2V0TmFtZShhUmVsYXRpb25OYW1lKTsKLSAgICAgICAgIAotICAgICAgICAgcmVsYXRpb25zaGlwcy5nZXRFamJSZWxhdGlvbnMoKS5hZGQocmVsYXRpb24pOwotICAgICAgICAgRUpCUmVsYXRpb24gcmV0VmFsdWUgPSBudWxsOwotICAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJKYXIuZ2V0RUpCUmVsYXRpb24oYVJlbGF0aW9uTmFtZSk7Ci0gICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsIHJlbGF0aW9uKTsKLSAgICB9Ci0gICAgCi0gICAKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RUpCUmVsYXRpb25zRm9yU291cmNlKCkgewotICAgIAkKLSAgICAJRUpCSmFyIG9iakVKQkphciA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFJlbGF0aW9uc2hpcHMgcmVsYXRpb25zaGlwcyA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVSZWxhdGlvbnNoaXBzKCk7Ci0gICAgICAgIG9iakVKQkphci5zZXRSZWxhdGlvbnNoaXBMaXN0KHJlbGF0aW9uc2hpcHMpOwotICAgICAgICByZWxhdGlvbnNoaXBzLnNldEVqYkphcihvYmpFSkJKYXIpOwotICAgICAgCi0gICAgICAgIEVKQlJlbGF0aW9uIHJlbGF0aW9uID0gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZUVKQlJlbGF0aW9uKCk7Ci0gICAgICAgIFN0cmluZyBhUmVsYXRpb25OYW1lID0gIlJlbGF0aW9uMSI7Ci0gICAgICAgIHJlbGF0aW9uLnNldE5hbWUoYVJlbGF0aW9uTmFtZSk7Ci0gICAgICAgIAotICAgICAgICBFSkJSZWxhdGlvbnNoaXBSb2xlIHJvbGUxID0gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZUVKQlJlbGF0aW9uc2hpcFJvbGUoKTsKLSAgICAJRUpCUmVsYXRpb25zaGlwUm9sZSByb2xlMiA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVFSkJSZWxhdGlvbnNoaXBSb2xlKCk7Ci0gICAgICAgCi0gICAgCUxpc3Qgcm9sZUxpc3QgPSByZWxhdGlvbi5nZXRSZWxhdGlvbnNoaXBSb2xlcygpOwotICAgICAgICByb2xlTGlzdC5hZGQocm9sZTEpOwotICAgICAgICByb2xlTGlzdC5hZGQocm9sZTIpOwotICAgICAgICAKLSAgICAgICAgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBlbnRpdHkgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpOwotICAgICAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IHRhcmdldEVudGl0eSA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVDb250YWluZXJNYW5hZ2VkRW50aXR5KCk7Ci0gICAgICAgIAotCSAgICBSb2xlU291cmNlIHJvbGVTb3VyY2UgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlUm9sZVNvdXJjZSgpOwotCSAgICByb2xlU291cmNlLnNldEVudGl0eUJlYW4oZW50aXR5KTsKLQkgICAgcm9sZVNvdXJjZS5zZXRSb2xlKHJvbGUxKTsKLQkgICAgcm9sZTEuc2V0U291cmNlKHJvbGVTb3VyY2UpOwotCSAgICAKLQkgICAgUm9sZVNvdXJjZSB0YXJnZXRSb2xlU291cmNlID0gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZVJvbGVTb3VyY2UoKTsKLQkgICAgdGFyZ2V0Um9sZVNvdXJjZS5zZXRFbnRpdHlCZWFuKHRhcmdldEVudGl0eSk7Ci0JICAgIHRhcmdldFJvbGVTb3VyY2Uuc2V0Um9sZShyb2xlMik7Ci0JICAgIHJvbGUyLnNldFNvdXJjZSh0YXJnZXRSb2xlU291cmNlKTsKLSAgICAgICAgCi0gICAgICAgIExpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVKQkphci5nZXRFSkJSZWxhdGlvbnNGb3JTb3VyY2UoZW50aXR5KTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUuc2l6ZSgpLDEpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUuY29udGFpbnMocmVsYXRpb24pLHRydWUpOwotICAgICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEVKQlJlbGF0aW9uc2hpcFJvbGVzRm9yVHlwZSgpIHsKLQotICAgIAlFSkJKYXIgb2JqRUpCSmFyID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgUmVsYXRpb25zaGlwcyByZWxhdGlvbnNoaXBzID0gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZVJlbGF0aW9uc2hpcHMoKTsKLSAgICAgICAgb2JqRUpCSmFyLnNldFJlbGF0aW9uc2hpcExpc3QocmVsYXRpb25zaGlwcyk7Ci0gICAgICAgIHJlbGF0aW9uc2hpcHMuc2V0RWpiSmFyKG9iakVKQkphcik7Ci0gICAgICAKLSAgICAgICAgRUpCUmVsYXRpb24gcmVsYXRpb24gPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlRUpCUmVsYXRpb24oKTsKLSAgICAgICAgU3RyaW5nIGFSZWxhdGlvbk5hbWUgPSAiUmVsYXRpb24xIjsKLSAgICAgICAgcmVsYXRpb24uc2V0TmFtZShhUmVsYXRpb25OYW1lKTsKLSAgICAgICAgCi0gICAgICAgIEVKQlJlbGF0aW9uc2hpcFJvbGUgcm9sZTEgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlRUpCUmVsYXRpb25zaGlwUm9sZSgpOwotICAgIAlFSkJSZWxhdGlvbnNoaXBSb2xlIHJvbGUyID0gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZUVKQlJlbGF0aW9uc2hpcFJvbGUoKTsKLSAgICAgICAKLSAgICAJTGlzdCByb2xlTGlzdCA9IHJlbGF0aW9uLmdldFJlbGF0aW9uc2hpcFJvbGVzKCk7Ci0gICAgICAgIHJvbGVMaXN0LmFkZChyb2xlMSk7Ci0gICAgICAgIHJvbGVMaXN0LmFkZChyb2xlMik7Ci0gICAgICAgIAotICAgICAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IGVudGl0eSA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVDb250YWluZXJNYW5hZ2VkRW50aXR5KCk7Ci0gICAgICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgdGFyZ2V0RW50aXR5ID0gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZUNvbnRhaW5lck1hbmFnZWRFbnRpdHkoKTsKLSAgICAgICAgCi0JICAgIFJvbGVTb3VyY2Ugcm9sZVNvdXJjZSA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVSb2xlU291cmNlKCk7Ci0JICAgIHJvbGVTb3VyY2Uuc2V0RW50aXR5QmVhbihlbnRpdHkpOwotCSAgICByb2xlU291cmNlLnNldFJvbGUocm9sZTEpOwotCSAgICByb2xlMS5zZXRTb3VyY2Uocm9sZVNvdXJjZSk7Ci0JICAgIAotCSAgICBSb2xlU291cmNlIHRhcmdldFJvbGVTb3VyY2UgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlUm9sZVNvdXJjZSgpOwotCSAgICB0YXJnZXRSb2xlU291cmNlLnNldEVudGl0eUJlYW4odGFyZ2V0RW50aXR5KTsKLQkgICAgdGFyZ2V0Um9sZVNvdXJjZS5zZXRSb2xlKHJvbGUyKTsKLQkgICAgcm9sZTIuc2V0U291cmNlKHRhcmdldFJvbGVTb3VyY2UpOwotICAgICAgICAKLSAgICAgICAgTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRUpCSmFyLmdldEVKQlJlbGF0aW9uc2hpcFJvbGVzRm9yVHlwZSh0YXJnZXRFbnRpdHkpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZS5zaXplKCksMSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZS5jb250YWlucyhyZWxhdGlvbiksdHJ1ZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgRUpCSmFyVGVzdCgidGVzdF9FSkJKYXIiKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEVKQkphclRlc3QoInRlc3RfY29udGFpbnNDb250YWluZXJNYW5hZ2VkQmVhbnMiKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEVKQkphclRlc3QoInRlc3RfY29udGFpbnNTZWN1cml0eVJvbGUiKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEVKQkphclRlc3QoInRlc3RfZ2V0QmVhbk1hbmFnZWRCZWFucyIpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgRUpCSmFyVGVzdCgidGVzdF9nZXRDb250YWluZXJNYW5hZ2VkQmVhbnMiKSk7Ci0JCQotCQlzdWl0ZS5hZGRUZXN0KG5ldyBFSkJKYXJUZXN0KCJ0ZXN0X2dldEVKQjExQ29udGFpbmVyTWFuYWdlZEJlYW5zIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBFSkJKYXJUZXN0KCJ0ZXN0X2dldEVKQjIwQ29udGFpbmVyTWFuYWdlZEJlYW5zIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBFSkJKYXJUZXN0KCJ0ZXN0X2dldE1lc3NhZ2VEcml2ZW5CZWFucyIpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgRUpCSmFyVGVzdCgidGVzdF9nZXRFamJSZWxhdGlvbnMiKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEVKQkphclRlc3QoInRlc3RfZ2V0RW50ZXJwaXNlQmVhbkZyb21SZWYiKSk7Ci0JCQotCQlzdWl0ZS5hZGRUZXN0KG5ldyBFSkJKYXJUZXN0KCJ0ZXN0X2dldEVudGVycHJpc2VCZWFuTmFtZWQiKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEVKQkphclRlc3QoInRlc3RfZ2V0RW50ZXJwcmlzZUJlYW5zV2l0aFJlZmVyZW5jZSIpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgRUpCSmFyVGVzdCgidGVzdF9nZXRFbnRlcnByaXNlQmVhbldpdGhSZWZlcmVuY2UiKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEVKQkphclRlc3QoInRlc3RfZ2V0U2Vzc2lvbkJlYW5zIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBFSkJKYXJUZXN0KCJ0ZXN0X2dldFZlcnNpb25JRCIpKTsKLQkJCi0JCXN1aXRlLmFkZFRlc3QobmV3IEVKQkphclRlc3QoInRlc3RfZ2V0SjJFRVZlcnNpb25JRCIpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgRUpCSmFyVGVzdCgidGVzdF9nZXRFSkJSZWxhdGlvbiIpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgRUpCSmFyVGVzdCgidGVzdF9nZXRFSkJSZWxhdGlvbnNGb3JTb3VyY2UiKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEVKQkphclRlc3QoInRlc3RfZ2V0RUpCUmVsYXRpb25zaGlwUm9sZXNGb3JUeXBlIikpOwotCQkKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3Rlc3QvRUpCUmVsYXRpb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9FSkJSZWxhdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVjY2VjNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9FSkJSZWxhdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi50ZXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVsYXRpb25zaGlwUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLQotcHVibGljIGNsYXNzIEVKQlJlbGF0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXByaXZhdGUgRWpiRmFjdG9yeSBFSkJGQUNUT1JZID0gRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RWpiRmFjdG9yeSgpOwotCXByaXZhdGUgRUpCUmVsYXRpb24gZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFSkJSZWxhdGlvbigpOwotCX0KLQkgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShFSkJSZWxhdGlvblRlc3QuY2xhc3MpOwotCX0KLQkgCi0gICAgcHVibGljIHZvaWQgdGVzdF9FSkJSZWxhdGlvbigpIHsKLQotICAgICAgICBFSkJSZWxhdGlvbiB0bXBFSkJSZWxhdGlvbiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwodG1wRUpCUmVsYXRpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY29udGFpbnNSZWxhdGlvbnNoaXBSb2xlKCkgewotICAgIAlFSkJSZWxhdGlvbnNoaXBSb2xlIHJvbGUxID0gRUpCRkFDVE9SWS5jcmVhdGVFSkJSZWxhdGlvbnNoaXBSb2xlKCk7Ci0gICAgCUVKQlJlbGF0aW9uc2hpcFJvbGUgcm9sZTIgPSBFSkJGQUNUT1JZLmNyZWF0ZUVKQlJlbGF0aW9uc2hpcFJvbGUoKTsKLSAgICAgICAgRUpCUmVsYXRpb24gb2JqRUpCUmVsYXRpb24gPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRUpCUmVsYXRpb24uY29udGFpbnNSZWxhdGlvbnNoaXBSb2xlKHJvbGUxKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLHJldFZhbHVlKTsKLSAgICAgICAgTGlzdCByb2xlTGlzdCA9IG9iakVKQlJlbGF0aW9uLmdldFJlbGF0aW9uc2hpcFJvbGVzKCk7Ci0gICAgICAgIHJvbGVMaXN0LmFkZChyb2xlMSk7Ci0gICAgICAgIHJvbGVMaXN0LmFkZChyb2xlMik7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRUpCUmVsYXRpb24uY29udGFpbnNSZWxhdGlvbnNoaXBSb2xlKHJvbGUxKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUscmV0VmFsdWUpOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRGaXJzdFJvbGUoKSB7Ci0gICAgCUVKQlJlbGF0aW9uc2hpcFJvbGUgcm9sZTEgPSBFSkJGQUNUT1JZLmNyZWF0ZUVKQlJlbGF0aW9uc2hpcFJvbGUoKTsKLSAgICAJRUpCUmVsYXRpb25zaGlwUm9sZSByb2xlMiA9IEVKQkZBQ1RPUlkuY3JlYXRlRUpCUmVsYXRpb25zaGlwUm9sZSgpOwotICAgICAgICBFSkJSZWxhdGlvbiBvYmpFSkJSZWxhdGlvbiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIExpc3Qgcm9sZUxpc3QgPSBvYmpFSkJSZWxhdGlvbi5nZXRSZWxhdGlvbnNoaXBSb2xlcygpOwotICAgICAgICByb2xlTGlzdC5hZGQocm9sZTEpOwotICAgICAgICByb2xlTGlzdC5hZGQocm9sZTIpOwotICAgICAgICBFSkJSZWxhdGlvbnNoaXBSb2xlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJSZWxhdGlvbi5nZXRGaXJzdFJvbGUoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJvbGUxLHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE9wcG9zaXRlUm9sZSgpIHsKLSAgICAJCi0gICAgCUVKQlJlbGF0aW9uc2hpcFJvbGUgcm9sZTEgPSBFSkJGQUNUT1JZLmNyZWF0ZUVKQlJlbGF0aW9uc2hpcFJvbGUoKTsKLSAgICAJRUpCUmVsYXRpb25zaGlwUm9sZSByb2xlMiA9IEVKQkZBQ1RPUlkuY3JlYXRlRUpCUmVsYXRpb25zaGlwUm9sZSgpOwotICAgICAgICBFSkJSZWxhdGlvbiBvYmpFSkJSZWxhdGlvbiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVKQlJlbGF0aW9uc2hpcFJvbGUgb3BwUm9sZSA9IG9iakVKQlJlbGF0aW9uLmdldE9wcG9zaXRlUm9sZShyb2xlMSk7Ci0gICAgICAgIGFzc2VydE51bGwob3BwUm9sZSk7Ci0gICAgICAgIAotICAgICAgICBMaXN0IHJvbGVMaXN0ID0gb2JqRUpCUmVsYXRpb24uZ2V0UmVsYXRpb25zaGlwUm9sZXMoKTsKLSAgICAgICAgcm9sZUxpc3QuYWRkKHJvbGUxKTsKLSAgICAgICAgcm9sZUxpc3QuYWRkKHJvbGUyKTsKLSAgICAgICAgCi0gICAgICAgIG9wcFJvbGUgPSBvYmpFSkJSZWxhdGlvbi5nZXRPcHBvc2l0ZVJvbGUocm9sZTEpOwotICAgICAgICBhc3NlcnRFcXVhbHMocm9sZTIsb3BwUm9sZSk7Ci0gICAgICAgIAotICAgICAgICBvcHBSb2xlID0gb2JqRUpCUmVsYXRpb24uZ2V0T3Bwb3NpdGVSb2xlKHJvbGUyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJvbGUxLG9wcFJvbGUpOwotICAgIH0KLQotICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFNlY29uZFJvbGUoKSB7Ci0KLSAgICAJRUpCUmVsYXRpb25zaGlwUm9sZSByb2xlMSA9IEVKQkZBQ1RPUlkuY3JlYXRlRUpCUmVsYXRpb25zaGlwUm9sZSgpOwotICAgIAlFSkJSZWxhdGlvbnNoaXBSb2xlIHJvbGUyID0gRUpCRkFDVE9SWS5jcmVhdGVFSkJSZWxhdGlvbnNoaXBSb2xlKCk7Ci0gICAgICAgIEVKQlJlbGF0aW9uIG9iakVKQlJlbGF0aW9uID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgTGlzdCByb2xlTGlzdCA9IG9iakVKQlJlbGF0aW9uLmdldFJlbGF0aW9uc2hpcFJvbGVzKCk7Ci0gICAgICAgIHJvbGVMaXN0LmFkZChyb2xlMSk7Ci0gICAgICAgIHJvbGVMaXN0LmFkZChyb2xlMik7Ci0gICAgICAgIEVKQlJlbGF0aW9uc2hpcFJvbGUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVKQlJlbGF0aW9uLmdldFNlY29uZFJvbGUoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJvbGUyLHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldEZvd2FyZCgpIHsKLQotICAgIAlFSkJSZWxhdGlvbnNoaXBSb2xlIHJvbGUxID0gRUpCRkFDVE9SWS5jcmVhdGVFSkJSZWxhdGlvbnNoaXBSb2xlKCk7Ci0gICAgCUVKQlJlbGF0aW9uc2hpcFJvbGUgcm9sZTIgPSBFSkJGQUNUT1JZLmNyZWF0ZUVKQlJlbGF0aW9uc2hpcFJvbGUoKTsKLSAgICAgICAgRUpCUmVsYXRpb24gb2JqRUpCUmVsYXRpb24gPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBMaXN0IHJvbGVMaXN0ID0gb2JqRUpCUmVsYXRpb24uZ2V0UmVsYXRpb25zaGlwUm9sZXMoKTsKLSAgICAgICAgcm9sZUxpc3QuYWRkKHJvbGUxKTsKLSAgICAgICAgcm9sZUxpc3QuYWRkKHJvbGUyKTsKLSAgICAgICAgCi0gICAgICAgIG9iakVKQlJlbGF0aW9uLnNldEZvd2FyZChyb2xlMik7Ci0gICAgICAgIEVKQlJlbGF0aW9uc2hpcFJvbGUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVKQlJlbGF0aW9uLmdldEZpcnN0Um9sZSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMocm9sZTIscmV0VmFsdWUpOwotICAgIH0KLQotICAvKiAgcHVibGljIHZvaWQgdGVzdF9nZXREZXNjcmlwdGlvbigpIHsKLQotICAgICAgICBFSkJSZWxhdGlvbiBvYmpFSkJSZWxhdGlvbiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyByZXRWYWx1ZSA9ICIiOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVKQlJlbGF0aW9uLmdldERlc2NyaXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXREZXNjcmlwdGlvbigpIHsKLQotICAgICAgICBFSkJSZWxhdGlvbiBvYmpFSkJSZWxhdGlvbiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBuZXdEZXNjcmlwdGlvbiA9ICIiOwotICAgICAgICBvYmpFSkJSZWxhdGlvbi5zZXREZXNjcmlwdGlvbihuZXdEZXNjcmlwdGlvbik7Ci0gICAgfSovCi0KLSAgLyogcHVibGljIHZvaWQgdGVzdF9nZXROYW1lKCkgewotCi0gICAgICAgIEVKQlJlbGF0aW9uIG9iakVKQlJlbGF0aW9uID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIHJldFZhbHVlID0gIiI7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRUpCUmVsYXRpb24uZ2V0TmFtZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0TmFtZSgpIHsKLQotICAgICAgICBFSkJSZWxhdGlvbiBvYmpFSkJSZWxhdGlvbiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBuZXdOYW1lID0gIiI7Ci0gICAgICAgIG9iakVKQlJlbGF0aW9uLnNldE5hbWUobmV3TmFtZSk7Ci0gICAgfSovCi0KLSAgIC8qIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UmVsYXRpb25zaGlwTGlzdCgpIHsKLQotICAgICAgICBFSkJSZWxhdGlvbiBvYmpFSkJSZWxhdGlvbiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFJlbGF0aW9uc2hpcHMgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVKQlJlbGF0aW9uLmdldFJlbGF0aW9uc2hpcExpc3QoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFJlbGF0aW9uc2hpcExpc3QoKSB7Ci0KLSAgICAgICAgRUpCUmVsYXRpb24gb2JqRUpCUmVsYXRpb24gPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBSZWxhdGlvbnNoaXBzIG5ld1JlbGF0aW9uc2hpcExpc3QgPSBudWxsOwotICAgICAgICBvYmpFSkJSZWxhdGlvbi5zZXRSZWxhdGlvbnNoaXBMaXN0KG5ld1JlbGF0aW9uc2hpcExpc3QpOwotICAgIH0KLQotIAotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RGVzY3JpcHRpb25zKCkgewotCi0gICAgICAgIEVKQlJlbGF0aW9uIG9iakVKQlJlbGF0aW9uID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRUxpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVKQlJlbGF0aW9uLmdldERlc2NyaXB0aW9ucygpOwotICAgIH0qLwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3Rlc3QvRUpCUmVsYXRpb25zaGlwUm9sZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L0VKQlJlbGF0aW9uc2hpcFJvbGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMmMwNTguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3Rlc3QvRUpCUmVsYXRpb25zaGlwUm9sZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi50ZXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5DTVJGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlbGF0aW9uc2hpcFJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk11bHRpcGxpY2l0eUtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlJvbGVTb3VyY2U7Ci0KLXB1YmxpYyBjbGFzcyBFSkJSZWxhdGlvbnNoaXBSb2xlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXByaXZhdGUgRWpiRmFjdG9yeSBFSkJGQUNUT1JZID0gRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RWpiRmFjdG9yeSgpOwotCUVKQlJlbGF0aW9uc2hpcFJvbGUgcm9sZTEgPSBudWxsLCByb2xlMiA9IG51bGw7Ci0JQ29udGFpbmVyTWFuYWdlZEVudGl0eSBlbnRpdHkgPSBudWxsOwotCUVKQlJlbGF0aW9uIGVqYlJlbGF0aW9uID0gbnVsbCA7Ci0JCi0JIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoRUpCUmVsYXRpb25zaGlwUm9sZVRlc3QuY2xhc3MpOwotCX0KLQkgCi0JcHJpdmF0ZSBFSkJSZWxhdGlvbnNoaXBSb2xlIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gRUpCRkFDVE9SWS5jcmVhdGVFSkJSZWxhdGlvbnNoaXBSb2xlKCk7Ci0JfQotCQotICAgIHB1YmxpYyB2b2lkIHRlc3RfRUpCUmVsYXRpb25zaGlwUm9sZSgpIHsKLQotICAgICAgICBFSkJSZWxhdGlvbnNoaXBSb2xlIHRtcEVKQlJlbGF0aW9uc2hpcFJvbGUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHRtcEVKQlJlbGF0aW9uc2hpcFJvbGUpOwotICAgIH0KLQotICAgcHVibGljIHZvaWQgdGVzdF9nZXRMb2dpY2FsTmFtZSgpIHsKLQotICAgICAgIC8qIEVKQlJlbGF0aW9uc2hpcFJvbGUgb2JqRUpCUmVsYXRpb25zaGlwUm9sZSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyByZXRWYWx1ZSA9ICIiOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVKQlJlbGF0aW9uc2hpcFJvbGUuZ2V0TG9naWNhbE5hbWUoKTsqLwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TmFtZSgpIHsKLQotICAgICAgICBFSkJSZWxhdGlvbnNoaXBSb2xlIG9iakVKQlJlbGF0aW9uc2hpcFJvbGUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgbmFtZSA9ICJyb2xlMSI7Ci0gICAgICAgIG9iakVKQlJlbGF0aW9uc2hpcFJvbGUuc2V0TmFtZShuYW1lKTsKLSAgICAgICAgU3RyaW5nIHJldFZhbHVlID0gIiI7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRUpCUmVsYXRpb25zaGlwUm9sZS5nZXROYW1lKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhuYW1lLHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE9wcG9zaXRlKCkgewotICAgIAlpbml0KCk7Ci0gICAgICAgIEVKQlJlbGF0aW9uc2hpcFJvbGUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IHJvbGUxLmdldE9wcG9zaXRlKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxyb2xlMik7Ci0gICAgICAgIHJldFZhbHVlID0gcm9sZTIuZ2V0T3Bwb3NpdGUoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLHJvbGUxKTsKLSAgICB9Ci0KLSAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0U291cmNlRW50aXR5KCkgewotCSAgICBpbml0KCk7Ci0JICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgcmV0VmFsdWUgPSByb2xlMS5nZXRTb3VyY2VFbnRpdHkoKTsKLQkgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLGVudGl0eSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9pc0ZvcndhcmQoKSB7Ci0gICAgICAgCWluaXQoKTsKLQkgICAgYm9vbGVhbiByZXRWYWx1ZSA9IHJvbGUyLmlzRm9yd2FyZCgpOwotCSAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsZmFsc2UpOwotCSAgICByb2xlMi5zZXRGb3dhcmQoKTsKLQkgICAgcmV0VmFsdWUgPSByb2xlMi5pc0ZvcndhcmQoKTsKLQkgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLHRydWUpOwotCSAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzS2V5KCkgewotICAgIAlpbml0KCk7Ci0JICAgIGJvb2xlYW4gcmV0VmFsdWUgPSByb2xlMi5pc0tleSgpOwotCSAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsZmFsc2UpOwotCSAgICByb2xlMi5zZXRLZXkodHJ1ZSk7Ci0JICAgIHJldFZhbHVlID0gcm9sZTIuaXNLZXkoKTsKLQkgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0S2V5KCkgewotCi0gICAgCWluaXQoKTsKLQkgICAgYm9vbGVhbiByZXRWYWx1ZSA9IHJvbGUyLmlzS2V5KCk7Ci0JICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxmYWxzZSk7Ci0JICAgIHJvbGUyLnNldEtleSh0cnVlKTsKLQkgICAgcmV0VmFsdWUgPSByb2xlMi5pc0tleSgpOwotCSAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsdHJ1ZSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBpbml0KCkgewotICAgIAlyb2xlMSA9IEVKQkZBQ1RPUlkuY3JlYXRlRUpCUmVsYXRpb25zaGlwUm9sZSgpOwotCQlyb2xlMiA9IEVKQkZBQ1RPUlkuY3JlYXRlRUpCUmVsYXRpb25zaGlwUm9sZSgpOwotCSAgICBlamJSZWxhdGlvbiA9IEVKQkZBQ1RPUlkuY3JlYXRlRUpCUmVsYXRpb24oKTsKLQkgICAgZW50aXR5ID0gRUpCRkFDVE9SWS5jcmVhdGVDb250YWluZXJNYW5hZ2VkRW50aXR5KCk7Ci0JICAgIFJvbGVTb3VyY2Ugcm9sZVNvdXJjZSA9IEVKQkZBQ1RPUlkuY3JlYXRlUm9sZVNvdXJjZSgpOwotCSAgICByb2xlU291cmNlLnNldEVudGl0eUJlYW4oZW50aXR5KTsKLQkgICAgcm9sZVNvdXJjZS5zZXRSb2xlKHJvbGUxKTsKLQkgICAgcm9sZTEuc2V0U291cmNlKHJvbGVTb3VyY2UpOwotCSAgICBMaXN0IHJvbGVMaXN0ID0gZWpiUmVsYXRpb24uZ2V0UmVsYXRpb25zaGlwUm9sZXMoKTsKLQkgICAgcm9sZUxpc3QuYWRkKHJvbGUxKTsKLQkgICAgcm9sZUxpc3QuYWRkKHJvbGUyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzTWFueSgpIHsKLSAgICAJaW5pdCgpOwotCSAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7Ci0JICAgIHJldFZhbHVlID0gcm9sZTEuaXNNYW55KCk7Ci0JICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxmYWxzZSkgOwotCSAgICByb2xlMi5zZXRNdWx0aXBsaWNpdHkoTXVsdGlwbGljaXR5S2luZC5NQU5ZX0xJVEVSQUwpOwotCSAgICByZXRWYWx1ZSA9IHJvbGUxLmlzTWFueSgpOwotCSAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsdHJ1ZSkgOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNOYXZpZ2FibGUoKSB7Ci0gICAgCWluaXQoKTsKLSAgICAJYm9vbGVhbiByZXRWYWx1ZSA9IHJvbGUxLmlzTmF2aWdhYmxlKCk7Ci0gICAgCWFzc2VydEVxdWFscyhyZXRWYWx1ZSxmYWxzZSk7Ci0gICAgCUNNUkZpZWxkIGNtckZpZWxkID0gRUpCRkFDVE9SWS5jcmVhdGVDTVJGaWVsZCgpOwotICAgIAlyb2xlMS5zZXRDbXJGaWVsZChjbXJGaWVsZCk7Ci0gICAgCXJldFZhbHVlID0gcm9sZTEuaXNOYXZpZ2FibGUoKTsKLSAgICAJYXNzZXJ0RXF1YWxzKHJldFZhbHVlLHRydWUpOwotICAgIH0KLQotICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldEZvd2FyZCgpIHsKLSAgICAJaW5pdCgpOwotCSAgICBib29sZWFuIHJldFZhbHVlID0gcm9sZTIuaXNGb3J3YXJkKCk7Ci0JICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxmYWxzZSk7Ci0JICAgIHJvbGUyLnNldEZvd2FyZCgpOwotCSAgICByZXRWYWx1ZSA9IHJvbGUyLmlzRm9yd2FyZCgpOwotCSAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXROYW1lKCkgewotCi0gICAgCSBFSkJSZWxhdGlvbnNoaXBSb2xlIG9iakVKQlJlbGF0aW9uc2hpcFJvbGUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICAgU3RyaW5nIG5hbWUgPSAicm9sZTEiOwotICAgICAgICAgb2JqRUpCUmVsYXRpb25zaGlwUm9sZS5zZXROYW1lKG5hbWUpOwotICAgICAgICAgU3RyaW5nIHJldFZhbHVlID0gIiI7Ci0gICAgICAgICByZXRWYWx1ZSA9IG9iakVKQlJlbGF0aW9uc2hpcFJvbGUuZ2V0TmFtZSgpOwotICAgICAgICAgYXNzZXJ0RXF1YWxzKG5hbWUscmV0VmFsdWUpOwotICAgIH0KLQotICAvKiBwdWJsaWMgdm9pZCB0ZXN0X2dldERlc2NyaXB0aW9uKCkgewotCi0gICAgICAgIEVKQlJlbGF0aW9uc2hpcFJvbGUgb2JqRUpCUmVsYXRpb25zaGlwUm9sZSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyByZXRWYWx1ZSA9ICIiOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVKQlJlbGF0aW9uc2hpcFJvbGUuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldERlc2NyaXB0aW9uKCkgewotCi0gICAgICAgIEVKQlJlbGF0aW9uc2hpcFJvbGUgb2JqRUpCUmVsYXRpb25zaGlwUm9sZSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBuZXdEZXNjcmlwdGlvbiA9ICIiOwotICAgICAgICBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlLnNldERlc2NyaXB0aW9uKG5ld0Rlc2NyaXB0aW9uKTsKLSAgICB9Ki8KLQotICAgLyogcHVibGljIHZvaWQgdGVzdF9nZXRSb2xlTmFtZSgpIHsKLQotICAgICAgICBFSkJSZWxhdGlvbnNoaXBSb2xlIG9iakVKQlJlbGF0aW9uc2hpcFJvbGUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgcmV0VmFsdWUgPSAiIjsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlLmdldFJvbGVOYW1lKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRSb2xlTmFtZSgpIHsKLQotICAgICAgICBFSkJSZWxhdGlvbnNoaXBSb2xlIG9iakVKQlJlbGF0aW9uc2hpcFJvbGUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgbmV3Um9sZU5hbWUgPSAiIjsKLSAgICAgICAgb2JqRUpCUmVsYXRpb25zaGlwUm9sZS5zZXRSb2xlTmFtZShuZXdSb2xlTmFtZSk7Ci0gICAgfSovCi0KLSAgLyogIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TXVsdGlwbGljaXR5KCkgewotCi0gICAgICAgIEVKQlJlbGF0aW9uc2hpcFJvbGUgb2JqRUpCUmVsYXRpb25zaGlwUm9sZSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIE11bHRpcGxpY2l0eUtpbmQgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVKQlJlbGF0aW9uc2hpcFJvbGUuZ2V0TXVsdGlwbGljaXR5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRNdWx0aXBsaWNpdHkoKSB7Ci0KLSAgICAgICAgRUpCUmVsYXRpb25zaGlwUm9sZSBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgTXVsdGlwbGljaXR5S2luZCBuZXdNdWx0aXBsaWNpdHkgPSBudWxsOwotICAgICAgICBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlLnNldE11bHRpcGxpY2l0eShuZXdNdWx0aXBsaWNpdHkpOwotICAgIH0qLwotCi0gICAvKiBwdWJsaWMgdm9pZCB0ZXN0X3Vuc2V0TXVsdGlwbGljaXR5KCkgewotCi0gICAgICAgIEVKQlJlbGF0aW9uc2hpcFJvbGUgb2JqRUpCUmVsYXRpb25zaGlwUm9sZSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIG9iakVKQlJlbGF0aW9uc2hpcFJvbGUudW5zZXRNdWx0aXBsaWNpdHkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzU2V0TXVsdGlwbGljaXR5KCkgewotCi0gICAgICAgIEVKQlJlbGF0aW9uc2hpcFJvbGUgb2JqRUpCUmVsYXRpb25zaGlwUm9sZSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlLmlzU2V0TXVsdGlwbGljaXR5KCk7Ci0gICAgfSovCi0KLSAgIC8qIHB1YmxpYyB2b2lkIHRlc3RfaXNDYXNjYWRlRGVsZXRlKCkgewotCi0gICAgICAgIEVKQlJlbGF0aW9uc2hpcFJvbGUgb2JqRUpCUmVsYXRpb25zaGlwUm9sZSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlLmlzQ2FzY2FkZURlbGV0ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0Q2FzY2FkZURlbGV0ZSgpIHsKLQotICAgICAgICBFSkJSZWxhdGlvbnNoaXBSb2xlIG9iakVKQlJlbGF0aW9uc2hpcFJvbGUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBib29sZWFuIG5ld0Nhc2NhZGVEZWxldGUgPSBmYWxzZTsKLSAgICAgICAgb2JqRUpCUmVsYXRpb25zaGlwUm9sZS5zZXRDYXNjYWRlRGVsZXRlKG5ld0Nhc2NhZGVEZWxldGUpOwotICAgIH0qLwotCi0gLyogICBwdWJsaWMgdm9pZCB0ZXN0X3Vuc2V0Q2FzY2FkZURlbGV0ZSgpIHsKLQotICAgICAgICBFSkJSZWxhdGlvbnNoaXBSb2xlIG9iakVKQlJlbGF0aW9uc2hpcFJvbGUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlLnVuc2V0Q2FzY2FkZURlbGV0ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNTZXRDYXNjYWRlRGVsZXRlKCkgewotCi0gICAgICAgIEVKQlJlbGF0aW9uc2hpcFJvbGUgb2JqRUpCUmVsYXRpb25zaGlwUm9sZSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlLmlzU2V0Q2FzY2FkZURlbGV0ZSgpOwotICAgIH0qLwotCi0gICAgLyogcHVibGljIHZvaWQgdGVzdF9nZXRSZWxhdGlvbnNoaXAoKSB7Ci0KLSAgICAgICAgRUpCUmVsYXRpb25zaGlwUm9sZSBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRUpCUmVsYXRpb24gcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVKQlJlbGF0aW9uc2hpcFJvbGUuZ2V0UmVsYXRpb25zaGlwKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRSZWxhdGlvbnNoaXAoKSB7Ci0KLSAgICAgICAgRUpCUmVsYXRpb25zaGlwUm9sZSBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRUpCUmVsYXRpb24gbmV3Q29udGFpbmVyID0gbnVsbDsKLSAgICAgICAgb2JqRUpCUmVsYXRpb25zaGlwUm9sZS5zZXRSZWxhdGlvbnNoaXAobmV3Q29udGFpbmVyKTsKLSAgICB9Ki8KLQotICAgLypwdWJsaWMgdm9pZCB0ZXN0X2dldFNvdXJjZSgpIHsKLQotICAgICAgICBFSkJSZWxhdGlvbnNoaXBSb2xlIG9iakVKQlJlbGF0aW9uc2hpcFJvbGUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBSb2xlU291cmNlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlLmdldFNvdXJjZSgpOwotICAgIH0KLQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0U291cmNlKCkgewotCi0gICAgICAgIEVKQlJlbGF0aW9uc2hpcFJvbGUgb2JqRUpCUmVsYXRpb25zaGlwUm9sZSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFJvbGVTb3VyY2UgbmV3U291cmNlID0gbnVsbDsKLSAgICAgICAgb2JqRUpCUmVsYXRpb25zaGlwUm9sZS5zZXRTb3VyY2UobmV3U291cmNlKTsKLSAgICB9Ki8KLQotICAgLyogcHVibGljIHZvaWQgdGVzdF9nZXRDbXJGaWVsZCgpIHsKLQotICAgICAgICBFSkJSZWxhdGlvbnNoaXBSb2xlIG9iakVKQlJlbGF0aW9uc2hpcFJvbGUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBDTVJGaWVsZCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRUpCUmVsYXRpb25zaGlwUm9sZS5nZXRDbXJGaWVsZCgpOwotICAgIH0KLQotICAgCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRDbXJGaWVsZCgpIHsKLQotICAgICAgICBFSkJSZWxhdGlvbnNoaXBSb2xlIG9iakVKQlJlbGF0aW9uc2hpcFJvbGUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBDTVJGaWVsZCBuZXdDbXJGaWVsZCA9IG51bGw7Ci0gICAgICAgIG9iakVKQlJlbGF0aW9uc2hpcFJvbGUuc2V0Q21yRmllbGQobmV3Q21yRmllbGQpOwotICAgIH0qLwotCi0gICAvKiBwdWJsaWMgdm9pZCB0ZXN0X2dldERlc2NyaXB0aW9ucygpIHsKLQotICAgICAgICBFSkJSZWxhdGlvbnNoaXBSb2xlIG9iakVKQlJlbGF0aW9uc2hpcFJvbGUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBFTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRUpCUmVsYXRpb25zaGlwUm9sZS5nZXREZXNjcmlwdGlvbnMoKTsKLSAgICB9Ki8KLQotICAgCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRSZXF1aXJlZCgpIHsKLQotICAgICAgICBFSkJSZWxhdGlvbnNoaXBSb2xlIG9iakVKQlJlbGF0aW9uc2hpcFJvbGUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBCb29sZWFuIGlzUmVxdWlyZWQgPSBCb29sZWFuLkZBTFNFOwotICAgICAgICBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlLnNldFJlcXVpcmVkKGlzUmVxdWlyZWQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2Usb2JqRUpCUmVsYXRpb25zaGlwUm9sZS5pc1JlcXVpcmVkKCkpOwotICAgICAgICBpc1JlcXVpcmVkID0gQm9vbGVhbi5UUlVFOwotICAgICAgICBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlLnNldFJlcXVpcmVkKGlzUmVxdWlyZWQpOwotICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSxvYmpFSkJSZWxhdGlvbnNoaXBSb2xlLmlzUmVxdWlyZWQoKSk7Ci0gICAgfQotICAgIAotICAgLyogcHVibGljIHZvaWQgdGVzdF9yZWNvbmNpbGVBdHRyaWJ1dGVzKCkgewotCi0gICAgICAgIEVKQlJlbGF0aW9uc2hpcFJvbGUgb2JqRUpCUmVsYXRpb25zaGlwUm9sZSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIG9iakVKQlJlbGF0aW9uc2hpcFJvbGUucmVjb25jaWxlQXR0cmlidXRlcygpOwotICAgIH0gKi8KLQotCi0gICAKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L0VqYkVNRlRlc3RCYXNlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9FamJFTUZUZXN0QmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTQ2MDlmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L0VqYkVNRlRlc3RCYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMTQsIDIwMDUKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi50ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0cy5FamJFTUZUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUudGVzdHV0aWxpdGllcy5FTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLQotLyoqCi0gKiBAYXV0aG9yIEFkbWluCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgRWpiRU1GVGVzdEJhc2UgZXh0ZW5kcyBFamJFTUZUZXN0IHsKLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIEVqYkVNRlRlc3RCYXNlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvci5yZXNldCgpOwotCQljcmVhdGVFQVIoKTsKLQkJY3JlYXRlRUpCKCk7Ci0KLQkJRUpCUmVzb3VyY2UgREQgPSAoRUpCUmVzb3VyY2UpIGVqYkZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotCQkvL1RPRE86IGluZGl2aWR1YWwgdGVzdCBmb3IgZWFjaCB2ZXJzaW9uCi0JCURELnNldFZlcnNpb25JRChKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCk7Ci0JCXNldFZlcnNpb24oVkVSU0lPTl8xXzQpOwotCQlzZXRNb2R1bGVUeXBlKEVKQik7Ci0JCXBvcHVsYXRlUm9vdChERC5nZXRSb290T2JqZWN0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RUpCSmFyUG9wdWxhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBkb250IHRlc3QgdGhlIGJhc2UgZnVuY3Rpb25zCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3QxNEVKQkphclBvcHVsYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8JCSBkb250IHRlc3QgdGhlIGJhc2UgZnVuY3Rpb25zCi0JfQkKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L0VqYkZhY3RvcnlUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9FamJGYWN0b3J5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzUwYzhhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L0VqYkZhY3RvcnlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIudGVzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhUmVmRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFjdGl2YXRpb25Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFjdGl2YXRpb25Db25maWdQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQXNzZW1ibHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5DTVBBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNNUkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQk1ldGhvZENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVsYXRpb25zaGlwUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FeGNsdWRlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWVzc2FnZURyaXZlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RQZXJtaXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RUcmFuc2FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlF1ZXJ5TWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5SZWxhdGlvbnNoaXBzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Sb2xlU291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5TZXNzaW9uOwotCi1wdWJsaWMgY2xhc3MgRWpiRmFjdG9yeVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIEVqYkZhY3RvcnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFamJGYWN0b3J5KCk7Ci0JfQotCQotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShFamJGYWN0b3J5VGVzdC5jbGFzcyk7Ci0JfQotCQotICAgIHB1YmxpYyB2b2lkIHRlc3RfRWpiRmFjdG9yeSgpIHsKLQotICAgICAgICBFamJGYWN0b3J5IHRtcEVqYkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlTWV0aG9kRWxlbWVudCgpIHsKLQotICAgICAgICBFamJGYWN0b3J5IG9iakVqYkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgYVNpZ25hdHVyZSA9ICIiOwotICAgICAgICBNZXRob2RFbGVtZW50IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFamJGYWN0b3J5LmNyZWF0ZU1ldGhvZEVsZW1lbnQoYVNpZ25hdHVyZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlTWV0aG9kRWxlbWVudEZyb20oKSB7Ci0KLSAgICAgICAgRWpiRmFjdG9yeSBvYmpFamJGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgTWV0aG9kIGFNZXRob2QgPSAgSmF2YVJlZkZhY3RvcnlJbXBsLmdldEFjdGl2ZUZhY3RvcnkoKS5jcmVhdGVNZXRob2QoKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBuYW1lID0gInNldFR3b1BhcmFtTWV0aG9kIjsKLSAgICAgICAgSmF2YVBhcmFtZXRlciBqYXZhUGFyYW1ldGVyMSA9IEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVKYXZhUGFyYW1ldGVyKCk7Ci0gICAgICAgIEphdmFIZWxwZXJzIHR5cGUxID0gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNsYXNzUmVmKCJqYXZhLmxhbmcuU3RyaW5nIik7Ci0gICAgICAgIGphdmFQYXJhbWV0ZXIxLnNldEVUeXBlKHR5cGUxKTsKLSAgICAgICAgCi0gICAgICAgIEphdmFQYXJhbWV0ZXIgamF2YVBhcmFtZXRlcjIgPSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSmF2YVBhcmFtZXRlcigpOwotICAgICAgICBKYXZhSGVscGVycyB0eXBlMiA9IEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDbGFzc1JlZigiamF2YS51dGlsLkxpc3QiKTsKLSAgICAgICAgamF2YVBhcmFtZXRlcjIuc2V0RVR5cGUodHlwZTIpOwotICAgICAgICAKLSAgICAgICAgYU1ldGhvZC5zZXROYW1lKG5hbWUpOwotICAgICAgICBhTWV0aG9kLmdldFBhcmFtZXRlcnMoKS5hZGQoamF2YVBhcmFtZXRlcjEpOwotICAgICAgICBhTWV0aG9kLmdldFBhcmFtZXRlcnMoKS5hZGQoamF2YVBhcmFtZXRlcjIpOwotICAgICAgICAKLSAgICAgICAgTWV0aG9kRWxlbWVudCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRWpiRmFjdG9yeS5jcmVhdGVNZXRob2RFbGVtZW50RnJvbShhTWV0aG9kKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVNZXRob2RFbGVtZW50RnJvbV8yKCkgewotCi0gICAgICAgIEVqYkZhY3Rvcnkgb2JqRWpiRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCBtZXRob2QgPSBudWxsOwotICAgICAgICBNZXRob2RFbGVtZW50IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFamJGYWN0b3J5LmNyZWF0ZU1ldGhvZEVsZW1lbnRGcm9tKG1ldGhvZCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZU1ldGhvZFBlcm1pc3Npb24oKSB7Ci0KLSAgICAgICAgRWpiRmFjdG9yeSBvYmpFamJGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgTWV0aG9kUGVybWlzc2lvbiByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRWpiRmFjdG9yeS5jcmVhdGVNZXRob2RQZXJtaXNzaW9uKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlQXNzZW1ibHlEZXNjcmlwdG9yKCkgewotCi0gICAgICAgIEVqYkZhY3Rvcnkgb2JqRWpiRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEFzc2VtYmx5RGVzY3JpcHRvciByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRWpiRmFjdG9yeS5jcmVhdGVBc3NlbWJseURlc2NyaXB0b3IoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVNZXRob2RUcmFuc2FjdGlvbigpIHsKLQotICAgICAgICBFamJGYWN0b3J5IG9iakVqYkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBNZXRob2RUcmFuc2FjdGlvbiByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRWpiRmFjdG9yeS5jcmVhdGVNZXRob2RUcmFuc2FjdGlvbigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUVudGl0eSgpIHsKLQotICAgICAgICBFamJGYWN0b3J5IG9iakVqYkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBFbnRpdHkgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVqYkZhY3RvcnkuY3JlYXRlRW50aXR5KCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIAotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVDb250YWluZXJNYW5hZ2VkRW50aXR5KCkgewotCi0gICAgICAgIEVqYkZhY3Rvcnkgb2JqRWpiRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVqYkZhY3RvcnkuY3JlYXRlQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUNNUEF0dHJpYnV0ZSgpIHsKLQotICAgICAgICBFamJGYWN0b3J5IG9iakVqYkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBDTVBBdHRyaWJ1dGUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVqYkZhY3RvcnkuY3JlYXRlQ01QQXR0cmlidXRlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlQ01SRmllbGQoKSB7Ci0KLSAgICAgICAgRWpiRmFjdG9yeSBvYmpFamJGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgQ01SRmllbGQgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVqYkZhY3RvcnkuY3JlYXRlQ01SRmllbGQoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVFSkJSZWxhdGlvbnNoaXBSb2xlKCkgewotCi0gICAgICAgIEVqYkZhY3Rvcnkgb2JqRWpiRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVKQlJlbGF0aW9uc2hpcFJvbGUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVqYkZhY3RvcnkuY3JlYXRlRUpCUmVsYXRpb25zaGlwUm9sZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlRUpCUmVsYXRpb24oKSB7Ci0KLSAgICAgICAgRWpiRmFjdG9yeSBvYmpFamJGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRUpCUmVsYXRpb24gcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVqYkZhY3RvcnkuY3JlYXRlRUpCUmVsYXRpb24oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZVJlbGF0aW9uc2hpcHMoKSB7Ci0KLSAgICAgICAgRWpiRmFjdG9yeSBvYmpFamJGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgUmVsYXRpb25zaGlwcyByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRWpiRmFjdG9yeS5jcmVhdGVSZWxhdGlvbnNoaXBzKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlRUpCSmFyKCkgewotCi0gICAgICAgIEVqYkZhY3Rvcnkgb2JqRWpiRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVKQkphciByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRWpiRmFjdG9yeS5jcmVhdGVFSkJKYXIoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVSb2xlU291cmNlKCkgewotCi0gICAgICAgIEVqYkZhY3Rvcnkgb2JqRWpiRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFJvbGVTb3VyY2UgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVqYkZhY3RvcnkuY3JlYXRlUm9sZVNvdXJjZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZVF1ZXJ5KCkgewotCi0gICAgICAgIEVqYkZhY3Rvcnkgb2JqRWpiRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFF1ZXJ5IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFamJGYWN0b3J5LmNyZWF0ZVF1ZXJ5KCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlUXVlcnlNZXRob2QoKSB7Ci0KLSAgICAgICAgRWpiRmFjdG9yeSBvYmpFamJGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgUXVlcnlNZXRob2QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVqYkZhY3RvcnkuY3JlYXRlUXVlcnlNZXRob2QoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkoKSB7Ci0KLSAgICAgICAgRWpiRmFjdG9yeSBvYmpFamJGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFamJGYWN0b3J5LmNyZWF0ZUFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUFjdGl2YXRpb25Db25maWcoKSB7Ci0KLSAgICAgICAgRWpiRmFjdG9yeSBvYmpFamJGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgQWN0aXZhdGlvbkNvbmZpZyByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRWpiRmFjdG9yeS5jcmVhdGVBY3RpdmF0aW9uQ29uZmlnKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlTWV0aG9kRWxlbWVudF8yKCkgewotCi0gICAgICAgIEVqYkZhY3Rvcnkgb2JqRWpiRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIE1ldGhvZEVsZW1lbnQgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVqYkZhY3RvcnkuY3JlYXRlTWV0aG9kRWxlbWVudCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUV4Y2x1ZGVMaXN0KCkgewotCi0gICAgICAgIEVqYkZhY3Rvcnkgb2JqRWpiRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEV4Y2x1ZGVMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFamJGYWN0b3J5LmNyZWF0ZUV4Y2x1ZGVMaXN0KCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlU2Vzc2lvbigpIHsKLQotICAgICAgICBFamJGYWN0b3J5IG9iakVqYkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTZXNzaW9uIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFamJGYWN0b3J5LmNyZWF0ZVNlc3Npb24oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVNZXNzYWdlRHJpdmVuKCkgewotCi0gICAgICAgIEVqYkZhY3Rvcnkgb2JqRWpiRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIE1lc3NhZ2VEcml2ZW4gcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVqYkZhY3RvcnkuY3JlYXRlTWVzc2FnZURyaXZlbigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZU1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbigpIHsKLQotICAgICAgICBFamJGYWN0b3J5IG9iakVqYkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBNZXNzYWdlRHJpdmVuRGVzdGluYXRpb24gcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVqYkZhY3RvcnkuY3JlYXRlTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlRUpCTWV0aG9kQ2F0ZWdvcnkoKSB7Ci0KLSAgICAgICAgRWpiRmFjdG9yeSBvYmpFamJGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRUpCTWV0aG9kQ2F0ZWdvcnkgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVqYkZhY3RvcnkuY3JlYXRlRUpCTWV0aG9kQ2F0ZWdvcnkoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9FbnRpdHlUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9FbnRpdHlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljYTU0OGMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3Rlc3QvRW50aXR5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLnRlc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQXNzZW1ibHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGl0eTsKLQotcHVibGljIGNsYXNzIEVudGl0eVRlc3QgZXh0ZW5kcyBFamJFTUZUZXN0QmFzZXsKLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIEVudGl0eVRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByaXZhdGUgRW50aXR5IGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRW50aXR5KCk7Ci0JfQotICAgIHB1YmxpYyB2b2lkIHRlc3RfRW50aXR5KCkgewotICAgICAgICBFbnRpdHkgdG1wRW50aXR5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh0bXBFbnRpdHkpOwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJc3VwZXIuc2V0VXAoKTsKLQl9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFByaW1hcnlLZXlOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLSAgICAJaW5pdCgpOwotICAgIAlFSkJSZXNvdXJjZSBERCA9IChFSkJSZXNvdXJjZSkgZWpiRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0gICAgCQotICAgIAlBc3NlbWJseURlc2NyaXB0b3IgYXNzZW1ibHlEZXNjcmlwdG9yID0gREQuZ2V0RUpCSmFyKCkuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCk7Ci0JCUxpc3QgZW50ZXJwcmlzZUJlYW5zID0gREQuZ2V0RUpCSmFyKCkuZ2V0RW50ZXJwcmlzZUJlYW5zKCk7Ci0JCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgZW50aXR5QmVhbiA9IG51bGw7Ci0JCUVudGVycHJpc2VCZWFuIGJlYW4gPSBudWxsOwotCQlmb3IgKGludCB4PTA7IHg8IGVudGVycHJpc2VCZWFucy5zaXplKCk7ICsreCkgewotCQkJYmVhbiA9IChFbnRlcnByaXNlQmVhbikgZW50ZXJwcmlzZUJlYW5zLmdldCh4KTsKLQkJCWlmIChiZWFuLmlzRW50aXR5KCkgJiYgYmVhbi5pc0NvbnRhaW5lck1hbmFnZWRFbnRpdHkoKSkgewotCQkJCWVudGl0eUJlYW4gPSAoQ29udGFpbmVyTWFuYWdlZEVudGl0eSkgYmVhbjsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoZW50aXR5QmVhbiAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IGVudGl0eUJlYW4uZ2V0UHJpbWFyeUtleU5hbWUoKTsKLQkJCVN0cmluZyBwcmltS2V5TmFtZSA9IGVudGl0eUJlYW4uZ2V0UHJpbWFyeUtleSgpLmdldFF1YWxpZmllZE5hbWUoKTsKLQkJCWFzc2VydEVxdWFscyhuYW1lLHByaW1LZXlOYW1lKTsKLQkJCQotCQl9Ci0gICAgfQotCi0gICAgCi0gICAvKiBwdWJsaWMgdm9pZCB0ZXN0X2lzQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpIHsKLSAgICAgICAgRW50aXR5IG9iakVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFbnRpdHkuaXNDb250YWluZXJNYW5hZ2VkRW50aXR5KCk7Ci0gICAgfSovCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFByaW1hcnlLZXlOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgCWluaXQoKTsKLSAgICAJRUpCUmVzb3VyY2UgREQgPSAoRUpCUmVzb3VyY2UpIGVqYkZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotICAgIAkKLSAgICAJQXNzZW1ibHlEZXNjcmlwdG9yIGFzc2VtYmx5RGVzY3JpcHRvciA9IERELmdldEVKQkphcigpLmdldEFzc2VtYmx5RGVzY3JpcHRvcigpOwotCQlMaXN0IGVudGVycHJpc2VCZWFucyA9IERELmdldEVKQkphcigpLmdldEVudGVycHJpc2VCZWFucygpOwotCQlDb250YWluZXJNYW5hZ2VkRW50aXR5IGVudGl0eUJlYW4gPSBudWxsOwotCQlFbnRlcnByaXNlQmVhbiBiZWFuID0gbnVsbDsKLQkJZm9yIChpbnQgeD0wOyB4PCBlbnRlcnByaXNlQmVhbnMuc2l6ZSgpOyArK3gpIHsKLQkJCWJlYW4gPSAoRW50ZXJwcmlzZUJlYW4pIGVudGVycHJpc2VCZWFucy5nZXQoeCk7Ci0JCQlpZiAoYmVhbi5pc0VudGl0eSgpICYmIGJlYW4uaXNDb250YWluZXJNYW5hZ2VkRW50aXR5KCkpIHsKLQkJCQllbnRpdHlCZWFuID0gKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpIGJlYW47Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVudGl0eUJlYW4gIT0gbnVsbCkgewotCQkJU3RyaW5nIG5hbWUgPSBlbnRpdHlCZWFuLmdldFByaW1hcnlLZXlOYW1lKCk7Ci0JCQlTdHJpbmcgbmV3TmFtZSA9ICJOZXdOYW1lIiA7Ci0JCQllbnRpdHlCZWFuLnNldFByaW1hcnlLZXlOYW1lKG5ld05hbWUpOwotCQkJYXNzZXJ0RXF1YWxzKG5ld05hbWUsZW50aXR5QmVhbi5nZXRQcmltYXJ5S2V5TmFtZSgpKTsKLQkJfSAgICAKLSAgICB9Ci0KLSAgLyogcHVibGljIHZvaWQgdGVzdF9pc1JlZW50cmFudCgpIHsKLQotICAgICAgICBFbnRpdHkgb2JqRW50aXR5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVudGl0eS5pc1JlZW50cmFudCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0UmVlbnRyYW50KCkgewotCi0gICAgICAgIEVudGl0eSBvYmpFbnRpdHkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBib29sZWFuIG5ld1JlZW50cmFudCA9IGZhbHNlOwotICAgICAgICBvYmpFbnRpdHkuc2V0UmVlbnRyYW50KG5ld1JlZW50cmFudCk7Ci0gICAgfSovCi0KLSAgLyogIHB1YmxpYyB2b2lkIHRlc3RfdW5zZXRSZWVudHJhbnQoKSB7Ci0KLSAgICAgICAgRW50aXR5IG9iakVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIG9iakVudGl0eS51bnNldFJlZW50cmFudCgpOwotICAgIH0gKi8KLQotICAgLyogcHVibGljIHZvaWQgdGVzdF9pc1NldFJlZW50cmFudCgpIHsKLQotICAgICAgICBFbnRpdHkgb2JqRW50aXR5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVudGl0eS5pc1NldFJlZW50cmFudCgpOwotICAgIH0gKi8KLQotICAvKiAgcHVibGljIHZvaWQgdGVzdF9nZXRQcmltYXJ5S2V5KCkgewotCi0gICAgICAgIEVudGl0eSBvYmpFbnRpdHkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBKYXZhQ2xhc3MgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVudGl0eS5nZXRQcmltYXJ5S2V5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRQcmltYXJ5S2V5KCkgewotCi0gICAgICAgIEVudGl0eSBvYmpFbnRpdHkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBKYXZhQ2xhc3MgbmV3UHJpbWFyeUtleSA9IG51bGw7Ci0gICAgICAgIG9iakVudGl0eS5zZXRQcmltYXJ5S2V5KG5ld1ByaW1hcnlLZXkpOwotICAgIH0gKi8KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEVudGl0eVRlc3QoInRlc3Rfc2V0UHJpbWFyeUtleU5hbWUiKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEVudGl0eVRlc3QoInRlc3RfZ2V0UHJpbWFyeUtleU5hbWUiKSk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9NZXRob2RFbGVtZW50VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3Rlc3QvTWV0aG9kRWxlbWVudFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU1MzNmZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9NZXRob2RFbGVtZW50VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTE3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLnRlc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhUmVmRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kRWxlbWVudEtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlNlc3Npb247Ci0KLXB1YmxpYyBjbGFzcyBNZXRob2RFbGVtZW50VGVzdCBleHRlbmRzIEVqYkVNRlRlc3RCYXNlIHsKLQlwcml2YXRlIGZpbmFsIGludCBTRVNTSU9OID0wOwotCXByaXZhdGUgZmluYWwgaW50IEVOVElUWSA9IDE7Ci0JcHJpdmF0ZSBmaW5hbCBpbnQgQ09OVEFJTkVSX01BTkFHRURfRU5USVRZID0yOwotCQotCQotCi0JLyoqCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudFRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JCQotCX0KLQotCXByaXZhdGUgTWV0aG9kRWxlbWVudCBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVqYkZhY3RvcnkoKS5jcmVhdGVNZXRob2RFbGVtZW50KCk7Ci0JfQotCQotICAgIHB1YmxpYyB2b2lkIHRlc3RfTWV0aG9kRWxlbWVudCgpIHsKLSAgICAgICAgTWV0aG9kRWxlbWVudCB0bXBNZXRob2RFbGVtZW50ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh0bXBNZXRob2RFbGVtZW50KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2FkZE1ldGhvZFBhcmFtcygpIHsKLSAgICAgICAgTWV0aG9kRWxlbWVudCBvYmpNZXRob2RFbGVtZW50ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIHBhcmFtMSA9ICJwYXJhbTEiOwotICAgICAgICBTdHJpbmcgcGFyYW0yPSAicGFyYW0yIjsKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICBvYmpNZXRob2RFbGVtZW50LmFkZE1ldGhvZFBhcmFtcyhwYXJhbTEpOwotICAgICAgICBvYmpNZXRob2RFbGVtZW50LmFkZE1ldGhvZFBhcmFtcyhwYXJhbTIpOwotICAgICAgICBMaXN0IGxpc3QgPSBvYmpNZXRob2RFbGVtZW50LmdldE1ldGhvZFBhcmFtcygpOwotICAgICAgICByZXRWYWx1ZSA9IGxpc3QuY29udGFpbnMocGFyYW0xKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfYXBwbHlaZXJvUGFyYW1zKCkgewotICAgIAlNZXRob2RFbGVtZW50IG9iak1ldGhvZEVsZW1lbnQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgcGFyYW0xID0gInBhcmFtMSI7Ci0gICAgICAgIFN0cmluZyBwYXJhbTI9ICJwYXJhbTIiOwotICAgICAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7Ci0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQuYWRkTWV0aG9kUGFyYW1zKHBhcmFtMSk7Ci0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQuYWRkTWV0aG9kUGFyYW1zKHBhcmFtMik7Ci0gICAgICAgIExpc3QgbGlzdCA9IG9iak1ldGhvZEVsZW1lbnQuZ2V0TWV0aG9kUGFyYW1zKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhsaXN0LnNpemUoKT09MiwgdHJ1ZSkgOwotICAgICAgICBvYmpNZXRob2RFbGVtZW50LmFwcGx5WmVyb1BhcmFtcygpOwotICAgICAgICBsaXN0ID0gb2JqTWV0aG9kRWxlbWVudC5nZXRNZXRob2RQYXJhbXMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGxpc3Quc2l6ZSgpPT0wLCB0cnVlKSA7Ci0gICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZXF1YWxTaWduYXR1cmUoKSB7Ci0KLSAgICAgICAgTWV0aG9kRWxlbWVudCBvYmpNZXRob2RFbGVtZW50MSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIE1ldGhvZEVsZW1lbnQgb2JqTWV0aG9kRWxlbWVudDIgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBNZXRob2RFbGVtZW50IG9iak1ldGhvZEVsZW1lbnQzID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgCi0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQxLnNldE5hbWUoIm5hbWUiKTsKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudDIuc2V0TmFtZSgibmFtZSIpOwotICAgICAgICBvYmpNZXRob2RFbGVtZW50My5zZXROYW1lKCJuYW1lIik7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgcGFyYW0xID0gInBhcmFtMSI7Ci0gICAgICAgIFN0cmluZyBwYXJhbTI9ICJwYXJhbTIiOwotICAgICAgICBTdHJpbmcgcGFyYW0zID0gInBhcmFtMyI7Ci0gICAgICAgIFN0cmluZyBwYXJhbTQ9ICJwYXJhbTQiOwotICAgICAgICAKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudDEuYWRkTWV0aG9kUGFyYW1zKHBhcmFtMSk7Ci0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQxLmFkZE1ldGhvZFBhcmFtcyhwYXJhbTIpOwotICAgICAgICAKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudDIuYWRkTWV0aG9kUGFyYW1zKHBhcmFtMSk7Ci0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQyLmFkZE1ldGhvZFBhcmFtcyhwYXJhbTIpOwotICAgICAgICAKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudDMuYWRkTWV0aG9kUGFyYW1zKHBhcmFtMSk7Ci0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQzLmFkZE1ldGhvZFBhcmFtcyhwYXJhbTIpOwotICAgICAgICAKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudDEuc2V0VHlwZShNZXRob2RFbGVtZW50S2luZC5MT0NBTF9MSVRFUkFMKTsKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudDIuc2V0VHlwZShNZXRob2RFbGVtZW50S2luZC5MT0NBTF9MSVRFUkFMKTsKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudDMuc2V0VHlwZShNZXRob2RFbGVtZW50S2luZC5MT0NBTF9MSVRFUkFMKTsKLSAgICAgICAgCi0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RFbGVtZW50MS5lcXVhbFNpZ25hdHVyZShvYmpNZXRob2RFbGVtZW50Mik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSx0cnVlKTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RFbGVtZW50Mi5lcXVhbFNpZ25hdHVyZShvYmpNZXRob2RFbGVtZW50Myk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSx0cnVlKTsKLSAgICAgICAgCi0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQzLnNldE5hbWUoIm5hbWVEaWZmIik7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kRWxlbWVudDIuZXF1YWxTaWduYXR1cmUob2JqTWV0aG9kRWxlbWVudDMpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsZmFsc2UpOwotICAgICAgICAKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudDIuYWRkTWV0aG9kUGFyYW1zKHBhcmFtMyk7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kRWxlbWVudDEuZXF1YWxTaWduYXR1cmUob2JqTWV0aG9kRWxlbWVudDIpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsZmFsc2UpOwotICAgICAgICAKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudDMuc2V0TmFtZSgibmFtZSIpOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZEVsZW1lbnQxLmVxdWFsU2lnbmF0dXJlKG9iak1ldGhvZEVsZW1lbnQzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLHRydWUpOwotICAgICAgICAKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudDMuc2V0VHlwZShNZXRob2RFbGVtZW50S2luZC5IT01FX0xJVEVSQUwpOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZEVsZW1lbnQxLmVxdWFsU2lnbmF0dXJlKG9iak1ldGhvZEVsZW1lbnQzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE1ldGhvZFBhcmFtcygpIHsKLQotICAgIAlNZXRob2RFbGVtZW50IG9iak1ldGhvZEVsZW1lbnQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgcGFyYW0xID0gInBhcmFtMSI7Ci0gICAgICAgIFN0cmluZyBwYXJhbTI9ICJwYXJhbTIiOwotICAgICAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7Ci0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQuYWRkTWV0aG9kUGFyYW1zKHBhcmFtMSk7Ci0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQuYWRkTWV0aG9kUGFyYW1zKHBhcmFtMik7Ci0gICAgICAgIExpc3QgbGlzdCA9IG9iak1ldGhvZEVsZW1lbnQuZ2V0TWV0aG9kUGFyYW1zKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhsaXN0LnNpemUoKT09MiwgdHJ1ZSkgOwotICAgICAgICBhc3NlcnRFcXVhbHMobGlzdC5jb250YWlucyhwYXJhbTEpLHRydWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMobGlzdC5jb250YWlucyhwYXJhbTIpLHRydWUpOwotICAgIH0KLQotICAgIAotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRTaWduYXR1cmUoKSB7Ci0KLSAgICAJTWV0aG9kRWxlbWVudCBvYmpNZXRob2RFbGVtZW50ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAJU3RyaW5nIG5hbWUgPSAidGVzdCI7Ci0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQuc2V0TmFtZShuYW1lKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBwYXJhbTEgPSAicGFyYW0xIjsKLSAgICAgICAgU3RyaW5nIHBhcmFtMj0gInBhcmFtMiI7Ci0gICAgICAgIAotICAgICAgICBvYmpNZXRob2RFbGVtZW50LmFkZE1ldGhvZFBhcmFtcyhwYXJhbTEpOwotICAgICAgICBvYmpNZXRob2RFbGVtZW50LmFkZE1ldGhvZFBhcmFtcyhwYXJhbTIpOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHNpZ25hdHVyZSA9IG5hbWUgKyAiKCIgKyBwYXJhbTEgKyAiLCIgKyBwYXJhbTIgKyAiKSI7Ci0gICAgICAgIFN0cmluZyByZXRWYWx1ZSA9IG9iak1ldGhvZEVsZW1lbnQuZ2V0U2lnbmF0dXJlKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhzaWduYXR1cmUscmV0VmFsdWUpOwotICAgICAgICAKLSAgICAgIAotICAgIH0KLSAgICAKLSAgICAKLSAgICAKLSAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0VHlwZUphdmFDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotICAgIAlpbml0KCk7Ci0gICAgCUVKQlJlc291cmNlIEREID0gKEVKQlJlc291cmNlKSBlamJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLSAgICAJTGlzdCBlbnRlcnByaXNlQmVhbnMgPSBERC5nZXRFSkJKYXIoKS5nZXRFbnRlcnByaXNlQmVhbnMoKTsKLSAgICAJRW50ZXJwcmlzZUJlYW4gZWIgPSAoRW50ZXJwcmlzZUJlYW4pZW50ZXJwcmlzZUJlYW5zLmdldCgwKTsKLSAgICAgICAgTWV0aG9kRWxlbWVudCBvYmpNZXRob2RFbGVtZW50ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudC5zZXRFbnRlcnByaXNlQmVhbihlYik7Ci0gICAgICAgIEphdmFDbGFzcyByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIGlmIChlYi5oYXNSZW1vdGVDbGllbnQoKSkgewotICAgICAgICAJb2JqTWV0aG9kRWxlbWVudC5zZXRUeXBlKE1ldGhvZEVsZW1lbnRLaW5kLkhPTUVfTElURVJBTCk7Ci0gICAgICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZEVsZW1lbnQuZ2V0VHlwZUphdmFDbGFzcygpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLGViLmdldEhvbWVJbnRlcmZhY2UoKSk7Ci0gICAgICAgICAgICBvYmpNZXRob2RFbGVtZW50LnNldFR5cGUoTWV0aG9kRWxlbWVudEtpbmQuUkVNT1RFX0xJVEVSQUwpOwotICAgICAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RFbGVtZW50LmdldFR5cGVKYXZhQ2xhc3MoKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxlYi5nZXRSZW1vdGVJbnRlcmZhY2UoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgfSAKLSAgICAgICAgaWYgKGViLmhhc0xvY2FsQ2xpZW50KCkpewotICAgICAgICAJb2JqTWV0aG9kRWxlbWVudC5zZXRUeXBlKE1ldGhvZEVsZW1lbnRLaW5kLkxPQ0FMX0hPTUVfTElURVJBTCk7Ci0gICAgICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZEVsZW1lbnQuZ2V0VHlwZUphdmFDbGFzcygpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLGViLmdldExvY2FsSG9tZUludGVyZmFjZSgpKTsKLSAgICAgICAgICAgIG9iak1ldGhvZEVsZW1lbnQuc2V0VHlwZShNZXRob2RFbGVtZW50S2luZC5MT0NBTF9MSVRFUkFMKTsKLSAgICAgICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kRWxlbWVudC5nZXRUeXBlSmF2YUNsYXNzKCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsZWIuZ2V0TG9jYWxJbnRlcmZhY2UoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgfSAKLSAgICAgICAgaWYgKGViLmlzTWVzc2FnZURyaXZlbigpKSB7Ci0gICAgICAgIAlvYmpNZXRob2RFbGVtZW50LnNldFR5cGUoTWV0aG9kRWxlbWVudEtpbmQuVU5TUEVDSUZJRURfTElURVJBTCk7Ci0gICAgICAgIAlyZXRWYWx1ZSA9IG9iak1ldGhvZEVsZW1lbnQuZ2V0VHlwZUphdmFDbGFzcygpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLGViLmdldEVqYkNsYXNzKCkpOwotICAgICAgICB9Ci0gIAotICAgIH0KLSAgICAKLSAgIAotCi0gICAvKiBwdWJsaWMgdm9pZCB0ZXN0X2dldE1ldGhvZHMoKSB7Ci0gICAgCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRNb3N0U3BlY2lmaWMoKSB7Ci0KLSAgICAgICAgTWV0aG9kRWxlbWVudCBvYmpNZXRob2RFbGVtZW50ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgTWV0aG9kRWxlbWVudCBhTWV0aG9kRWxlbWVudCA9IG51bGw7Ci0gICAgICAgIEphdmFDbGFzcyBhQ2xhc3MgPSBudWxsOwotICAgICAgICBNZXRob2RFbGVtZW50IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RFbGVtZW50LmdldE1vc3RTcGVjaWZpYyhhTWV0aG9kRWxlbWVudCwgYUNsYXNzKTsKLSAgICB9Ki8KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2hhc01ldGhvZFBhcmFtcygpIHsKLSAgICAgICAgTWV0aG9kRWxlbWVudCBvYmpNZXRob2RFbGVtZW50ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZEVsZW1lbnQuaGFzTWV0aG9kUGFyYW1zKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxmYWxzZSk7Ci0gICAgICAgIFN0cmluZyBwYXJhbTEgPSAicGFyYW0xIjsKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudC5hZGRNZXRob2RQYXJhbXMocGFyYW0xKTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RFbGVtZW50Lmhhc01ldGhvZFBhcmFtcygpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsdHJ1ZSk7Ci0gICAgICAgIFN0cmluZyBwYXJhbTIgPSAicGFyYW0yIjsKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudC5hZGRNZXRob2RQYXJhbXMocGFyYW0yKTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RFbGVtZW50Lmhhc01ldGhvZFBhcmFtcygpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9pbml0aWFsaXplRnJvbVNpZ25hdHVyZSgpIHsKLSAgICAgICAgTWV0aG9kRWxlbWVudCBvYmpNZXRob2RFbGVtZW50ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIHNpZ25hdHVyZSA9ICJzZXRUd29QYXJhbU1ldGhvZChqYXZhLmxhbmcuU3RyaW5nLGphdmEudXRpbC5MaXN0KSI7Ci0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQuaW5pdGlhbGl6ZUZyb21TaWduYXR1cmUoc2lnbmF0dXJlKTsKLSAgICAgICAgTGlzdCBsaXN0ID0gb2JqTWV0aG9kRWxlbWVudC5nZXRNZXRob2RQYXJhbXMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGxpc3Quc2l6ZSgpPT0yLCB0cnVlKSA7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gInNldFR3b1BhcmFtTWV0aG9kIjsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGxpc3QuY29udGFpbnMoImphdmEubGFuZy5TdHJpbmciKSx0cnVlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGxpc3QuY29udGFpbnMoImphdmEudXRpbC5MaXN0IiksdHJ1ZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhvYmpNZXRob2RFbGVtZW50LmdldE5hbWUoKSwgInNldFR3b1BhcmFtTWV0aG9kIik7Ci0gICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNEZWZhdWx0KCkgewotICAgICAgICBNZXRob2RFbGVtZW50IG9iak1ldGhvZEVsZW1lbnQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBvYmpNZXRob2RFbGVtZW50LnNldE5hbWUoInRlc3QiKTsKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZEVsZW1lbnQuaXNEZWZhdWx0KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxmYWxzZSk7Ci0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQuc2V0TmFtZShKYXZhQ2xhc3MuREVGQVVMVF9NRVRIT0RfTkFNRSk7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kRWxlbWVudC5pc0RlZmF1bHQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLHRydWUpOwotICAgICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzRXF1aXZhbGVudCgpIHsKLQotICAgICAgICBNZXRob2RFbGVtZW50IG9iak1ldGhvZEVsZW1lbnQxID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgTWV0aG9kRWxlbWVudCBvYmpNZXRob2RFbGVtZW50MiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIAotICAgICAgICBTZXNzaW9uIHNlc3Npb24xID0gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZVNlc3Npb24oKTsKLSAgICAgICAgU2Vzc2lvbiBzZXNzaW9uMiA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVTZXNzaW9uKCk7Ci0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQxLnNldEVudGVycHJpc2VCZWFuKHNlc3Npb24xKTsKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudDIuc2V0RW50ZXJwcmlzZUJlYW4oc2Vzc2lvbjEpOwotICAgICAgICBTdHJpbmcgc2lnbmF0dXJlMSA9ICJzZXRUd29QYXJhbU1ldGhvZChqYXZhLmxhbmcuU3RyaW5nLGphdmEudXRpbC5MaXN0KSI7Ci0gICAgICAgIFN0cmluZyBzaWduYXR1cmUyID0gInNldFR3b1BhcmFtTWV0aG9kMihqYXZhLmxhbmcuU3RyaW5nLGphdmEudXRpbC5MaXN0KSI7Ci0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQxLmluaXRpYWxpemVGcm9tU2lnbmF0dXJlKHNpZ25hdHVyZTEpOwotICAgICAgICBvYmpNZXRob2RFbGVtZW50Mi5pbml0aWFsaXplRnJvbVNpZ25hdHVyZShzaWduYXR1cmUxKTsKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZEVsZW1lbnQxLmlzRXF1aXZhbGVudChvYmpNZXRob2RFbGVtZW50Mik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSx0cnVlKTsKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudDIuaW5pdGlhbGl6ZUZyb21TaWduYXR1cmUoc2lnbmF0dXJlMik7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kRWxlbWVudDEuaXNFcXVpdmFsZW50KG9iak1ldGhvZEVsZW1lbnQyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLGZhbHNlKTsKLSAgICAgICAgCi0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQyLmluaXRpYWxpemVGcm9tU2lnbmF0dXJlKHNpZ25hdHVyZTEpOwotICAgICAgICBvYmpNZXRob2RFbGVtZW50Mi5zZXRFbnRlcnByaXNlQmVhbihzZXNzaW9uMik7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kRWxlbWVudDEuaXNFcXVpdmFsZW50KG9iak1ldGhvZEVsZW1lbnQyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzSG9tZSgpIHsKLQotICAgICAgICBNZXRob2RFbGVtZW50IG9iak1ldGhvZEVsZW1lbnQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBvYmpNZXRob2RFbGVtZW50LnNldFR5cGUoTWV0aG9kRWxlbWVudEtpbmQuSE9NRV9MSVRFUkFMKTsKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZEVsZW1lbnQuaXNIb21lKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSx0cnVlKTsKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudC5zZXRUeXBlKE1ldGhvZEVsZW1lbnRLaW5kLkxPQ0FMX0hPTUVfTElURVJBTCk7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kRWxlbWVudC5pc0hvbWUoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLGZhbHNlKTsKLSAgICAgICAgCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9pc1JlbW90ZSgpIHsKLSAgICAJIE1ldGhvZEVsZW1lbnQgb2JqTWV0aG9kRWxlbWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgICBvYmpNZXRob2RFbGVtZW50LnNldFR5cGUoTWV0aG9kRWxlbWVudEtpbmQuUkVNT1RFX0xJVEVSQUwpOwotICAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RFbGVtZW50LmlzUmVtb3RlKCk7Ci0gICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsdHJ1ZSk7Ci0gICAgICAgICBvYmpNZXRob2RFbGVtZW50LnNldFR5cGUoTWV0aG9kRWxlbWVudEtpbmQuTE9DQUxfSE9NRV9MSVRFUkFMKTsKLSAgICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kRWxlbWVudC5pc1JlbW90ZSgpOwotICAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzVW5zcGVjaWZpZWQoKSB7Ci0gICAgCSBNZXRob2RFbGVtZW50IG9iak1ldGhvZEVsZW1lbnQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICAgb2JqTWV0aG9kRWxlbWVudC5zZXRUeXBlKE1ldGhvZEVsZW1lbnRLaW5kLlVOU1BFQ0lGSUVEX0xJVEVSQUwpOwotICAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RFbGVtZW50LmlzVW5zcGVjaWZpZWQoKTsKLSAgICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSx0cnVlKTsKLSAgICAgICAgIG9iak1ldGhvZEVsZW1lbnQuc2V0VHlwZShNZXRob2RFbGVtZW50S2luZC5MT0NBTF9IT01FX0xJVEVSQUwpOwotICAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RFbGVtZW50LmlzVW5zcGVjaWZpZWQoKTsKLSAgICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxmYWxzZSk7Ci0gICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNMb2NhbEhvbWUoKSB7Ci0KLSAgICAJIE1ldGhvZEVsZW1lbnQgb2JqTWV0aG9kRWxlbWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgICBvYmpNZXRob2RFbGVtZW50LnNldFR5cGUoTWV0aG9kRWxlbWVudEtpbmQuTE9DQUxfSE9NRV9MSVRFUkFMICk7Ci0gICAgICAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7Ci0gICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZEVsZW1lbnQuaXNMb2NhbEhvbWUoKTsKLSAgICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSx0cnVlKTsKLSAgICAgICAgIG9iak1ldGhvZEVsZW1lbnQuc2V0VHlwZShNZXRob2RFbGVtZW50S2luZC5VTlNQRUNJRklFRF9MSVRFUkFMKTsKLSAgICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kRWxlbWVudC5pc0xvY2FsSG9tZSgpOwotICAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzTG9jYWwoKSB7Ci0gICAgCSBNZXRob2RFbGVtZW50IG9iak1ldGhvZEVsZW1lbnQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICAgb2JqTWV0aG9kRWxlbWVudC5zZXRUeXBlKE1ldGhvZEVsZW1lbnRLaW5kLkxPQ0FMX0xJVEVSQUwgKTsKLSAgICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kRWxlbWVudC5pc0xvY2FsKCk7Ci0gICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsdHJ1ZSk7Ci0gICAgICAgICBvYmpNZXRob2RFbGVtZW50LnNldFR5cGUoTWV0aG9kRWxlbWVudEtpbmQuVU5TUEVDSUZJRURfTElURVJBTCk7Ci0gICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZEVsZW1lbnQuaXNMb2NhbCgpOwotICAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzVmFsaWQoKSB7Ci0gICAgICAgIE1ldGhvZEVsZW1lbnQgb2JqTWV0aG9kRWxlbWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RFbGVtZW50LmlzVmFsaWQoKTsKLSAgICB9Ci0KLSAgCi0gICAgcHVibGljIHZvaWQgdGVzdF9uYW1lQW5kUGFyYW1zRXF1YWxzKCkgewotCi0gICAgICAgIE1ldGhvZEVsZW1lbnQgb2JqTWV0aG9kRWxlbWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIE1ldGhvZCBhTWV0aG9kID0gIEphdmFSZWZGYWN0b3J5SW1wbC5nZXRBY3RpdmVGYWN0b3J5KCkuY3JlYXRlTWV0aG9kKCk7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gInNldFR3b1BhcmFtTWV0aG9kIjsKLSAgICAgICAgU3RyaW5nIHBhcmFtMSA9ICJqYXZhLmxhbmcuU3RyaW5nIjsKLSAgICAgICAgU3RyaW5nIHBhcmFtMiA9ICJqYXZhLnV0aWwuTGlzdCI7Ci0gICAgICAgIAotICAgICAgICBKYXZhUGFyYW1ldGVyIGphdmFQYXJhbWV0ZXIxID0gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUphdmFQYXJhbWV0ZXIoKTsKLSAgICAgICAgSmF2YUhlbHBlcnMgdHlwZTEgPSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2xhc3NSZWYoImphdmEubGFuZy5TdHJpbmciKTsKLSAgICAgICAgamF2YVBhcmFtZXRlcjEuc2V0RVR5cGUodHlwZTEpOwotICAgICAgICAKLSAgICAgICAgSmF2YVBhcmFtZXRlciBqYXZhUGFyYW1ldGVyMiA9IEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVKYXZhUGFyYW1ldGVyKCk7Ci0gICAgICAgIEphdmFIZWxwZXJzIHR5cGUyID0gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNsYXNzUmVmKCJqYXZhLnV0aWwuTGlzdCIpOwotICAgICAgICBqYXZhUGFyYW1ldGVyMi5zZXRFVHlwZSh0eXBlMik7Ci0gICAgICAgIAotICAgICAgICBhTWV0aG9kLnNldE5hbWUobmFtZSk7Ci0gICAgICAgIGFNZXRob2QuZ2V0UGFyYW1ldGVycygpLmFkZChqYXZhUGFyYW1ldGVyMSk7Ci0gICAgICAgIGFNZXRob2QuZ2V0UGFyYW1ldGVycygpLmFkZChqYXZhUGFyYW1ldGVyMik7Ci0gICAgICAgIAotICAgICAgICBvYmpNZXRob2RFbGVtZW50LnNldE5hbWUobmFtZSk7Ci0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQuYWRkTWV0aG9kUGFyYW1zKHBhcmFtMSk7Ci0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQuYWRkTWV0aG9kUGFyYW1zKHBhcmFtMik7Ci0gICAgICAgCi0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RFbGVtZW50Lm5hbWVBbmRQYXJhbXNFcXVhbHMoYU1ldGhvZCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSx0cnVlKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBuYW1lMiA9ICJzZXRUd29QYXJhbU1ldGhvZDIiOwotICAgICAgICBvYmpNZXRob2RFbGVtZW50LnNldE5hbWUobmFtZTIpOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZEVsZW1lbnQubmFtZUFuZFBhcmFtc0VxdWFscyhhTWV0aG9kKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLGZhbHNlKTsKLSAgICAgICAgCi0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQuc2V0TmFtZShuYW1lKTsKLSAgICAgICAgU3RyaW5nIHBhcmFtMyA9ICJqYXZhLnV0aWwuTGlzdCI7Ci0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQuYWRkTWV0aG9kUGFyYW1zKHBhcmFtMyk7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kRWxlbWVudC5uYW1lQW5kUGFyYW1zRXF1YWxzKGFNZXRob2QpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsZmFsc2UpOwotICAgICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZU1ldGhvZFBhcmFtcygpIHsKLQotICAgIAkgTWV0aG9kRWxlbWVudCBvYmpNZXRob2RFbGVtZW50ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgIFN0cmluZyBwYXJhbTEgPSAicGFyYW0xIjsKLSAgICAgICAgIFN0cmluZyBwYXJhbTI9ICJwYXJhbTIiOwotICAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICAgb2JqTWV0aG9kRWxlbWVudC5hZGRNZXRob2RQYXJhbXMocGFyYW0xKTsKLSAgICAgICAgIG9iak1ldGhvZEVsZW1lbnQuYWRkTWV0aG9kUGFyYW1zKHBhcmFtMik7Ci0gICAgICAgICBMaXN0IGxpc3QgPSBvYmpNZXRob2RFbGVtZW50LmdldE1ldGhvZFBhcmFtcygpOwotICAgICAgICAgcmV0VmFsdWUgPSBsaXN0LmNvbnRhaW5zKHBhcmFtMSk7Ci0gICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsdHJ1ZSk7Ci0gICAgICAgICBvYmpNZXRob2RFbGVtZW50LnJlbW92ZU1ldGhvZFBhcmFtcyhwYXJhbTEpOwotICAgICAgICAgbGlzdCA9IG9iak1ldGhvZEVsZW1lbnQuZ2V0TWV0aG9kUGFyYW1zKCk7Ci0gICAgICAgICByZXRWYWx1ZSA9IGxpc3QuY29udGFpbnMocGFyYW0xKTsKLSAgICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxmYWxzZSk7Ci0gICAgfQotCi0gLyogICBwdWJsaWMgdm9pZCB0ZXN0X3JlcHJlc2VudHMoKSB7Ci0KLSAgICAgICAgTWV0aG9kRWxlbWVudCBvYmpNZXRob2RFbGVtZW50ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgTWV0aG9kIGFNZXRob2QgPSBudWxsOwotICAgICAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kRWxlbWVudC5yZXByZXNlbnRzKGFNZXRob2QpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0SWRUb1JlYWRhYmxlU3RyaW5nKCkgewotCi0gICAgICAgIE1ldGhvZEVsZW1lbnQgb2JqTWV0aG9kRWxlbWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQuc2V0SWRUb1JlYWRhYmxlU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF91bmlxdWVseUlkZW50aWZpZXMoKSB7Ci0KLSAgICAgICAgTWV0aG9kRWxlbWVudCBvYmpNZXRob2RFbGVtZW50ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgTWV0aG9kIGFNZXRob2QgPSBudWxsOwotICAgICAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kRWxlbWVudC51bmlxdWVseUlkZW50aWZpZXMoYU1ldGhvZCk7Ci0gICAgfSAqLwotCi0gICAvKiBwdWJsaWMgdm9pZCB0ZXN0X2dldE5hbWUoKSB7Ci0KLSAgICAgICAgTWV0aG9kRWxlbWVudCBvYmpNZXRob2RFbGVtZW50ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIHJldFZhbHVlID0gIiI7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kRWxlbWVudC5nZXROYW1lKCk7Ci0gICAgfSovCi0KLSAgIC8qIHB1YmxpYyB2b2lkIHRlc3Rfc2V0TmFtZSgpIHsKLQotICAgICAgICBNZXRob2RFbGVtZW50IG9iak1ldGhvZEVsZW1lbnQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgbmV3TmFtZSA9ICIiOwotICAgICAgICBvYmpNZXRob2RFbGVtZW50LnNldE5hbWUobmV3TmFtZSk7Ci0gICAgfSovCi0KLSAgIC8qIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UGFybXMoKSB7Ci0KLSAgICAgICAgTWV0aG9kRWxlbWVudCBvYmpNZXRob2RFbGVtZW50ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIHJldFZhbHVlID0gIiI7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kRWxlbWVudC5nZXRQYXJtcygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0UGFybXMoKSB7Ci0KLSAgICAgICAgTWV0aG9kRWxlbWVudCBvYmpNZXRob2RFbGVtZW50ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIG5ld1Bhcm1zID0gIiI7Ci0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQuc2V0UGFybXMobmV3UGFybXMpOwotICAgIH0qLwotCi0gIC8qICBwdWJsaWMgdm9pZCB0ZXN0X2dldFR5cGUoKSB7Ci0KLSAgICAgICAgTWV0aG9kRWxlbWVudCBvYmpNZXRob2RFbGVtZW50ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgTWV0aG9kRWxlbWVudEtpbmQgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZEVsZW1lbnQuZ2V0VHlwZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0VHlwZSgpIHsKLQotICAgICAgICBNZXRob2RFbGVtZW50IG9iak1ldGhvZEVsZW1lbnQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBNZXRob2RFbGVtZW50S2luZCBuZXdUeXBlID0gbnVsbDsKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudC5zZXRUeXBlKG5ld1R5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfdW5zZXRUeXBlKCkgewotCi0gICAgICAgIE1ldGhvZEVsZW1lbnQgb2JqTWV0aG9kRWxlbWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQudW5zZXRUeXBlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9pc1NldFR5cGUoKSB7Ci0KLSAgICAgICAgTWV0aG9kRWxlbWVudCBvYmpNZXRob2RFbGVtZW50ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZEVsZW1lbnQuaXNTZXRUeXBlKCk7Ci0gICAgfSovCi0KLSAgLyogIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RGVzY3JpcHRpb24oKSB7Ci0KLSAgICAgICAgTWV0aG9kRWxlbWVudCBvYmpNZXRob2RFbGVtZW50ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIHJldFZhbHVlID0gIiI7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kRWxlbWVudC5nZXREZXNjcmlwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0RGVzY3JpcHRpb24oKSB7Ci0KLSAgICAgICAgTWV0aG9kRWxlbWVudCBvYmpNZXRob2RFbGVtZW50ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIG5ld0Rlc2NyaXB0aW9uID0gIiI7Ci0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQuc2V0RGVzY3JpcHRpb24obmV3RGVzY3JpcHRpb24pOwotICAgIH0qLwotCi0gICAvKiBwdWJsaWMgdm9pZCB0ZXN0X2dldEVudGVycHJpc2VCZWFuKCkgewotCi0gICAgICAgIE1ldGhvZEVsZW1lbnQgb2JqTWV0aG9kRWxlbWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVudGVycHJpc2VCZWFuIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RFbGVtZW50LmdldEVudGVycHJpc2VCZWFuKCk7Ci0gICAgfQotCi0gIAotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0RW50ZXJwcmlzZUJlYW4oKSB7Ci0KLSAgICAgICAgTWV0aG9kRWxlbWVudCBvYmpNZXRob2RFbGVtZW50ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRW50ZXJwcmlzZUJlYW4gbmV3RW50ZXJwcmlzZUJlYW4gPSBudWxsOwotICAgICAgICBvYmpNZXRob2RFbGVtZW50LnNldEVudGVycHJpc2VCZWFuKG5ld0VudGVycHJpc2VCZWFuKTsKLSAgICB9Ki8KLQotICAgLyogcHVibGljIHZvaWQgdGVzdF9nZXREZXNjcmlwdGlvbnMoKSB7Ci0KLSAgICAgICAgTWV0aG9kRWxlbWVudCBvYmpNZXRob2RFbGVtZW50ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRUxpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZEVsZW1lbnQuZ2V0RGVzY3JpcHRpb25zKCk7Ci0gICAgfSovCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShNZXRob2RFbGVtZW50VGVzdC5jbGFzcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9NZXRob2RQZXJtaXNzaW9uVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3Rlc3QvTWV0aG9kUGVybWlzc2lvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjAzNDU3MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9NZXRob2RQZXJtaXNzaW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLnRlc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eVJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZFBlcm1pc3Npb247Ci0KLXB1YmxpYyBjbGFzcyBNZXRob2RQZXJtaXNzaW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEVqYkZhY3RvcnkgRUpCRkFDVE9SWSA9IEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVqYkZhY3RvcnkoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21tb25GYWN0b3J5IENPTU1PTkZBQ1RPUlkgPSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21tb25GYWN0b3J5KCk7Ci0JcHJpdmF0ZSBNZXRob2RQZXJtaXNzaW9uIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gRUpCRkFDVE9SWS5jcmVhdGVNZXRob2RQZXJtaXNzaW9uKCk7Ci0JfQotCQotCQotICAgIHB1YmxpYyB2b2lkIHRlc3RfTWV0aG9kUGVybWlzc2lvbigpIHsKLSAgICAgICAgTWV0aG9kUGVybWlzc2lvbiB0bXBNZXRob2RQZXJtaXNzaW9uID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh0bXBNZXRob2RQZXJtaXNzaW9uKTsKLSAgICB9Ci0KLSAgIC8qcHVibGljIHZvaWQgdGVzdF9nZXRNZXRob2RFbGVtZW50cygpIHsKLQotICAgICAgICBNZXRob2RQZXJtaXNzaW9uIG9iak1ldGhvZFBlcm1pc3Npb24gPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBFbnRlcnByaXNlQmVhbiBhbkVKQiA9IG51bGw7Ci0gICAgICAgIExpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZFBlcm1pc3Npb24uZ2V0TWV0aG9kRWxlbWVudHMoYW5FSkIpOwotICAgIH0qLwotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRTZWN1cml0eVJvbGUoKSB7Ci0KLSAgICAgICAgTWV0aG9kUGVybWlzc2lvbiBvYmpNZXRob2RQZXJtaXNzaW9uID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU2VjdXJpdHlSb2xlIHNlY3VyaXR5Um9sZT0gQ09NTU9ORkFDVE9SWS5jcmVhdGVTZWN1cml0eVJvbGUoKTsKLQkJU3RyaW5nIHNlY3VyaXR5Um9sZU5hbWUgPSAidGVzdFJvbGUiOwotCQlzZWN1cml0eVJvbGUuc2V0Um9sZU5hbWUoc2VjdXJpdHlSb2xlTmFtZSk7Ci0JCW9iak1ldGhvZFBlcm1pc3Npb24uZ2V0Um9sZXMoKS5hZGQoc2VjdXJpdHlSb2xlKTsKLQkJCi0gICAgICAgIFNlY3VyaXR5Um9sZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kUGVybWlzc2lvbi5nZXRTZWN1cml0eVJvbGUoc2VjdXJpdHlSb2xlTmFtZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhzZWN1cml0eVJvbGUscmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfaGFzU2VjdXJpdHlSb2xlKCkgewotICAgICAgICBNZXRob2RQZXJtaXNzaW9uIG9iak1ldGhvZFBlcm1pc3Npb24gPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTZWN1cml0eVJvbGUgc2VjdXJpdHlSb2xlPSBDT01NT05GQUNUT1JZLmNyZWF0ZVNlY3VyaXR5Um9sZSgpOwotCQlTdHJpbmcgc2VjdXJpdHlSb2xlTmFtZSA9ICJ0ZXN0Um9sZSI7Ci0JCXNlY3VyaXR5Um9sZS5zZXRSb2xlTmFtZShzZWN1cml0eVJvbGVOYW1lKTsKLQkJb2JqTWV0aG9kUGVybWlzc2lvbi5nZXRSb2xlcygpLmFkZChzZWN1cml0eVJvbGUpOwotICAgICAgICBib29sZWFuIHJldFZhbHVlID0gb2JqTWV0aG9kUGVybWlzc2lvbi5oYXNTZWN1cml0eVJvbGUoc2VjdXJpdHlSb2xlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLCB0cnVlKTsKLSAgICAgICAgU2VjdXJpdHlSb2xlIHNlY3VyaXR5Um9sZTI9IENPTU1PTkZBQ1RPUlkuY3JlYXRlU2VjdXJpdHlSb2xlKCk7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kUGVybWlzc2lvbi5oYXNTZWN1cml0eVJvbGUoc2VjdXJpdHlSb2xlMik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfaGFzU2VjdXJpdHlSb2xlXzIoKSB7Ci0KLSAgICAJTWV0aG9kUGVybWlzc2lvbiBvYmpNZXRob2RQZXJtaXNzaW9uID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU2VjdXJpdHlSb2xlIHNlY3VyaXR5Um9sZT0gQ09NTU9ORkFDVE9SWS5jcmVhdGVTZWN1cml0eVJvbGUoKTsKLQkJU3RyaW5nIHNlY3VyaXR5Um9sZU5hbWUgPSAidGVzdFJvbGUiOwotCQlzZWN1cml0eVJvbGUuc2V0Um9sZU5hbWUoc2VjdXJpdHlSb2xlTmFtZSk7Ci0JCW9iak1ldGhvZFBlcm1pc3Npb24uZ2V0Um9sZXMoKS5hZGQoc2VjdXJpdHlSb2xlKTsKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IG9iak1ldGhvZFBlcm1pc3Npb24uaGFzU2VjdXJpdHlSb2xlKHNlY3VyaXR5Um9sZU5hbWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsIHRydWUpOwotICAgICAgICBTdHJpbmcgc2VjdXJpdHlSb2xlTmFtZURvZXNOb3RFeGlzdCA9ICJ0ZXN0Um9sZURvZXNOb3RFeGlzdCI7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kUGVybWlzc2lvbi5oYXNTZWN1cml0eVJvbGUoc2VjdXJpdHlSb2xlTmFtZURvZXNOb3RFeGlzdCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNFcXVpdmFsZW50KCkgewotCi0gICAgCU1ldGhvZFBlcm1pc3Npb24gb2JqTWV0aG9kUGVybWlzc2lvbjEgPSBnZXRJbnN0YW5jZSgpOwotICAgIAlNZXRob2RQZXJtaXNzaW9uIG9iak1ldGhvZFBlcm1pc3Npb24yID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAJCi0gICAgICAgIFNlY3VyaXR5Um9sZSBzZWN1cml0eVJvbGUxPSBDT01NT05GQUNUT1JZLmNyZWF0ZVNlY3VyaXR5Um9sZSgpOwotICAgICAgICBzZWN1cml0eVJvbGUxLnNldFJvbGVOYW1lKCJ0ZXN0Um9sZTEiKTsKLSAgICAgICAgU2VjdXJpdHlSb2xlIHNlY3VyaXR5Um9sZTI9IENPTU1PTkZBQ1RPUlkuY3JlYXRlU2VjdXJpdHlSb2xlKCk7Ci0gICAgICAgIHNlY3VyaXR5Um9sZTIuc2V0Um9sZU5hbWUoInRlc3RSb2xlMiIpOwotICAgICAgICBTZWN1cml0eVJvbGUgc2VjdXJpdHlSb2xlMz0gQ09NTU9ORkFDVE9SWS5jcmVhdGVTZWN1cml0eVJvbGUoKTsKLSAgICAgICAgc2VjdXJpdHlSb2xlMy5zZXRSb2xlTmFtZSgidGVzdFJvbGUzIik7Ci0gICAgICAgIAotCQkKLSAgICAgICAgb2JqTWV0aG9kUGVybWlzc2lvbjEuZ2V0Um9sZXMoKS5hZGQoc2VjdXJpdHlSb2xlMSk7Ci0gICAgICAgIG9iak1ldGhvZFBlcm1pc3Npb24xLmdldFJvbGVzKCkuYWRkKHNlY3VyaXR5Um9sZTIpOwotICAgICAgICAKLSAgICAgICAgb2JqTWV0aG9kUGVybWlzc2lvbjIuZ2V0Um9sZXMoKS5hZGQoc2VjdXJpdHlSb2xlMSk7Ci0gICAgICAgIG9iak1ldGhvZFBlcm1pc3Npb24yLmdldFJvbGVzKCkuYWRkKHNlY3VyaXR5Um9sZTIpOwotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBvYmpNZXRob2RQZXJtaXNzaW9uMS5pc0VxdWl2YWxlbnQob2JqTWV0aG9kUGVybWlzc2lvbjIpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsIHRydWUpOwotICAgICAgICAKLSAgICAgICAgb2JqTWV0aG9kUGVybWlzc2lvbjEuZ2V0Um9sZXMoKS5hZGQoc2VjdXJpdHlSb2xlMyk7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kUGVybWlzc2lvbjEuaXNFcXVpdmFsZW50KG9iak1ldGhvZFBlcm1pc3Npb24yKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLCBmYWxzZSk7Ci0gICAgICAgIAotICAgICAgICAKLSAgICB9Ci0KLSAvKiAgcHVibGljIHZvaWQgdGVzdF9nZXREZXNjcmlwdGlvbigpIHsKLQotICAgICAgICBNZXRob2RQZXJtaXNzaW9uIG9iak1ldGhvZFBlcm1pc3Npb24gPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgcmV0VmFsdWUgPSAiIjsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RQZXJtaXNzaW9uLmdldERlc2NyaXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXREZXNjcmlwdGlvbigpIHsKLQotICAgICAgICBNZXRob2RQZXJtaXNzaW9uIG9iak1ldGhvZFBlcm1pc3Npb24gPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgbmV3RGVzY3JpcHRpb24gPSAiIjsKLSAgICAgICAgb2JqTWV0aG9kUGVybWlzc2lvbi5zZXREZXNjcmlwdGlvbihuZXdEZXNjcmlwdGlvbik7Ci0gICAgfSovCi0KLSAgLyogcHVibGljIHZvaWQgdGVzdF9pc1VuY2hlY2tlZCgpIHsKLQotICAgICAgICBNZXRob2RQZXJtaXNzaW9uIG9iak1ldGhvZFBlcm1pc3Npb24gPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kUGVybWlzc2lvbi5pc1VuY2hlY2tlZCgpOwotICAgIH0qLwotCi0gICAvKiBwdWJsaWMgdm9pZCB0ZXN0X3NldFVuY2hlY2tlZCgpIHsKLQotICAgICAgICBNZXRob2RQZXJtaXNzaW9uIG9iak1ldGhvZFBlcm1pc3Npb24gPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBib29sZWFuIG5ld1VuY2hlY2tlZCA9IGZhbHNlOwotICAgICAgICBvYmpNZXRob2RQZXJtaXNzaW9uLnNldFVuY2hlY2tlZChuZXdVbmNoZWNrZWQpOwotICAgIH0qLwotCi0gICAvKiBwdWJsaWMgdm9pZCB0ZXN0X3Vuc2V0VW5jaGVja2VkKCkgewotCi0gICAgICAgIE1ldGhvZFBlcm1pc3Npb24gb2JqTWV0aG9kUGVybWlzc2lvbiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIG9iak1ldGhvZFBlcm1pc3Npb24udW5zZXRVbmNoZWNrZWQoKTsKLSAgICB9Ki8KLQotICAgIC8qcHVibGljIHZvaWQgdGVzdF9pc1NldFVuY2hlY2tlZCgpIHsKLQotICAgICAgICBNZXRob2RQZXJtaXNzaW9uIG9iak1ldGhvZFBlcm1pc3Npb24gPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kUGVybWlzc2lvbi5pc1NldFVuY2hlY2tlZCgpOwotICAgIH0qLwotCi0gICAvKiBwdWJsaWMgdm9pZCB0ZXN0X2dldEFzc2VtYmx5RGVzY3JpcHRvcigpIHsKLQotICAgICAgICBNZXRob2RQZXJtaXNzaW9uIG9iak1ldGhvZFBlcm1pc3Npb24gPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBBc3NlbWJseURlc2NyaXB0b3IgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZFBlcm1pc3Npb24uZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRBc3NlbWJseURlc2NyaXB0b3IoKSB7Ci0KLSAgICAgICAgTWV0aG9kUGVybWlzc2lvbiBvYmpNZXRob2RQZXJtaXNzaW9uID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgQXNzZW1ibHlEZXNjcmlwdG9yIG5ld0Fzc2VtYmx5RGVzY3JpcHRvciA9IG51bGw7Ci0gICAgICAgIG9iak1ldGhvZFBlcm1pc3Npb24uc2V0QXNzZW1ibHlEZXNjcmlwdG9yKG5ld0Fzc2VtYmx5RGVzY3JpcHRvcik7Ci0gICAgfSovCi0KLSAgIC8qIHB1YmxpYyB2b2lkIHRlc3RfZ2V0Um9sZXMoKSB7Ci0KLSAgICAgICAgTWV0aG9kUGVybWlzc2lvbiBvYmpNZXRob2RQZXJtaXNzaW9uID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRUxpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZFBlcm1pc3Npb24uZ2V0Um9sZXMoKTsKLSAgICB9Ki8KLQotICAgLyogcHVibGljIHZvaWQgdGVzdF9nZXRNZXRob2RFbGVtZW50c18yKCkgewotCi0gICAgICAgIE1ldGhvZFBlcm1pc3Npb24gb2JqTWV0aG9kUGVybWlzc2lvbiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RQZXJtaXNzaW9uLmdldE1ldGhvZEVsZW1lbnRzKCk7Ci0gICAgfSovCi0KLSAgLyogcHVibGljIHZvaWQgdGVzdF9nZXREZXNjcmlwdGlvbnMoKSB7Ci0KLSAgICAgICAgTWV0aG9kUGVybWlzc2lvbiBvYmpNZXRob2RQZXJtaXNzaW9uID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRUxpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZFBlcm1pc3Npb24uZ2V0RGVzY3JpcHRpb25zKCk7Ci0gICAgfSovICAgCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShNZXRob2RQZXJtaXNzaW9uVGVzdC5jbGFzcyk7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L01ldGhvZFRyYW5zYWN0aW9uVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3Rlc3QvTWV0aG9kVHJhbnNhY3Rpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3ZGQ5OGQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3Rlc3QvTWV0aG9kVHJhbnNhY3Rpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIudGVzdDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Bc3NlbWJseURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kVHJhbnNhY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZTsKLQotcHVibGljIGNsYXNzIE1ldGhvZFRyYW5zYWN0aW9uVGVzdCBleHRlbmRzIEVqYkVNRlRlc3RCYXNlIHsKLQotICAgIC8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIE1ldGhvZFRyYW5zYWN0aW9uVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0X01ldGhvZFRyYW5zYWN0aW9uKCkgewotICAgICAgICBNZXRob2RUcmFuc2FjdGlvbiB0bXBNZXRob2RUcmFuc2FjdGlvbiA9IEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1ldGhvZFRyYW5zYWN0aW9uKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwodG1wTWV0aG9kVHJhbnNhY3Rpb24pOwotICAgIH0gICAKLSAgICAKLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE1ldGhvZEVsZW1lbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLSAgICAJaW5pdCgpOwotICAgIAlFSkJSZXNvdXJjZSBERCA9IChFSkJSZXNvdXJjZSkgZWpiRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0JCUFzc2VtYmx5RGVzY3JpcHRvciBhc3NlbWJseURlc2NyaXB0b3IgPSBERC5nZXRFSkJKYXIoKS5nZXRBc3NlbWJseURlc2NyaXB0b3IoKTsKLQkJYXNzZXJ0Tm90TnVsbChhc3NlbWJseURlc2NyaXB0b3IpOwotCQlMaXN0IGVudGVycHJpc2VCZWFucyA9IERELmdldEVKQkphcigpLmdldEVudGVycHJpc2VCZWFucygpOwotCQlFbnRlcnByaXNlQmVhbiBlYjEgPSAoRW50ZXJwcmlzZUJlYW4pZW50ZXJwcmlzZUJlYW5zLmdldCgwKTsKLQkJLy8gY3JlYXRlIGEgbWV0aG9kIHRyYW5zYWN0aW9uCi0JCU1ldGhvZFRyYW5zYWN0aW9uIG1ldGhvZFRyYW5zYWN0aW9uID0gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZU1ldGhvZFRyYW5zYWN0aW9uKCk7Ci0JCUxpc3QgbWV0aG9kVHJhbnNhY3Rpb25zID0gYXNzZW1ibHlEZXNjcmlwdG9yLmdldE1ldGhvZFRyYW5zYWN0aW9ucygpOwotCQltZXRob2RUcmFuc2FjdGlvbnMuYWRkKG1ldGhvZFRyYW5zYWN0aW9uKTsKLQkJLy8gY3JlYXRlIGEgbWV0aG9kIGVsZW1lbnQKLQkJTWV0aG9kRWxlbWVudCBtZXRob2RFbGVtZW50ID0gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZU1ldGhvZEVsZW1lbnQoKTsKLQkJbWV0aG9kRWxlbWVudC5zZXRFbnRlcnByaXNlQmVhbihlYjEpOwotCQltZXRob2RUcmFuc2FjdGlvbi5nZXRNZXRob2RFbGVtZW50cygpLmFkZChtZXRob2RFbGVtZW50KTsKLQkJLy8gZ2V0IHRoZSBtZXRob2QgZWxlbWVudCBmb3IgdGhlIGVudGVycHJpc2UgYmVhbgotCQlMaXN0IG1ldGhvZEVsZW1lbnRzID0gbWV0aG9kVHJhbnNhY3Rpb24uZ2V0TWV0aG9kRWxlbWVudHMoZWIxKTsKLQkJYXNzZXJ0RXF1YWxzKG1ldGhvZEVsZW1lbnRzLmNvbnRhaW5zKG1ldGhvZEVsZW1lbnQpLCB0cnVlKTsKLQl9Ci0gICAgCi0gICAgLyoqCi0gICAgICogIAotICAgICAqIFtpc3N1ZSA6IFNBIC0gZ2V0TW9zdFNwZWNpZmljTWV0aG9kRWxlbWVudCgpIC0gZG9lcyBpdCBuZWVkIHRvIGJlIGFuIEFQSSBhcyBpdCBjYWxscwotICAgICAqICB0byB0aGUgc3RhdGljIG1lbWJlciBvZiBNZXRob2RFbGVtZW50SW1wbCBdCi0gICAgICoKLSAgICAgKi8KLQotICAvKiAgcHVibGljIHZvaWQgdGVzdF9nZXRNb3N0U3BlY2lmaWNNZXRob2RFbGVtZW50KCkgewotCi0gICAgICAgIE1ldGhvZFRyYW5zYWN0aW9uIG9iak1ldGhvZFRyYW5zYWN0aW9uID0gRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kVHJhbnNhY3Rpb24oKTsKLSAgICAgICAgTWV0aG9kIGFNZXRob2QgPSBudWxsOwotICAgICAgICBNZXRob2RFbGVtZW50IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RUcmFuc2FjdGlvbgotICAgICAgICAgICAgICAgIC5nZXRNb3N0U3BlY2lmaWNNZXRob2RFbGVtZW50KGFNZXRob2QpOwotICAgIH0gKi8KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNFcXVpdmFsZW50KCkgewotCi0gICAgICAgIE1ldGhvZFRyYW5zYWN0aW9uIG9iak1ldGhvZFRyYW5zYWN0aW9uMSA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVNZXRob2RUcmFuc2FjdGlvbigpOwotICAgICAgICBNZXRob2RUcmFuc2FjdGlvbiBvYmpNZXRob2RUcmFuc2FjdGlvbjIgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlTWV0aG9kVHJhbnNhY3Rpb24oKTsKLQotICAgICAgICBvYmpNZXRob2RUcmFuc2FjdGlvbjEuc2V0VHJhbnNhY3Rpb25BdHRyaWJ1dGUoVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlLlNVUFBPUlRTX0xJVEVSQUwpOwotICAgICAgICBvYmpNZXRob2RUcmFuc2FjdGlvbjIuc2V0VHJhbnNhY3Rpb25BdHRyaWJ1dGUoVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlLlNVUFBPUlRTX0xJVEVSQUwpOwotICAgICAKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IG9iak1ldGhvZFRyYW5zYWN0aW9uMS5pc0VxdWl2YWxlbnQob2JqTWV0aG9kVHJhbnNhY3Rpb24yKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLHRydWUpOwotICAgICAgICBvYmpNZXRob2RUcmFuc2FjdGlvbjIuc2V0VHJhbnNhY3Rpb25BdHRyaWJ1dGUoVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlLlJFUVVJUkVEX0xJVEVSQUwpOwotICAgICAgICAKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RUcmFuc2FjdGlvbjEuaXNFcXVpdmFsZW50KG9iak1ldGhvZFRyYW5zYWN0aW9uMik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxmYWxzZSk7Ci0gICAgfQotCi0gIC8qICBwdWJsaWMgdm9pZCB0ZXN0X2dldFRyYW5zYWN0aW9uQXR0cmlidXRlKCkgewotCi0gICAgICAgIE1ldGhvZFRyYW5zYWN0aW9uIG9iak1ldGhvZFRyYW5zYWN0aW9uID0gRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kVHJhbnNhY3Rpb24oKTsKLSAgICAgICAgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RUcmFuc2FjdGlvbi5nZXRUcmFuc2FjdGlvbkF0dHJpYnV0ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0VHJhbnNhY3Rpb25BdHRyaWJ1dGUoKSB7Ci0KLSAgICAgICAgTWV0aG9kVHJhbnNhY3Rpb24gb2JqTWV0aG9kVHJhbnNhY3Rpb24gPSBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXRob2RUcmFuc2FjdGlvbigpOwotICAgICAgICBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgbmV3VHJhbnNhY3Rpb25BdHRyaWJ1dGUgPSBudWxsOwotICAgICAgICBvYmpNZXRob2RUcmFuc2FjdGlvbgotICAgICAgICAgICAgICAgIC5zZXRUcmFuc2FjdGlvbkF0dHJpYnV0ZShuZXdUcmFuc2FjdGlvbkF0dHJpYnV0ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF91bnNldFRyYW5zYWN0aW9uQXR0cmlidXRlKCkgewotCi0gICAgICAgIE1ldGhvZFRyYW5zYWN0aW9uIG9iak1ldGhvZFRyYW5zYWN0aW9uID0gRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kVHJhbnNhY3Rpb24oKTsKLSAgICAgICAgb2JqTWV0aG9kVHJhbnNhY3Rpb24udW5zZXRUcmFuc2FjdGlvbkF0dHJpYnV0ZSgpOwotICAgIH0gCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzU2V0VHJhbnNhY3Rpb25BdHRyaWJ1dGUoKSB7Ci0KLSAgICAgICAgTWV0aG9kVHJhbnNhY3Rpb24gb2JqTWV0aG9kVHJhbnNhY3Rpb24gPSBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXRob2RUcmFuc2FjdGlvbigpOwotICAgICAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kVHJhbnNhY3Rpb24uaXNTZXRUcmFuc2FjdGlvbkF0dHJpYnV0ZSgpOwotICAgIH0KLSovCi0gLyogICBwdWJsaWMgdm9pZCB0ZXN0X2dldERlc2NyaXB0aW9uKCkgewotCi0gICAgICAgIE1ldGhvZFRyYW5zYWN0aW9uIG9iak1ldGhvZFRyYW5zYWN0aW9uID0gRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kVHJhbnNhY3Rpb24oKTsKLSAgICAgICAgU3RyaW5nIHJldFZhbHVlID0gIiI7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kVHJhbnNhY3Rpb24uZ2V0RGVzY3JpcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldERlc2NyaXB0aW9uKCkgewotCi0gICAgICAgIE1ldGhvZFRyYW5zYWN0aW9uIG9iak1ldGhvZFRyYW5zYWN0aW9uID0gRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kVHJhbnNhY3Rpb24oKTsKLSAgICAgICAgU3RyaW5nIG5ld0Rlc2NyaXB0aW9uID0gIiI7Ci0gICAgICAgIG9iak1ldGhvZFRyYW5zYWN0aW9uLnNldERlc2NyaXB0aW9uKG5ld0Rlc2NyaXB0aW9uKTsKLSAgICB9Ki8KLQotIC8qICAgcHVibGljIHZvaWQgdGVzdF9nZXRBc3NlbWJseURlc2NyaXB0b3IoKSB7Ci0KLSAgICAgICAgTWV0aG9kVHJhbnNhY3Rpb24gb2JqTWV0aG9kVHJhbnNhY3Rpb24gPSBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXRob2RUcmFuc2FjdGlvbigpOwotICAgICAgICBBc3NlbWJseURlc2NyaXB0b3IgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZFRyYW5zYWN0aW9uLmdldEFzc2VtYmx5RGVzY3JpcHRvcigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0QXNzZW1ibHlEZXNjcmlwdG9yKCkgewotCi0gICAgICAgIE1ldGhvZFRyYW5zYWN0aW9uIG9iak1ldGhvZFRyYW5zYWN0aW9uID0gRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kVHJhbnNhY3Rpb24oKTsKLSAgICAgICAgQXNzZW1ibHlEZXNjcmlwdG9yIG5ld0Fzc2VtYmx5RGVzY3JpcHRvciA9IG51bGw7Ci0gICAgICAgIG9iak1ldGhvZFRyYW5zYWN0aW9uLnNldEFzc2VtYmx5RGVzY3JpcHRvcihuZXdBc3NlbWJseURlc2NyaXB0b3IpOwotICAgIH0gKi8KLQotICAvKiAgcHVibGljIHZvaWQgdGVzdF9nZXRNZXRob2RFbGVtZW50c18yKCkgewotCi0gICAgICAgIE1ldGhvZFRyYW5zYWN0aW9uIG9iak1ldGhvZFRyYW5zYWN0aW9uID0gRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kVHJhbnNhY3Rpb24oKTsKLSAgICAgICAgRUxpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZFRyYW5zYWN0aW9uLmdldE1ldGhvZEVsZW1lbnRzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXREZXNjcmlwdGlvbnMoKSB7Ci0KLSAgICAgICAgTWV0aG9kVHJhbnNhY3Rpb24gb2JqTWV0aG9kVHJhbnNhY3Rpb24gPSBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXRob2RUcmFuc2FjdGlvbigpOwotICAgICAgICBFTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kVHJhbnNhY3Rpb24uZ2V0RGVzY3JpcHRpb25zKCk7Ci0gICAgfSAqLwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgTWV0aG9kVHJhbnNhY3Rpb25UZXN0KCJ0ZXN0X2lzRXF1aXZhbGVudCIpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgTWV0aG9kVHJhbnNhY3Rpb25UZXN0KCJ0ZXN0X2dldE1ldGhvZEVsZW1lbnRzIikpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotICAgCi0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L1F1ZXJ5TWV0aG9kVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3Rlc3QvUXVlcnlNZXRob2RUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzYTZmZmQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3Rlc3QvUXVlcnlNZXRob2RUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi50ZXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Bc3NlbWJseURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUXVlcnlNZXRob2Q7Ci0KLXB1YmxpYyBjbGFzcyBRdWVyeU1ldGhvZFRlc3QgZXh0ZW5kcyBFamJFTUZUZXN0QmFzZSB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBRdWVyeU1ldGhvZFRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotICAgCi0gIC8qICBwdWJsaWMgdm9pZCB0ZXN0X2dldFF1ZXJ5KCkgewotCi0gICAgICAgIFF1ZXJ5TWV0aG9kIG9ialF1ZXJ5TWV0aG9kID0gRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUXVlcnlNZXRob2QoKTsKLSAgICAgICAgUXVlcnkgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialF1ZXJ5TWV0aG9kLmdldFF1ZXJ5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRRdWVyeSgpIHsKLQotICAgICAgICBRdWVyeU1ldGhvZCBvYmpRdWVyeU1ldGhvZCA9IEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVF1ZXJ5TWV0aG9kKCk7Ci0gICAgICAgIFF1ZXJ5IG5ld1F1ZXJ5ID0gbnVsbDsKLSAgICAgICAgb2JqUXVlcnlNZXRob2Quc2V0UXVlcnkobmV3UXVlcnkpOwotICAgIH0gKi8KLSAgICAKLQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2xpZW50VHlwZUphdmFDbGFzc2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWluaXQoKTsKLQkJRUpCUmVzb3VyY2UgREQgPSAoRUpCUmVzb3VyY2UpIGVqYkZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotCQkKLQkJQXNzZW1ibHlEZXNjcmlwdG9yIGFzc2VtYmx5RGVzY3JpcHRvciA9IERELmdldEVKQkphcigpLmdldEFzc2VtYmx5RGVzY3JpcHRvcigpOwotCQlMaXN0IGVudGVycHJpc2VCZWFucyA9IERELmdldEVKQkphcigpLmdldEVudGVycHJpc2VCZWFucygpOwotCQlDb250YWluZXJNYW5hZ2VkRW50aXR5IGVudGl0eUJlYW4gPSBudWxsOwotCQlFbnRlcnByaXNlQmVhbiBiZWFuID0gbnVsbDsKLQkJZm9yIChpbnQgeD0wOyB4PCBlbnRlcnByaXNlQmVhbnMuc2l6ZSgpOyArK3gpIHsKLQkJCWJlYW4gPSAoRW50ZXJwcmlzZUJlYW4pIGVudGVycHJpc2VCZWFucy5nZXQoeCk7Ci0JCQlpZiAoYmVhbi5pc0VudGl0eSgpICYmIGJlYW4uaXNDb250YWluZXJNYW5hZ2VkRW50aXR5KCkpIHsKLQkJCQllbnRpdHlCZWFuID0gKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpIGJlYW47Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0Tm90TnVsbChlbnRpdHlCZWFuKTsKLQkJUXVlcnlNZXRob2Qgb2JqUXVlcnlNZXRob2QgPWdldEVqYkZhY3RvcnkoKS5jcmVhdGVRdWVyeU1ldGhvZCgpOwotCQlvYmpRdWVyeU1ldGhvZC5zZXROYW1lKFF1ZXJ5TWV0aG9kLlNFTEVDVF9QUkVGSVgrIlRlc3QiKTsKLQkJb2JqUXVlcnlNZXRob2Quc2V0RW50ZXJwcmlzZUJlYW4oZW50aXR5QmVhbik7Ci0JCUphdmFDbGFzc1tdIHJldFZhbHVlID0gb2JqUXVlcnlNZXRob2QuZ2V0Q2xpZW50VHlwZUphdmFDbGFzc2VzKCk7Ci0JCWFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotCQlhc3NlcnRFcXVhbHMocmV0VmFsdWUubGVuZ3RoPT0xLHRydWUgKTsKLQkJYXNzZXJ0RXF1YWxzKHJldFZhbHVlWzBdLGVudGl0eUJlYW4uZ2V0RWpiQ2xhc3MoKSk7Ci0JCQotCQlvYmpRdWVyeU1ldGhvZC5zZXROYW1lKFF1ZXJ5TWV0aG9kLkZJTkRfUFJFRklYKyJUZXN0Iik7Ci0JCQotCQlpZiAoZW50aXR5QmVhbi5oYXNMb2NhbENsaWVudCgpICYmICFlbnRpdHlCZWFuLmhhc1JlbW90ZUNsaWVudCgpKSB7Ci0JCQlyZXRWYWx1ZSA9IG9ialF1ZXJ5TWV0aG9kLmdldENsaWVudFR5cGVKYXZhQ2xhc3NlcygpOwotCQkJYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0JCQlhc3NlcnRFcXVhbHMocmV0VmFsdWUubGVuZ3RoPT0xLHRydWUgKTsKLQkJCWFzc2VydEVxdWFscyhyZXRWYWx1ZVswXSxlbnRpdHlCZWFuLmdldExvY2FsSG9tZUludGVyZmFjZSgpKTsKLQkJfQkKLQkJaWYgKGVudGl0eUJlYW4uaGFzUmVtb3RlQ2xpZW50KCkgJiYgIWVudGl0eUJlYW4uaGFzTG9jYWxDbGllbnQoKSkgewotCQkJcmV0VmFsdWUgPSBvYmpRdWVyeU1ldGhvZC5nZXRDbGllbnRUeXBlSmF2YUNsYXNzZXMoKTsKLQkJCWFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotCQkJYXNzZXJ0RXF1YWxzKHJldFZhbHVlLmxlbmd0aD09MSx0cnVlICk7Ci0JCQlhc3NlcnRFcXVhbHMocmV0VmFsdWVbMF0sZW50aXR5QmVhbi5nZXRIb21lSW50ZXJmYWNlKCkpOwotCQl9Ci0JCWlmIChlbnRpdHlCZWFuLmhhc1JlbW90ZUNsaWVudCgpICYmIGVudGl0eUJlYW4uaGFzTG9jYWxDbGllbnQoKSkgewotCQkJcmV0VmFsdWUgPSBvYmpRdWVyeU1ldGhvZC5nZXRDbGllbnRUeXBlSmF2YUNsYXNzZXMoKTsKLQkJCWFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotCQkJYXNzZXJ0RXF1YWxzKHJldFZhbHVlLmxlbmd0aD09Mix0cnVlICk7Ci0JCQlhc3NlcnRFcXVhbHMocmV0VmFsdWVbMF0sZW50aXR5QmVhbi5nZXRMb2NhbEhvbWVJbnRlcmZhY2UoKSk7Ci0JCQlhc3NlcnRFcXVhbHMocmV0VmFsdWVbMV0sZW50aXR5QmVhbi5nZXRIb21lSW50ZXJmYWNlKCkpOwotCQl9ICAKLQl9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBRdWVyeU1ldGhvZFRlc3QoInRlc3RfZ2V0Q2xpZW50VHlwZUphdmFDbGFzc2VzIikpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQkJCi0JCQotCQotCQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9RdWVyeVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L1F1ZXJ5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjJkNjQ2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L1F1ZXJ5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLnRlc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5RdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUmV0dXJuVHlwZU1hcHBpbmc7Ci0KLXB1YmxpYyBjbGFzcyBRdWVyeVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X1F1ZXJ5KCkgewotICAgICAgICBRdWVyeSB0bXBRdWVyeSA9IEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVF1ZXJ5KCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwodG1wUXVlcnkpOwotICAgIH0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKFF1ZXJ5VGVzdC5jbGFzcyk7Ci0JfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9pc0xvY2FsUmVzdWx0TWFwcGluZygpIHsKLQotICAgICAgICBRdWVyeSBvYmpRdWVyeSA9IEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVF1ZXJ5KCk7Ci0gICAgICAgIG9ialF1ZXJ5LnNldFJldHVyblR5cGVNYXBwaW5nKFJldHVyblR5cGVNYXBwaW5nLkxPQ0FMX0xJVEVSQUwpOwotICAgICAgICBhc3NlcnRFcXVhbHMob2JqUXVlcnkuaXNMb2NhbFJlc3VsdE1hcHBpbmcoKSx0cnVlKTsKLSAgICAgICAgb2JqUXVlcnkuc2V0UmV0dXJuVHlwZU1hcHBpbmcoUmV0dXJuVHlwZU1hcHBpbmcuUkVNT1RFX0xJVEVSQUwpOwotICAgICAgICBhc3NlcnRFcXVhbHMob2JqUXVlcnkuaXNMb2NhbFJlc3VsdE1hcHBpbmcoKSxmYWxzZSk7Ci0gICAgICAgCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9pc1JlbW90ZVJlc3VsdE1hcHBpbmcoKSB7Ci0KLSAgICAJIFF1ZXJ5IG9ialF1ZXJ5ID0gRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUXVlcnkoKTsKLSAgICAgICAgIG9ialF1ZXJ5LnNldFJldHVyblR5cGVNYXBwaW5nKFJldHVyblR5cGVNYXBwaW5nLlJFTU9URV9MSVRFUkFMKTsKLSAgICAgICAgIGFzc2VydEVxdWFscyhvYmpRdWVyeS5pc0xvY2FsUmVzdWx0TWFwcGluZygpLGZhbHNlKTsKLSAgICAgICAgIG9ialF1ZXJ5LnNldFJldHVyblR5cGVNYXBwaW5nKFJldHVyblR5cGVNYXBwaW5nLkxPQ0FMX0xJVEVSQUwpOwotICAgICAgICAgYXNzZXJ0RXF1YWxzKG9ialF1ZXJ5LmlzTG9jYWxSZXN1bHRNYXBwaW5nKCksdHJ1ZSk7Ci0gICAgIAotICAgIH0KLQotIC8qICAgcHVibGljIHZvaWQgdGVzdF9nZXREZXNjcmlwdGlvbigpIHsKLQotICAgICAgICBRdWVyeSBvYmpRdWVyeSA9IEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVF1ZXJ5KCk7Ci0gICAgICAgIFN0cmluZyByZXRWYWx1ZSA9ICIiOwotICAgICAgICByZXRWYWx1ZSA9IG9ialF1ZXJ5LmdldERlc2NyaXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXREZXNjcmlwdGlvbigpIHsKLQotICAgICAgICBRdWVyeSBvYmpRdWVyeSA9IEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVF1ZXJ5KCk7Ci0gICAgICAgIFN0cmluZyBuZXdEZXNjcmlwdGlvbiA9ICIiOwotICAgICAgICBvYmpRdWVyeS5zZXREZXNjcmlwdGlvbihuZXdEZXNjcmlwdGlvbik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRFamJRTCgpIHsKLQotICAgICAgICBRdWVyeSBvYmpRdWVyeSA9IEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVF1ZXJ5KCk7Ci0gICAgICAgIFN0cmluZyByZXRWYWx1ZSA9ICIiOwotICAgICAgICByZXRWYWx1ZSA9IG9ialF1ZXJ5LmdldEVqYlFMKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRFamJRTCgpIHsKLQotICAgICAgICBRdWVyeSBvYmpRdWVyeSA9IEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVF1ZXJ5KCk7Ci0gICAgICAgIFN0cmluZyBuZXdFamJRTCA9ICIiOwotICAgICAgICBvYmpRdWVyeS5zZXRFamJRTChuZXdFamJRTCk7Ci0gICAgfSAqLwotCi0gIC8qICBwdWJsaWMgdm9pZCB0ZXN0X2dldFJldHVyblR5cGVNYXBwaW5nKCkgewotCi0gICAgICAgIFF1ZXJ5IG9ialF1ZXJ5ID0gRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUXVlcnkoKTsKLSAgICAgICAgUmV0dXJuVHlwZU1hcHBpbmcgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialF1ZXJ5LmdldFJldHVyblR5cGVNYXBwaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRSZXR1cm5UeXBlTWFwcGluZygpIHsKLQotICAgICAgICBRdWVyeSBvYmpRdWVyeSA9IEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVF1ZXJ5KCk7Ci0gICAgICAgIFJldHVyblR5cGVNYXBwaW5nIG5ld1JldHVyblR5cGVNYXBwaW5nID0gbnVsbDsKLSAgICAgICAgb2JqUXVlcnkuc2V0UmV0dXJuVHlwZU1hcHBpbmcobmV3UmV0dXJuVHlwZU1hcHBpbmcpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfdW5zZXRSZXR1cm5UeXBlTWFwcGluZygpIHsKLQotICAgICAgICBRdWVyeSBvYmpRdWVyeSA9IEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVF1ZXJ5KCk7Ci0gICAgICAgIG9ialF1ZXJ5LnVuc2V0UmV0dXJuVHlwZU1hcHBpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzU2V0UmV0dXJuVHlwZU1hcHBpbmcoKSB7Ci0KLSAgICAgICAgUXVlcnkgb2JqUXVlcnkgPSBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVRdWVyeSgpOwotICAgICAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqUXVlcnkuaXNTZXRSZXR1cm5UeXBlTWFwcGluZygpOwotICAgIH0qLwotCi0gLyogICBwdWJsaWMgdm9pZCB0ZXN0X2dldFF1ZXJ5TWV0aG9kKCkgewotCi0gICAgICAgIFF1ZXJ5IG9ialF1ZXJ5ID0gRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUXVlcnkoKTsKLSAgICAgICAgUXVlcnlNZXRob2QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialF1ZXJ5LmdldFF1ZXJ5TWV0aG9kKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRRdWVyeU1ldGhvZCgpIHsKLQotICAgICAgICBRdWVyeSBvYmpRdWVyeSA9IEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVF1ZXJ5KCk7Ci0gICAgICAgIFF1ZXJ5TWV0aG9kIG5ld1F1ZXJ5TWV0aG9kID0gbnVsbDsKLSAgICAgICAgb2JqUXVlcnkuc2V0UXVlcnlNZXRob2QobmV3UXVlcnlNZXRob2QpOwotICAgIH0qLwotCi0gIC8qICBwdWJsaWMgdm9pZCB0ZXN0X2dldEVudGl0eSgpIHsKLQotICAgICAgICBRdWVyeSBvYmpRdWVyeSA9IEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVF1ZXJ5KCk7Ci0gICAgICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialF1ZXJ5LmdldEVudGl0eSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0RW50aXR5KCkgewotCi0gICAgICAgIFF1ZXJ5IG9ialF1ZXJ5ID0gRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUXVlcnkoKTsKLSAgICAgICAgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBuZXdFbnRpdHkgPSBudWxsOwotICAgICAgICBvYmpRdWVyeS5zZXRFbnRpdHkobmV3RW50aXR5KTsKLSAgICB9Ki8KLQotICAgIC8qcHVibGljIHZvaWQgdGVzdF9nZXREZXNjcmlwdGlvbnMoKSB7Ci0KLSAgICAgICAgUXVlcnkgb2JqUXVlcnkgPSBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVRdWVyeSgpOwotICAgICAgICBFTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqUXVlcnkuZ2V0RGVzY3JpcHRpb25zKCk7Ci0gICAgfSovCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9TZXNzaW9uVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3Rlc3QvU2Vzc2lvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA3N2ZkMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9TZXNzaW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLnRlc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5TZXNzaW9uOwotCi1wdWJsaWMgY2xhc3MgU2Vzc2lvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQkgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoU2Vzc2lvblRlc3QuY2xhc3MpOwotCX0KLSAKLSAgLyogIHB1YmxpYyB2b2lkIHRlc3RfZ2V0VHJhbnNhY3Rpb25UeXBlKCkgewotCi0gICAgICAgIFNlc3Npb24gb2JqU2Vzc2lvbiA9ICBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZXNzaW9uKCk7Ci0gICAgICAgIFRyYW5zYWN0aW9uVHlwZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqU2Vzc2lvbi5nZXRUcmFuc2FjdGlvblR5cGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFRyYW5zYWN0aW9uVHlwZSgpIHsKLQotICAgICAgICBTZXNzaW9uIG9ialNlc3Npb24gPSAgRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2Vzc2lvbigpOwotICAgICAgICBUcmFuc2FjdGlvblR5cGUgbmV3VHJhbnNhY3Rpb25UeXBlID0gbnVsbDsKLSAgICAgICAgb2JqU2Vzc2lvbi5zZXRUcmFuc2FjdGlvblR5cGUobmV3VHJhbnNhY3Rpb25UeXBlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3Vuc2V0VHJhbnNhY3Rpb25UeXBlKCkgewotCi0gICAgICAgIFNlc3Npb24gb2JqU2Vzc2lvbiA9ICBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZXNzaW9uKCk7Ci0gICAgICAgIG9ialNlc3Npb24udW5zZXRUcmFuc2FjdGlvblR5cGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzU2V0VHJhbnNhY3Rpb25UeXBlKCkgewotCi0gICAgICAgIFNlc3Npb24gb2JqU2Vzc2lvbiA9ICBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZXNzaW9uKCk7Ci0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpTZXNzaW9uLmlzU2V0VHJhbnNhY3Rpb25UeXBlKCk7Ci0gICAgfSovCi0KLSAgIC8qIHB1YmxpYyB2b2lkIHRlc3RfZ2V0U2Vzc2lvblR5cGUoKSB7Ci0KLSAgICAgICAgU2Vzc2lvbiBvYmpTZXNzaW9uID0gIEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlc3Npb24oKTsKLSAgICAgICAgU2Vzc2lvblR5cGUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialNlc3Npb24uZ2V0U2Vzc2lvblR5cGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFNlc3Npb25UeXBlKCkgewotCi0gICAgICAgIFNlc3Npb24gb2JqU2Vzc2lvbiA9ICBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZXNzaW9uKCk7Ci0gICAgICAgIFNlc3Npb25UeXBlIG5ld1Nlc3Npb25UeXBlID0gbnVsbDsKLSAgICAgICAgb2JqU2Vzc2lvbi5zZXRTZXNzaW9uVHlwZShuZXdTZXNzaW9uVHlwZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF91bnNldFNlc3Npb25UeXBlKCkgewotCi0gICAgICAgIFNlc3Npb24gb2JqU2Vzc2lvbiA9ICBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZXNzaW9uKCk7Ci0gICAgICAgIG9ialNlc3Npb24udW5zZXRTZXNzaW9uVHlwZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNTZXRTZXNzaW9uVHlwZSgpIHsKLQotICAgICAgICBTZXNzaW9uIG9ialNlc3Npb24gPSAgRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2Vzc2lvbigpOwotICAgICAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqU2Vzc2lvbi5pc1NldFNlc3Npb25UeXBlKCk7Ci0gICAgfSovCi0KLSAgLyogIHB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VydmljZUVuZHBvaW50KCkgewotCi0gICAgICAgIFNlc3Npb24gb2JqU2Vzc2lvbiA9ICBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZXNzaW9uKCk7Ci0gICAgICAgIEphdmFDbGFzcyByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqU2Vzc2lvbi5nZXRTZXJ2aWNlRW5kcG9pbnQoKTsKLSAgICB9Ci0KLSAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VydmljZUVuZHBvaW50KCkgewotCi0gICAgICAgIFNlc3Npb24gb2JqU2Vzc2lvbiA9ICBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZXNzaW9uKCk7Ci0gICAgICAgIEphdmFDbGFzcyBuZXdTZXJ2aWNlRW5kcG9pbnQgPSBudWxsOwotICAgICAgICBvYmpTZXNzaW9uLnNldFNlcnZpY2VFbmRwb2ludChuZXdTZXJ2aWNlRW5kcG9pbnQpOwotICAgIH0qLwotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VydmljZUVuZHBvaW50TmFtZSgpIHsKLQotICAgICAgICBTZXNzaW9uIG9ialNlc3Npb24gPSAgRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZVNlc3Npb24oKTsKLSAgICAgICAgU3RyaW5nIHNlcnZpY2VFbmRwb2ludE5hbWUgPSAiU2Vzc2lvbkVuZFBvaW50MSI7Ci0gICAgICAgIG9ialNlc3Npb24uc2V0U2VydmljZUVuZHBvaW50TmFtZShzZXJ2aWNlRW5kcG9pbnROYW1lKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHNlcnZpY2VFbmRwb2ludE5hbWUsb2JqU2Vzc2lvbi5nZXRTZXJ2aWNlRW5kcG9pbnROYW1lKCkpOwotICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfaGFzU2VydmljZUVuZHBvaW50KCkgewotCi0gICAgICAgIFNlc3Npb24gb2JqU2Vzc2lvbiA9ICBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZXNzaW9uKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhvYmpTZXNzaW9uLmhhc1NlcnZpY2VFbmRwb2ludCgpLGZhbHNlKTsKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2VydmljZUVuZHBvaW50TmFtZSA9ICJTZXNzaW9uRW5kUG9pbnQxIjsKLSAgICAgICAgb2JqU2Vzc2lvbi5zZXRTZXJ2aWNlRW5kcG9pbnROYW1lKHNlcnZpY2VFbmRwb2ludE5hbWUpOwotICAgICAgICByZXRWYWx1ZSA9IG9ialNlc3Npb24uaGFzU2VydmljZUVuZHBvaW50KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhvYmpTZXNzaW9uLmhhc1NlcnZpY2VFbmRwb2ludCgpLHRydWUpOwotICAgICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFNlcnZpY2VFbmRwb2ludE5hbWUoKSB7Ci0KLQkgICBTZXNzaW9uIG9ialNlc3Npb24gPSAgRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZVNlc3Npb24oKTsKLSAgICAgICBTdHJpbmcgc2VydmljZUVuZHBvaW50TmFtZSA9ICJTZXNzaW9uRW5kUG9pbnQxIjsKLSAgICAgICBvYmpTZXNzaW9uLnNldFNlcnZpY2VFbmRwb2ludE5hbWUoc2VydmljZUVuZHBvaW50TmFtZSk7Ci0gICAgICAgYXNzZXJ0RXF1YWxzKHNlcnZpY2VFbmRwb2ludE5hbWUsb2JqU2Vzc2lvbi5nZXRTZXJ2aWNlRW5kcG9pbnROYW1lKCkpOwotICAgICAKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS90ZXN0L0Nvbm5lY3RvclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS90ZXN0L0Nvbm5lY3RvclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE3YzhkNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvdGVzdC9Db25uZWN0b3JUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS50ZXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuZW1mdGVzdHMuUmFyRU1GVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLnRlc3R1dGlsaXRpZXMuRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0b3JSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZTsKLQotcHVibGljIGNsYXNzIENvbm5lY3RvclRlc3QgZXh0ZW5kcyBSYXJFTUZUZXN0IHsKLQotICAgIC8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIENvbm5lY3RvclRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIENvbm5lY3RvciBnZXRJbnN0YW5jZSgpIHsKLSAgICAJcmV0dXJuIEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldEpjYUZhY3RvcnkoKS5jcmVhdGVDb25uZWN0b3IoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFZlcnNpb25JRCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIAlFTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yLnJlc2V0KCk7Ci0JCWNyZWF0ZUVBUigpOwotCQljcmVhdGVSQVIoKTsKLQotCQlDb25uZWN0b3JSZXNvdXJjZSBERCA9IChDb25uZWN0b3JSZXNvdXJjZSkgcmFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0JCURELnNldFZlcnNpb25JRChKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCk7Ci0JCXNldFZlcnNpb24oVkVSU0lPTl8xXzQpOwotCQlpbnQgdmVyc2lvbklEID0gREQuZ2V0Q29ubmVjdG9yKCkuZ2V0VmVyc2lvbklEKCk7Ci0JCWFzc2VydEVxdWFscyh2ZXJzaW9uSUQsSjJFRVZlcnNpb25Db25zdGFudHMuSkNBXzFfNV9JRCk7Ci0JCQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IENvbm5lY3RvclRlc3QoInRlc3RfZ2V0VmVyc2lvbklEIikpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS90ZXN0L0pjYUZhY3RvcnlUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvdGVzdC9KY2FGYWN0b3J5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODkwNTkzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS90ZXN0L0pjYUZhY3RvcnlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudGVzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkFjdGl2YXRpb25TcGVjOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BZG1pbk9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQXV0aGVudGljYXRpb25NZWNoYW5pc207Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbmZpZ1Byb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5JbmJvdW5kUmVzb3VyY2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5MaWNlbnNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5NZXNzYWdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuTWVzc2FnZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5PdXRib3VuZFJlc291cmNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlJlc291cmNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuU2VjdXJpdHlQZXJtaXNzaW9uOwotCi1wdWJsaWMgY2xhc3MgSmNhRmFjdG9yeVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIEpjYUZhY3RvcnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRKY2FGYWN0b3J5KCk7Ci0JfQotICAgIHB1YmxpYyB2b2lkIHRlc3RfSmNhRmFjdG9yeSgpIHsKLQotICAgICAgICBKY2FGYWN0b3J5IHRtcEpjYUZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKEpjYUZhY3RvcnlUZXN0LmNsYXNzKTsKLQl9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUNvbm5lY3RvcigpIHsKLQotICAgICAgICBKY2FGYWN0b3J5IG9iakpjYUZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBDb25uZWN0b3IgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakpjYUZhY3RvcnkuY3JlYXRlQ29ubmVjdG9yKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlTGljZW5zZSgpIHsKLQotICAgICAgICBKY2FGYWN0b3J5IG9iakpjYUZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBMaWNlbnNlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpKY2FGYWN0b3J5LmNyZWF0ZUxpY2Vuc2UoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVJbmJvdW5kUmVzb3VyY2VBZGFwdGVyKCkgewotCi0gICAgICAgIEpjYUZhY3Rvcnkgb2JqSmNhRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEluYm91bmRSZXNvdXJjZUFkYXB0ZXIgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakpjYUZhY3RvcnkuY3JlYXRlSW5ib3VuZFJlc291cmNlQWRhcHRlcigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZU91dGJvdW5kUmVzb3VyY2VBZGFwdGVyKCkgewotCi0gICAgICAgIEpjYUZhY3Rvcnkgb2JqSmNhRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpKY2FGYWN0b3J5LmNyZWF0ZU91dGJvdW5kUmVzb3VyY2VBZGFwdGVyKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlTWVzc2FnZUFkYXB0ZXIoKSB7Ci0KLSAgICAgICAgSmNhRmFjdG9yeSBvYmpKY2FGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgTWVzc2FnZUFkYXB0ZXIgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakpjYUZhY3RvcnkuY3JlYXRlTWVzc2FnZUFkYXB0ZXIoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVDb25uZWN0aW9uRGVmaW5pdGlvbigpIHsKLQotICAgICAgICBKY2FGYWN0b3J5IG9iakpjYUZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBDb25uZWN0aW9uRGVmaW5pdGlvbiByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqSmNhRmFjdG9yeS5jcmVhdGVDb25uZWN0aW9uRGVmaW5pdGlvbigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUFkbWluT2JqZWN0KCkgewotCi0gICAgICAgIEpjYUZhY3Rvcnkgb2JqSmNhRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEFkbWluT2JqZWN0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpKY2FGYWN0b3J5LmNyZWF0ZUFkbWluT2JqZWN0KCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlTWVzc2FnZUxpc3RlbmVyKCkgewotCi0gICAgICAgIEpjYUZhY3Rvcnkgb2JqSmNhRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIE1lc3NhZ2VMaXN0ZW5lciByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqSmNhRmFjdG9yeS5jcmVhdGVNZXNzYWdlTGlzdGVuZXIoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVBY3RpdmF0aW9uU3BlYygpIHsKLQotICAgICAgICBKY2FGYWN0b3J5IG9iakpjYUZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBBY3RpdmF0aW9uU3BlYyByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqSmNhRmFjdG9yeS5jcmVhdGVBY3RpdmF0aW9uU3BlYygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZVJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlKCkgewotCi0gICAgICAgIEpjYUZhY3Rvcnkgb2JqSmNhRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpKY2FGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlUmVzb3VyY2VBZGFwdGVyKCkgewotCi0gICAgICAgIEpjYUZhY3Rvcnkgb2JqSmNhRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFJlc291cmNlQWRhcHRlciByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqSmNhRmFjdG9yeS5jcmVhdGVSZXNvdXJjZUFkYXB0ZXIoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVTZWN1cml0eVBlcm1pc3Npb24oKSB7Ci0KLSAgICAgICAgSmNhRmFjdG9yeSBvYmpKY2FGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU2VjdXJpdHlQZXJtaXNzaW9uIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpKY2FGYWN0b3J5LmNyZWF0ZVNlY3VyaXR5UGVybWlzc2lvbigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKCkgewotCi0gICAgICAgIEpjYUZhY3Rvcnkgb2JqSmNhRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpKY2FGYWN0b3J5LmNyZWF0ZUF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlQ29uZmlnUHJvcGVydHkoKSB7Ci0KLSAgICAgICAgSmNhRmFjdG9yeSBvYmpKY2FGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgQ29uZmlnUHJvcGVydHkgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakpjYUZhY3RvcnkuY3JlYXRlQ29uZmlnUHJvcGVydHkoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRKY2FQYWNrYWdlKCkgewotCi0gICAgICAgIEpjYUZhY3Rvcnkgb2JqSmNhRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEpjYVBhY2thZ2UgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakpjYUZhY3RvcnkuZ2V0SmNhUGFja2FnZSgpOwotICAgICAgIAotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pzcC90ZXN0L0pzcEZhY3RvcnlUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9qc3AvdGVzdC9Kc3BGYWN0b3J5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjFmOTg3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pzcC90ZXN0L0pzcEZhY3RvcnlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC50ZXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudGVzdC5KY2FGYWN0b3J5VGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BQcm9wZXJ0eUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5UYWdMaWJSZWZUeXBlOwotCi1wdWJsaWMgY2xhc3MgSnNwRmFjdG9yeVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKEpjYUZhY3RvcnlUZXN0LmNsYXNzKTsKLQl9Ci0JCi0JcHJpdmF0ZSBKc3BGYWN0b3J5IGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gSnNwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SnNwRmFjdG9yeSgpOwotCX0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUpTUENvbmZpZygpIHsKLQotICAgICAgICBKc3BGYWN0b3J5IG9iakpzcEZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBKU1BDb25maWcgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakpzcEZhY3RvcnkuY3JlYXRlSlNQQ29uZmlnKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlSlNQUHJvcGVydHlHcm91cCgpIHsKLQotICAgICAgICBKc3BGYWN0b3J5IG9iakpzcEZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBKU1BQcm9wZXJ0eUdyb3VwIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpKc3BGYWN0b3J5LmNyZWF0ZUpTUFByb3BlcnR5R3JvdXAoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVUYWdMaWJSZWZUeXBlKCkgewotCi0gICAgICAgIEpzcEZhY3Rvcnkgb2JqSnNwRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFRhZ0xpYlJlZlR5cGUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakpzcEZhY3RvcnkuY3JlYXRlVGFnTGliUmVmVHlwZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEpzcFBhY2thZ2UoKSB7Ci0KLSAgICAgICAgSnNwRmFjdG9yeSBvYmpKc3BGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgSnNwUGFja2FnZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqSnNwRmFjdG9yeS5nZXRKc3BQYWNrYWdlKCk7Ci0gICAgICAgIC8vIFRPRE8gZ2V0V3NkZFBhY2thZ2UgbWV0aG9kIGFsd2F5cyByZXR1cm4gbnVsbAotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL3Rlc3QvV2ViYXBwbGljYXRpb25GYWN0b3J5VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vdGVzdC9XZWJhcHBsaWNhdGlvbkZhY3RvcnlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzZDBhMWQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vdGVzdC9XZWJhcHBsaWNhdGlvbkZhY3RvcnlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi50ZXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5BdXRoQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Db250ZXh0UGFyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRXJyb3JDb2RlRXJyb3JQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkVycm9yUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5FeGNlcHRpb25UeXBlRXJyb3JQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5GaWx0ZXJNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkZvcm1Mb2dpbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5IVFRQTWV0aG9kVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Jbml0UGFyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uSlNQVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Mb2NhbEVuY29kaW5nTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Mb2NhbEVuY29kaW5nTWFwcGluZ0xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTG9naW5Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTWltZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uUm9sZU5hbWVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlY3VyaXR5Q29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlc3Npb25Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uVGFnTGliUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlVSTFBhdHRlcm5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlVzZXJEYXRhQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViUmVzb3VyY2VDb2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2VsY29tZUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2VsY29tZUZpbGVMaXN0OwotCi1wdWJsaWMgY2xhc3MgV2ViYXBwbGljYXRpb25GYWN0b3J5VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoV2ViYXBwbGljYXRpb25GYWN0b3J5VGVzdC5jbGFzcyk7Ci0JfQotCQotCXByaXZhdGUgV2ViYXBwbGljYXRpb25GYWN0b3J5IGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJhcHBsaWNhdGlvbkZhY3RvcnkoKTsKLQl9Ci0JCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVXZWJBcHAoKSB7Ci0KLSAgICAgICAgV2ViYXBwbGljYXRpb25GYWN0b3J5IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFdlYkFwcCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5LmNyZWF0ZVdlYkFwcCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUNvbnRleHRQYXJhbSgpIHsKLQotICAgICAgICBXZWJhcHBsaWNhdGlvbkZhY3Rvcnkgb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgQ29udGV4dFBhcmFtIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkuY3JlYXRlQ29udGV4dFBhcmFtKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlRXJyb3JQYWdlKCkgewotCi0gICAgICAgIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBFcnJvclBhZ2UgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeS5jcmVhdGVFcnJvclBhZ2UoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVUYWdMaWJSZWYoKSB7Ci0KLSAgICAgICAgV2ViYXBwbGljYXRpb25GYWN0b3J5IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFRhZ0xpYlJlZiByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5LmNyZWF0ZVRhZ0xpYlJlZigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUV4Y2VwdGlvblR5cGVFcnJvclBhZ2UoKSB7Ci0KLSAgICAgICAgV2ViYXBwbGljYXRpb25GYWN0b3J5IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEV4Y2VwdGlvblR5cGVFcnJvclBhZ2UgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeS5jcmVhdGVFeGNlcHRpb25UeXBlRXJyb3JQYWdlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlRXJyb3JDb2RlRXJyb3JQYWdlKCkgewotCi0gICAgICAgIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBFcnJvckNvZGVFcnJvclBhZ2UgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeS5jcmVhdGVFcnJvckNvZGVFcnJvclBhZ2UoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVXZWxjb21lRmlsZUxpc3QoKSB7Ci0KLSAgICAgICAgV2ViYXBwbGljYXRpb25GYWN0b3J5IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFdlbGNvbWVGaWxlTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5LmNyZWF0ZVdlbGNvbWVGaWxlTGlzdCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZVdlbGNvbWVGaWxlKCkgewotCi0gICAgICAgIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBXZWxjb21lRmlsZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5LmNyZWF0ZVdlbGNvbWVGaWxlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlU2VjdXJpdHlDb25zdHJhaW50KCkgewotCi0gICAgICAgIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTZWN1cml0eUNvbnN0cmFpbnQgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeS5jcmVhdGVTZWN1cml0eUNvbnN0cmFpbnQoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVXZWJSZXNvdXJjZUNvbGxlY3Rpb24oKSB7Ci0KLSAgICAgICAgV2ViYXBwbGljYXRpb25GYWN0b3J5IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFdlYlJlc291cmNlQ29sbGVjdGlvbiByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5LmNyZWF0ZVdlYlJlc291cmNlQ29sbGVjdGlvbigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZVVSTFBhdHRlcm5UeXBlKCkgewotCi0gICAgICAgIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBVUkxQYXR0ZXJuVHlwZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5LmNyZWF0ZVVSTFBhdHRlcm5UeXBlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlQXV0aENvbnN0cmFpbnQoKSB7Ci0KLSAgICAgICAgV2ViYXBwbGljYXRpb25GYWN0b3J5IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEF1dGhDb25zdHJhaW50IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkuY3JlYXRlQXV0aENvbnN0cmFpbnQoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVVc2VyRGF0YUNvbnN0cmFpbnQoKSB7Ci0KLSAgICAgICAgV2ViYXBwbGljYXRpb25GYWN0b3J5IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFVzZXJEYXRhQ29uc3RyYWludCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5LmNyZWF0ZVVzZXJEYXRhQ29uc3RyYWludCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUxvZ2luQ29uZmlnKCkgewotCi0gICAgICAgIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBMb2dpbkNvbmZpZyByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5LmNyZWF0ZUxvZ2luQ29uZmlnKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlRm9ybUxvZ2luQ29uZmlnKCkgewotCi0gICAgICAgIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBGb3JtTG9naW5Db25maWcgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeS5jcmVhdGVGb3JtTG9naW5Db25maWcoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVNaW1lTWFwcGluZygpIHsKLQotICAgICAgICBXZWJhcHBsaWNhdGlvbkZhY3Rvcnkgb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgTWltZU1hcHBpbmcgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeS5jcmVhdGVNaW1lTWFwcGluZygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZVNlc3Npb25Db25maWcoKSB7Ci0KLSAgICAgICAgV2ViYXBwbGljYXRpb25GYWN0b3J5IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFNlc3Npb25Db25maWcgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeS5jcmVhdGVTZXNzaW9uQ29uZmlnKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlU2VydmxldE1hcHBpbmcoKSB7Ci0KLSAgICAgICAgV2ViYXBwbGljYXRpb25GYWN0b3J5IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFNlcnZsZXRNYXBwaW5nIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkuY3JlYXRlU2VydmxldE1hcHBpbmcoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVTZXJ2bGV0KCkgewotCi0gICAgICAgIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTZXJ2bGV0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkuY3JlYXRlU2VydmxldCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZVNlcnZsZXRUeXBlKCkgewotCi0gICAgICAgIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTZXJ2bGV0VHlwZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5LmNyZWF0ZVNlcnZsZXRUeXBlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlSlNQVHlwZSgpIHsKLQotICAgICAgICBXZWJhcHBsaWNhdGlvbkZhY3Rvcnkgb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgSlNQVHlwZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5LmNyZWF0ZUpTUFR5cGUoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVJbml0UGFyYW0oKSB7Ci0KLSAgICAgICAgV2ViYXBwbGljYXRpb25GYWN0b3J5IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEluaXRQYXJhbSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5LmNyZWF0ZUluaXRQYXJhbSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUZpbHRlcigpIHsKLQotICAgICAgICBXZWJhcHBsaWNhdGlvbkZhY3Rvcnkgb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRmlsdGVyIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkuY3JlYXRlRmlsdGVyKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlRmlsdGVyTWFwcGluZygpIHsKLQotICAgICAgICBXZWJhcHBsaWNhdGlvbkZhY3Rvcnkgb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRmlsdGVyTWFwcGluZyByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5LmNyZWF0ZUZpbHRlck1hcHBpbmcoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QoKSB7Ci0KLSAgICAgICAgV2ViYXBwbGljYXRpb25GYWN0b3J5IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5Ci0gICAgICAgICAgICAgICAgLmNyZWF0ZUxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUxvY2FsRW5jb2RpbmdNYXBwaW5nKCkgewotCi0gICAgICAgIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBMb2NhbEVuY29kaW5nTWFwcGluZyByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5LmNyZWF0ZUxvY2FsRW5jb2RpbmdNYXBwaW5nKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlSFRUUE1ldGhvZFR5cGUoKSB7Ci0KLSAgICAgICAgV2ViYXBwbGljYXRpb25GYWN0b3J5IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEhUVFBNZXRob2RUeXBlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkuY3JlYXRlSFRUUE1ldGhvZFR5cGUoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVSb2xlTmFtZVR5cGUoKSB7Ci0KLSAgICAgICAgV2ViYXBwbGljYXRpb25GYWN0b3J5IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFJvbGVOYW1lVHlwZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5LmNyZWF0ZVJvbGVOYW1lVHlwZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFdlYmFwcGxpY2F0aW9uUGFja2FnZSgpIHsKLQotICAgICAgICBXZWJhcHBsaWNhdGlvbkZhY3Rvcnkgb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgV2ViYXBwbGljYXRpb25QYWNrYWdlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkuZ2V0V2ViYXBwbGljYXRpb25QYWNrYWdlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi90ZXN0L1dzY29tbW9uRmFjdG9yeVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vdGVzdC9Xc2NvbW1vbkZhY3RvcnlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhNzY0ZmUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi90ZXN0L1dzY29tbW9uRmFjdG9yeVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi50ZXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkRlc2NyaXB0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkRpc3BsYXlOYW1lVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkluaXRQYXJhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLlBvcnROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uU09BUEhlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLlNPQVBSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25QYWNrYWdlOwotCi1wdWJsaWMgY2xhc3MgV3Njb21tb25GYWN0b3J5VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoV3Njb21tb25GYWN0b3J5VGVzdC5jbGFzcyk7Ci0JfQotCQotCXByaXZhdGUgV3Njb21tb25GYWN0b3J5IGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gV3Njb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXc2NvbW1vbkZhY3RvcnkoKTsKLQl9Ci0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVJbml0UGFyYW0oKSB7Ci0KLSAgICAgICAgV3Njb21tb25GYWN0b3J5IG9ialdzY29tbW9uRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEluaXRQYXJhbSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqV3Njb21tb25GYWN0b3J5LmNyZWF0ZUluaXRQYXJhbSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZVNPQVBIZWFkZXIoKSB7Ci0KLSAgICAgICAgV3Njb21tb25GYWN0b3J5IG9ialdzY29tbW9uRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFNPQVBIZWFkZXIgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdzY29tbW9uRmFjdG9yeS5jcmVhdGVTT0FQSGVhZGVyKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlU09BUFJvbGUoKSB7Ci0KLSAgICAgICAgV3Njb21tb25GYWN0b3J5IG9ialdzY29tbW9uRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFNPQVBSb2xlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpXc2NvbW1vbkZhY3RvcnkuY3JlYXRlU09BUFJvbGUoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVQb3J0TmFtZSgpIHsKLQotICAgICAgICBXc2NvbW1vbkZhY3Rvcnkgb2JqV3Njb21tb25GYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgUG9ydE5hbWUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdzY29tbW9uRmFjdG9yeS5jcmVhdGVQb3J0TmFtZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZURlc2NyaXB0aW9uVHlwZSgpIHsKLQotICAgICAgICBXc2NvbW1vbkZhY3Rvcnkgb2JqV3Njb21tb25GYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRGVzY3JpcHRpb25UeXBlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpXc2NvbW1vbkZhY3RvcnkuY3JlYXRlRGVzY3JpcHRpb25UeXBlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlRGlzcGxheU5hbWVUeXBlKCkgewotCi0gICAgICAgIFdzY29tbW9uRmFjdG9yeSBvYmpXc2NvbW1vbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBEaXNwbGF5TmFtZVR5cGUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdzY29tbW9uRmFjdG9yeS5jcmVhdGVEaXNwbGF5TmFtZVR5cGUoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRXc2NvbW1vblBhY2thZ2UoKSB7Ci0KLSAgICAgICAgV3Njb21tb25GYWN0b3J5IG9ialdzY29tbW9uRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFdzY29tbW9uUGFja2FnZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqV3Njb21tb25GYWN0b3J5LmdldFdzY29tbW9uUGFja2FnZSgpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvdGVzdC9Xc2RkRmFjdG9yeVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC90ZXN0L1dzZGRGYWN0b3J5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjEwYWI4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC90ZXN0L1dzZGRGYWN0b3J5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLnRlc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5CZWFuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuRUpCTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuU2VydmljZUltcGxCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2bGV0TGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV1NETFBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZTsKLQotcHVibGljIGNsYXNzIFdzZGRGYWN0b3J5VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoV3NkZEZhY3RvcnlUZXN0LmNsYXNzKTsKLQl9Ci0JCi0JcHJpdmF0ZSBXc2RkRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRXc2RkRmFjdG9yeSgpOwotCX0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZVdlYlNlcnZpY2VzKCkgewotCi0gICAgICAgIFdzZGRGYWN0b3J5IG9ialdzZGRGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgV2ViU2VydmljZXMgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdzZGRGYWN0b3J5LmNyZWF0ZVdlYlNlcnZpY2VzKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlV2ViU2VydmljZURlc2NyaXB0aW9uKCkgewotCi0gICAgICAgIFdzZGRGYWN0b3J5IG9ialdzZGRGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgV2ViU2VydmljZURlc2NyaXB0aW9uIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpXc2RkRmFjdG9yeS5jcmVhdGVXZWJTZXJ2aWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVQb3J0Q29tcG9uZW50KCkgewotCi0gICAgICAgIFdzZGRGYWN0b3J5IG9ialdzZGRGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgUG9ydENvbXBvbmVudCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqV3NkZEZhY3RvcnkuY3JlYXRlUG9ydENvbXBvbmVudCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZVdTRExQb3J0KCkgewotCi0gICAgICAgIFdzZGRGYWN0b3J5IG9ialdzZGRGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgV1NETFBvcnQgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdzZGRGYWN0b3J5LmNyZWF0ZVdTRExQb3J0KCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlU2VydmljZUltcGxCZWFuKCkgewotCi0gICAgICAgIFdzZGRGYWN0b3J5IG9ialdzZGRGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU2VydmljZUltcGxCZWFuIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpXc2RkRmFjdG9yeS5jcmVhdGVTZXJ2aWNlSW1wbEJlYW4oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVTZXJ2bGV0TGluaygpIHsKLQotICAgICAgICBXc2RkRmFjdG9yeSBvYmpXc2RkRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFNlcnZsZXRMaW5rIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpXc2RkRmFjdG9yeS5jcmVhdGVTZXJ2bGV0TGluaygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUVKQkxpbmsoKSB7Ci0KLSAgICAgICAgV3NkZEZhY3Rvcnkgb2JqV3NkZEZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBFSkJMaW5rIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpXc2RkRmFjdG9yeS5jcmVhdGVFSkJMaW5rKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlSGFuZGxlcigpIHsKLQotICAgICAgICBXc2RkRmFjdG9yeSBvYmpXc2RkRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEhhbmRsZXIgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdzZGRGYWN0b3J5LmNyZWF0ZUhhbmRsZXIoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVCZWFuTGluaygpIHsKLQotICAgICAgICBXc2RkRmFjdG9yeSBvYmpXc2RkRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEJlYW5MaW5rIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpXc2RkRmFjdG9yeS5jcmVhdGVCZWFuTGluaygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9vdXQueG1pIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9vdXQueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2QzMGMzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvb3V0LnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJBU0NJSSI/Pg0KLTxvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YTpKYXZhQ2xhc3MgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YT0iamF2YS54bWkiIG5hbWU9IkEiIGtpbmQ9IkNMQVNTIiBwdWJsaWM9InRydWUiPg0KLSAgPGVTdXBlclR5cGVzIGhyZWY9ImphdmE6L2phdmEubGFuZyNPYmplY3QiLz4NCi0gIDxpbXBsZW1lbnRzSW50ZXJmYWNlcyBocmVmPSJqYXZhOi9jb20uaWJtLmV0b29scy5qYXZhLnN0cmVzc1NhbXBsZSNJQSIvPg0KLSAgPGZpZWxkcyBuYW1lPSJhbkEiIGVUeXBlPSIvIi8+DQotICA8ZmllbGRzIG5hbWU9ImFCIj4NCi0gICAgPGVUeXBlIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YTpKYXZhQ2xhc3MiIGhyZWY9ImphdmE6L2NvbS5pYm0uZXRvb2xzLmphdmEuc3RyZXNzU2FtcGxlI0IiLz4NCi0gIDwvZmllbGRzPg0KLSAgPGZpZWxkcyBuYW1lPSJiZWVzIj4NCi0gICAgPGVUeXBlIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YTpBcnJheVR5cGUiIGhyZWY9ImphdmE6L2NvbS5pYm0uZXRvb2xzLmphdmEuc3RyZXNzU2FtcGxlI0JbXSIvPg0KLSAgPC9maWVsZHM+DQotICA8ZmllbGRzIG5hbWU9ImJlZXNfYW5kX2JlZXMiPg0KLSAgICA8ZVR5cGUgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhOkFycmF5VHlwZSIgaHJlZj0iamF2YTovY29tLmlibS5ldG9vbHMuamF2YS5zdHJlc3NTYW1wbGUjQltdW10iLz4NCi0gIDwvZmllbGRzPg0KLSAgPGZpZWxkcyBuYW1lPSJpbnRzIj4NCi0gICAgPGVUeXBlIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YTpBcnJheVR5cGUiIGhyZWY9ImphdmE6LyNpbnRbXSIvPg0KLSAgPC9maWVsZHM+DQotICA8ZmllbGRzIG5hbWU9ImludHMyIj4NCi0gICAgPGVUeXBlIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YTpBcnJheVR5cGUiIGhyZWY9ImphdmE6LyNpbnRbXVtdIi8+DQotICA8L2ZpZWxkcz4NCi0gIDxmaWVsZHMgbmFtZT0iaW50czMiPg0KLSAgICA8ZVR5cGUgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhOkFycmF5VHlwZSIgaHJlZj0iamF2YTovI2ludFtdW11bXSIvPg0KLSAgPC9maWVsZHM+DQotICA8ZmllbGRzIG5hbWU9ImNoYXJzIj4NCi0gICAgPGVUeXBlIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YTpBcnJheVR5cGUiIGhyZWY9ImphdmE6LyNjaGFyW10iLz4NCi0gIDwvZmllbGRzPg0KLSAgPGZpZWxkcyBuYW1lPSJmbG9hdHMiPg0KLSAgICA8ZVR5cGUgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhOkFycmF5VHlwZSIgaHJlZj0iamF2YTovI2Zsb2F0W10iLz4NCi0gIDwvZmllbGRzPg0KLSAgPGZpZWxkcyBuYW1lPSJjb29scyI+DQotICAgIDxlVHlwZSB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmE6QXJyYXlUeXBlIiBocmVmPSJqYXZhOi8jYm9vbGVhbltdIi8+DQotICA8L2ZpZWxkcz4NCi0gIDxmaWVsZHMgbmFtZT0iZG91YmxlcyI+DQotICAgIDxlVHlwZSB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmE6QXJyYXlUeXBlIiBocmVmPSJqYXZhOi8jZG91YmxlW10iLz4NCi0gIDwvZmllbGRzPg0KLSAgPGZpZWxkcyBuYW1lPSJsb25ncyI+DQotICAgIDxlVHlwZSB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmE6QXJyYXlUeXBlIiBocmVmPSJqYXZhOi8jbG9uZ1tdIi8+DQotICA8L2ZpZWxkcz4NCi0gIDxmaWVsZHMgbmFtZT0ic2hvcnRzIj4NCi0gICAgPGVUeXBlIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YTpBcnJheVR5cGUiIGhyZWY9ImphdmE6LyNzaG9ydFtdIi8+DQotICA8L2ZpZWxkcz4NCi0gIDxmaWVsZHMgbmFtZT0iYnl0ZXMiPg0KLSAgICA8ZVR5cGUgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhOkFycmF5VHlwZSIgaHJlZj0iamF2YTovI2J5dGVbXSIvPg0KLSAgPC9maWVsZHM+DQotICA8ZmllbGRzIG5hbWU9InRlc3RTdHJpbmciIGZpbmFsPSJ0cnVlIiBzdGF0aWM9InRydWUiPg0KLSAgICA8ZVR5cGUgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhOkphdmFDbGFzcyIgaHJlZj0iamF2YTovamF2YS5sYW5nI1N0cmluZyIvPg0KLSAgICA8aW5pdGlhbGl6ZXIgc291cmNlPSImcXVvdDt0ZXN0aW5nJnF1b3Q7IiBuYW1lPSJ0ZXN0U3RyaW5nX2Jsb2NrIi8+DQotICA8L2ZpZWxkcz4NCi0gIDxtZXRob2RzIG5hbWU9ImRvQWxsUHJpbWl0aXZlcyI+DQotICAgIDxlVHlwZSB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmE6SmF2YURhdGFUeXBlIiBocmVmPSJqYXZhOi8jdm9pZCIvPg0KLSAgICA8cGFyYW1ldGVycyBuYW1lPSJhcmcwIj4NCi0gICAgICA8ZVR5cGUgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhOkFycmF5VHlwZSIgaHJlZj0iamF2YTovI2ludFtdIi8+DQotICAgIDwvcGFyYW1ldGVycz4NCi0gICAgPHBhcmFtZXRlcnMgbmFtZT0iYXJnMSI+DQotICAgICAgPGVUeXBlIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YTpBcnJheVR5cGUiIGhyZWY9ImphdmE6LyNpbnRbXVtdIi8+DQotICAgIDwvcGFyYW1ldGVycz4NCi0gICAgPHBhcmFtZXRlcnMgbmFtZT0iYXJnMiI+DQotICAgICAgPGVUeXBlIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YTpBcnJheVR5cGUiIGhyZWY9ImphdmE6LyNpbnRbXVtdW10iLz4NCi0gICAgPC9wYXJhbWV0ZXJzPg0KLSAgICA8cGFyYW1ldGVycyBuYW1lPSJhcmczIj4NCi0gICAgICA8ZVR5cGUgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhOkFycmF5VHlwZSIgaHJlZj0iamF2YTovI2NoYXJbXSIvPg0KLSAgICA8L3BhcmFtZXRlcnM+DQotICAgIDxwYXJhbWV0ZXJzIG5hbWU9ImFyZzQiPg0KLSAgICAgIDxlVHlwZSB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmE6QXJyYXlUeXBlIiBocmVmPSJqYXZhOi8jZmxvYXRbXSIvPg0KLSAgICA8L3BhcmFtZXRlcnM+DQotICAgIDxwYXJhbWV0ZXJzIG5hbWU9ImFyZzUiPg0KLSAgICAgIDxlVHlwZSB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmE6QXJyYXlUeXBlIiBocmVmPSJqYXZhOi8jYm9vbGVhbltdIi8+DQotICAgIDwvcGFyYW1ldGVycz4NCi0gICAgPHBhcmFtZXRlcnMgbmFtZT0iYXJnNiI+DQotICAgICAgPGVUeXBlIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YTpBcnJheVR5cGUiIGhyZWY9ImphdmE6LyNkb3VibGVbXSIvPg0KLSAgICA8L3BhcmFtZXRlcnM+DQotICAgIDxwYXJhbWV0ZXJzIG5hbWU9ImFyZzciPg0KLSAgICAgIDxlVHlwZSB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmE6QXJyYXlUeXBlIiBocmVmPSJqYXZhOi8jbG9uZ1tdIi8+DQotICAgIDwvcGFyYW1ldGVycz4NCi0gICAgPHBhcmFtZXRlcnMgbmFtZT0iYXJnOCI+DQotICAgICAgPGVUeXBlIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YTpBcnJheVR5cGUiIGhyZWY9ImphdmE6LyNzaG9ydFtdIi8+DQotICAgIDwvcGFyYW1ldGVycz4NCi0gICAgPHBhcmFtZXRlcnMgbmFtZT0iYXJnOSI+DQotICAgICAgPGVUeXBlIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YTpBcnJheVR5cGUiIGhyZWY9ImphdmE6LyNieXRlW10iLz4NCi0gICAgPC9wYXJhbWV0ZXJzPg0KLSAgPC9tZXRob2RzPg0KLSAgPG1ldGhvZHMgbmFtZT0iZG9Tb21ldGhpbmciPg0KLSAgICA8ZVR5cGUgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhOkphdmFDbGFzcyIgaHJlZj0iamF2YTovY29tLmlibS5ldG9vbHMuamF2YS5zdHJlc3NTYW1wbGUjQyIvPg0KLSAgPC9tZXRob2RzPg0KLSAgPG1ldGhvZHMgbmFtZT0iZ2V0Qnl0ZXMiPg0KLSAgICA8ZVR5cGUgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhOkFycmF5VHlwZSIgaHJlZj0iamF2YTovI2J5dGVbXSIvPg0KLSAgPC9tZXRob2RzPg0KLSAgPG1ldGhvZHMgbmFtZT0iZ2V0Q2hhciI+DQotICAgIDxlVHlwZSB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmE6QXJyYXlUeXBlIiBocmVmPSJqYXZhOi8jY2hhcltdIi8+DQotICA8L21ldGhvZHM+DQotICA8bWV0aG9kcyBuYW1lPSJnZXRGbG9hdHMiPg0KLSAgICA8ZVR5cGUgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhOkFycmF5VHlwZSIgaHJlZj0iamF2YTovI2Zsb2F0W10iLz4NCi0gIDwvbWV0aG9kcz4NCi0gIDxtZXRob2RzIG5hbWU9ImdldEludHMiPg0KLSAgICA8ZVR5cGUgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhOkFycmF5VHlwZSIgaHJlZj0iamF2YTovI2ludFtdIi8+DQotICA8L21ldGhvZHM+DQotICA8bWV0aG9kcyBuYW1lPSJnZXRMb25ncyI+DQotICAgIDxlVHlwZSB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmE6QXJyYXlUeXBlIiBocmVmPSJqYXZhOi8jbG9uZ1tdIi8+DQotICA8L21ldGhvZHM+DQotICA8bWV0aG9kcyBuYW1lPSJnZXRTaG9ydHMiPg0KLSAgICA8ZVR5cGUgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhOkFycmF5VHlwZSIgaHJlZj0iamF2YTovI3Nob3J0W10iLz4NCi0gIDwvbWV0aG9kcz4NCi0gIDxtZXRob2RzIG5hbWU9InJldHVybkFzIj4NCi0gICAgPGVUeXBlIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YTpBcnJheVR5cGUiIGhyZWY9ImphdmE6L2NvbS5pYm0uZXRvb2xzLmphdmEuc3RyZXNzU2FtcGxlI0FbXSIvPg0KLSAgICA8cGFyYW1ldGVycyBuYW1lPSJhcmcwIj4NCi0gICAgICA8ZVR5cGUgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhOkFycmF5VHlwZSIgaHJlZj0iamF2YTovY29tLmlibS5ldG9vbHMuamF2YS5zdHJlc3NTYW1wbGUjQ1tdIi8+DQotICAgIDwvcGFyYW1ldGVycz4NCi0gIDwvbWV0aG9kcz4NCi0gIDxtZXRob2RzIG5hbWU9IkEiIGNvbnN0cnVjdG9yPSJ0cnVlIi8+DQotPC9vcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YTpKYXZhQ2xhc3M+DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9wbHVnaW4ueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWZjZDExLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cyIKLSAgIG5hbWU9IkoyRUUgQ29yZSBUZXN0cyBDb21wb25lbnQiCi0gICB2ZXJzaW9uPSIxLjEuMCIKLSAgIHByb3ZpZGVyLW5hbWU9IkVjbGlwc2Uub3JnIiA+Ci0KLQotICAgPHJ1bnRpbWU+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJ0ZXN0cy5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmp1bml0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamVtLnV0aWwiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamVtIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cyIvPgotCi0gICA8L3JlcXVpcmVzPgotCi0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0LnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZGI2OTguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08cHJvamVjdCBuYW1lPSJ0ZXN0c3VpdGUiIGRlZmF1bHQ9InJ1biIgYmFzZWRpcj0iLiI+Ci0gIDwhLS0gVGhlIHByb3BlcnR5ICR7ZWNsaXBzZS1ob21lfSBzaG91bGQgYmUgcGFzc2VkIGludG8gdGhpcyBzY3JpcHQgLS0+Ci0gIDwhLS0gU2V0IGEgbWVhbmluZ2Z1bCBkZWZhdWx0IHZhbHVlIGZvciB3aGVuIGl0IGlzIG5vdC4gLS0+Ci0gPCEtLSA8cHJvcGVydHkgbmFtZT0iZWNsaXBzZS1ob21lIiB2YWx1ZT0iJHtiYXNlZGlyfVwuLlwuLiIvPiAtLT4KLQk8ZWNobyBtZXNzYWdlPSJiYXNlZGlyICR7YmFzZWRpcn0iIC8+Ci0JPGVjaG8gbWVzc2FnZT0iZWNsaXBzZSBwbGFjZSAke2VjbGlwc2UtaG9tZX0iIC8+Ci0gIDwhLS0gc2V0cyB0aGUgcHJvcGVydGllcyBwbHVnaW4tbmFtZSwgYW5kIGxpYnJhcnktZmlsZSAtLT4KLSAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cyIvPgotICA8cHJvcGVydHkgbmFtZT0ibGlicmFyeS1maWxlIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3BsdWdpbnMvb3JnLmVjbGlwc2UudGVzdF8zLjEuMC9saWJyYXJ5LnhtbCIvPgotICA8cHJvcGVydHkgbmFtZT0iZXh0cmFWTWFyZ3MiIHZhbHVlPSItRFhteDcwME0iLz4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGFsbCBpbml0aWFsaXphdGlvbiBjb2RlIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSBmb3IgLS0+Ci0gIDwhLS0gYWxsIHRlc3RzIHRoYXQgYXJlIHRvIGJlIHJ1bi4gSW5pdGlhbGl6YXRpb24gZm9yIGluZGl2aWR1YWwgdGVzdHMgLS0+Ci0gIDwhLS0gc2hvdWxkIGJlIGRvbmUgd2l0aGluIHRoZSBib2R5IG9mIHRoZSBzdWl0ZSB0YXJnZXQuIC0tPgotICA8dGFyZ2V0IG5hbWU9ImluaXQiPgotICAgIDx0c3RhbXAvPgotICAgIDxkZWxldGU+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7ZWNsaXBzZS1ob21lfSIgaW5jbHVkZXM9Im9yZyoueG1sIi8+Ci0gICAgPC9kZWxldGU+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgZGVmaW5lcyB0aGUgdGVzdHMgdGhhdCBuZWVkIHRvIGJlIHJ1bi4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0ic3VpdGUiPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJqc3QtZm9sZGVyIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L2pzdF9mb2xkZXIiLz4KLSAgICA8ZGVsZXRlIGRpcj0iJHtqc3QtZm9sZGVyfSIgcXVpZXQ9InRydWUiLz4KLSAgICA8YW50IHRhcmdldD0iY29yZS10ZXN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkYXRhLWRpciIgdmFsdWU9IiR7anN0LWZvbGRlcn0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3NuYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5idnQuQXV0b21hdGVkQlZUIiAvPgotICAgCSAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1wYXRoIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3BsdWdpbnMvJHtwbHVnaW4tbmFtZX0iLz4KLSAgIAkgIDxwcm9wZXJ0eSBuYW1lPSJleHRyYVZNYXJncyIgdmFsdWU9IiR7ZXh0cmFWTWFyZ3N9Ii8+Ci0gICAgPC9hbnQ+Ci0gICAgPGFudCB0YXJnZXQ9ImNvcmUtdGVzdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iZGF0YS1kaXIiIHZhbHVlPSIke2pzdC1mb2xkZXJ9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUuYXBpLnRlc3QuQXV0b21hdGVkQVBJQlZUIiAvPgotICAgCSAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1wYXRoIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3BsdWdpbnMvJHtwbHVnaW4tbmFtZX0iLz4KLSAgIAkgIDxwcm9wZXJ0eSBuYW1lPSJleHRyYVZNYXJncyIgdmFsdWU9IiR7ZXh0cmFWTWFyZ3N9Ii8+Ci0gICAgPC9hbnQ+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgY29kZSB0byBjbGVhbnVwIHRoZSB0ZXN0aW5nIGVudmlyb25tZW50IGFmdGVyIC0tPgotICA8IS0tIGFmdGVyIGFsbCBvZiB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1bi4gWW91IGNhbiB1c2UgdGhpcyB0YXJnZXQgdG8gLS0+Ci0gIDwhLS0gZGVsZXRlIHRlbXBvcmFyeSBmaWxlcyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJjbGVhbnVwIj4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBydW5zIHRoZSB0ZXN0IHN1aXRlLiBBbnkgYWN0aW9ucyB0aGF0IG5lZWQgdG8gaGFwcGVuIC0tPgotICA8IS0tIGFmdGVyIGFsbCB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1biBzaG91bGQgZ28gaGVyZS4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0icnVuIiBkZXBlbmRzPSJpbml0LHN1aXRlLGNsZWFudXAiPgotICAgIDxhbnQgdGFyZ2V0PSJjb2xsZWN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpbmNsdWRlcyIgdmFsdWU9Im9yZyoueG1sIi8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0ib3V0cHV0LWZpbGUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfS54bWwiLz4KLSAgICA8L2FudD4KLSAgPC90YXJnZXQ+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9lamIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL2VqYi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA0MTY1MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL2VqYi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1BbnQtVmVyc2lvbjogQXBhY2hlIEFudCAxLjUuNCAKLUNyZWF0ZWQtQnk6IDEuMy4wIChJQk0gQ29ycG9yYXRpb24pCi1NYWluLUNsYXNzOiBudWxsCi0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvZWpiL01FVEEtSU5GL1RhYmxlLmRkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvZWpiL01FVEEtSU5GL1RhYmxlLmRkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc4MDg2MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL2VqYi9NRVRBLUlORi9UYWJsZS5kZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0NCi0NCi0tLSBHZW5lcmF0ZWQgYnkgUmVsYXRpb25hbCBTY2hlbWEgQ2VudGVyIG9uIEZyaSBNYXIgMTIgMTQ6MzI6MTQgQ1NUIDIwMDQNCi0NCi0NCi1DUkVBVEUgVEFCTEUgQUNDT1VOVA0KLSAgKEFDQ09VTlRJRCBWQVJDSEFSKDI1MCkgTk9UIE5VTEwsDQotICAgVFlQRTEgSU5URUdFUiBOT1QgTlVMTCwNCi0gICBCQUxBTkNFIERPVUJMRSBQUkVDSVNJT04gTk9UIE5VTEwsDQotICAgQVBSIERPVUJMRSBQUkVDSVNJT04gTk9UIE5VTEwpOw0KLQ0KLUFMVEVSIFRBQkxFIEFDQ09VTlQNCi0gIEFERCBDT05TVFJBSU5UIFBLX0FDQ09VTlQgUFJJTUFSWSBLRVkgKEFDQ09VTlRJRCk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9lamIvTUVUQS1JTkYvYmFja2VuZHMvQ0xPVURTQ0FQRV9WNTBfMS9NYXAubWFweG1pIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9lamIvTUVUQS1JTkYvYmFja2VuZHMvQ0xPVURTQ0FQRV9WNTBfMS9NYXAubWFweG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTlhOThlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvZWpiL01FVEEtSU5GL2JhY2tlbmRzL0NMT1VEU0NBUEVfVjUwXzEvTWFwLm1hcHhtaQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGVqYnJkYm1hcHBpbmc6RWpiUmRiRG9jdW1lbnRSb290IHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6UkRCU2NoZW1hPSJSREJTY2hlbWEueG1pIiB4bWxuczplamI9ImVqYi54bWkiIHhtbG5zOmVqYnJkYm1hcHBpbmc9ImVqYnJkYm1hcHBpbmcueG1pIiB4bWxuczpNYXBwaW5nPSJNYXBwaW5nLnhtaSIgeG1pOmlkPSJFamJSZGJEb2N1bWVudFJvb3RfMTA3OTEyMzUxNjkwNyIgdG9wVG9Cb3R0b209InRydWUiIGNvbW1hbmRTdGFjaz0iJmx0O2NvbGxlY3Rpb24+Jmx0O2NvbW1hbmQtY3JlYXRpb24tcmVjb3JkPiZsdDtjbGFzcyBuYW1lPSZxdW90O2NvbS5pYm0uZXRvb2xzLmVqYnJkYm1hcHBpbmcuY29tbWFuZC5Ub3BEb3duRWpiSmFyQ29tbWFuZCZxdW90Oy8+Jmx0O2NvbW1hbmQtcGFyYW1ldGVyPiZsdDtyZWYtb2JqZWN0IGhyZWY9JnF1b3Q7cGxhdGZvcm06L3Jlc291cmNlL2I2Mzc0OGJhL2VqYk1vZHVsZS9NRVRBLUlORi9lamItamFyLnhtbCNlamItamFyX0lEJnF1b3Q7Lz4mbHQ7bnVsbC8+Jmx0O2NvbGxlY3Rpb24+Jmx0O3N0cmluZyB2YWx1ZT0mcXVvdDtUb3BEb3duREImcXVvdDsvPiZsdDtudWxsLz4mbHQ7aW50IHZhbHVlPSZxdW90OzE4JnF1b3Q7Lz4mbHQ7aGFzaHRhYmxlPiZsdDsvaGFzaHRhYmxlPiZsdDtoYXNodGFibGU+Jmx0Oy9oYXNodGFibGU+Jmx0O2Jvb2xlYW4gdmFsdWU9JnF1b3Q7ZmFsc2UmcXVvdDsvPiZsdDtib29sZWFuIHZhbHVlPSZxdW90O2ZhbHNlJnF1b3Q7Lz4mbHQ7L2NvbGxlY3Rpb24+Jmx0O251bGwvPiZsdDtpbnQgdmFsdWU9JnF1b3Q7LTEmcXVvdDsvPiZsdDsvY29tbWFuZC1wYXJhbWV0ZXI+Jmx0Oy9jb21tYW5kLWNyZWF0aW9uLXJlY29yZD4mbHQ7L2NvbGxlY3Rpb24+Ij4NCi0gIDxoZWxwZXIgeG1pOnR5cGU9ImVqYnJkYm1hcHBpbmc6UmRiU2NoZW1hUHJvcGVyaWVzIiB4bWk6aWQ9IlJkYlNjaGVtYVByb3Blcmllc18xMDc5MTIzNTE2OTA3IiBwcmltaXRpdmVzRG9jdW1lbnQ9IkNMT1VEU0NBUEVfVjUwIi8+DQotICA8bmVzdGVkIHhtaTp0eXBlPSJlamJyZGJtYXBwaW5nOlJEQkVqYk1hcHBlciIgeG1pOmlkPSJSREJFamJNYXBwZXJfMTA3OTEyMzUxNjkwNyI+DQotICAgIDxoZWxwZXIgeG1pOnR5cGU9ImVqYnJkYm1hcHBpbmc6UHJpbWFyeVRhYmxlU3RyYXRlZ3kiIHhtaTppZD0iUHJpbWFyeVRhYmxlU3RyYXRlZ3lfMTA3OTEyMzUxNjkwNyI+DQotICAgICAgPHRhYmxlIGhyZWY9Ik1FVEEtSU5GL2JhY2tlbmRzL0NMT1VEU0NBUEVfVjUwXzEvVG9wRG93bkRCX05VTExJRF9BQ0NPVU5ULnRibHhtaSNBQ0NPVU5UIi8+DQotICAgIDwvaGVscGVyPg0KLSAgICA8bmVzdGVkIHhtaTp0eXBlPSJlamJyZGJtYXBwaW5nOlJEQkVqYkZpZWxkTWFwcGVyIiB4bWk6aWQ9IlJEQkVqYkZpZWxkTWFwcGVyXzEwNzkxMjM1MTY5MDciPg0KLSAgICAgIDxpbnB1dHMgeG1pOnR5cGU9ImVqYjpDTVBBdHRyaWJ1dGUiIGhyZWY9Ik1FVEEtSU5GL2VqYi1qYXIueG1sI0FjY291bnRfYWNjb3VudGlkIi8+DQotICAgICAgPG91dHB1dHMgeG1pOnR5cGU9IlJEQlNjaGVtYTpSREJDb2x1bW4iIGhyZWY9Ik1FVEEtSU5GL2JhY2tlbmRzL0NMT1VEU0NBUEVfVjUwXzEvVG9wRG93bkRCX05VTExJRF9BQ0NPVU5ULnRibHhtaSNBQ0NPVU5USUQiLz4NCi0gICAgICA8dHlwZU1hcHBpbmcgaHJlZj0iSmF2YXRvQ0xPVURTQ0FQRV9WNTBUeXBlTWFwcy54bWkjU3RyaW5nLVZBUkNIQVIiLz4NCi0gICAgPC9uZXN0ZWQ+DQotICAgIDxuZXN0ZWQgeG1pOnR5cGU9ImVqYnJkYm1hcHBpbmc6UkRCRWpiRmllbGRNYXBwZXIiIHhtaTppZD0iUkRCRWpiRmllbGRNYXBwZXJfMTA3OTEyMzUxNjkwOCIgb3B0aW1pc3RpYz0idHJ1ZSI+DQotICAgICAgPGlucHV0cyB4bWk6dHlwZT0iZWpiOkNNUEF0dHJpYnV0ZSIgaHJlZj0iTUVUQS1JTkYvZWpiLWphci54bWwjQWNjb3VudF90eXBlIi8+DQotICAgICAgPG91dHB1dHMgeG1pOnR5cGU9IlJEQlNjaGVtYTpSREJDb2x1bW4iIGhyZWY9Ik1FVEEtSU5GL2JhY2tlbmRzL0NMT1VEU0NBUEVfVjUwXzEvVG9wRG93bkRCX05VTExJRF9BQ0NPVU5ULnRibHhtaSNUWVBFMSIvPg0KLSAgICAgIDx0eXBlTWFwcGluZyBocmVmPSJKYXZhdG9DTE9VRFNDQVBFX1Y1MFR5cGVNYXBzLnhtaSNpbnQtSU5URUdFUiIvPg0KLSAgICA8L25lc3RlZD4NCi0gICAgPG5lc3RlZCB4bWk6dHlwZT0iZWpicmRibWFwcGluZzpSREJFamJGaWVsZE1hcHBlciIgeG1pOmlkPSJSREJFamJGaWVsZE1hcHBlcl8xMDc5MTIzNTE2OTA5IiBvcHRpbWlzdGljPSJ0cnVlIj4NCi0gICAgICA8aW5wdXRzIHhtaTp0eXBlPSJlamI6Q01QQXR0cmlidXRlIiBocmVmPSJNRVRBLUlORi9lamItamFyLnhtbCNBY2NvdW50X2JhbGFuY2UiLz4NCi0gICAgICA8b3V0cHV0cyB4bWk6dHlwZT0iUkRCU2NoZW1hOlJEQkNvbHVtbiIgaHJlZj0iTUVUQS1JTkYvYmFja2VuZHMvQ0xPVURTQ0FQRV9WNTBfMS9Ub3BEb3duREJfTlVMTElEX0FDQ09VTlQudGJseG1pI0JBTEFOQ0UiLz4NCi0gICAgICA8dHlwZU1hcHBpbmcgaHJlZj0iSmF2YXRvQ0xPVURTQ0FQRV9WNTBUeXBlTWFwcy54bWkjZG91YmxlLURPVUJMRSIvPg0KLSAgICA8L25lc3RlZD4NCi0gICAgPG5lc3RlZCB4bWk6dHlwZT0iZWpicmRibWFwcGluZzpSREJFamJGaWVsZE1hcHBlciIgeG1pOmlkPSJSREJFamJGaWVsZE1hcHBlcl8xMDc5MTIzNTE2OTEwIiBvcHRpbWlzdGljPSJ0cnVlIj4NCi0gICAgICA8aW5wdXRzIHhtaTp0eXBlPSJlamI6Q01QQXR0cmlidXRlIiBocmVmPSJNRVRBLUlORi9lamItamFyLnhtbCNBY2NvdW50X2FwciIvPg0KLSAgICAgIDxvdXRwdXRzIHhtaTp0eXBlPSJSREJTY2hlbWE6UkRCQ29sdW1uIiBocmVmPSJNRVRBLUlORi9iYWNrZW5kcy9DTE9VRFNDQVBFX1Y1MF8xL1RvcERvd25EQl9OVUxMSURfQUNDT1VOVC50Ymx4bWkjQVBSIi8+DQotICAgICAgPHR5cGVNYXBwaW5nIGhyZWY9IkphdmF0b0NMT1VEU0NBUEVfVjUwVHlwZU1hcHMueG1pI2RvdWJsZS1ET1VCTEUiLz4NCi0gICAgPC9uZXN0ZWQ+DQotICAgIDxpbnB1dHMgeG1pOnR5cGU9ImVqYjpDb250YWluZXJNYW5hZ2VkRW50aXR5IiBocmVmPSJNRVRBLUlORi9lamItamFyLnhtbCNDb250YWluZXJNYW5hZ2VkRW50aXR5XzEiLz4NCi0gICAgPG91dHB1dHMgeG1pOnR5cGU9IlJEQlNjaGVtYTpSREJUYWJsZSIgaHJlZj0iTUVUQS1JTkYvYmFja2VuZHMvQ0xPVURTQ0FQRV9WNTBfMS9Ub3BEb3duREJfTlVMTElEX0FDQ09VTlQudGJseG1pI0FDQ09VTlQiLz4NCi0gIDwvbmVzdGVkPg0KLSAgPGlucHV0cyB4bWk6dHlwZT0iZWpiOkVKQkphciIgaHJlZj0iTUVUQS1JTkYvZWpiLWphci54bWwjZWpiLWphcl9JRCIvPg0KLSAgPG91dHB1dHMgeG1pOnR5cGU9IlJEQlNjaGVtYTpSREJEYXRhYmFzZSIgaHJlZj0iTUVUQS1JTkYvYmFja2VuZHMvQ0xPVURTQ0FQRV9WNTBfMS9Ub3BEb3duREIuZGJ4bWkjVG9wRG93bkRCIi8+DQotICA8dHlwZU1hcHBpbmcgeG1pOnR5cGU9Ik1hcHBpbmc6TWFwcGluZ1Jvb3QiIGhyZWY9IkphdmF0b0NMT1VEU0NBUEVfVjUwVHlwZU1hcHMueG1pI0phdmFfdG9fQ0xPVURTQ0FQRV9WNTBfVHlwZU1hcHMiLz4NCi08L2VqYnJkYm1hcHBpbmc6RWpiUmRiRG9jdW1lbnRSb290Pg0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvZWpiL01FVEEtSU5GL2JhY2tlbmRzL0NMT1VEU0NBUEVfVjUwXzEvVGFibGUuZGRsIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9lamIvTUVUQS1JTkYvYmFja2VuZHMvQ0xPVURTQ0FQRV9WNTBfMS9UYWJsZS5kZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ODA4NjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9lamIvTUVUQS1JTkYvYmFja2VuZHMvQ0xPVURTQ0FQRV9WNTBfMS9UYWJsZS5kZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0NCi0NCi0tLSBHZW5lcmF0ZWQgYnkgUmVsYXRpb25hbCBTY2hlbWEgQ2VudGVyIG9uIEZyaSBNYXIgMTIgMTQ6MzI6MTQgQ1NUIDIwMDQNCi0NCi0NCi1DUkVBVEUgVEFCTEUgQUNDT1VOVA0KLSAgKEFDQ09VTlRJRCBWQVJDSEFSKDI1MCkgTk9UIE5VTEwsDQotICAgVFlQRTEgSU5URUdFUiBOT1QgTlVMTCwNCi0gICBCQUxBTkNFIERPVUJMRSBQUkVDSVNJT04gTk9UIE5VTEwsDQotICAgQVBSIERPVUJMRSBQUkVDSVNJT04gTk9UIE5VTEwpOw0KLQ0KLUFMVEVSIFRBQkxFIEFDQ09VTlQNCi0gIEFERCBDT05TVFJBSU5UIFBLX0FDQ09VTlQgUFJJTUFSWSBLRVkgKEFDQ09VTlRJRCk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9lamIvTUVUQS1JTkYvYmFja2VuZHMvQ0xPVURTQ0FQRV9WNTBfMS9Ub3BEb3duREIuZGJ4bWkgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL2VqYi9NRVRBLUlORi9iYWNrZW5kcy9DTE9VRFNDQVBFX1Y1MF8xL1RvcERvd25EQi5kYnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE0YmRlZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL2VqYi9NRVRBLUlORi9iYWNrZW5kcy9DTE9VRFNDQVBFX1Y1MF8xL1RvcERvd25EQi5kYnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08UkRCU2NoZW1hOlJEQkRhdGFiYXNlIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6UkRCU2NoZW1hPSJSREJTY2hlbWEueG1pIiB4bWk6aWQ9IlRvcERvd25EQiIgbmFtZT0iVG9wRG93bkRCIj4NCi0gIDxzY2hlbWF0YSBocmVmPSJNRVRBLUlORi9iYWNrZW5kcy9DTE9VRFNDQVBFX1Y1MF8xL1RvcERvd25EQl9OVUxMSUQuc2NoeG1pI05VTExJRCIvPg0KLSAgPHRhYmxlR3JvdXAgeG1pOnR5cGU9IlJEQlNjaGVtYTpSREJUYWJsZSIgaHJlZj0iTUVUQS1JTkYvYmFja2VuZHMvQ0xPVURTQ0FQRV9WNTBfMS9Ub3BEb3duREJfTlVMTElEX0FDQ09VTlQudGJseG1pI0FDQ09VTlQiLz4NCi0gIDxkb21haW4gaHJlZj0iQ0xPVURTQ0FQRV9WNTBfRG9tYWluLnhtaSNTUUxWZW5kb3JfMSIvPg0KLTwvUkRCU2NoZW1hOlJEQkRhdGFiYXNlPg0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvZWpiL01FVEEtSU5GL2JhY2tlbmRzL0NMT1VEU0NBUEVfVjUwXzEvVG9wRG93bkRCX05VTExJRC5zY2h4bWkgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL2VqYi9NRVRBLUlORi9iYWNrZW5kcy9DTE9VRFNDQVBFX1Y1MF8xL1RvcERvd25EQl9OVUxMSUQuc2NoeG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTIwYTQwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvZWpiL01FVEEtSU5GL2JhY2tlbmRzL0NMT1VEU0NBUEVfVjUwXzEvVG9wRG93bkRCX05VTExJRC5zY2h4bWkKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPFJEQlNjaGVtYTpSREJTY2hlbWEgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpSREJTY2hlbWE9IlJEQlNjaGVtYS54bWkiIHhtaTppZD0iTlVMTElEIiBuYW1lPSJOVUxMSUQiPg0KLSAgPGRhdGFiYXNlIGhyZWY9Ik1FVEEtSU5GL2JhY2tlbmRzL0NMT1VEU0NBUEVfVjUwXzEvVG9wRG93bkRCLmRieG1pI1RvcERvd25EQiIvPg0KLSAgPHRhYmxlcyB4bWk6dHlwZT0iUkRCU2NoZW1hOlJEQlRhYmxlIiBocmVmPSJNRVRBLUlORi9iYWNrZW5kcy9DTE9VRFNDQVBFX1Y1MF8xL1RvcERvd25EQl9OVUxMSURfQUNDT1VOVC50Ymx4bWkjQUNDT1VOVCIvPg0KLTwvUkRCU2NoZW1hOlJEQlNjaGVtYT4NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL2VqYi9NRVRBLUlORi9iYWNrZW5kcy9DTE9VRFNDQVBFX1Y1MF8xL1RvcERvd25EQl9OVUxMSURfQUNDT1VOVC50Ymx4bWkgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL2VqYi9NRVRBLUlORi9iYWNrZW5kcy9DTE9VRFNDQVBFX1Y1MF8xL1RvcERvd25EQl9OVUxMSURfQUNDT1VOVC50Ymx4bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkZjFkNzUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9lamIvTUVUQS1JTkYvYmFja2VuZHMvQ0xPVURTQ0FQRV9WNTBfMS9Ub3BEb3duREJfTlVMTElEX0FDQ09VTlQudGJseG1pCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08UkRCU2NoZW1hOlJEQlRhYmxlIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6UkRCU2NoZW1hPSJSREJTY2hlbWEueG1pIiB4bWk6aWQ9IkFDQ09VTlQiIG5hbWU9IkFDQ09VTlQiIHByaW1hcnlLZXk9IlBLX0FDQ09VTlQiPg0KLSAgPGRhdGFiYXNlIGhyZWY9Ik1FVEEtSU5GL2JhY2tlbmRzL0NMT1VEU0NBUEVfVjUwXzEvVG9wRG93bkRCLmRieG1pI1RvcERvd25EQiIvPg0KLSAgPHNjaGVtYSBocmVmPSJNRVRBLUlORi9iYWNrZW5kcy9DTE9VRFNDQVBFX1Y1MF8xL1RvcERvd25EQl9OVUxMSUQuc2NoeG1pI05VTExJRCIvPg0KLSAgPGNvbHVtbnMgeG1pOnR5cGU9IlJEQlNjaGVtYTpSREJDb2x1bW4iIHhtaTppZD0iQUNDT1VOVElEIiBuYW1lPSJBQ0NPVU5USUQiPg0KLSAgICA8dHlwZSB4bWk6dHlwZT0iUkRCU2NoZW1hOlNRTENoYXJhY3RlclN0cmluZ1R5cGUiIHhtaTppZD0iU1FMQ2hhcmFjdGVyU3RyaW5nVHlwZV8xMDc5MTIzNTE2OTc3IiBsZW5ndGg9IjI1MCI+DQotICAgICAgPG9yaWdpbmF0aW5nVHlwZSB4bWk6dHlwZT0iUkRCU2NoZW1hOlNRTENoYXJhY3RlclN0cmluZ1R5cGUiIGhyZWY9IkphdmF0b0NMT1VEU0NBUEVfVjUwVHlwZU1hcHMueG1pI1NRTENoYXJhY3RlclN0cmluZ1R5cGVfMjUwIi8+DQotICAgIDwvdHlwZT4NCi0gIDwvY29sdW1ucz4NCi0gIDxjb2x1bW5zIHhtaTp0eXBlPSJSREJTY2hlbWE6UkRCQ29sdW1uIiB4bWk6aWQ9IlRZUEUxIiBuYW1lPSJUWVBFMSI+DQotICAgIDx0eXBlIHhtaTp0eXBlPSJSREJTY2hlbWE6U1FMRXhhY3ROdW1lcmljIiB4bWk6aWQ9IlNRTEV4YWN0TnVtZXJpY18xMDc5MTIzNTE2OTc3Ij4NCi0gICAgICA8b3JpZ2luYXRpbmdUeXBlIHhtaTp0eXBlPSJSREJTY2hlbWE6U1FMRXhhY3ROdW1lcmljIiBocmVmPSJDTE9VRFNDQVBFX1Y1MF9QcmltaXRpdmVzLnhtaSNTUUxFeGFjdE51bWVyaWNfMSIvPg0KLSAgICA8L3R5cGU+DQotICA8L2NvbHVtbnM+DQotICA8Y29sdW1ucyB4bWk6dHlwZT0iUkRCU2NoZW1hOlJEQkNvbHVtbiIgeG1pOmlkPSJCQUxBTkNFIiBuYW1lPSJCQUxBTkNFIj4NCi0gICAgPHR5cGUgeG1pOnR5cGU9IlJEQlNjaGVtYTpTUUxBcHByb3hpbWF0ZU51bWVyaWMiIHhtaTppZD0iU1FMQXBwcm94aW1hdGVOdW1lcmljXzEwNzkxMjM1MTY5NzciPg0KLSAgICAgIDxvcmlnaW5hdGluZ1R5cGUgeG1pOnR5cGU9IlJEQlNjaGVtYTpTUUxBcHByb3hpbWF0ZU51bWVyaWMiIGhyZWY9IkNMT1VEU0NBUEVfVjUwX1ByaW1pdGl2ZXMueG1pI1NRTEFwcHJveGltYXRlTnVtZXJpY18xIi8+DQotICAgIDwvdHlwZT4NCi0gIDwvY29sdW1ucz4NCi0gIDxjb2x1bW5zIHhtaTp0eXBlPSJSREJTY2hlbWE6UkRCQ29sdW1uIiB4bWk6aWQ9IkFQUiIgbmFtZT0iQVBSIj4NCi0gICAgPHR5cGUgeG1pOnR5cGU9IlJEQlNjaGVtYTpTUUxBcHByb3hpbWF0ZU51bWVyaWMiIHhtaTppZD0iU1FMQXBwcm94aW1hdGVOdW1lcmljXzEwNzkxMjM1MTY5NzgiPg0KLSAgICAgIDxvcmlnaW5hdGluZ1R5cGUgeG1pOnR5cGU9IlJEQlNjaGVtYTpTUUxBcHByb3hpbWF0ZU51bWVyaWMiIGhyZWY9IkNMT1VEU0NBUEVfVjUwX1ByaW1pdGl2ZXMueG1pI1NRTEFwcHJveGltYXRlTnVtZXJpY18xIi8+DQotICAgIDwvdHlwZT4NCi0gIDwvY29sdW1ucz4NCi0gIDxuYW1lZEdyb3VwIHhtaTp0eXBlPSJSREJTY2hlbWE6U1FMUmVmZXJlbmNlIiB4bWk6aWQ9IlBLX0FDQ09VTlQiIG5hbWU9IlBLX0FDQ09VTlQiIG1lbWJlcnM9IkFDQ09VTlRJRCIgY29uc3RyYWludD0iU1FMQ29uc3RyYWludF8xMDc5MTIzNTE2OTc3Ii8+DQotICA8Y29uc3RyYWludHMgeG1pOmlkPSJTUUxDb25zdHJhaW50XzEwNzkxMjM1MTY5NzciIG5hbWU9IlBLX0FDQ09VTlQiIHR5cGU9IlBSSU1BUllLRVkiIHByaW1hcnlLZXk9IlBLX0FDQ09VTlQiLz4NCi08L1JEQlNjaGVtYTpSREJUYWJsZT4NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL2VqYi9NRVRBLUlORi9iYWNrZW5kcy9DTE9VRFNDQVBFX1Y1MF8xL2libV9wbWJhYi5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9lamIvTUVUQS1JTkYvYmFja2VuZHMvQ0xPVURTQ0FQRV9WNTBfMS9pYm1fcG1iYWIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZmNjJkMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL2VqYi9NRVRBLUlORi9iYWNrZW5kcy9DTE9VRFNDQVBFX1Y1MF8xL2libV9wbWJhYi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jRnJpIE1hciAxMiAxNDozMjowMSBDU1QgMjAwNAotQWNjb3VudD1jb20uaWJtLndlYnNwaGVyZS5zYW1wbGVzLmFwcHByb2ZpbGUuYWNjb3VudG1hbmFnZW1lbnRlamIud2Vic3BoZXJlX2RlcGxveS5DTE9VRFNDQVBFX1Y1MF8xLkFjY291bnRCZWFuQWRhcHRvckJpbmRpbmdfMGMxODIxMzUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvZWpiL01FVEEtSU5GL2VqYi1qYXIueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9lamIvTUVUQS1JTkYvZWpiLWphci54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkOTg2MGYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9lamIvTUVUQS1JTkYvZWpiLWphci54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGVqYi1qYXIgUFVCTElDICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgRW50ZXJwcmlzZSBKYXZhQmVhbnMgMi4wLy9FTiIgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2VqYi1qYXJfMl8wLmR0ZCI+Ci0KLSAgIDxlamItamFyIGlkPSJlamItamFyX0lEIj4KLSAgICAgIDxkaXNwbGF5LW5hbWU+QXBwUHJvZmlsZVNhbXBsZUVKQk1vZHVsZTwvZGlzcGxheS1uYW1lPgotICAgICAgPGVudGVycHJpc2UtYmVhbnM+Ci0gICAgICAgICA8ZW50aXR5IGlkPSJDb250YWluZXJNYW5hZ2VkRW50aXR5XzEiPgotICAgICAgICAgICAgPGVqYi1uYW1lPkFjY291bnQ8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGhvbWU+Y29tLmlibS53ZWJzcGhlcmUuc2FtcGxlcy5hcHBwcm9maWxlLmFjY291bnRtYW5hZ2VtZW50ZWpiLkFjY291bnRIb21lPC9ob21lPgotICAgICAgICAgICAgPHJlbW90ZT5jb20uaWJtLndlYnNwaGVyZS5zYW1wbGVzLmFwcHByb2ZpbGUuYWNjb3VudG1hbmFnZW1lbnRlamIuQWNjb3VudDwvcmVtb3RlPgotICAgICAgICAgICAgPGxvY2FsLWhvbWU+Y29tLmlibS53ZWJzcGhlcmUuc2FtcGxlcy5hcHBwcm9maWxlLmFjY291bnRtYW5hZ2VtZW50ZWpiLkxvY2FsQWNjb3VudEhvbWU8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICA8bG9jYWw+Y29tLmlibS53ZWJzcGhlcmUuc2FtcGxlcy5hcHBwcm9maWxlLmFjY291bnRtYW5hZ2VtZW50ZWpiLkxvY2FsQWNjb3VudDwvbG9jYWw+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmNvbS5pYm0ud2Vic3BoZXJlLnNhbXBsZXMuYXBwcHJvZmlsZS5hY2NvdW50bWFuYWdlbWVudGVqYi5BY2NvdW50QmVhbjwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXR5cGU+Q29udGFpbmVyPC9wZXJzaXN0ZW5jZS10eXBlPgotICAgICAgICAgICAgPHByaW0ta2V5LWNsYXNzPmphdmEubGFuZy5TdHJpbmc8L3ByaW0ta2V5LWNsYXNzPgotICAgICAgICAgICAgPHJlZW50cmFudD5GYWxzZTwvcmVlbnRyYW50PgotICAgICAgICAgICAgPGNtcC12ZXJzaW9uPjIueDwvY21wLXZlcnNpb24+Ci0gICAgICAgICAgICA8YWJzdHJhY3Qtc2NoZW1hLW5hbWU+QWNjb3VudDwvYWJzdHJhY3Qtc2NoZW1hLW5hbWU+Ci0gICAgICAgICAgICA8Y21wLWZpZWxkIGlkPSJBY2NvdW50X2FjY291bnRpZCI+Ci0gICAgICAgICAgICAgICA8ZmllbGQtbmFtZT5hY2NvdW50aWQ8L2ZpZWxkLW5hbWU+Ci0gICAgICAgICAgICA8L2NtcC1maWVsZD4KLSAgICAgICAgICAgIDxjbXAtZmllbGQgaWQ9IkFjY291bnRfdHlwZSI+Ci0gICAgICAgICAgICAgICA8ZmllbGQtbmFtZT50eXBlPC9maWVsZC1uYW1lPgotICAgICAgICAgICAgPC9jbXAtZmllbGQ+Ci0gICAgICAgICAgICA8Y21wLWZpZWxkIGlkPSJBY2NvdW50X2JhbGFuY2UiPgotICAgICAgICAgICAgICAgPGZpZWxkLW5hbWU+YmFsYW5jZTwvZmllbGQtbmFtZT4KLSAgICAgICAgICAgIDwvY21wLWZpZWxkPgotICAgICAgICAgICAgPGNtcC1maWVsZCBpZD0iQWNjb3VudF9hcHIiPgotICAgICAgICAgICAgICAgPGZpZWxkLW5hbWU+YXByPC9maWVsZC1uYW1lPgotICAgICAgICAgICAgPC9jbXAtZmllbGQ+Ci0gICAgICAgICAgICA8cHJpbWtleS1maWVsZD5hY2NvdW50aWQ8L3ByaW1rZXktZmllbGQ+Ci0gICAgICAgICAgICA8cXVlcnkgaWQ9IlF1ZXJ5XzEiPgotICAgICAgICAgICAgICAgPHF1ZXJ5LW1ldGhvZCBpZD0iUXVlcnlNZXRob2RfMSI+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+ZmluZExhcmdlQWNjb3VudHM8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPmRvdWJsZTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgPC9xdWVyeS1tZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZWpiLXFsPlNFTEVDVCBPQkpFQ1QoYSkgRlJPTSBBY2NvdW50IGEgV0hFUkUgYS5iYWxhbmNlID49ID8xPC9lamItcWw+Ci0gICAgICAgICAgICA8L3F1ZXJ5PgotICAgICAgICAgICAgPHF1ZXJ5IGlkPSJRdWVyeV8yIj4KLSAgICAgICAgICAgICAgIDxxdWVyeS1tZXRob2QgaWQ9IlF1ZXJ5TWV0aG9kXzIiPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPmZpbmRCeUFjY291bnRJZDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgPC9xdWVyeS1tZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZWpiLXFsPlNFTEVDVCBPQkpFQ1QoYSkgRlJPTSBBY2NvdW50IGEgV0hFUkUgYS5hY2NvdW50aWQgID0gPzE8L2VqYi1xbD4KLSAgICAgICAgICAgIDwvcXVlcnk+Ci0gICAgICAgICAgICA8cXVlcnkgaWQ9IlF1ZXJ5XzMiPgotICAgICAgICAgICAgICAgPHF1ZXJ5LW1ldGhvZCBpZD0iUXVlcnlNZXRob2RfMyI+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+ZmluZEFsbEFjY291bnRzPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT48L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgIDwvcXVlcnktbWV0aG9kPgotICAgICAgICAgICAgICAgPGVqYi1xbD5TRUxFQ1QgT0JKRUNUKGEpIEZST00gQWNjb3VudCBhPC9lamItcWw+Ci0gICAgICAgICAgICA8L3F1ZXJ5PgotICAgICAgICAgPC9lbnRpdHk+Ci0gICAgICAgICA8c2Vzc2lvbiBpZD0iU2Vzc2lvbl8xIj4KLSAgICAgICAgICAgIDxkaXNwbGF5LW5hbWU+QWNjb3VudE1hbmFnZXI8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgICAgIDxlamItbmFtZT5BY2NvdW50TWFuYWdlcjwvZWpiLW5hbWU+Ci0gICAgICAgICAgICA8aG9tZT5jb20uaWJtLndlYnNwaGVyZS5zYW1wbGVzLmFwcHByb2ZpbGUuYWNjb3VudG1hbmFnZW1lbnRlamIuQWNjb3VudE1hbmFnZXJIb21lPC9ob21lPgotICAgICAgICAgICAgPHJlbW90ZT5jb20uaWJtLndlYnNwaGVyZS5zYW1wbGVzLmFwcHByb2ZpbGUuYWNjb3VudG1hbmFnZW1lbnRlamIuQWNjb3VudE1hbmFnZXI8L3JlbW90ZT4KLSAgICAgICAgICAgIDxlamItY2xhc3M+Y29tLmlibS53ZWJzcGhlcmUuc2FtcGxlcy5hcHBwcm9maWxlLmFjY291bnRtYW5hZ2VtZW50ZWpiLkFjY291bnRNYW5hZ2VyQmVhbjwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHNlc3Npb24tdHlwZT5TdGF0ZWxlc3M8L3Nlc3Npb24tdHlwZT4KLSAgICAgICAgICAgIDx0cmFuc2FjdGlvbi10eXBlPkNvbnRhaW5lcjwvdHJhbnNhY3Rpb24tdHlwZT4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmIGlkPSJFSkJMb2NhbFJlZl8xIj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+ZWpiL0FwcFByb2ZpbGVTYW1wbGUtQWNjb3VudEhvbWU8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5jb20uaWJtLndlYnNwaGVyZS5zYW1wbGVzLmFwcHByb2ZpbGUuYWNjb3VudG1hbmFnZW1lbnRlamIuTG9jYWxBY2NvdW50SG9tZTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5jb20uaWJtLndlYnNwaGVyZS5zYW1wbGVzLmFwcHByb2ZpbGUuYWNjb3VudG1hbmFnZW1lbnRlamIuTG9jYWxBY2NvdW50PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5BY2NvdW50PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgIDwvc2Vzc2lvbj4KLSAgICAgIDwvZW50ZXJwcmlzZS1iZWFucz4KLSAgIDwvZWpiLWphcj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvZWpiL01FVEEtSU5GL2libS1lamItamFyLWJuZC54bWkgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL2VqYi9NRVRBLUlORi9pYm0tZWpiLWphci1ibmQueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjkwZDQzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvZWpiL01FVEEtSU5GL2libS1lamItamFyLWJuZC54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxlamJibmQ6RUpCSmFyQmluZGluZyB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVqYmJuZD0iZWpiYm5kLnhtaSIgeG1sbnM6ZWpiPSJlamIueG1pIiB4bWxuczpjb21tb249ImNvbW1vbi54bWkiIHhtaTppZD0iZWpiLWphcl9JRF9CbmQiIGN1cnJlbnRCYWNrZW5kSWQ9IkNMT1VEU0NBUEVfVjUwXzEiPg0KLSAgPGVqYkphciBocmVmPSJNRVRBLUlORi9lamItamFyLnhtbCNlamItamFyX0lEIi8+DQotICA8ZWpiQmluZGluZ3MgeG1pOmlkPSJDb250YWluZXJNYW5hZ2VkRW50aXR5XzFfQm5kIiBqbmRpTmFtZT0iQXBwUHJvZmlsZVNhbXBsZS1BY2NvdW50SG9tZSI+DQotICAgIDxlbnRlcnByaXNlQmVhbiB4bWk6dHlwZT0iZWpiOkNvbnRhaW5lck1hbmFnZWRFbnRpdHkiIGhyZWY9Ik1FVEEtSU5GL2VqYi1qYXIueG1sI0NvbnRhaW5lck1hbmFnZWRFbnRpdHlfMSIvPg0KLSAgPC9lamJCaW5kaW5ncz4NCi0gIDxlamJCaW5kaW5ncyB4bWk6aWQ9IkVudGVycHJpc2VCZWFuQmluZGluZ18xIiBqbmRpTmFtZT0iQXBwUHJvZmlsZVNhbXBsZS1BY2NvdW50TWFuYWdlckhvbWUiPg0KLSAgICA8ZW50ZXJwcmlzZUJlYW4geG1pOnR5cGU9ImVqYjpTZXNzaW9uIiBocmVmPSJNRVRBLUlORi9lamItamFyLnhtbCNTZXNzaW9uXzEiLz4NCi0gICAgPGVqYlJlZkJpbmRpbmdzIHhtaTppZD0iRWpiUmVmQmluZGluZ18xIiBqbmRpTmFtZT0iQXBwUHJvZmlsZVNhbXBsZS1BY2NvdW50SG9tZSI+DQotICAgICAgPGJpbmRpbmdFamJSZWYgeG1pOnR5cGU9ImNvbW1vbjpFSkJMb2NhbFJlZiIgaHJlZj0iTUVUQS1JTkYvZWpiLWphci54bWwjRUpCTG9jYWxSZWZfMSIvPg0KLSAgICA8L2VqYlJlZkJpbmRpbmdzPg0KLSAgPC9lamJCaW5kaW5ncz4NCi0gIDxkZWZhdWx0Q01QQ29ubmVjdGlvbkZhY3RvcnkgeG1pOmlkPSJDTVBDb25uZWN0aW9uRmFjdG9yeUJpbmRpbmdfMiIgam5kaU5hbWU9ImVpcy9qZGJjL0FwcFByb2ZpbGVTYW1wbGVEQl9DTVAiIHJlc0F1dGg9IlBlcl9Db25uZWN0aW9uX0ZhY3RvcnkiLz4NCi08L2VqYmJuZDpFSkJKYXJCaW5kaW5nPg0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvZWpiL01FVEEtSU5GL2libS1lamItamFyLWV4dC1wbWUueG1pIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9lamIvTUVUQS1JTkYvaWJtLWVqYi1qYXItZXh0LXBtZS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlZWVjYjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9lamIvTUVUQS1JTkYvaWJtLWVqYi1qYXItZXh0LXBtZS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwbWVleHQ6UE1FRUpCSmFyRXh0ZW5zaW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6YXBwcHJvZmlsZWVqYmV4dD0iaHR0cDovL3d3dy5pYm0uY29tL3dlYnNwaGVyZS9hcHBzZXJ2ZXIvc2NoZW1hcy81LjAvYXBwcHJvZmlsZWVqYmV4dC54bWkiIHhtbG5zOmVqYmV4dD0iZWpiZXh0LnhtaSIgeG1sbnM6ZWpiPSJlamIueG1pIiB4bWxuczpwbWVleHQ9Imh0dHA6Ly93d3cuaWJtLmNvbS93ZWJzcGhlcmUvYXBwc2VydmVyL3NjaGVtYXMvNS4wL3BtZWV4dC54bWkiIHhtaTppZD0iUE1FRUpCSmFyRXh0ZW5zaW9uXzEiPg0KLSAgPGFwcFByb2ZpbGVFSkJKYXJFeHRlbnNpb24geG1pOmlkPSJBcHBQcm9maWxlRUpCSmFyRXh0ZW5zaW9uXzEiPg0KLSAgICA8YXBwbGljYXRpb25Qcm9maWxlcyB4bWk6aWQ9IkVKQk1vZHVsZVByb2ZpbGVfMSIgbmFtZT0iUmVhZC1vbmx5IiBkZXNjcmlwdGlvbj0iVGhpcyBwcm9maWxlIHdpbGwgYXBwbHkgYSByZWFkLW9ubHkgYWNjZXNzLWludGVudCBwb2xpY3kgdG8gdGhlIG11bHRpZmluZGVyIGZvciB0aGUgQWNjb3VudCBlbnRpdHkgYmVhbi4iPg0KLSAgICAgIDxhcHBsaWVkQWNjZXNzSW50ZW50cyB4bWk6aWQ9IkFwcGxpZWRBY2Nlc3NJbnRlbnRfMTA3MjgyODc1MzQyNCIgbmFtZT0iY29tLmlibS53ZWJzcGhlcmUuZWpicXVlcnkuRGVmYXVsdCIgZGVzY3JpcHRpb249IkFsbCBtZXRob2RzIG9mIHRoZSBBY2NvdW50IGJlYW4gYXJlIHNldCBmb3IgcmVhZCBvbmx5LiIgYWNjZXNzSW50ZW50TmFtZT0id3NQZXNzaW1pc3RpY1JlYWQiPg0KLSAgICAgICAgPG1ldGhvZEVsZW1lbnRzIHhtaTppZD0iTWV0aG9kRWxlbWVudF8xMDcyODI4NzUzNDI0IiB0eXBlPSJVbnNwZWNpZmllZCI+DQotICAgICAgICAgIDxlbnRlcnByaXNlQmVhbiB4bWk6dHlwZT0iZWpiOkNvbnRhaW5lck1hbmFnZWRFbnRpdHkiIGhyZWY9Ik1FVEEtSU5GL2VqYi1qYXIueG1sI0NvbnRhaW5lck1hbmFnZWRFbnRpdHlfMSIvPg0KLSAgICAgICAgPC9tZXRob2RFbGVtZW50cz4NCi0gICAgICA8L2FwcGxpZWRBY2Nlc3NJbnRlbnRzPg0KLSAgICAgIDx0YXNrcyB4bWk6aWQ9IlRhc2tfMTA3MTA5MzQxNTc4NCIgbmFtZT0iZ2V0TGFyZ2VBY2NvdW50cyIgZGVzY3JpcHRpb249IlRoaXMgdGFzayB3aWxsIGJlIHVzZWQgYnkgQWNjb3VudE1hbmFnZXIgc2Vzc2lvbiBiZWFuIGZvciByZWFkLW9ubHkgaW50ZW50LiIvPg0KLSAgICA8L2FwcGxpY2F0aW9uUHJvZmlsZXM+DQotICAgIDxlamJKYXJFeHRlbnNpb24gaHJlZj0iTUVUQS1JTkYvaWJtLWVqYi1qYXItZXh0LnhtaSNlamItamFyX0lEX0V4dCIvPg0KLSAgICA8ZGVmaW5lZEFjY2Vzc0ludGVudFBvbGljaWVzIHhtaTppZD0iRGVmaW5lZEFjY2Vzc0ludGVudFBvbGljeV8xIiBuYW1lPSJQZXNzaW1pc3RpY1VwZGF0ZSAtIEluY3JlbWVudCAxMCIgZGVzY3JpcHRpb249IlRoaXMgaXMgYSBjdXN0b20gcG9saWN5IHRoYXQga2VlcHMgYWxsIHRoZSBhdHRyaWJ1dGVzIG9mIHdzUGVzc2ltaXNpdGljVXBkYXRlIGV4Y2VwdCBmb3IgY29sbGVjdGlvbiBpbmNyZW1lbnQsIHdoaWNoIGlzIHNldCB0byAxMC4iPg0KLSAgICAgIDxhY2Nlc3NJbnRlbnRFbnRyaWVzIHhtaTp0eXBlPSJlamJleHQ6UGVzc2ltaXN0aWNVcGRhdGUiIHhtaTppZD0iUGVzc2ltaXN0aWNVcGRhdGVfMTA3MjgyNDI5MDgxNyIvPg0KLSAgICAgIDxhY2Nlc3NJbnRlbnRFbnRyaWVzIHhtaTp0eXBlPSJlamJleHQ6Q29sbGVjdGlvbkluY3JlbWVudCIgeG1pOmlkPSJDb2xsZWN0aW9uSW5jcmVtZW50XzEwNzI4MjQyOTA4MTciIGNvbGxlY3Rpb25JbmNyZW1lbnQ9IjEwIi8+DQotICAgICAgPGFjY2Vzc0ludGVudEVudHJpZXMgeG1pOnR5cGU9ImVqYmV4dDpSZXNvdXJjZU1hbmFnZXJQcmVGZXRjaEluY3JlbWVudCIgeG1pOmlkPSJSZXNvdXJjZU1hbmFnZXJQcmVGZXRjaEluY3JlbWVudF8xMDcyODI0MjkwODE3IiBwcmVGZXRjaEluY3JlbWVudD0iMCIvPg0KLSAgICAgIDxhY2Nlc3NJbnRlbnRFbnRyaWVzIHhtaTp0eXBlPSJlamJleHQ6VHJhbnNhY3Rpb25TY29wZSIgeG1pOmlkPSJUcmFuc2FjdGlvblNjb3BlXzEwNzI4MjQyOTA4MTciLz4NCi0gICAgPC9kZWZpbmVkQWNjZXNzSW50ZW50UG9saWNpZXM+DQotICAgIDxydW5Bc1Rhc2tzIHhtaTppZD0iUnVuQXNUYXNrXzIiIG5hbWU9ImdldExhcmdlQWNvdW50cyI+DQotICAgICAgPHRhc2tSdW5Bc0tpbmQgeG1pOnR5cGU9ImFwcHByb2ZpbGVlamJleHQ6UnVuQXNTcGVjaWZpZWRUYXNrIiB4bWk6aWQ9IlJ1bkFzU3BlY2lmaWVkVGFza18yIj4NCi0gICAgICAgIDx0YXNrIHhtaTppZD0iVGFza181IiBuYW1lPSJnZXRMYXJnZUFjY291bnRzIiBkZXNjcmlwdGlvbj0iZm9yIHZpZXdpbmcgYWNjb3VudCBkYXRhIG9ubHkiLz4NCi0gICAgICA8L3Rhc2tSdW5Bc0tpbmQ+DQotICAgICAgPG1ldGhvZEVsZW1lbnRzIHhtaTppZD0iTWV0aG9kRWxlbWVudF8zIiBuYW1lPSJnZXRMYXJnZUFjY291bnRzIiBwYXJtcz0iZG91YmxlICIgdHlwZT0iUmVtb3RlIj4NCi0gICAgICAgIDxlbnRlcnByaXNlQmVhbiB4bWk6dHlwZT0iZWpiOlNlc3Npb24iIGhyZWY9Ik1FVEEtSU5GL2VqYi1qYXIueG1sI1Nlc3Npb25fMSIvPg0KLSAgICAgIDwvbWV0aG9kRWxlbWVudHM+DQotICAgIDwvcnVuQXNUYXNrcz4NCi0gICAgPGFwcFByb2ZpbGVDb21wb25lbnRFeHRlbnNpb25zIHhtaTppZD0iQXBwUHJvZmlsZUNvbXBvbmVudEV4dGVuc2lvbl8xIj4NCi0gICAgICA8Y29tcG9uZW50RXh0ZW5zaW9uIHhtaTp0eXBlPSJlamJleHQ6U2Vzc2lvbkV4dGVuc2lvbiIgaHJlZj0iTUVUQS1JTkYvaWJtLWVqYi1qYXItZXh0LnhtaSNTZXNzaW9uRXh0ZW5zaW9uXzEiLz4NCi0gICAgPC9hcHBQcm9maWxlQ29tcG9uZW50RXh0ZW5zaW9ucz4NCi0gICAgPGFwcFByb2ZpbGVDb21wb25lbnRFeHRlbnNpb25zIHhtaTppZD0iQXBwUHJvZmlsZUNvbXBvbmVudEV4dGVuc2lvbl8yIj4NCi0gICAgICA8Y29tcG9uZW50RXh0ZW5zaW9uIHhtaTp0eXBlPSJlamJleHQ6Q29udGFpbmVyTWFuYWdlZEVudGl0eUV4dGVuc2lvbiIgaHJlZj0iTUVUQS1JTkYvaWJtLWVqYi1qYXItZXh0LnhtaSNDb250YWluZXJNYW5hZ2VkRW50aXR5XzFfRXh0Ii8+DQotICAgIDwvYXBwUHJvZmlsZUNvbXBvbmVudEV4dGVuc2lvbnM+DQotICA8L2FwcFByb2ZpbGVFSkJKYXJFeHRlbnNpb24+DQotPC9wbWVleHQ6UE1FRUpCSmFyRXh0ZW5zaW9uPg0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvZWpiL01FVEEtSU5GL2libS1lamItamFyLWV4dC54bWkgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL2VqYi9NRVRBLUlORi9pYm0tZWpiLWphci1leHQueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzMyNjRmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvZWpiL01FVEEtSU5GL2libS1lamItamFyLWV4dC54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxlamJleHQ6RUpCSmFyRXh0ZW5zaW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6ZWpiZXh0PSJlamJleHQueG1pIiB4bWxuczplamI9ImVqYi54bWkiIHhtaTppZD0iZWpiLWphcl9JRF9FeHQiPg0KLSAgPGVqYkV4dGVuc2lvbnMgeG1pOnR5cGU9ImVqYmV4dDpDb250YWluZXJNYW5hZ2VkRW50aXR5RXh0ZW5zaW9uIiB4bWk6aWQ9IkNvbnRhaW5lck1hbmFnZWRFbnRpdHlfMV9FeHQiIGNvbmN1cnJlbmN5Q29udHJvbD0icGVzc2ltaXN0aWMiPg0KLSAgICA8ZW50ZXJwcmlzZUJlYW4geG1pOnR5cGU9ImVqYjpDb250YWluZXJNYW5hZ2VkRW50aXR5IiBocmVmPSJNRVRBLUlORi9lamItamFyLnhtbCNDb250YWluZXJNYW5hZ2VkRW50aXR5XzEiLz4NCi0gICAgPHN0cnVjdHVyZSB4bWk6aWQ9IkJlYW5TdHJ1Y3R1cmVfMSIgaW5oZXJpdGVuY2VSb290PSJmYWxzZSIvPg0KLSAgICA8YmVhbkNhY2hlIHhtaTppZD0iQmVhbkNhY2hlXzEiIGFjdGl2YXRlQXQ9IlRSQU5TQUNUSU9OIiBsb2FkQXQ9IlRSQU5TQUNUSU9OIi8+DQotICAgIDxsb2NhbFRyYW4geG1pOmlkPSJMb2NhbFRyYW5fMSIgYm91bmRhcnk9IkJFQU5fTUVUSE9EIiB1bnJlc29sdmVkQWN0aW9uPSJST0xMQkFDSyIvPg0KLSAgICA8ZGF0YUNhY2hlIHhtaTppZD0iRGF0YUNhY2hlXzEiIGxpZmV0aW1lSW5DYWNoZT0iMCIgbGlmZXRpbWVJbkNhY2hlVXNhZ2U9Ik9GRiIvPg0KLSAgPC9lamJFeHRlbnNpb25zPg0KLSAgPGVqYkV4dGVuc2lvbnMgeG1pOnR5cGU9ImVqYmV4dDpTZXNzaW9uRXh0ZW5zaW9uIiB4bWk6aWQ9IlNlc3Npb25FeHRlbnNpb25fMSIgdGltZW91dD0iNjAwIj4NCi0gICAgPGVudGVycHJpc2VCZWFuIHhtaTp0eXBlPSJlamI6U2Vzc2lvbiIgaHJlZj0iTUVUQS1JTkYvZWpiLWphci54bWwjU2Vzc2lvbl8xIi8+DQotICAgIDxzdHJ1Y3R1cmUgeG1pOmlkPSJCZWFuU3RydWN0dXJlXzIiIGluaGVyaXRlbmNlUm9vdD0iZmFsc2UiLz4NCi0gICAgPGJlYW5DYWNoZSB4bWk6aWQ9IkJlYW5DYWNoZV8yIiBhY3RpdmF0ZUF0PSJPTkNFIi8+DQotICAgIDxsb2NhbFRyYW4geG1pOmlkPSJMb2NhbFRyYW5fMiIgYm91bmRhcnk9IkJFQU5fTUVUSE9EIiB1bnJlc29sdmVkQWN0aW9uPSJST0xMQkFDSyIvPg0KLSAgPC9lamJFeHRlbnNpb25zPg0KLSAgPGVqYkphciBocmVmPSJNRVRBLUlORi9lamItamFyLnhtbCNlamItamFyX0lEIi8+DQotICA8YXBwbGllZEFjY2Vzc0ludGVudHMgeG1pOmlkPSJBcHBsaWVkQWNjZXNzSW50ZW50XzEwNzEwOTM0MTU3NDQiIG5hbWU9ImNvbS5pYm0ud2Vic3BoZXJlLmVqYnF1ZXJ5LkRlZmF1bHQiIGRlc2NyaXB0aW9uPSIiIGFjY2Vzc0ludGVudE5hbWU9IlBlc3NpbWlzdGljVXBkYXRlIC0gSW5jcmVtZW50IDEwIj4NCi0gICAgPG1ldGhvZEVsZW1lbnRzIHhtaTppZD0iTWV0aG9kRWxlbWVudF8xMDcxMDkzNDE1NzQ0IiB0eXBlPSJVbnNwZWNpZmllZCI+DQotICAgICAgPGVudGVycHJpc2VCZWFuIHhtaTp0eXBlPSJlamI6Q29udGFpbmVyTWFuYWdlZEVudGl0eSIgaHJlZj0iTUVUQS1JTkYvZWpiLWphci54bWwjQ29udGFpbmVyTWFuYWdlZEVudGl0eV8xIi8+DQotICAgIDwvbWV0aG9kRWxlbWVudHM+DQotICA8L2FwcGxpZWRBY2Nlc3NJbnRlbnRzPg0KLTwvZWpiZXh0OkVKQkphckV4dGVuc2lvbj4NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL25vLXNsL01FVEEtSU5GL01BTklGRVNULk1GIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9uby1zbC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk0OTliYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL25vLXNsL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9uby1zbC9NRVRBLUlORi9lamItamFyLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvbm8tc2wvTUVUQS1JTkYvZWpiLWphci54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2OTNjODYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9uby1zbC9NRVRBLUlORi9lamItamFyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZWpiLWphciBpZD0iZWpiLWphcl9JRCIgdmVyc2lvbj0iMi4xIiAKLQl4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIgPgotCTxkaXNwbGF5LW5hbWU+Ci0JVGVzdEVKQjwvZGlzcGxheS1uYW1lPgotCTxlbnRlcnByaXNlLWJlYW5zPgotCQk8c2Vzc2lvbiBpZD0iVDEiPgotCQkJPGVqYi1uYW1lPlQxPC9lamItbmFtZT4KLQkJCTxob21lPmVqYnMuVDFIb21lPC9ob21lPgotCQkJPHJlbW90ZT5lamJzLlQxPC9yZW1vdGU+Ci0JCQk8ZWpiLWNsYXNzPmVqYnMuVDFCZWFuPC9lamItY2xhc3M+Ci0JCQk8c2Vzc2lvbi10eXBlPlN0YXRlbGVzczwvc2Vzc2lvbi10eXBlPgotCQkJPHRyYW5zYWN0aW9uLXR5cGU+Q29udGFpbmVyPC90cmFuc2FjdGlvbi10eXBlPgotCQk8L3Nlc3Npb24+Ci0JPC9lbnRlcnByaXNlLWJlYW5zPgotPC9lamItamFyPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9uby1zbC9lamJzL1QxLmNsYXNzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9uby1zbC9lamJzL1QxLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGE0ZTA4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvbm8tc2wvZWpicy9UMS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvbm8tc2wvZWpicy9UMUJlYW4uY2xhc3MgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL25vLXNsL2VqYnMvVDFCZWFuLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWNiNGY2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvbm8tc2wvZWpicy9UMUJlYW4uY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL25vLXNsL2VqYnMvVDFIb21lLmNsYXNzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9uby1zbC9lamJzL1QxSG9tZS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU3OTgzMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL25vLXNsL2VqYnMvVDFIb21lLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9zbC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvc2wvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NDk5YmMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9zbC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvc2wvTUVUQS1JTkYvZWpiLWphci54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL3NsL01FVEEtSU5GL2VqYi1qYXIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjM3YTAzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvc2wvTUVUQS1JTkYvZWpiLWphci54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGVqYi1qYXIgaWQ9ImVqYi1qYXJfSUQiIHZlcnNpb249IjIuMSIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2VqYi1qYXJfMl8xLnhzZCI+Ci0JPGRpc3BsYXktbmFtZT4KLQlUZXN0RUpCPC9kaXNwbGF5LW5hbWU+Ci0JPGVudGVycHJpc2UtYmVhbnM+Ci0JCTxzZXNzaW9uIGlkPSJUMSI+Ci0JCQk8ZWpiLW5hbWU+VDE8L2VqYi1uYW1lPgotCQkJPGhvbWU+ZWpicy5UMUhvbWU8L2hvbWU+Ci0JCQk8cmVtb3RlPmVqYnMuVDE8L3JlbW90ZT4KLQkJCTxlamItY2xhc3M+ZWpicy5UMUJlYW48L2VqYi1jbGFzcz4KLQkJCTxzZXNzaW9uLXR5cGU+U3RhdGVsZXNzPC9zZXNzaW9uLXR5cGU+Ci0JCQk8dHJhbnNhY3Rpb24tdHlwZT5Db250YWluZXI8L3RyYW5zYWN0aW9uLXR5cGU+Ci0JCTwvc2Vzc2lvbj4KLQk8L2VudGVycHJpc2UtYmVhbnM+Ci08L2VqYi1qYXI+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL3NsL2VqYnMvVDEuY2xhc3MgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL3NsL2VqYnMvVDEuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkYTRlMDguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9zbC9lamJzL1QxLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9zbC9lamJzL1QxQmVhbi5jbGFzcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvc2wvZWpicy9UMUJlYW4uY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxY2I0ZjYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9zbC9lamJzL1QxQmVhbi5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvc2wvZWpicy9UMUhvbWUuY2xhc3MgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL3NsL2VqYnMvVDFIb21lLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTc5ODMyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvc2wvZWpicy9UMUhvbWUuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL3dlYnNlcnZpY2VzL01FVEEtSU5GL0FubnVpdHlTZXJ2aWNlc19tYXBwaW5nLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvd2Vic2VydmljZXMvTUVUQS1JTkYvQW5udWl0eVNlcnZpY2VzX21hcHBpbmcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmZkY2JkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvd2Vic2VydmljZXMvTUVUQS1JTkYvQW5udWl0eVNlcnZpY2VzX21hcHBpbmcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDYxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08amF2YS13c2RsLW1hcHBpbmcgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHZlcnNpb249IjEuMSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIGh0dHA6Ly93d3cuaWJtLmNvbS93ZWJzZXJ2aWNlcy94c2QvajJlZV9qYXhycGNfbWFwcGluZ18xXzEueHNkIj4KLSAgICA8cGFja2FnZS1tYXBwaW5nPgotICAgICAgICA8cGFja2FnZS10eXBlPmNvbS5pYm0ud3NzdnQudGMucGxpLmRhdGE8L3BhY2thZ2UtdHlwZT4KLSAgICAgICAgPG5hbWVzcGFjZVVSST5odHRwOi8vZGF0YS5wbGkudGMud3NzdnQuaWJtLmNvbTwvbmFtZXNwYWNlVVJJPgotICAgIDwvcGFja2FnZS1tYXBwaW5nPgotICAgIDxwYWNrYWdlLW1hcHBpbmc+Ci0gICAgICAgIDxwYWNrYWdlLXR5cGU+Y29tLmlibS53c3N2dC5hY21lLmFubnVpdHkud3M8L3BhY2thZ2UtdHlwZT4KLSAgICAgICAgPG5hbWVzcGFjZVVSST5odHRwOi8vd3MuYW5udWl0eS5hY21lLndzc3Z0LmlibS5jb208L25hbWVzcGFjZVVSST4KLSAgICA8L3BhY2thZ2UtbWFwcGluZz4KLSAgICA8amF2YS14bWwtdHlwZS1tYXBwaW5nPgotICAgICAgICA8amF2YS10eXBlPmRvdWJsZTwvamF2YS10eXBlPgotICAgICAgICA8cm9vdC10eXBlLXFuYW1lIHhtbG5zOnJ0cT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPnJ0cTpkb3VibGU8L3Jvb3QtdHlwZS1xbmFtZT4KLSAgICAgICAgPHFuYW1lLXNjb3BlPnNpbXBsZVR5cGU8L3FuYW1lLXNjb3BlPgotICAgIDwvamF2YS14bWwtdHlwZS1tYXBwaW5nPgotICAgIDxqYXZhLXhtbC10eXBlLW1hcHBpbmc+Ci0gICAgICAgIDxqYXZhLXR5cGU+amF2YS51dGlsLlZlY3RvcjwvamF2YS10eXBlPgotICAgICAgICA8cm9vdC10eXBlLXFuYW1lIHhtbG5zOnJ0cT0iaHR0cDovL3htbC5hcGFjaGUub3JnL3htbC1zb2FwIj5ydHE6VmVjdG9yPC9yb290LXR5cGUtcW5hbWU+Ci0gICAgICAgIDxxbmFtZS1zY29wZT5zaW1wbGVUeXBlPC9xbmFtZS1zY29wZT4KLSAgICA8L2phdmEteG1sLXR5cGUtbWFwcGluZz4KLSAgICA8amF2YS14bWwtdHlwZS1tYXBwaW5nPgotICAgICAgICA8amF2YS10eXBlPmphdmEubGFuZy5TdHJpbmc8L2phdmEtdHlwZT4KLSAgICAgICAgPHJvb3QtdHlwZS1xbmFtZSB4bWxuczpydHE9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj5ydHE6c3RyaW5nPC9yb290LXR5cGUtcW5hbWU+Ci0gICAgICAgIDxxbmFtZS1zY29wZT5zaW1wbGVUeXBlPC9xbmFtZS1zY29wZT4KLSAgICA8L2phdmEteG1sLXR5cGUtbWFwcGluZz4KLSAgICA8amF2YS14bWwtdHlwZS1tYXBwaW5nPgotICAgICAgICA8amF2YS10eXBlPmNvbS5pYm0ud3NzdnQudGMucGxpLmRhdGEuV1NBbm51aXR5Q29tcG9zaXRlRGF0YTwvamF2YS10eXBlPgotICAgICAgICA8cm9vdC10eXBlLXFuYW1lIHhtbG5zOnJ0cT0iaHR0cDovL2RhdGEucGxpLnRjLndzc3Z0LmlibS5jb20iPnJ0cTpXU0FubnVpdHlDb21wb3NpdGVEYXRhPC9yb290LXR5cGUtcW5hbWU+Ci0gICAgICAgIDxxbmFtZS1zY29wZT5jb21wbGV4VHlwZTwvcW5hbWUtc2NvcGU+Ci0gICAgICAgIDx2YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICAgICAgPGphdmEtdmFyaWFibGUtbmFtZT5XU0FubnVpdHkgICAgRGF0YTwvamF2YS12YXJpYWJsZS1uYW1lPgotICAgICAgICAgICAgPHhtbC1lbGVtZW50LW5hbWU+V1NBbm51aXR5ICAgIERhdGE8L3htbC1lbGVtZW50LW5hbWU+Ci0gICAgICAgIDwvdmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgPHZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgICAgICA8amF2YS12YXJpYWJsZS1uYW1lPnN1YkFjY291bnRzPC9qYXZhLXZhcmlhYmxlLW5hbWU+Ci0gICAgICAgICAgICA8eG1sLWVsZW1lbnQtbmFtZT5zdWJBY2NvdW50czwveG1sLWVsZW1lbnQtbmFtZT4KLSAgICAgICAgPC92YXJpYWJsZS1tYXBwaW5nPgotICAgIDwvamF2YS14bWwtdHlwZS1tYXBwaW5nPgotICAgIDxqYXZhLXhtbC10eXBlLW1hcHBpbmc+Ci0gICAgICAgIDxqYXZhLXR5cGU+Y29tLmlibS53c3N2dC50Yy5wbGkuZGF0YS5XU0FubnVpdHlEYXRhPC9qYXZhLXR5cGU+Ci0gICAgICAgIDxyb290LXR5cGUtcW5hbWUgeG1sbnM6cnRxPSJodHRwOi8vZGF0YS5wbGkudGMud3NzdnQuaWJtLmNvbSI+cnRxOldTQW5udWl0eURhdGE8L3Jvb3QtdHlwZS1xbmFtZT4KLSAgICAgICAgPHFuYW1lLXNjb3BlPmNvbXBsZXhUeXBlPC9xbmFtZS1zY29wZT4KLSAgICAgICAgPHZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgICAgICA8amF2YS12YXJpYWJsZS1uYW1lPnRheFN0YXR1czwvamF2YS12YXJpYWJsZS1uYW1lPgotICAgICAgICAgICAgPHhtbC1lbGVtZW50LW5hbWU+dGF4U3RhdHVzPC94bWwtZWxlbWVudC1uYW1lPgotICAgICAgICA8L3ZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgIDx2YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICAgICAgPGphdmEtdmFyaWFibGUtbmFtZT50eXBlPC9qYXZhLXZhcmlhYmxlLW5hbWU+Ci0gICAgICAgICAgICA8eG1sLWVsZW1lbnQtbmFtZT50eXBlPC94bWwtZWxlbWVudC1uYW1lPgotICAgICAgICA8L3ZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgIDx2YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICAgICAgPGphdmEtdmFyaWFibGUtbmFtZT5hbW91bnQ8L2phdmEtdmFyaWFibGUtbmFtZT4KLSAgICAgICAgICAgIDx4bWwtZWxlbWVudC1uYW1lPmFtb3VudDwveG1sLWVsZW1lbnQtbmFtZT4KLSAgICAgICAgPC92YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICA8dmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgICAgIDxqYXZhLXZhcmlhYmxlLW5hbWU+ZW5kRGF0ZTwvamF2YS12YXJpYWJsZS1uYW1lPgotICAgICAgICAgICAgPHhtbC1lbGVtZW50LW5hbWU+ZW5kRGF0ZTwveG1sLWVsZW1lbnQtbmFtZT4KLSAgICAgICAgPC92YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICA8dmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgICAgIDxqYXZhLXZhcmlhYmxlLW5hbWU+Y3VzdE51bWJlcjwvamF2YS12YXJpYWJsZS1uYW1lPgotICAgICAgICAgICAgPHhtbC1lbGVtZW50LW5hbWU+Y3VzdE51bWJlcjwveG1sLWVsZW1lbnQtbmFtZT4KLSAgICAgICAgPC92YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICA8dmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgICAgIDxqYXZhLXZhcmlhYmxlLW5hbWU+Y3VzdE5hbWU8L2phdmEtdmFyaWFibGUtbmFtZT4KLSAgICAgICAgICAgIDx4bWwtZWxlbWVudC1uYW1lPmN1c3ROYW1lPC94bWwtZWxlbWVudC1uYW1lPgotICAgICAgICA8L3ZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgIDx2YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICAgICAgPGphdmEtdmFyaWFibGUtbmFtZT5jdXN0U1NOdW08L2phdmEtdmFyaWFibGUtbmFtZT4KLSAgICAgICAgICAgIDx4bWwtZWxlbWVudC1uYW1lPmN1c3RTU051bTwveG1sLWVsZW1lbnQtbmFtZT4KLSAgICAgICAgPC92YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICA8dmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgICAgIDxqYXZhLXZhcmlhYmxlLW5hbWU+RU1haWw8L2phdmEtdmFyaWFibGUtbmFtZT4KLSAgICAgICAgICAgIDx4bWwtZWxlbWVudC1uYW1lPkVNYWlsPC94bWwtZWxlbWVudC1uYW1lPgotICAgICAgICA8L3ZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgIDx2YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICAgICAgPGphdmEtdmFyaWFibGUtbmFtZT5hbm51aXR5Tm88L2phdmEtdmFyaWFibGUtbmFtZT4KLSAgICAgICAgICAgIDx4bWwtZWxlbWVudC1uYW1lPmFubnVpdHlObzwveG1sLWVsZW1lbnQtbmFtZT4KLSAgICAgICAgPC92YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICA8dmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgICAgIDxqYXZhLXZhcmlhYmxlLW5hbWU+cHJlbWl1bTwvamF2YS12YXJpYWJsZS1uYW1lPgotICAgICAgICAgICAgPHhtbC1lbGVtZW50LW5hbWU+cHJlbWl1bTwveG1sLWVsZW1lbnQtbmFtZT4KLSAgICAgICAgPC92YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICA8dmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgICAgIDxqYXZhLXZhcmlhYmxlLW5hbWU+YmVnaW5EYXRlPC9qYXZhLXZhcmlhYmxlLW5hbWU+Ci0gICAgICAgICAgICA8eG1sLWVsZW1lbnQtbmFtZT5iZWdpbkRhdGU8L3htbC1lbGVtZW50LW5hbWU+Ci0gICAgICAgIDwvdmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgPHZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgICAgICA8amF2YS12YXJpYWJsZS1uYW1lPnN0YXR1czwvamF2YS12YXJpYWJsZS1uYW1lPgotICAgICAgICAgICAgPHhtbC1lbGVtZW50LW5hbWU+c3RhdHVzPC94bWwtZWxlbWVudC1uYW1lPgotICAgICAgICA8L3ZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgIDx2YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICAgICAgPGphdmEtdmFyaWFibGUtbmFtZT5maXhlZFBlcmlvZDwvamF2YS12YXJpYWJsZS1uYW1lPgotICAgICAgICAgICAgPHhtbC1lbGVtZW50LW5hbWU+Zml4ZWRQZXJpb2Q8L3htbC1lbGVtZW50LW5hbWU+Ci0gICAgICAgIDwvdmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgPHZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgICAgICA8amF2YS12YXJpYWJsZS1uYW1lPmZpeGVkQW1vdW50PC9qYXZhLXZhcmlhYmxlLW5hbWU+Ci0gICAgICAgICAgICA8eG1sLWVsZW1lbnQtbmFtZT5maXhlZEFtb3VudDwveG1sLWVsZW1lbnQtbmFtZT4KLSAgICAgICAgPC92YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICA8dmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgICAgIDxqYXZhLXZhcmlhYmxlLW5hbWU+bGlmZTwvamF2YS12YXJpYWJsZS1uYW1lPgotICAgICAgICAgICAgPHhtbC1lbGVtZW50LW5hbWU+bGlmZTwveG1sLWVsZW1lbnQtbmFtZT4KLSAgICAgICAgPC92YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICA8dmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgICAgIDxqYXZhLXZhcmlhYmxlLW5hbWU+bGlmZVdpdGhQZXJpb2Q8L2phdmEtdmFyaWFibGUtbmFtZT4KLSAgICAgICAgICAgIDx4bWwtZWxlbWVudC1uYW1lPmxpZmVXaXRoUGVyaW9kPC94bWwtZWxlbWVudC1uYW1lPgotICAgICAgICA8L3ZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgIDx2YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICAgICAgPGphdmEtdmFyaWFibGUtbmFtZT5maXhlZFBlcmNlbnQ8L2phdmEtdmFyaWFibGUtbmFtZT4KLSAgICAgICAgICAgIDx4bWwtZWxlbWVudC1uYW1lPmZpeGVkUGVyY2VudDwveG1sLWVsZW1lbnQtbmFtZT4KLSAgICAgICAgPC92YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICA8dmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgICAgIDxqYXZhLXZhcmlhYmxlLW5hbWU+YWN0dWFsUGVyY2VudDwvamF2YS12YXJpYWJsZS1uYW1lPgotICAgICAgICAgICAgPHhtbC1lbGVtZW50LW5hbWU+YWN0dWFsUGVyY2VudDwveG1sLWVsZW1lbnQtbmFtZT4KLSAgICAgICAgPC92YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICA8dmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgICAgIDxqYXZhLXZhcmlhYmxlLW5hbWU+YmVuZWZpdE9wdGlvbnM8L2phdmEtdmFyaWFibGUtbmFtZT4KLSAgICAgICAgICAgIDx4bWwtZWxlbWVudC1uYW1lPmJlbmVmaXRPcHRpb25zPC94bWwtZWxlbWVudC1uYW1lPgotICAgICAgICA8L3ZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgIDx2YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICAgICAgPGphdmEtdmFyaWFibGUtbmFtZT5wcmVtaXVtU2NoZWQ8L2phdmEtdmFyaWFibGUtbmFtZT4KLSAgICAgICAgICAgIDx4bWwtZWxlbWVudC1uYW1lPnByZW1pdW1TY2hlZDwveG1sLWVsZW1lbnQtbmFtZT4KLSAgICAgICAgPC92YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICA8dmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgICAgIDxqYXZhLXZhcmlhYmxlLW5hbWU+aW52ZXN0Q2F0ZWdvcnk8L2phdmEtdmFyaWFibGUtbmFtZT4KLSAgICAgICAgICAgIDx4bWwtZWxlbWVudC1uYW1lPmludmVzdENhdGVnb3J5PC94bWwtZWxlbWVudC1uYW1lPgotICAgICAgICA8L3ZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgIDx2YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICAgICAgPGphdmEtdmFyaWFibGUtbmFtZT5wYXlvdXRPcHRpb25zPC9qYXZhLXZhcmlhYmxlLW5hbWU+Ci0gICAgICAgICAgICA8eG1sLWVsZW1lbnQtbmFtZT5wYXlvdXRPcHRpb25zPC94bWwtZWxlbWVudC1uYW1lPgotICAgICAgICA8L3ZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgIDx2YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICAgICAgPGphdmEtdmFyaWFibGUtbmFtZT5ndWFyUGF5b3V0PC9qYXZhLXZhcmlhYmxlLW5hbWU+Ci0gICAgICAgICAgICA8eG1sLWVsZW1lbnQtbmFtZT5ndWFyUGF5b3V0PC94bWwtZWxlbWVudC1uYW1lPgotICAgICAgICA8L3ZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgIDx2YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICAgICAgPGphdmEtdmFyaWFibGUtbmFtZT5udW1TdWJBY2N0czwvamF2YS12YXJpYWJsZS1uYW1lPgotICAgICAgICAgICAgPHhtbC1lbGVtZW50LW5hbWU+bnVtU3ViQWNjdHM8L3htbC1lbGVtZW50LW5hbWU+Ci0gICAgICAgIDwvdmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgPHZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgICAgICA8amF2YS12YXJpYWJsZS1uYW1lPmV4dHJhQ3JlZGl0czwvamF2YS12YXJpYWJsZS1uYW1lPgotICAgICAgICAgICAgPHhtbC1lbGVtZW50LW5hbWU+ZXh0cmFDcmVkaXRzPC94bWwtZWxlbWVudC1uYW1lPgotICAgICAgICA8L3ZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgIDx2YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICAgICAgPGphdmEtdmFyaWFibGUtbmFtZT5jZWxsTm9kZVNlcnZlck5hbWU8L2phdmEtdmFyaWFibGUtbmFtZT4KLSAgICAgICAgICAgIDx4bWwtZWxlbWVudC1uYW1lPmNlbGxOb2RlU2VydmVyTmFtZTwveG1sLWVsZW1lbnQtbmFtZT4KLSAgICAgICAgPC92YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICA8dmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgICAgIDxqYXZhLXZhcmlhYmxlLW5hbWU+Y2xpZW50SWQ8L2phdmEtdmFyaWFibGUtbmFtZT4KLSAgICAgICAgICAgIDx4bWwtZWxlbWVudC1uYW1lPmNsaWVudElkPC94bWwtZWxlbWVudC1uYW1lPgotICAgICAgICA8L3ZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgPC9qYXZhLXhtbC10eXBlLW1hcHBpbmc+Ci0gICAgPGphdmEteG1sLXR5cGUtbWFwcGluZz4KLSAgICAgICAgPGphdmEtdHlwZT5pbnQ8L2phdmEtdHlwZT4KLSAgICAgICAgPHJvb3QtdHlwZS1xbmFtZSB4bWxuczpydHE9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj5ydHE6aW50PC9yb290LXR5cGUtcW5hbWU+Ci0gICAgICAgIDxxbmFtZS1zY29wZT5zaW1wbGVUeXBlPC9xbmFtZS1zY29wZT4KLSAgICA8L2phdmEteG1sLXR5cGUtbWFwcGluZz4KLSAgICA8amF2YS14bWwtdHlwZS1tYXBwaW5nPgotICAgICAgICA8amF2YS10eXBlPmphdmEudXRpbC5DYWxlbmRhcjwvamF2YS10eXBlPgotICAgICAgICA8cm9vdC10eXBlLXFuYW1lIHhtbG5zOnJ0cT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPnJ0cTpkYXRlVGltZTwvcm9vdC10eXBlLXFuYW1lPgotICAgICAgICA8cW5hbWUtc2NvcGU+c2ltcGxlVHlwZTwvcW5hbWUtc2NvcGU+Ci0gICAgPC9qYXZhLXhtbC10eXBlLW1hcHBpbmc+Ci0gICAgPGphdmEteG1sLXR5cGUtbWFwcGluZz4KLSAgICAgICAgPGphdmEtdHlwZT5jb20uaWJtLndzc3Z0LnRjLnBsaS5kYXRhLlN1YkFjY3REYXRhW108L2phdmEtdHlwZT4KLSAgICAgICAgPGFub255bW91cy10eXBlLXFuYW1lPmh0dHA6Ly9kYXRhLnBsaS50Yy53c3N2dC5pYm0uY29tOlN1YkFjY3REYXRhWzAsdW5ib3VuZGVkXTwvYW5vbnltb3VzLXR5cGUtcW5hbWU+Ci0gICAgICAgIDxxbmFtZS1zY29wZT5jb21wbGV4VHlwZTwvcW5hbWUtc2NvcGU+Ci0gICAgPC9qYXZhLXhtbC10eXBlLW1hcHBpbmc+Ci0gICAgPGphdmEteG1sLXR5cGUtbWFwcGluZz4KLSAgICAgICAgPGphdmEtdHlwZT5jb20uaWJtLndzc3Z0LnRjLnBsaS5kYXRhLlN1YkFjY3REYXRhPC9qYXZhLXR5cGU+Ci0gICAgICAgIDxyb290LXR5cGUtcW5hbWUgeG1sbnM6cnRxPSJodHRwOi8vZGF0YS5wbGkudGMud3NzdnQuaWJtLmNvbSI+cnRxOlN1YkFjY3REYXRhPC9yb290LXR5cGUtcW5hbWU+Ci0gICAgICAgIDxxbmFtZS1zY29wZT5jb21wbGV4VHlwZTwvcW5hbWUtc2NvcGU+Ci0gICAgICAgIDx2YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICAgICAgPGphdmEtdmFyaWFibGUtbmFtZT50eXBlPC9qYXZhLXZhcmlhYmxlLW5hbWU+Ci0gICAgICAgICAgICA8eG1sLWVsZW1lbnQtbmFtZT50eXBlPC94bWwtZWxlbWVudC1uYW1lPgotICAgICAgICA8L3ZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgIDx2YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICAgICAgPGphdmEtdmFyaWFibGUtbmFtZT52YWx1ZTwvamF2YS12YXJpYWJsZS1uYW1lPgotICAgICAgICAgICAgPHhtbC1lbGVtZW50LW5hbWU+dmFsdWU8L3htbC1lbGVtZW50LW5hbWU+Ci0gICAgICAgIDwvdmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgPHZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgICAgICA8amF2YS12YXJpYWJsZS1uYW1lPmFubnVpdHlJZDwvamF2YS12YXJpYWJsZS1uYW1lPgotICAgICAgICAgICAgPHhtbC1lbGVtZW50LW5hbWU+YW5udWl0eUlkPC94bWwtZWxlbWVudC1uYW1lPgotICAgICAgICA8L3ZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgIDx2YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICAgICAgPGphdmEtdmFyaWFibGUtbmFtZT5pZDwvamF2YS12YXJpYWJsZS1uYW1lPgotICAgICAgICAgICAgPHhtbC1lbGVtZW50LW5hbWU+aWQ8L3htbC1lbGVtZW50LW5hbWU+Ci0gICAgICAgIDwvdmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgPHZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgICAgICA8amF2YS12YXJpYWJsZS1uYW1lPm5hbWU8L2phdmEtdmFyaWFibGUtbmFtZT4KLSAgICAgICAgICAgIDx4bWwtZWxlbWVudC1uYW1lPm5hbWU8L3htbC1lbGVtZW50LW5hbWU+Ci0gICAgICAgIDwvdmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgPHZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgICAgICA8amF2YS12YXJpYWJsZS1uYW1lPmNlbGxOb2RlU2VydmVyTmFtZTwvamF2YS12YXJpYWJsZS1uYW1lPgotICAgICAgICAgICAgPHhtbC1lbGVtZW50LW5hbWU+Y2VsbE5vZGVTZXJ2ZXJOYW1lPC94bWwtZWxlbWVudC1uYW1lPgotICAgICAgICA8L3ZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgIDx2YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICAgICAgPGphdmEtdmFyaWFibGUtbmFtZT5jbGllbnRJZDwvamF2YS12YXJpYWJsZS1uYW1lPgotICAgICAgICAgICAgPHhtbC1lbGVtZW50LW5hbWU+Y2xpZW50SWQ8L3htbC1lbGVtZW50LW5hbWU+Ci0gICAgICAgIDwvdmFyaWFibGUtbWFwcGluZz4KLSAgICA8L2phdmEteG1sLXR5cGUtbWFwcGluZz4KLSAgICA8amF2YS14bWwtdHlwZS1tYXBwaW5nPgotICAgICAgICA8amF2YS10eXBlPmJvb2xlYW48L2phdmEtdHlwZT4KLSAgICAgICAgPHJvb3QtdHlwZS1xbmFtZSB4bWxuczpydHE9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj5ydHE6Ym9vbGVhbjwvcm9vdC10eXBlLXFuYW1lPgotICAgICAgICA8cW5hbWUtc2NvcGU+c2ltcGxlVHlwZTwvcW5hbWUtc2NvcGU+Ci0gICAgPC9qYXZhLXhtbC10eXBlLW1hcHBpbmc+Ci0gICAgPGphdmEteG1sLXR5cGUtbWFwcGluZz4KLSAgICAgICAgPGphdmEtdHlwZT5jb20uaWJtLndzc3Z0LnRjLnBsaS5kYXRhLlN1YkFjY3REYXRhW108L2phdmEtdHlwZT4KLSAgICAgICAgPHJvb3QtdHlwZS1xbmFtZSB4bWxuczpydHE9Imh0dHA6Ly93cy5hbm51aXR5LmFjbWUud3NzdnQuaWJtLmNvbSI+cnRxOkFycmF5T2ZfdG5zMl9uaWxsYWJsZV9TdWJBY2N0RGF0YTwvcm9vdC10eXBlLXFuYW1lPgotICAgICAgICA8cW5hbWUtc2NvcGU+Y29tcGxleFR5cGU8L3FuYW1lLXNjb3BlPgotICAgICAgICA8dmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgICAgIDxqYXZhLXZhcmlhYmxlLW5hbWU+c3ViQWNjdERhdGE8L2phdmEtdmFyaWFibGUtbmFtZT4KLSAgICAgICAgICAgIDx4bWwtZWxlbWVudC1uYW1lPlN1YkFjY3REYXRhPC94bWwtZWxlbWVudC1uYW1lPgotICAgICAgICA8L3ZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgPC9qYXZhLXhtbC10eXBlLW1hcHBpbmc+Ci0gICAgPGphdmEteG1sLXR5cGUtbWFwcGluZz4KLSAgICAgICAgPGphdmEtdHlwZT5jb20uaWJtLndzc3Z0LnRjLnBsaS5kYXRhLlN1YkFjY3REYXRhW108L2phdmEtdHlwZT4KLSAgICAgICAgPGFub255bW91cy10eXBlLXFuYW1lPmh0dHA6Ly93cy5hbm51aXR5LmFjbWUud3NzdnQuaWJtLmNvbTpBcnJheU9mX3RuczJfbmlsbGFibGVfU3ViQWNjdERhdGEmZ3Q7U3ViQWNjdERhdGFbMCx1bmJvdW5kZWRdPC9hbm9ueW1vdXMtdHlwZS1xbmFtZT4KLSAgICAgICAgPHFuYW1lLXNjb3BlPmNvbXBsZXhUeXBlPC9xbmFtZS1zY29wZT4KLSAgICA8L2phdmEteG1sLXR5cGUtbWFwcGluZz4KLSAgICA8amF2YS14bWwtdHlwZS1tYXBwaW5nPgotICAgICAgICA8amF2YS10eXBlPmphdmEubGFuZy5PYmplY3RbXTwvamF2YS10eXBlPgotICAgICAgICA8YW5vbnltb3VzLXR5cGUtcW5hbWU+aHR0cDovL3htbC5hcGFjaGUub3JnL3htbC1zb2FwOlZlY3RvciZndDtpdGVtWzAsdW5ib3VuZGVkXTwvYW5vbnltb3VzLXR5cGUtcW5hbWU+Ci0gICAgICAgIDxxbmFtZS1zY29wZT5jb21wbGV4VHlwZTwvcW5hbWUtc2NvcGU+Ci0gICAgPC9qYXZhLXhtbC10eXBlLW1hcHBpbmc+Ci0gICAgPHNlcnZpY2UtaW50ZXJmYWNlLW1hcHBpbmc+Ci0gICAgICAgIDxzZXJ2aWNlLWludGVyZmFjZT5jb20uaWJtLndzc3Z0LmFjbWUuYW5udWl0eS53cy5XU1RBbm51aXR5U2VydmljZTwvc2VydmljZS1pbnRlcmZhY2U+Ci0gICAgICAgIDx3c2RsLXNlcnZpY2UtbmFtZSB4bWxuczpzaW09Imh0dHA6Ly93cy5hbm51aXR5LmFjbWUud3NzdnQuaWJtLmNvbSI+c2ltOldTVEFubnVpdHlTZXJ2aWNlPC93c2RsLXNlcnZpY2UtbmFtZT4KLSAgICAgICAgPHBvcnQtbWFwcGluZz4KLSAgICAgICAgICAgIDxwb3J0LW5hbWU+V1NUQW5udWl0eVNlcnZpY2U8L3BvcnQtbmFtZT4KLSAgICAgICAgICAgIDxqYXZhLXBvcnQtbmFtZT5XU1RBbm51aXR5U2VydmljZTwvamF2YS1wb3J0LW5hbWU+Ci0gICAgICAgIDwvcG9ydC1tYXBwaW5nPgotICAgIDwvc2VydmljZS1pbnRlcmZhY2UtbWFwcGluZz4KLSAgICA8c2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UtbWFwcGluZz4KLSAgICAgICAgPHNlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlPmNvbS5pYm0ud3NzdnQuYWNtZS5hbm51aXR5LndzLkFubnVpdHlTZXJ2aWNlUG9ydFR5cGU8L3NlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlPgotICAgICAgICA8d3NkbC1wb3J0LXR5cGUgeG1sbnM6c2VpbXdwdD0iaHR0cDovL3dzLmFubnVpdHkuYWNtZS53c3N2dC5pYm0uY29tIj5zZWltd3B0OkFubnVpdHlTZXJ2aWNlUG9ydFR5cGU8L3dzZGwtcG9ydC10eXBlPgotICAgICAgICA8d3NkbC1iaW5kaW5nIHhtbG5zOnNlaW13Yj0iaHR0cDovL3dzLmFubnVpdHkuYWNtZS53c3N2dC5pYm0uY29tIj5zZWltd2I6QW5udWl0eVNlcnZpY2VCaW5kaW5nPC93c2RsLWJpbmRpbmc+Ci0gICAgICAgIDxzZXJ2aWNlLWVuZHBvaW50LW1ldGhvZC1tYXBwaW5nPgotICAgICAgICAgICAgPGphdmEtbWV0aG9kLW5hbWU+d3NMaXN0QW5udWl0eUJ5SG9sZGVyPC9qYXZhLW1ldGhvZC1uYW1lPgotICAgICAgICAgICAgPHdzZGwtb3BlcmF0aW9uPndzTGlzdEFubnVpdHlCeUhvbGRlcjwvd3NkbC1vcGVyYXRpb24+Ci0gICAgICAgICAgICA8d3JhcHBlZC1lbGVtZW50Pjwvd3JhcHBlZC1lbGVtZW50PgotICAgICAgICAgICAgPG1ldGhvZC1wYXJhbS1wYXJ0cy1tYXBwaW5nPgotICAgICAgICAgICAgICAgIDxwYXJhbS1wb3NpdGlvbj4wPC9wYXJhbS1wb3NpdGlvbj4KLSAgICAgICAgICAgICAgICA8cGFyYW0tdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9wYXJhbS10eXBlPgotICAgICAgICAgICAgICAgIDx3c2RsLW1lc3NhZ2UtbWFwcGluZz4KLSAgICAgICAgICAgICAgICAgICAgPHdzZGwtbWVzc2FnZSB4bWxuczptcHBtPSJodHRwOi8vd3MuYW5udWl0eS5hY21lLndzc3Z0LmlibS5jb20iPm1wcG06d3NMaXN0QW5udWl0eUJ5SG9sZGVyUmVxdWVzdDwvd3NkbC1tZXNzYWdlPgotICAgICAgICAgICAgICAgICAgICA8d3NkbC1tZXNzYWdlLXBhcnQtbmFtZT5ob2xkZXJTU048L3dzZGwtbWVzc2FnZS1wYXJ0LW5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxwYXJhbWV0ZXItbW9kZT5JTjwvcGFyYW1ldGVyLW1vZGU+Ci0gICAgICAgICAgICAgICAgPC93c2RsLW1lc3NhZ2UtbWFwcGluZz4KLSAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtLXBhcnRzLW1hcHBpbmc+Ci0gICAgICAgICAgICA8d3NkbC1yZXR1cm4tdmFsdWUtbWFwcGluZz4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXJldHVybi12YWx1ZT5qYXZhLnV0aWwuVmVjdG9yPC9tZXRob2QtcmV0dXJuLXZhbHVlPgotICAgICAgICAgICAgICAgIDx3c2RsLW1lc3NhZ2UgeG1sbnM6d3J2bT0iaHR0cDovL3dzLmFubnVpdHkuYWNtZS53c3N2dC5pYm0uY29tIj53cnZtOndzTGlzdEFubnVpdHlCeUhvbGRlclJlc3BvbnNlPC93c2RsLW1lc3NhZ2U+Ci0gICAgICAgICAgICAgICAgPHdzZGwtbWVzc2FnZS1wYXJ0LW5hbWU+d3NMaXN0QW5udWl0eUJ5SG9sZGVyUmV0dXJuPC93c2RsLW1lc3NhZ2UtcGFydC1uYW1lPgotICAgICAgICAgICAgPC93c2RsLXJldHVybi12YWx1ZS1tYXBwaW5nPgotICAgICAgICA8L3NlcnZpY2UtZW5kcG9pbnQtbWV0aG9kLW1hcHBpbmc+Ci0gICAgICAgIDxzZXJ2aWNlLWVuZHBvaW50LW1ldGhvZC1tYXBwaW5nPgotICAgICAgICAgICAgPGphdmEtbWV0aG9kLW5hbWU+d3NBZGRTdWJBY2NvdW50czwvamF2YS1tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDx3c2RsLW9wZXJhdGlvbj53c0FkZFN1YkFjY291bnRzPC93c2RsLW9wZXJhdGlvbj4KLSAgICAgICAgICAgIDx3cmFwcGVkLWVsZW1lbnQ+PC93cmFwcGVkLWVsZW1lbnQ+Ci0gICAgICAgICAgICA8bWV0aG9kLXBhcmFtLXBhcnRzLW1hcHBpbmc+Ci0gICAgICAgICAgICAgICAgPHBhcmFtLXBvc2l0aW9uPjA8L3BhcmFtLXBvc2l0aW9uPgotICAgICAgICAgICAgICAgIDxwYXJhbS10eXBlPmNvbS5pYm0ud3NzdnQudGMucGxpLmRhdGEuV1NBbm51aXR5Q29tcG9zaXRlRGF0YTwvcGFyYW0tdHlwZT4KLSAgICAgICAgICAgICAgICA8d3NkbC1tZXNzYWdlLW1hcHBpbmc+Ci0gICAgICAgICAgICAgICAgICAgIDx3c2RsLW1lc3NhZ2UgeG1sbnM6bXBwbT0iaHR0cDovL3dzLmFubnVpdHkuYWNtZS53c3N2dC5pYm0uY29tIj5tcHBtOndzQWRkU3ViQWNjb3VudHNSZXF1ZXN0PC93c2RsLW1lc3NhZ2U+Ci0gICAgICAgICAgICAgICAgICAgIDx3c2RsLW1lc3NhZ2UtcGFydC1uYW1lPmFDRDwvd3NkbC1tZXNzYWdlLXBhcnQtbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPHBhcmFtZXRlci1tb2RlPklOPC9wYXJhbWV0ZXItbW9kZT4KLSAgICAgICAgICAgICAgICA8L3dzZGwtbWVzc2FnZS1tYXBwaW5nPgotICAgICAgICAgICAgPC9tZXRob2QtcGFyYW0tcGFydHMtbWFwcGluZz4KLSAgICAgICAgICAgIDxtZXRob2QtcGFyYW0tcGFydHMtbWFwcGluZz4KLSAgICAgICAgICAgICAgICA8cGFyYW0tcG9zaXRpb24+MTwvcGFyYW0tcG9zaXRpb24+Ci0gICAgICAgICAgICAgICAgPHBhcmFtLXR5cGU+Y29tLmlibS53c3N2dC50Yy5wbGkuZGF0YS5TdWJBY2N0RGF0YVtdPC9wYXJhbS10eXBlPgotICAgICAgICAgICAgICAgIDx3c2RsLW1lc3NhZ2UtbWFwcGluZz4KLSAgICAgICAgICAgICAgICAgICAgPHdzZGwtbWVzc2FnZSB4bWxuczptcHBtPSJodHRwOi8vd3MuYW5udWl0eS5hY21lLndzc3Z0LmlibS5jb20iPm1wcG06d3NBZGRTdWJBY2NvdW50c1JlcXVlc3Q8L3dzZGwtbWVzc2FnZT4KLSAgICAgICAgICAgICAgICAgICAgPHdzZGwtbWVzc2FnZS1wYXJ0LW5hbWU+c0FEPC93c2RsLW1lc3NhZ2UtcGFydC1uYW1lPgotICAgICAgICAgICAgICAgICAgICA8cGFyYW1ldGVyLW1vZGU+SU48L3BhcmFtZXRlci1tb2RlPgotICAgICAgICAgICAgICAgIDwvd3NkbC1tZXNzYWdlLW1hcHBpbmc+Ci0gICAgICAgICAgICA8L21ldGhvZC1wYXJhbS1wYXJ0cy1tYXBwaW5nPgotICAgICAgICAgICAgPHdzZGwtcmV0dXJuLXZhbHVlLW1hcHBpbmc+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1yZXR1cm4tdmFsdWU+Y29tLmlibS53c3N2dC50Yy5wbGkuZGF0YS5XU0FubnVpdHlDb21wb3NpdGVEYXRhPC9tZXRob2QtcmV0dXJuLXZhbHVlPgotICAgICAgICAgICAgICAgIDx3c2RsLW1lc3NhZ2UgeG1sbnM6d3J2bT0iaHR0cDovL3dzLmFubnVpdHkuYWNtZS53c3N2dC5pYm0uY29tIj53cnZtOndzQWRkU3ViQWNjb3VudHNSZXNwb25zZTwvd3NkbC1tZXNzYWdlPgotICAgICAgICAgICAgICAgIDx3c2RsLW1lc3NhZ2UtcGFydC1uYW1lPndzQWRkU3ViQWNjb3VudHNSZXR1cm48L3dzZGwtbWVzc2FnZS1wYXJ0LW5hbWU+Ci0gICAgICAgICAgICA8L3dzZGwtcmV0dXJuLXZhbHVlLW1hcHBpbmc+Ci0gICAgICAgIDwvc2VydmljZS1lbmRwb2ludC1tZXRob2QtbWFwcGluZz4KLSAgICAgICAgPHNlcnZpY2UtZW5kcG9pbnQtbWV0aG9kLW1hcHBpbmc+Ci0gICAgICAgICAgICA8amF2YS1tZXRob2QtbmFtZT53c0NyZWF0ZUFubnVpdHk8L2phdmEtbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8d3NkbC1vcGVyYXRpb24+d3NDcmVhdGVBbm51aXR5PC93c2RsLW9wZXJhdGlvbj4KLSAgICAgICAgICAgIDx3cmFwcGVkLWVsZW1lbnQ+PC93cmFwcGVkLWVsZW1lbnQ+Ci0gICAgICAgICAgICA8bWV0aG9kLXBhcmFtLXBhcnRzLW1hcHBpbmc+Ci0gICAgICAgICAgICAgICAgPHBhcmFtLXBvc2l0aW9uPjA8L3BhcmFtLXBvc2l0aW9uPgotICAgICAgICAgICAgICAgIDxwYXJhbS10eXBlPmNvbS5pYm0ud3NzdnQudGMucGxpLmRhdGEuV1NBbm51aXR5Q29tcG9zaXRlRGF0YTwvcGFyYW0tdHlwZT4KLSAgICAgICAgICAgICAgICA8d3NkbC1tZXNzYWdlLW1hcHBpbmc+Ci0gICAgICAgICAgICAgICAgICAgIDx3c2RsLW1lc3NhZ2UgeG1sbnM6bXBwbT0iaHR0cDovL3dzLmFubnVpdHkuYWNtZS53c3N2dC5pYm0uY29tIj5tcHBtOndzQ3JlYXRlQW5udWl0eVJlcXVlc3Q8L3dzZGwtbWVzc2FnZT4KLSAgICAgICAgICAgICAgICAgICAgPHdzZGwtbWVzc2FnZS1wYXJ0LW5hbWU+YUNEPC93c2RsLW1lc3NhZ2UtcGFydC1uYW1lPgotICAgICAgICAgICAgICAgICAgICA8cGFyYW1ldGVyLW1vZGU+SU48L3BhcmFtZXRlci1tb2RlPgotICAgICAgICAgICAgICAgIDwvd3NkbC1tZXNzYWdlLW1hcHBpbmc+Ci0gICAgICAgICAgICA8L21ldGhvZC1wYXJhbS1wYXJ0cy1tYXBwaW5nPgotICAgICAgICAgICAgPHdzZGwtcmV0dXJuLXZhbHVlLW1hcHBpbmc+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1yZXR1cm4tdmFsdWU+Y29tLmlibS53c3N2dC50Yy5wbGkuZGF0YS5XU0FubnVpdHlDb21wb3NpdGVEYXRhPC9tZXRob2QtcmV0dXJuLXZhbHVlPgotICAgICAgICAgICAgICAgIDx3c2RsLW1lc3NhZ2UgeG1sbnM6d3J2bT0iaHR0cDovL3dzLmFubnVpdHkuYWNtZS53c3N2dC5pYm0uY29tIj53cnZtOndzQ3JlYXRlQW5udWl0eVJlc3BvbnNlPC93c2RsLW1lc3NhZ2U+Ci0gICAgICAgICAgICAgICAgPHdzZGwtbWVzc2FnZS1wYXJ0LW5hbWU+d3NDcmVhdGVBbm51aXR5UmV0dXJuPC93c2RsLW1lc3NhZ2UtcGFydC1uYW1lPgotICAgICAgICAgICAgPC93c2RsLXJldHVybi12YWx1ZS1tYXBwaW5nPgotICAgICAgICA8L3NlcnZpY2UtZW5kcG9pbnQtbWV0aG9kLW1hcHBpbmc+Ci0gICAgPC9zZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZS1tYXBwaW5nPgotICAgIDxzZXJ2aWNlLWludGVyZmFjZS1tYXBwaW5nPgotICAgICAgICA8c2VydmljZS1pbnRlcmZhY2U+Y29tLmlibS53c3N2dC5hY21lLmFubnVpdHkud3MuQW5udWl0eVNlcnZpY2U8L3NlcnZpY2UtaW50ZXJmYWNlPgotICAgICAgICA8d3NkbC1zZXJ2aWNlLW5hbWUgeG1sbnM6c2ltPSJodHRwOi8vd3MuYW5udWl0eS5hY21lLndzc3Z0LmlibS5jb20iPnNpbTpBbm51aXR5U2VydmljZTwvd3NkbC1zZXJ2aWNlLW5hbWU+Ci0gICAgICAgIDxwb3J0LW1hcHBpbmc+Ci0gICAgICAgICAgICA8cG9ydC1uYW1lPkFubnVpdHlTZXJ2aWNlPC9wb3J0LW5hbWU+Ci0gICAgICAgICAgICA8amF2YS1wb3J0LW5hbWU+QW5udWl0eVNlcnZpY2U8L2phdmEtcG9ydC1uYW1lPgotICAgICAgICA8L3BvcnQtbWFwcGluZz4KLSAgICA8L3NlcnZpY2UtaW50ZXJmYWNlLW1hcHBpbmc+Ci0gICAgPHNlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlLW1hcHBpbmc+Ci0gICAgICAgIDxzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZT5jb20uaWJtLndzc3Z0LmFjbWUuYW5udWl0eS53cy5Bbm51aXR5U2VydmljZVBvcnRUeXBlPC9zZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZT4KLSAgICAgICAgPHdzZGwtcG9ydC10eXBlIHhtbG5zOnNlaW13cHQ9Imh0dHA6Ly93cy5hbm51aXR5LmFjbWUud3NzdnQuaWJtLmNvbSI+c2VpbXdwdDpBbm51aXR5U2VydmljZVBvcnRUeXBlPC93c2RsLXBvcnQtdHlwZT4KLSAgICAgICAgPHdzZGwtYmluZGluZyB4bWxuczpzZWltd2I9Imh0dHA6Ly93cy5hbm51aXR5LmFjbWUud3NzdnQuaWJtLmNvbSI+c2VpbXdiOkFubnVpdHlTZXJ2aWNlQmluZGluZzwvd3NkbC1iaW5kaW5nPgotICAgICAgICA8c2VydmljZS1lbmRwb2ludC1tZXRob2QtbWFwcGluZz4KLSAgICAgICAgICAgIDxqYXZhLW1ldGhvZC1uYW1lPndzTGlzdEFubnVpdHlCeUhvbGRlcjwvamF2YS1tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDx3c2RsLW9wZXJhdGlvbj53c0xpc3RBbm51aXR5QnlIb2xkZXI8L3dzZGwtb3BlcmF0aW9uPgotICAgICAgICAgICAgPHdyYXBwZWQtZWxlbWVudD48L3dyYXBwZWQtZWxlbWVudD4KLSAgICAgICAgICAgIDxtZXRob2QtcGFyYW0tcGFydHMtbWFwcGluZz4KLSAgICAgICAgICAgICAgICA8cGFyYW0tcG9zaXRpb24+MDwvcGFyYW0tcG9zaXRpb24+Ci0gICAgICAgICAgICAgICAgPHBhcmFtLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvcGFyYW0tdHlwZT4KLSAgICAgICAgICAgICAgICA8d3NkbC1tZXNzYWdlLW1hcHBpbmc+Ci0gICAgICAgICAgICAgICAgICAgIDx3c2RsLW1lc3NhZ2UgeG1sbnM6bXBwbT0iaHR0cDovL3dzLmFubnVpdHkuYWNtZS53c3N2dC5pYm0uY29tIj5tcHBtOndzTGlzdEFubnVpdHlCeUhvbGRlclJlcXVlc3Q8L3dzZGwtbWVzc2FnZT4KLSAgICAgICAgICAgICAgICAgICAgPHdzZGwtbWVzc2FnZS1wYXJ0LW5hbWU+aG9sZGVyU1NOPC93c2RsLW1lc3NhZ2UtcGFydC1uYW1lPgotICAgICAgICAgICAgICAgICAgICA8cGFyYW1ldGVyLW1vZGU+SU48L3BhcmFtZXRlci1tb2RlPgotICAgICAgICAgICAgICAgIDwvd3NkbC1tZXNzYWdlLW1hcHBpbmc+Ci0gICAgICAgICAgICA8L21ldGhvZC1wYXJhbS1wYXJ0cy1tYXBwaW5nPgotICAgICAgICAgICAgPHdzZGwtcmV0dXJuLXZhbHVlLW1hcHBpbmc+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1yZXR1cm4tdmFsdWU+amF2YS51dGlsLlZlY3RvcjwvbWV0aG9kLXJldHVybi12YWx1ZT4KLSAgICAgICAgICAgICAgICA8d3NkbC1tZXNzYWdlIHhtbG5zOndydm09Imh0dHA6Ly93cy5hbm51aXR5LmFjbWUud3NzdnQuaWJtLmNvbSI+d3J2bTp3c0xpc3RBbm51aXR5QnlIb2xkZXJSZXNwb25zZTwvd3NkbC1tZXNzYWdlPgotICAgICAgICAgICAgICAgIDx3c2RsLW1lc3NhZ2UtcGFydC1uYW1lPndzTGlzdEFubnVpdHlCeUhvbGRlclJldHVybjwvd3NkbC1tZXNzYWdlLXBhcnQtbmFtZT4KLSAgICAgICAgICAgIDwvd3NkbC1yZXR1cm4tdmFsdWUtbWFwcGluZz4KLSAgICAgICAgPC9zZXJ2aWNlLWVuZHBvaW50LW1ldGhvZC1tYXBwaW5nPgotICAgICAgICA8c2VydmljZS1lbmRwb2ludC1tZXRob2QtbWFwcGluZz4KLSAgICAgICAgICAgIDxqYXZhLW1ldGhvZC1uYW1lPndzQWRkU3ViQWNjb3VudHM8L2phdmEtbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8d3NkbC1vcGVyYXRpb24+d3NBZGRTdWJBY2NvdW50czwvd3NkbC1vcGVyYXRpb24+Ci0gICAgICAgICAgICA8d3JhcHBlZC1lbGVtZW50Pjwvd3JhcHBlZC1lbGVtZW50PgotICAgICAgICAgICAgPG1ldGhvZC1wYXJhbS1wYXJ0cy1tYXBwaW5nPgotICAgICAgICAgICAgICAgIDxwYXJhbS1wb3NpdGlvbj4wPC9wYXJhbS1wb3NpdGlvbj4KLSAgICAgICAgICAgICAgICA8cGFyYW0tdHlwZT5jb20uaWJtLndzc3Z0LnRjLnBsaS5kYXRhLldTQW5udWl0eUNvbXBvc2l0ZURhdGE8L3BhcmFtLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHdzZGwtbWVzc2FnZS1tYXBwaW5nPgotICAgICAgICAgICAgICAgICAgICA8d3NkbC1tZXNzYWdlIHhtbG5zOm1wcG09Imh0dHA6Ly93cy5hbm51aXR5LmFjbWUud3NzdnQuaWJtLmNvbSI+bXBwbTp3c0FkZFN1YkFjY291bnRzUmVxdWVzdDwvd3NkbC1tZXNzYWdlPgotICAgICAgICAgICAgICAgICAgICA8d3NkbC1tZXNzYWdlLXBhcnQtbmFtZT5hQ0Q8L3dzZGwtbWVzc2FnZS1wYXJ0LW5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxwYXJhbWV0ZXItbW9kZT5JTjwvcGFyYW1ldGVyLW1vZGU+Ci0gICAgICAgICAgICAgICAgPC93c2RsLW1lc3NhZ2UtbWFwcGluZz4KLSAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtLXBhcnRzLW1hcHBpbmc+Ci0gICAgICAgICAgICA8bWV0aG9kLXBhcmFtLXBhcnRzLW1hcHBpbmc+Ci0gICAgICAgICAgICAgICAgPHBhcmFtLXBvc2l0aW9uPjE8L3BhcmFtLXBvc2l0aW9uPgotICAgICAgICAgICAgICAgIDxwYXJhbS10eXBlPmNvbS5pYm0ud3NzdnQudGMucGxpLmRhdGEuU3ViQWNjdERhdGFbXTwvcGFyYW0tdHlwZT4KLSAgICAgICAgICAgICAgICA8d3NkbC1tZXNzYWdlLW1hcHBpbmc+Ci0gICAgICAgICAgICAgICAgICAgIDx3c2RsLW1lc3NhZ2UgeG1sbnM6bXBwbT0iaHR0cDovL3dzLmFubnVpdHkuYWNtZS53c3N2dC5pYm0uY29tIj5tcHBtOndzQWRkU3ViQWNjb3VudHNSZXF1ZXN0PC93c2RsLW1lc3NhZ2U+Ci0gICAgICAgICAgICAgICAgICAgIDx3c2RsLW1lc3NhZ2UtcGFydC1uYW1lPnNBRDwvd3NkbC1tZXNzYWdlLXBhcnQtbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPHBhcmFtZXRlci1tb2RlPklOPC9wYXJhbWV0ZXItbW9kZT4KLSAgICAgICAgICAgICAgICA8L3dzZGwtbWVzc2FnZS1tYXBwaW5nPgotICAgICAgICAgICAgPC9tZXRob2QtcGFyYW0tcGFydHMtbWFwcGluZz4KLSAgICAgICAgICAgIDx3c2RsLXJldHVybi12YWx1ZS1tYXBwaW5nPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcmV0dXJuLXZhbHVlPmNvbS5pYm0ud3NzdnQudGMucGxpLmRhdGEuV1NBbm51aXR5Q29tcG9zaXRlRGF0YTwvbWV0aG9kLXJldHVybi12YWx1ZT4KLSAgICAgICAgICAgICAgICA8d3NkbC1tZXNzYWdlIHhtbG5zOndydm09Imh0dHA6Ly93cy5hbm51aXR5LmFjbWUud3NzdnQuaWJtLmNvbSI+d3J2bTp3c0FkZFN1YkFjY291bnRzUmVzcG9uc2U8L3dzZGwtbWVzc2FnZT4KLSAgICAgICAgICAgICAgICA8d3NkbC1tZXNzYWdlLXBhcnQtbmFtZT53c0FkZFN1YkFjY291bnRzUmV0dXJuPC93c2RsLW1lc3NhZ2UtcGFydC1uYW1lPgotICAgICAgICAgICAgPC93c2RsLXJldHVybi12YWx1ZS1tYXBwaW5nPgotICAgICAgICA8L3NlcnZpY2UtZW5kcG9pbnQtbWV0aG9kLW1hcHBpbmc+Ci0gICAgICAgIDxzZXJ2aWNlLWVuZHBvaW50LW1ldGhvZC1tYXBwaW5nPgotICAgICAgICAgICAgPGphdmEtbWV0aG9kLW5hbWU+d3NDcmVhdGVBbm51aXR5PC9qYXZhLW1ldGhvZC1uYW1lPgotICAgICAgICAgICAgPHdzZGwtb3BlcmF0aW9uPndzQ3JlYXRlQW5udWl0eTwvd3NkbC1vcGVyYXRpb24+Ci0gICAgICAgICAgICA8d3JhcHBlZC1lbGVtZW50Pjwvd3JhcHBlZC1lbGVtZW50PgotICAgICAgICAgICAgPG1ldGhvZC1wYXJhbS1wYXJ0cy1tYXBwaW5nPgotICAgICAgICAgICAgICAgIDxwYXJhbS1wb3NpdGlvbj4wPC9wYXJhbS1wb3NpdGlvbj4KLSAgICAgICAgICAgICAgICA8cGFyYW0tdHlwZT5jb20uaWJtLndzc3Z0LnRjLnBsaS5kYXRhLldTQW5udWl0eUNvbXBvc2l0ZURhdGE8L3BhcmFtLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHdzZGwtbWVzc2FnZS1tYXBwaW5nPgotICAgICAgICAgICAgICAgICAgICA8d3NkbC1tZXNzYWdlIHhtbG5zOm1wcG09Imh0dHA6Ly93cy5hbm51aXR5LmFjbWUud3NzdnQuaWJtLmNvbSI+bXBwbTp3c0NyZWF0ZUFubnVpdHlSZXF1ZXN0PC93c2RsLW1lc3NhZ2U+Ci0gICAgICAgICAgICAgICAgICAgIDx3c2RsLW1lc3NhZ2UtcGFydC1uYW1lPmFDRDwvd3NkbC1tZXNzYWdlLXBhcnQtbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPHBhcmFtZXRlci1tb2RlPklOPC9wYXJhbWV0ZXItbW9kZT4KLSAgICAgICAgICAgICAgICA8L3dzZGwtbWVzc2FnZS1tYXBwaW5nPgotICAgICAgICAgICAgPC9tZXRob2QtcGFyYW0tcGFydHMtbWFwcGluZz4KLSAgICAgICAgICAgIDx3c2RsLXJldHVybi12YWx1ZS1tYXBwaW5nPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcmV0dXJuLXZhbHVlPmNvbS5pYm0ud3NzdnQudGMucGxpLmRhdGEuV1NBbm51aXR5Q29tcG9zaXRlRGF0YTwvbWV0aG9kLXJldHVybi12YWx1ZT4KLSAgICAgICAgICAgICAgICA8d3NkbC1tZXNzYWdlIHhtbG5zOndydm09Imh0dHA6Ly93cy5hbm51aXR5LmFjbWUud3NzdnQuaWJtLmNvbSI+d3J2bTp3c0NyZWF0ZUFubnVpdHlSZXNwb25zZTwvd3NkbC1tZXNzYWdlPgotICAgICAgICAgICAgICAgIDx3c2RsLW1lc3NhZ2UtcGFydC1uYW1lPndzQ3JlYXRlQW5udWl0eVJldHVybjwvd3NkbC1tZXNzYWdlLXBhcnQtbmFtZT4KLSAgICAgICAgICAgIDwvd3NkbC1yZXR1cm4tdmFsdWUtbWFwcGluZz4KLSAgICAgICAgPC9zZXJ2aWNlLWVuZHBvaW50LW1ldGhvZC1tYXBwaW5nPgotICAgIDwvc2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UtbWFwcGluZz4KLSAgICA8c2VydmljZS1pbnRlcmZhY2UtbWFwcGluZz4KLSAgICAgICAgPHNlcnZpY2UtaW50ZXJmYWNlPmNvbS5pYm0ud3NzdnQuYWNtZS5hbm51aXR5LndzLkFubnVpdHlTZXJ2aWNlMjwvc2VydmljZS1pbnRlcmZhY2U+Ci0gICAgICAgIDx3c2RsLXNlcnZpY2UtbmFtZSB4bWxuczpzaW09Imh0dHA6Ly93cy5hbm51aXR5LmFjbWUud3NzdnQuaWJtLmNvbSI+c2ltOkFubnVpdHlTZXJ2aWNlMjwvd3NkbC1zZXJ2aWNlLW5hbWU+Ci0gICAgICAgIDxwb3J0LW1hcHBpbmc+Ci0gICAgICAgICAgICA8cG9ydC1uYW1lPkFubnVpdHlTZXJ2aWNlMjwvcG9ydC1uYW1lPgotICAgICAgICAgICAgPGphdmEtcG9ydC1uYW1lPkFubnVpdHlTZXJ2aWNlMjwvamF2YS1wb3J0LW5hbWU+Ci0gICAgICAgIDwvcG9ydC1tYXBwaW5nPgotICAgIDwvc2VydmljZS1pbnRlcmZhY2UtbWFwcGluZz4KLSAgICA8c2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UtbWFwcGluZz4KLSAgICAgICAgPHNlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlPmNvbS5pYm0ud3NzdnQuYWNtZS5hbm51aXR5LndzLkFubnVpdHlTZXJ2aWNlUG9ydFR5cGU8L3NlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlPgotICAgICAgICA8d3NkbC1wb3J0LXR5cGUgeG1sbnM6c2VpbXdwdD0iaHR0cDovL3dzLmFubnVpdHkuYWNtZS53c3N2dC5pYm0uY29tIj5zZWltd3B0OkFubnVpdHlTZXJ2aWNlUG9ydFR5cGU8L3dzZGwtcG9ydC10eXBlPgotICAgICAgICA8d3NkbC1iaW5kaW5nIHhtbG5zOnNlaW13Yj0iaHR0cDovL3dzLmFubnVpdHkuYWNtZS53c3N2dC5pYm0uY29tIj5zZWltd2I6QW5udWl0eVNlcnZpY2VCaW5kaW5nPC93c2RsLWJpbmRpbmc+Ci0gICAgICAgIDxzZXJ2aWNlLWVuZHBvaW50LW1ldGhvZC1tYXBwaW5nPgotICAgICAgICAgICAgPGphdmEtbWV0aG9kLW5hbWU+d3NMaXN0QW5udWl0eUJ5SG9sZGVyPC9qYXZhLW1ldGhvZC1uYW1lPgotICAgICAgICAgICAgPHdzZGwtb3BlcmF0aW9uPndzTGlzdEFubnVpdHlCeUhvbGRlcjwvd3NkbC1vcGVyYXRpb24+Ci0gICAgICAgICAgICA8d3JhcHBlZC1lbGVtZW50Pjwvd3JhcHBlZC1lbGVtZW50PgotICAgICAgICAgICAgPG1ldGhvZC1wYXJhbS1wYXJ0cy1tYXBwaW5nPgotICAgICAgICAgICAgICAgIDxwYXJhbS1wb3NpdGlvbj4wPC9wYXJhbS1wb3NpdGlvbj4KLSAgICAgICAgICAgICAgICA8cGFyYW0tdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9wYXJhbS10eXBlPgotICAgICAgICAgICAgICAgIDx3c2RsLW1lc3NhZ2UtbWFwcGluZz4KLSAgICAgICAgICAgICAgICAgICAgPHdzZGwtbWVzc2FnZSB4bWxuczptcHBtPSJodHRwOi8vd3MuYW5udWl0eS5hY21lLndzc3Z0LmlibS5jb20iPm1wcG06d3NMaXN0QW5udWl0eUJ5SG9sZGVyUmVxdWVzdDwvd3NkbC1tZXNzYWdlPgotICAgICAgICAgICAgICAgICAgICA8d3NkbC1tZXNzYWdlLXBhcnQtbmFtZT5ob2xkZXJTU048L3dzZGwtbWVzc2FnZS1wYXJ0LW5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxwYXJhbWV0ZXItbW9kZT5JTjwvcGFyYW1ldGVyLW1vZGU+Ci0gICAgICAgICAgICAgICAgPC93c2RsLW1lc3NhZ2UtbWFwcGluZz4KLSAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtLXBhcnRzLW1hcHBpbmc+Ci0gICAgICAgICAgICA8d3NkbC1yZXR1cm4tdmFsdWUtbWFwcGluZz4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXJldHVybi12YWx1ZT5qYXZhLnV0aWwuVmVjdG9yPC9tZXRob2QtcmV0dXJuLXZhbHVlPgotICAgICAgICAgICAgICAgIDx3c2RsLW1lc3NhZ2UgeG1sbnM6d3J2bT0iaHR0cDovL3dzLmFubnVpdHkuYWNtZS53c3N2dC5pYm0uY29tIj53cnZtOndzTGlzdEFubnVpdHlCeUhvbGRlclJlc3BvbnNlPC93c2RsLW1lc3NhZ2U+Ci0gICAgICAgICAgICAgICAgPHdzZGwtbWVzc2FnZS1wYXJ0LW5hbWU+d3NMaXN0QW5udWl0eUJ5SG9sZGVyUmV0dXJuPC93c2RsLW1lc3NhZ2UtcGFydC1uYW1lPgotICAgICAgICAgICAgPC93c2RsLXJldHVybi12YWx1ZS1tYXBwaW5nPgotICAgICAgICA8L3NlcnZpY2UtZW5kcG9pbnQtbWV0aG9kLW1hcHBpbmc+Ci0gICAgICAgIDxzZXJ2aWNlLWVuZHBvaW50LW1ldGhvZC1tYXBwaW5nPgotICAgICAgICAgICAgPGphdmEtbWV0aG9kLW5hbWU+d3NBZGRTdWJBY2NvdW50czwvamF2YS1tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDx3c2RsLW9wZXJhdGlvbj53c0FkZFN1YkFjY291bnRzPC93c2RsLW9wZXJhdGlvbj4KLSAgICAgICAgICAgIDx3cmFwcGVkLWVsZW1lbnQ+PC93cmFwcGVkLWVsZW1lbnQ+Ci0gICAgICAgICAgICA8bWV0aG9kLXBhcmFtLXBhcnRzLW1hcHBpbmc+Ci0gICAgICAgICAgICAgICAgPHBhcmFtLXBvc2l0aW9uPjA8L3BhcmFtLXBvc2l0aW9uPgotICAgICAgICAgICAgICAgIDxwYXJhbS10eXBlPmNvbS5pYm0ud3NzdnQudGMucGxpLmRhdGEuV1NBbm51aXR5Q29tcG9zaXRlRGF0YTwvcGFyYW0tdHlwZT4KLSAgICAgICAgICAgICAgICA8d3NkbC1tZXNzYWdlLW1hcHBpbmc+Ci0gICAgICAgICAgICAgICAgICAgIDx3c2RsLW1lc3NhZ2UgeG1sbnM6bXBwbT0iaHR0cDovL3dzLmFubnVpdHkuYWNtZS53c3N2dC5pYm0uY29tIj5tcHBtOndzQWRkU3ViQWNjb3VudHNSZXF1ZXN0PC93c2RsLW1lc3NhZ2U+Ci0gICAgICAgICAgICAgICAgICAgIDx3c2RsLW1lc3NhZ2UtcGFydC1uYW1lPmFDRDwvd3NkbC1tZXNzYWdlLXBhcnQtbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPHBhcmFtZXRlci1tb2RlPklOPC9wYXJhbWV0ZXItbW9kZT4KLSAgICAgICAgICAgICAgICA8L3dzZGwtbWVzc2FnZS1tYXBwaW5nPgotICAgICAgICAgICAgPC9tZXRob2QtcGFyYW0tcGFydHMtbWFwcGluZz4KLSAgICAgICAgICAgIDxtZXRob2QtcGFyYW0tcGFydHMtbWFwcGluZz4KLSAgICAgICAgICAgICAgICA8cGFyYW0tcG9zaXRpb24+MTwvcGFyYW0tcG9zaXRpb24+Ci0gICAgICAgICAgICAgICAgPHBhcmFtLXR5cGU+Y29tLmlibS53c3N2dC50Yy5wbGkuZGF0YS5TdWJBY2N0RGF0YVtdPC9wYXJhbS10eXBlPgotICAgICAgICAgICAgICAgIDx3c2RsLW1lc3NhZ2UtbWFwcGluZz4KLSAgICAgICAgICAgICAgICAgICAgPHdzZGwtbWVzc2FnZSB4bWxuczptcHBtPSJodHRwOi8vd3MuYW5udWl0eS5hY21lLndzc3Z0LmlibS5jb20iPm1wcG06d3NBZGRTdWJBY2NvdW50c1JlcXVlc3Q8L3dzZGwtbWVzc2FnZT4KLSAgICAgICAgICAgICAgICAgICAgPHdzZGwtbWVzc2FnZS1wYXJ0LW5hbWU+c0FEPC93c2RsLW1lc3NhZ2UtcGFydC1uYW1lPgotICAgICAgICAgICAgICAgICAgICA8cGFyYW1ldGVyLW1vZGU+SU48L3BhcmFtZXRlci1tb2RlPgotICAgICAgICAgICAgICAgIDwvd3NkbC1tZXNzYWdlLW1hcHBpbmc+Ci0gICAgICAgICAgICA8L21ldGhvZC1wYXJhbS1wYXJ0cy1tYXBwaW5nPgotICAgICAgICAgICAgPHdzZGwtcmV0dXJuLXZhbHVlLW1hcHBpbmc+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1yZXR1cm4tdmFsdWU+Y29tLmlibS53c3N2dC50Yy5wbGkuZGF0YS5XU0FubnVpdHlDb21wb3NpdGVEYXRhPC9tZXRob2QtcmV0dXJuLXZhbHVlPgotICAgICAgICAgICAgICAgIDx3c2RsLW1lc3NhZ2UgeG1sbnM6d3J2bT0iaHR0cDovL3dzLmFubnVpdHkuYWNtZS53c3N2dC5pYm0uY29tIj53cnZtOndzQWRkU3ViQWNjb3VudHNSZXNwb25zZTwvd3NkbC1tZXNzYWdlPgotICAgICAgICAgICAgICAgIDx3c2RsLW1lc3NhZ2UtcGFydC1uYW1lPndzQWRkU3ViQWNjb3VudHNSZXR1cm48L3dzZGwtbWVzc2FnZS1wYXJ0LW5hbWU+Ci0gICAgICAgICAgICA8L3dzZGwtcmV0dXJuLXZhbHVlLW1hcHBpbmc+Ci0gICAgICAgIDwvc2VydmljZS1lbmRwb2ludC1tZXRob2QtbWFwcGluZz4KLSAgICAgICAgPHNlcnZpY2UtZW5kcG9pbnQtbWV0aG9kLW1hcHBpbmc+Ci0gICAgICAgICAgICA8amF2YS1tZXRob2QtbmFtZT53c0NyZWF0ZUFubnVpdHk8L2phdmEtbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8d3NkbC1vcGVyYXRpb24+d3NDcmVhdGVBbm51aXR5PC93c2RsLW9wZXJhdGlvbj4KLSAgICAgICAgICAgIDx3cmFwcGVkLWVsZW1lbnQ+PC93cmFwcGVkLWVsZW1lbnQ+Ci0gICAgICAgICAgICA8bWV0aG9kLXBhcmFtLXBhcnRzLW1hcHBpbmc+Ci0gICAgICAgICAgICAgICAgPHBhcmFtLXBvc2l0aW9uPjA8L3BhcmFtLXBvc2l0aW9uPgotICAgICAgICAgICAgICAgIDxwYXJhbS10eXBlPmNvbS5pYm0ud3NzdnQudGMucGxpLmRhdGEuV1NBbm51aXR5Q29tcG9zaXRlRGF0YTwvcGFyYW0tdHlwZT4KLSAgICAgICAgICAgICAgICA8d3NkbC1tZXNzYWdlLW1hcHBpbmc+Ci0gICAgICAgICAgICAgICAgICAgIDx3c2RsLW1lc3NhZ2UgeG1sbnM6bXBwbT0iaHR0cDovL3dzLmFubnVpdHkuYWNtZS53c3N2dC5pYm0uY29tIj5tcHBtOndzQ3JlYXRlQW5udWl0eVJlcXVlc3Q8L3dzZGwtbWVzc2FnZT4KLSAgICAgICAgICAgICAgICAgICAgPHdzZGwtbWVzc2FnZS1wYXJ0LW5hbWU+YUNEPC93c2RsLW1lc3NhZ2UtcGFydC1uYW1lPgotICAgICAgICAgICAgICAgICAgICA8cGFyYW1ldGVyLW1vZGU+SU48L3BhcmFtZXRlci1tb2RlPgotICAgICAgICAgICAgICAgIDwvd3NkbC1tZXNzYWdlLW1hcHBpbmc+Ci0gICAgICAgICAgICA8L21ldGhvZC1wYXJhbS1wYXJ0cy1tYXBwaW5nPgotICAgICAgICAgICAgPHdzZGwtcmV0dXJuLXZhbHVlLW1hcHBpbmc+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1yZXR1cm4tdmFsdWU+Y29tLmlibS53c3N2dC50Yy5wbGkuZGF0YS5XU0FubnVpdHlDb21wb3NpdGVEYXRhPC9tZXRob2QtcmV0dXJuLXZhbHVlPgotICAgICAgICAgICAgICAgIDx3c2RsLW1lc3NhZ2UgeG1sbnM6d3J2bT0iaHR0cDovL3dzLmFubnVpdHkuYWNtZS53c3N2dC5pYm0uY29tIj53cnZtOndzQ3JlYXRlQW5udWl0eVJlc3BvbnNlPC93c2RsLW1lc3NhZ2U+Ci0gICAgICAgICAgICAgICAgPHdzZGwtbWVzc2FnZS1wYXJ0LW5hbWU+d3NDcmVhdGVBbm51aXR5UmV0dXJuPC93c2RsLW1lc3NhZ2UtcGFydC1uYW1lPgotICAgICAgICAgICAgPC93c2RsLXJldHVybi12YWx1ZS1tYXBwaW5nPgotICAgICAgICA8L3NlcnZpY2UtZW5kcG9pbnQtbWV0aG9kLW1hcHBpbmc+Ci0gICAgPC9zZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZS1tYXBwaW5nPgotPC9qYXZhLXdzZGwtbWFwcGluZz4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvd2Vic2VydmljZXMvTUVUQS1JTkYvaWJtLXdlYnNlcnZpY2VzLWJuZC54bWkgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL3dlYnNlcnZpY2VzL01FVEEtSU5GL2libS13ZWJzZXJ2aWNlcy1ibmQueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWRjZjZjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvd2Vic2VydmljZXMvTUVUQS1JTkYvaWJtLXdlYnNlcnZpY2VzLWJuZC54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y29tLmlibS5ldG9vbHMud2Vic2VydmljZS53c2JuZDpXU0JpbmRpbmcgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpjb20uaWJtLmV0b29scy53ZWJzZXJ2aWNlLndzYm5kPSJodHRwOi8vd3d3LmlibS5jb20vd2Vic3BoZXJlL2FwcHNlcnZlci9zY2hlbWFzLzUuMC4yL3dzYm5kLnhtaSIgeG1pOmlkPSJXU0JpbmRpbmdfMTA1NTczNzI0MTc5NyI+Ci0gIDx3c2Rlc2NCaW5kaW5ncyB4bWk6aWQ9IldTRGVzY0JpbmRpbmdfMTA1NTczNzI0MTc5NyIgd3NEZXNjTmFtZUxpbms9IlN0b2NrUXVvdGVGZXRjaGVyIj4KLSAgICA8cGNCaW5kaW5ncyB4bWk6aWQ9IlBDQmluZGluZ18xMDU1NzM3MjQxNzk3IiBwY05hbWVMaW5rPSJ1cm46eG1sdG9kYXktZGVsYXllZC1xdW90ZXMiIHNjb3BlPSJTZXNzaW9uIi8+Ci0gIDwvd3NkZXNjQmluZGluZ3M+Ci0gIDxyb3V0ZXJNb2R1bGVzIHhtaTppZD0iUm91dGVyTW9kdWxlXzEwNTU3MzcyNDE3OTciIHRyYW5zcG9ydD0iaHR0cCIgbmFtZT0iU3RvY2tRdW90ZS53YXIiLz4KLTwvY29tLmlibS5ldG9vbHMud2Vic2VydmljZS53c2JuZDpXU0JpbmRpbmc+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL3dlYnNlcnZpY2VzL01FVEEtSU5GL2libS13ZWJzZXJ2aWNlcy1leHQueG1pIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS93ZWJzZXJ2aWNlcy9NRVRBLUlORi9pYm0td2Vic2VydmljZXMtZXh0LnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcwNTAwZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL3dlYnNlcnZpY2VzL01FVEEtSU5GL2libS13ZWJzZXJ2aWNlcy1leHQueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08Y29tLmlibS5ldG9vbHMud2Vic2VydmljZS53c2V4dDpXc0V4dGVuc2lvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmNvbS5pYm0uZXRvb2xzLndlYnNlcnZpY2Uud3NleHQ9Imh0dHA6Ly93d3cuaWJtLmNvbS93ZWJzcGhlcmUvYXBwc2VydmVyL3NjaGVtYXMvNS4wLjIvd3NleHQueG1pIiB4bWk6aWQ9IldzRXh0ZW5zaW9uXzEwNTM0ODQ2MTUwNTQiPgotICA8d3NEZXNjRXh0IHhtaTppZD0iV3NEZXNjRXh0XzEwNTM0ODQ2MTUwNTQiIHdzRGVzY05hbWVMaW5rPSJTdG9ja1F1b3RlRmV0Y2hlciI+Ci0gICAgPHBjQmluZGluZyB4bWk6aWQ9IlBjQmluZGluZ18xMDUzNDg0NjE1MDU0IiBwY05hbWVMaW5rPSJ1cm46eG1sdG9kYXktZGVsYXllZC1xdW90ZXMiPgotICAgIDwvcGNCaW5kaW5nPgotICA8L3dzRGVzY0V4dD4KLTwvY29tLmlibS5ldG9vbHMud2Vic2VydmljZS53c2V4dDpXc0V4dGVuc2lvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvd2Vic2VydmljZXMvTUVUQS1JTkYvd2Vic2VydmljZXMueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS93ZWJzZXJ2aWNlcy9NRVRBLUlORi93ZWJzZXJ2aWNlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyNjkwNzcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS93ZWJzZXJ2aWNlcy9NRVRBLUlORi93ZWJzZXJ2aWNlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIHdlYnNlcnZpY2VzIFBVQkxJQyAiLS8vSUJNIENvcnBvcmF0aW9uLCBJbmMuLy9EVEQgSjJFRSBXZWIgc2VydmljZXMgMS4wLy9FTiIgImh0dHA6Ly93d3cuaWJtLmNvbS93ZWJzZXJ2aWNlcy9kdGQvajJlZV93ZWJfc2VydmljZXNfMV8wLmR0ZCI+Ci0KLSAgIDx3ZWJzZXJ2aWNlcyBpZD0iV2ViU2VydmljZXNfMTA1NTczNzI0MTY3MiI+Ci0gICAgICA8d2Vic2VydmljZS1kZXNjcmlwdGlvbiBpZD0iV2ViU2VydmljZURlc2NyaXB0aW9uXzEwNTU3MzcyNDE2ODgiPgotICAgICAgICAgPHdlYnNlcnZpY2UtZGVzY3JpcHRpb24tbmFtZT5TdG9ja1F1b3RlRmV0Y2hlcjwvd2Vic2VydmljZS1kZXNjcmlwdGlvbi1uYW1lPgotICAgICAgICAgPHdzZGwtZmlsZT5NRVRBLUlORi93c2RsL1N0b2NrUXVvdGVGZXRjaGVyLndzZGw8L3dzZGwtZmlsZT4KLSAgICAgICAgIDxqYXhycGMtbWFwcGluZy1maWxlPk1FVEEtSU5GL1N0b2NrUXVvdGVGZXRjaGVyX21hcHBpbmcueG1sPC9qYXhycGMtbWFwcGluZy1maWxlPgotICAgICAgICAgPHBvcnQtY29tcG9uZW50IGlkPSJQb3J0Q29tcG9uZW50XzEwNTU3MzcyNDE3MzQiPgotICAgICAgICAgICAgPHBvcnQtY29tcG9uZW50LW5hbWU+dXJuOnhtbHRvZGF5LWRlbGF5ZWQtcXVvdGVzPC9wb3J0LWNvbXBvbmVudC1uYW1lPgotICAgICAgICAgICAgPHdzZGwtcG9ydCBpZD0iV1NETFBvcnRfMTA1NTczNzI0MTczNCI+Ci0gICAgICAgICAgICAgICA8bmFtZXNwYWNlVVJJPmh0dHA6Ly9zdG9jay53ZWJzZXJ2aWNlcy5zYW1wbGVzLndlYnNwaGVyZS5pYm0uY29tPC9uYW1lc3BhY2VVUkk+Ci0gICAgICAgICAgICAgICA8bG9jYWxwYXJ0PlN0b2NrUXVvdGU8L2xvY2FscGFydD4KLSAgICAgICAgICAgIDwvd3NkbC1wb3J0PgotICAgICAgICAgICAgPHNlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlPmNvbS5pYm0ud2Vic3BoZXJlLnNhbXBsZXMud2Vic2VydmljZXMuc3RvY2suU3RvY2tRdW90ZTwvc2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2U+Ci0gICAgICAgICAgICA8c2VydmljZS1pbXBsLWJlYW4gaWQ9IlNlcnZpY2VJbXBsQmVhbl8xMDU1NzM3MjQxNzM0Ij4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5jb21faWJtX3dlYnNwaGVyZV9zYW1wbGVzX3dlYnNlcnZpY2VzX3N0b2NrX1N0b2NrUXVvdGU8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9zZXJ2aWNlLWltcGwtYmVhbj4KLSAgICAgICAgIDwvcG9ydC1jb21wb25lbnQ+Ci0gICAgICA8L3dlYnNlcnZpY2UtZGVzY3JpcHRpb24+Ci0gICA8L3dlYnNlcnZpY2VzPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2UvLmNsYXNzcGF0aCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiZjY3MGUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2UvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iY29tbW9uLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZS8uY3ZzaWdub3JlIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2UvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNhYzYwNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1iaW4KLXRlbXAuZm9sZGVyCi1idWlsZC54bWwKLXBlcmZvcm1hbmNlLmphcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2UvLnByb2plY3QgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFlZDMzZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlL2Fib3V0Lmh0bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWM1OTg5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMiwgMjAwNjwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZS9idWlsZC5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2UvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFkNDU0Ny4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1zb3VyY2UucGVyZm9ybWFuY2UuamFyID0gY29tbW9uLwotb3V0cHV0LnBlcmZvcm1hbmNlLmphciA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGVyZm9ybWFuY2UuamFyLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS90ZXN0cy9wZXJmb3JtYW5jZS9CYXNlUGVyZm9ybWFuY2VUZXN0Q2FzZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2UvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Rlc3RzL3BlcmZvcm1hbmNlL0Jhc2VQZXJmb3JtYW5jZVRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNzU2YWYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2UvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Rlc3RzL3BlcmZvcm1hbmNlL0Jhc2VQZXJmb3JtYW5jZVRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gRGVjIDYsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5CYXNlVGVzdENhc2U7Ci0KLS8qKgotICogQGF1dGhvciBBZG1pbgotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VQZXJmb3JtYW5jZVRlc3RDYXNlIGV4dGVuZHMgQmFzZVRlc3RDYXNlIHsKLQlwcm90ZWN0ZWQgc3RhdGljIE1hcCBwZXJmb3JtYW5jZUNsYXNzID0gbnVsbDsKLQlzdGF0aWMgQ2xhc3NMb2FkZXIgY2xhenpMb2FkZXIgPSBudWxsOwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGZpbGU9IG51bGw7IAotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcGVyZm9ybWFuY2VDbGFzcyA9IG51bGw7Ci0JCXJldHVybiBjcmVhdGVUZXN0U3VpdGVzKCkgOwotCX0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBUZXN0IGNyZWF0ZVRlc3RTdWl0ZXMoKSB7Ci0JCWNyZWF0ZVBlcmZvcm1hbmNlQ2xhc3MoKTsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwZXJmb3JtYW5jZUNsYXNzLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJQ2xhc3MgY2xhenogPSAoQ2xhc3MpIGl0ZXIubmV4dCgpOwotCQkJTGlzdCBtZXRob2RMaXN0ID0gKExpc3QpcGVyZm9ybWFuY2VDbGFzcy5nZXQoY2xhenopOwotCQkJZm9yIChpbnQgeD0wOyB4PCBtZXRob2RMaXN0LnNpemUoKTsgKyt4KSB7Ci0JCQkJUGVyZm9ybWFuY2VUZXN0T2JqZWN0IHRlc3RPYmplY3QgPSAoUGVyZm9ybWFuY2VUZXN0T2JqZWN0KW1ldGhvZExpc3QuZ2V0KHgpOwotCQkJCVRlc3QgdGVzdCA9IGNyZWF0ZVRlc3QoY2xhenosdGVzdE9iamVjdC5nZXROYW1lKCkpOwotCQkJCWlmICh0ZXN0IGluc3RhbmNlb2YgQmFzZVRlc3RDYXNlKSB7Ci0JCQkJCXN1aXRlLmFkZFRlc3QobmV3IFBlcmZvcm1hbmNlVGVzdENhc2VXcmFwcGVyKChCYXNlVGVzdENhc2UpdGVzdCwgdGVzdE9iamVjdC5nZXRUYWdnaW5nKCkgLCB0ZXN0T2JqZWN0LmdldFNob3J0TmFtZSgpKSk7Ci0JCQkJfQotCQkJfQotCQl9CQkKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQkKLQlzdGF0aWMgcHVibGljIFRlc3QgY3JlYXRlVGVzdChDbGFzcyB0aGVDbGFzcywgU3RyaW5nIG5hbWUpIHsKLQkJQ29uc3RydWN0b3IgY29uc3RydWN0b3I7Ci0JCXRyeSB7Ci0JCQljb25zdHJ1Y3Rvcj0gZ2V0VGVzdENvbnN0cnVjdG9yKHRoZUNsYXNzKTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiB3YXJuaW5nKCJDbGFzcyAiK3RoZUNsYXNzLmdldE5hbWUoKSsiIGhhcyBubyBwdWJsaWMgY29uc3RydWN0b3IgVGVzdENhc2UoU3RyaW5nIG5hbWUpIG9yIFRlc3RDYXNlKCkiKTsKLQkJfQotCQlPYmplY3QgdGVzdDsKLQkJdHJ5IHsKLQkJCWlmIChjb25zdHJ1Y3Rvci5nZXRQYXJhbWV0ZXJUeXBlcygpLmxlbmd0aCA9PSAwKSB7Ci0JCQkJdGVzdD0gY29uc3RydWN0b3IubmV3SW5zdGFuY2UobmV3IE9iamVjdFswXSk7Ci0JCQkJaWYgKHRlc3QgaW5zdGFuY2VvZiBUZXN0Q2FzZSkKLQkJCQkJKChUZXN0Q2FzZSkgdGVzdCkuc2V0TmFtZShuYW1lKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGVzdD0gY29uc3RydWN0b3IubmV3SW5zdGFuY2UobmV3IE9iamVjdFtde25hbWV9KTsKLQkJCX0KLQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4od2FybmluZygiQ2Fubm90IGluc3RhbnRpYXRlIHRlc3QgY2FzZTogIituYW1lKyIgKCIrZXhjZXB0aW9uVG9TdHJpbmcoZSkrIikiKSk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuKHdhcm5pbmcoIkV4Y2VwdGlvbiBpbiBjb25zdHJ1Y3RvcjogIituYW1lKyIgKCIrZXhjZXB0aW9uVG9TdHJpbmcoZS5nZXRUYXJnZXRFeGNlcHRpb24oKSkrIikiKSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuKHdhcm5pbmcoIkNhbm5vdCBhY2Nlc3MgdGVzdCBjYXNlOiAiK25hbWUrIiAoIitleGNlcHRpb25Ub1N0cmluZyhlKSsiKSIpKTsKLQkJfQotCQlyZXR1cm4gKFRlc3QpIHRlc3Q7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSB0ZXN0IHdoaWNoIHdpbGwgZmFpbCBhbmQgbG9nIGEgd2FybmluZyBtZXNzYWdlLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFRlc3Qgd2FybmluZyhmaW5hbCBTdHJpbmcgbWVzc2FnZSkgewotCQlyZXR1cm4gbmV3IFRlc3RDYXNlKCJ3YXJuaW5nIikgewotCQkJcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHsKLQkJCQlmYWlsKG1lc3NhZ2UpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIENvbnN0cnVjdG9yIGdldFRlc3RDb25zdHJ1Y3RvcihDbGFzcyB0aGVDbGFzcykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCUNsYXNzW10gYXJncz0geyBTdHJpbmcuY2xhc3MgfTsKLQkJdHJ5IHsKLQkJCXJldHVybiB0aGVDbGFzcy5nZXRDb25zdHJ1Y3RvcihhcmdzKTsJCi0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBmYWxsIHRocm91Z2gKLQkJfQotCQlyZXR1cm4gdGhlQ2xhc3MuZ2V0Q29uc3RydWN0b3IobmV3IENsYXNzWzBdKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGV4Y2VwdGlvblRvU3RyaW5nKFRocm93YWJsZSB0KSB7Ci0JCVN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXI9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJUHJpbnRXcml0ZXIgd3JpdGVyPSBuZXcgUHJpbnRXcml0ZXIoc3RyaW5nV3JpdGVyKTsKLQkJdC5wcmludFN0YWNrVHJhY2Uod3JpdGVyKTsKLQkJcmV0dXJuIHN0cmluZ1dyaXRlci50b1N0cmluZygpOwotCi0JfQotCS8qKgotCSAqIEBwYXJhbSBwZXJmb3JtYW5jZUNsYXNzMgotCSAqLwotCQotCXB1YmxpYyBzdGF0aWMgTWFwIGdldFBlcmZvcm1hbmNlQ2xhc3MoKSB7Ci0JCWlmIChwZXJmb3JtYW5jZUNsYXNzID09IG51bGwpIHsKLQkJCWNyZWF0ZVBlcmZvcm1hbmNlQ2xhc3MoKTsKLQkJfQotCQlyZXR1cm4gcGVyZm9ybWFuY2VDbGFzczsKLQl9Ci0JCi0JCQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBjcmVhdGVQZXJmb3JtYW5jZUNsYXNzKCkgewotCQlpZiAocGVyZm9ybWFuY2VDbGFzcyA9PSBudWxsKSB7Ci0JCQlwZXJmb3JtYW5jZUNsYXNzID0gbmV3IFRlc3RDYXNlU0FYUGFyc2VyKCkuZG9Mb2FkKG5ldyBGaWxlKGZpbGUpKTsKLQkJfQotCX0KLQkKLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgY2xhenpMb2FkZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzc0xvYWRlciBnZXRDbGFzc0xvYWRlcigpIHsKLQkJcmV0dXJuIGNsYXp6TG9hZGVyOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gY2xhenpMb2FkZXIgVGhlIGNsYXp6TG9hZGVyIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q2xhc3NMb2FkZXIoQ2xhc3NMb2FkZXIgY2xhenpMb2FkZXIpIHsKLQkJQmFzZVBlcmZvcm1hbmNlVGVzdENhc2UuY2xhenpMb2FkZXIgPSBjbGF6ekxvYWRlcjsKLQl9Ci0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBmaWxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZpbGUoKSB7Ci0JCXJldHVybiBmaWxlOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gZmlsZSBUaGUgZmlsZSB0byBzZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEZpbGUoU3RyaW5nIGZpbGUpIHsKLQkJQmFzZVBlcmZvcm1hbmNlVGVzdENhc2UuZmlsZSA9IGZpbGU7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBzdWl0ZQotCSAqIEBwYXJhbSB0ZXN0Ci0JICogQHBhcmFtIGdsb2JhbAotCSAqIEBwYXJhbSBzdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgYWRkUGVyZm9ybWFuY2VUZXN0KFRlc3RTdWl0ZSBzdWl0ZSwgQmFzZVRlc3RDYXNlIHRlc3QsIGludCB0YWdnaW5nLCBTdHJpbmcgc2hvcnROYW1lKSB7Ci0JCVBlcmZvcm1hbmNlVGVzdENhc2VXcmFwcGVyIHRlc3RDYXNlID0gbmV3IFBlcmZvcm1hbmNlVGVzdENhc2VXcmFwcGVyKHRlc3QsIHRhZ2dpbmcgLCBzaG9ydE5hbWUpOwotCQlzdWl0ZS5hZGRUZXN0KHRlc3RDYXNlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvdGVzdHMvcGVyZm9ybWFuY2UvUGVyZm9ybWFuY2VQbHVnaW4uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS90ZXN0cy9wZXJmb3JtYW5jZS9QZXJmb3JtYW5jZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWUyOGFjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS90ZXN0cy9wZXJmb3JtYW5jZS9QZXJmb3JtYW5jZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi4qOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC4qOwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgUGVyZm9ybWFuY2VQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQkvL1RoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgUGVyZm9ybWFuY2VQbHVnaW4gcGx1Z2luOwotCS8vUmVzb3VyY2UgYnVuZGxlLgotCXByaXZhdGUgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBQZXJmb3JtYW5jZVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBwbHVnLWluIGFjdGl2YXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcGx1Zy1pbiBpcyBzdG9wcGVkCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCQlyZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUGVyZm9ybWFuY2VQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgZnJvbSB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqIG9yICdrZXknIGlmIG5vdCBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IFBlcmZvcm1hbmNlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotCQl0cnkgewotCQkJcmV0dXJuIChidW5kbGUgIT0gbnVsbCkgPyBidW5kbGUuZ2V0U3RyaW5nKGtleSkgOiBrZXk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJdHJ5IHsKLQkJCWlmIChyZXNvdXJjZUJ1bmRsZSA9PSBudWxsKQotCQkJCXJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZS5QZXJmb3JtYW5jZVBsdWdpblJlc291cmNlcyIpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24geCkgewotCQkJcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZUJ1bmRsZTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvdGVzdHMvcGVyZm9ybWFuY2UvUGVyZm9ybWFuY2VUZXN0Q2FzZVdyYXBwZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS90ZXN0cy9wZXJmb3JtYW5jZS9QZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzQ3MDE0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS90ZXN0cy9wZXJmb3JtYW5jZS9QZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIE5vdiAyNCwgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2U7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnRlc3QucGVyZm9ybWFuY2UuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlc3QucGVyZm9ybWFuY2UuUGVyZm9ybWFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVzdC5wZXJmb3JtYW5jZS5QZXJmb3JtYW5jZVRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuQmFzZVRlc3RDYXNlOwotCi0vKioKLSAqIEBhdXRob3IgQWRtaW4KLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyAgY2xhc3MgUGVyZm9ybWFuY2VUZXN0Q2FzZVdyYXBwZXIgZXh0ZW5kcyBQZXJmb3JtYW5jZVRlc3RDYXNlIHsKLQlwcm90ZWN0ZWQgQmFzZVRlc3RDYXNlIGZUZXN0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PTkUgPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQ0FMID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTE9CQUwgPSAyOwkKLQkKLQlwcml2YXRlIGJvb2xlYW4gdGFnQXNHbG9iYWxTdW1tYXJ5OwotCXByaXZhdGUgYm9vbGVhbiB0YWdBc1N1bW1hcnk7Ci0JcHJpdmF0ZSBTdHJpbmcgc2hvcnROYW1lOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElURVJBVElPTlMgPSAxMDsKLQotCXB1YmxpYyBQZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlcihCYXNlVGVzdENhc2UgdGVzdCwgCi0JCQkJCQkJCQlpbnQgdGFnZ2luZywKLQkJCQkJCQkJCVN0cmluZyBzaG9ydE5hbWUpIHsKLQkJZlRlc3Q9dGVzdDsKLQkJdGFnQXNHbG9iYWxTdW1tYXJ5ID0gKCh0YWdnaW5nICYgR0xPQkFMKSAhPSAwKTsKLQkgICAgdGFnQXNTdW1tYXJ5ID0gKCh0YWdnaW5nICYgTE9DQUwpICE9IDApOwotCSAgICB0aGlzLnNob3J0TmFtZSA9ICBzaG9ydE5hbWU7Ci0JfQotCQotCXB1YmxpYyBpbnQgY291bnRUZXN0Q2FzZXMoKSB7Ci0JCXJldHVybiBmVGVzdC5jb3VudFRlc3RDYXNlcygpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gZlRlc3QudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgVGVzdCBnZXRUZXN0KCkgewotCQlyZXR1cm4gZlRlc3Q7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnRlc3QucGVyZm9ybWFuY2UuUGVyZm9ybWFuY2VUZXN0Q2FzZSNzZXRVcCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZlRlc3Quc2V0VXBUZXN0KCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGJhc2ljU2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUGVyZm9ybWFuY2UgcGVyZm9ybWFuY2U9IFBlcmZvcm1hbmNlLmdldERlZmF1bHQoKTsKLQkJZlBlcmZvcm1hbmNlTWV0ZXI9IHBlcmZvcm1hbmNlLmNyZWF0ZVBlcmZvcm1hbmNlTWV0ZXIocGVyZm9ybWFuY2UuZ2V0RGVmYXVsdFNjZW5hcmlvSWQoZlRlc3QpKTsKLQl9Ci0KLQkKLQkvKioKLQkgKiBSdW5zIHRoZSBiYXJlIHRlc3Qgc2VxdWVuY2UuCi0JICogQGV4Y2VwdGlvbiBUaHJvd2FibGUgaWYgYW55IGV4Y2VwdGlvbiBpcyB0aHJvd24KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW5CYXJlKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCWJhc2ljU2V0VXAoKTsKLQkJdGFnSWZOZWNlc3Nhcnkoc2hvcnROYW1lLCBEaW1lbnNpb24uQ1BVX1RJTUUpOwotCQl0cnkgewotCQkJZm9yIChpbnQgaT0gMDsgaSA8IElURVJBVElPTlM7IGkrKykgewotCQkJCXNldFVwKCk7Ci0JCQkJc3RhcnRNZWFzdXJpbmcoKTsKLQkJCQlydW5UZXN0KCk7Ci0JCQkJc3RvcE1lYXN1cmluZygpOwotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJY29tbWl0TWVhc3VyZW1lbnRzKCk7Ci0JCQlhc3NlcnRQZXJmb3JtYW5jZSgpOwotCQkJdGVhckRvd24oKTsKLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjcnVuVGVzdCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCWZUZXN0LnJ1bkNvcmVUZXN0KCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnRlc3QucGVyZm9ybWFuY2UuUGVyZm9ybWFuY2VUZXN0Q2FzZSN0ZWFyRG93bigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlmVGVzdC50ZWFyRG93blRlc3QoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldE5hbWUoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJZlRlc3Quc2V0TmFtZShuYW1lKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gZlRlc3QuZ2V0TmFtZSgpOwotCX0KLQkKLSAgICAvKioKLSAgICAgKiBBbnN3ZXJzIHdoZXRoZXIgdGhpcyB0ZXN0IHNob3VsZCBiZSB0YWdnZWQgZ2xvYmFsbHkuCi0gICAgICogCi0gICAgICogQHJldHVybiB3aGV0aGVyIHRoaXMgdGVzdCBzaG91bGQgYmUgdGFnZ2VkIGdsb2JhbGx5Ci0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHNob3VsZEdsb2JhbGx5VGFnKCkgewotICAgIAlyZXR1cm4gdGFnQXNHbG9iYWxTdW1tYXJ5OwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBBbnN3ZXJzIHdoZXRoZXIgdGhpcyB0ZXN0IHNob3VsZCBiZSB0YWdnZWQgbG9jYWxseS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyB0ZXN0IHNob3VsZCBiZSB0YWdnZWQgbG9jYWxseQotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBzaG91bGRMb2NhbGx5VGFnKCkgewotICAgIAlyZXR1cm4gdGFnQXNTdW1tYXJ5OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0YWdJZk5lY2Vzc2FyeShTdHJpbmcgc2hvcnROYW1lLCBEaW1lbnNpb24gZGltZW5zaW9uKSB7Ci0JCWlmIChzaG91bGRHbG9iYWxseVRhZygpKSB7Ci0JCQl0YWdBc0dsb2JhbFN1bW1hcnkoc2hvcnROYW1lLCBkaW1lbnNpb24pOwotCQl9Ci0JCWlmIChzaG91bGRMb2NhbGx5VGFnKCkpIHsKLQkJCXRhZ0FzU3VtbWFyeShzaG9ydE5hbWUsIGRpbWVuc2lvbik7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGFnSWZOZWNlc3NhcnkoU3RyaW5nIHNob3J0TmFtZSwgRGltZW5zaW9uIFtdIGRpbWVuc2lvbnMpIHsKLQkJaWYgKHNob3VsZEdsb2JhbGx5VGFnKCkpIHsKLQkJCXRhZ0FzR2xvYmFsU3VtbWFyeShzaG9ydE5hbWUsIGRpbWVuc2lvbnMpOwotCQl9Ci0JCWlmIChzaG91bGRMb2NhbGx5VGFnKCkpIHsKLQkJCXRhZ0FzU3VtbWFyeShzaG9ydE5hbWUsIGRpbWVuc2lvbnMpOwotCQl9Ci0JfQotCQotCQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2UvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Rlc3RzL3BlcmZvcm1hbmNlL1BlcmZvcm1hbmNlVGVzdE9iamVjdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2UvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Rlc3RzL3BlcmZvcm1hbmNlL1BlcmZvcm1hbmNlVGVzdE9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDM5MzRlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS90ZXN0cy9wZXJmb3JtYW5jZS9QZXJmb3JtYW5jZVRlc3RPYmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIE5vdiAyNiwgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2U7Ci0KLS8qKgotICogQGF1dGhvciBBZG1pbgotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIFBlcmZvcm1hbmNlVGVzdE9iamVjdCB7Ci0JaW50IHRhZ2dpbmc7Ci0JU3RyaW5nIHNob3J0TmFtZTsKLQlTdHJpbmcgbmFtZTsKLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgUGVyZm9ybWFuY2VUZXN0T2JqZWN0KFN0cmluZyBuYW1lLGludCB0YWdnaW5nLCBTdHJpbmcgc2hvcnRuYW1lKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMudGFnZ2luZyA9IHRhZ2dpbmc7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMuc2hvcnROYW1lID0gc2hvcnRuYW1lOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgbmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNob3J0TmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNob3J0TmFtZSgpIHsKLQkJcmV0dXJuIHNob3J0TmFtZTsKLQl9Ci0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB0YWdnaW5nLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VGFnZ2luZygpIHsKLQkJcmV0dXJuIHRhZ2dpbmc7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2UvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Rlc3RzL3BlcmZvcm1hbmNlL1Rlc3RDYXNlU0FYUGFyc2VyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvdGVzdHMvcGVyZm9ybWFuY2UvVGVzdENhc2VTQVhQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE4OWVhMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvdGVzdHMvcGVyZm9ybWFuY2UvVGVzdENhc2VTQVhQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBOb3YgMjksIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7Ci0KLS8qKgotICogQGF1dGhvciBBZG1pbgotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIFRlc3RDYXNlU0FYUGFyc2VyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgewotCXByaXZhdGUgc3RhdGljIE1hcCBwZXJmb3JtYW5jZUNhc2VzID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9DQVNFID0gInRlc3RDYXNlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1MgPSAiY2xhc3MiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0QgPSAibWV0aG9kIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hPUlRfTkFNRSA9ICJzaG9ydE5hbWUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdHSU5HID0gInRhZ2dpbmciOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfTkFNRSA9ICJuYW1lIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0xPQkFMID0gIkdMT0JBTCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FMID0gIkxPQ0FMIjsKLQlwcml2YXRlIHN0YXRpYyBDbGFzcyBjdXJyZW50Q2xhenogPSBudWxsOwotCQotCi0JCi0JcHVibGljIE1hcCBkb0xvYWQoRmlsZSBmaWxlKSB7Ci0JCSBwZXJmb3JtYW5jZUNhc2VzID0gbmV3IEhhc2hNYXAoKTsKLQkJIERlZmF1bHRIYW5kbGVyIGhhbmRsZXIgPSBuZXcgVGVzdENhc2VTQVhQYXJzZXIoKTsKLQkJIFNBWFBhcnNlckZhY3RvcnkgZmFjdG9yeSA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQkJIHRyeSB7Ci0JCSAgU0FYUGFyc2VyIHNheFBhcnNlciA9IGZhY3RvcnkubmV3U0FYUGFyc2VyKCk7Ci0JCSAgc2F4UGFyc2VyLnBhcnNlKGZpbGUgLCBoYW5kbGVyICk7Ci0JCSB9Ci0JCSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkgIFN5c3RlbS5lcnIucHJpbnRsbiAoIkZhaWxlZCB0byBjcmVhdGUgU0FYIHBhcnNlcjoiICsgZXgpOwotCQkgfQotCQkgY2F0Y2ggKFNBWEV4Y2VwdGlvbiBleCkgewotCQkgIFN5c3RlbS5lcnIucHJpbnRsbiAoIlNBWCBwYXJzZXIgZXhjZWVwdGlvbjoiICsgZXgpOwotCQkgfQotCQkgY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCSAgU3lzdGVtLmVyci5wcmludGxuICgiSU8gZXhlY2VwdGlvbjoiICsgZXgpOwotCQkgfQotCQkgY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkgIFN5c3RlbS5lcnIucHJpbnRsbiAoIkludmFsaWQgZmlsZSBhcmd1bWVudCIgKyBleCk7Ci0JCSB9Ci0JCSByZXR1cm4gcGVyZm9ybWFuY2VDYXNlczsKLQkgfQotCQotCSBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgCi0JICBTdHJpbmcgcXVhbGlmaWVkTmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkgCWlmIChxdWFsaWZpZWROYW1lLmVxdWFscyhURVNUX0NBU0UpKSB7Ci0JCSAgZm9yIChpbnQgaSA9IDA7IGk8IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkgICAgaWYgKGF0dHJpYnV0ZXMuZ2V0UU5hbWUoaSkuZXF1YWxzSWdub3JlQ2FzZShDTEFTUykpIHsKLQkJICAgIAl0cnkgewotCQkgICAgCQljdXJyZW50Q2xhenogPSBsb2FkQ2xhc3MoYXR0cmlidXRlcy5nZXRWYWx1ZShpKSk7Ci0JCQkJCWlmIChwZXJmb3JtYW5jZUNhc2VzLmdldChjdXJyZW50Q2xhenopID09IG51bGwpIHsKLQkJCSAgICAJCUFycmF5TGlzdCBtZXRob2RMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJICAgIAkJcGVyZm9ybWFuY2VDYXNlcy5wdXQoY3VycmVudENsYXp6LG1ldGhvZExpc3QpOwotCQkgICAgCQl9Ci0JCQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWN1cnJlbnRDbGF6eiA9IG51bGw7Ci0JCQkJCSBTeXN0ZW0uZXJyLnByaW50bG4gKCJGYWlsZWQgdG8gbG9hZCBjbGFzczoiICsgYXR0cmlidXRlcy5nZXRWYWx1ZShpKSk7Ci0JCQkJCS8vZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCSAgICB9IC8vIGVuZCBvZiBpZgotCQkgIH0gLy8gZW5kIG9mIGZvcgotCSAJfSAvLyBlbmQgb2YgaWYgVEVTVF9DQVNFCi0JIAllbHNlIGlmIChxdWFsaWZpZWROYW1lLmVxdWFsc0lnbm9yZUNhc2UoTUVUSE9EKSkgewotCSAJCSBTdHJpbmcgbWV0aG9kTmFtZSA9IG51bGw7Ci0JIAkJIGludCB0YWdnaW5nID0gMDsKLQkgCQkgU3RyaW5nIHNob3J0TmFtZSA9IG51bGw7Ci0JIAkJIAotCSAJCSBpZiAoY3VycmVudENsYXp6ID09IG51bGwpIHJldHVybjsKLQkgCQkgCi0JIAkJIGZvciAoaW50IGkgPSAwOyBpPCBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkgCQkgICAgaWYgKGF0dHJpYnV0ZXMuZ2V0UU5hbWUoaSkuZXF1YWxzSWdub3JlQ2FzZShNRVRIT0RfTkFNRSkpIHsKLQkgCQkgICAgCW1ldGhvZE5hbWUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKGkpOwotCSAJCSAgICB9IAotCSAJCSAgICBlbHNlIGlmIChhdHRyaWJ1dGVzLmdldFFOYW1lKGkpLmVxdWFsc0lnbm9yZUNhc2UoVEFHR0lORykpewotCSAJCSAgICAJaWYgKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoaSkuZXF1YWxzSWdub3JlQ2FzZShHTE9CQUwpKSB7Ci0JIAkJICAgIAkJdGFnZ2luZyA9IFBlcmZvcm1hbmNlVGVzdENhc2VXcmFwcGVyLkdMT0JBTDsKLQkgCQkgICAgCX0gZWxzZSBpZiAoYXR0cmlidXRlcy5nZXRWYWx1ZShpKS5lcXVhbHNJZ25vcmVDYXNlKExPQ0FMKSkgewotCSAJCSAgICAJCXRhZ2dpbmcgPSBQZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlci5MT0NBTDsKLQkgCQkgICAgCX0gZWxzZSB7Ci0JIAkJICAgIAkJdGFnZ2luZyA9IFBlcmZvcm1hbmNlVGVzdENhc2VXcmFwcGVyLk5PTkU7Ci0JIAkJICAgIAl9Ci0JIAkJIAl9IGVsc2UgaWYoYXR0cmlidXRlcy5nZXRRTmFtZShpKS5lcXVhbHNJZ25vcmVDYXNlKFNIT1JUX05BTUUpKSB7Ci0JIAkJIAkJc2hvcnROYW1lID0gYXR0cmlidXRlcy5nZXRWYWx1ZShpKTsKLQkgCQkJfQotCSAJCSB9IC8vIGVuZCBvZiBmb3IKLQkgCQkgTGlzdCBtZXRob2RMaXN0ID0gKExpc3QpIHBlcmZvcm1hbmNlQ2FzZXMuZ2V0KGN1cnJlbnRDbGF6eik7Ci0JIAkJIG1ldGhvZExpc3QuYWRkKG5ldyBQZXJmb3JtYW5jZVRlc3RPYmplY3QobWV0aG9kTmFtZSx0YWdnaW5nLHNob3J0TmFtZSkpOwotCSAJIH0KLQkgfQotCi0JIHB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHF1YWxpZmllZE5hbWUpCi0JICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkgICAgaWYgKHF1YWxpZmllZE5hbWUuZXF1YWxzKFRFU1RfQ0FTRSkpIHsKLQkgIAkJY3VycmVudENsYXp6ID0gbnVsbDsKLQkgIAl9Ci0JIH0KLQkgCi0JIC8qKgotCSAqIExvYWRzIHRoZSB0ZXN0IHN1aXRlIGNsYXNzLgotCSAqLwotCSBwcml2YXRlIENsYXNzIGxvYWRDbGFzcyhTdHJpbmcgY2xhc3NOYW1lKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCWlmIChjbGFzc05hbWUgPT0gbnVsbCkgCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGdldENsYXNzTG9hZGVyKCkubG9hZENsYXNzKGNsYXNzTmFtZSk7Ci0JIH0KLQkgCi0JIC8qKgotCSAqIFRoZSBjbGFzcyBsb2FkZXIgdG8gYmUgdXNlZCBmb3IgbG9hZGluZyB0ZXN0cy4KLQkgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0byB1c2UgYW5vdGhlciBjbGFzcyBsb2FkZXIuCi0JICovCi0JIHByb3RlY3RlZCBDbGFzc0xvYWRlciBnZXRDbGFzc0xvYWRlcigpIHsKLQkJcmV0dXJuIEJhc2VQZXJmb3JtYW5jZVRlc3RDYXNlLmdldENsYXNzTG9hZGVyKCk7Ci0JIH0KLQkgCi19Ci0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlL3BsdWdpbi54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Mzg3ZDM2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlIgotICAgbmFtZT0iUGVyZm9ybWFuY2UgUGx1Zy1pbiIKLSAgIHZlcnNpb249IjEuMS4wIgotICAgcHJvdmlkZXItbmFtZT0iIgotICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlLlBlcmZvcm1hbmNlUGx1Z2luIj4KLQotICAgPHJ1bnRpbWU+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJwZXJmb3JtYW5jZS5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnRlc3QucGVyZm9ybWFuY2UiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuanVuaXQiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzIi8+Ci0gICA8L3JlcXVpcmVzPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL0RlZmVjdFRlc3REYXRhL0phclRlc3QuYXV0by5qYXIgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9EZWZlY3RUZXN0RGF0YS9KYXJUZXN0LmF1dG8uamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzYwN2ZlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL0RlZmVjdFRlc3REYXRhL0phclRlc3QuYXV0by5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9EZWZlY3RUZXN0RGF0YS9KYXJUZXN0Lm1hbi5qYXIgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9EZWZlY3RUZXN0RGF0YS9KYXJUZXN0Lm1hbi5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlOWUyNTIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvRGVmZWN0VGVzdERhdGEvSmFyVGVzdC5tYW4uamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvZGVmZWN0LXRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2RlZmVjdC90ZXN0cy9EZWZlY3RWZXJpZmljYXRpb25UZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvZGVmZWN0LXRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2RlZmVjdC90ZXN0cy9EZWZlY3RWZXJpZmljYXRpb25UZXN0cy5qYXZhCmluZGV4IGI3MGY1MDQuLmVjNjViZjkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2RlZmVjdC10ZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9kZWZlY3QvdGVzdHMvRGVmZWN0VmVyaWZpY2F0aW9uVGVzdHMuamF2YQorKysgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9kZWZlY3QtdGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZGVmZWN0L3Rlc3RzL0RlZmVjdFZlcmlmaWNhdGlvblRlc3RzLmphdmEKQEAgLTEwLDE0ICsxMCw5IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZGVmZWN0LnRlc3RzOwogCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7CiAKQEAgLTM4MSw0MiArMzc2LDEwIEBACiAJfQogCQogCQotCXB1YmxpYyB2b2lkIHRlc3QxNDUwMzEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIFtdIHNob3J0TmFtZXMgPSBuZXcgU3RyaW5nIFtdIHsgIkphclRlc3QubWFuLmphciIsICJKYXJUZXN0LmF1dG8uamFyIn07Ci0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNob3J0TmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigidHJ5aW5nIHNob3J0TmFtZSA9IitzaG9ydE5hbWVzW2ldKTsKLQkJCVN0cmluZyBsb25nTmFtZSA9IGdldEZ1bGxUZXN0RGF0YVBhdGgoc2hvcnROYW1lc1tpXSk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImxvbmdOYW1lID0iK2xvbmdOYW1lKTsKLQkJCVVSTENsYXNzTG9hZGVyIGphckNMID0gbmV3IFVSTENsYXNzTG9hZGVyKG5ldyBVUkxbXSB7IG5ldyBVUkwoImZpbGU6XFwiK2xvbmdOYW1lKSB9KTsKLQkJCUVudW1lcmF0aW9uIHJlc291cmNlcyA9IGphckNMLmdldFJlc291cmNlcygiTUVUQS1JTkYvIik7Ci0JCQlib29sZWFuIGZvdW5kUmVzb3VyY2UgPSBmYWxzZTsKLQkJCXdoaWxlKHJlc291cmNlcy5oYXNNb3JlRWxlbWVudHMoKSl7Ci0JCQkJVVJMIHVybCA9IChVUkwpcmVzb3VyY2VzLm5leHRFbGVtZW50KCk7Ci0JCQkJaWYodXJsLnRvU3RyaW5nKCkuaW5kZXhPZihzaG9ydE5hbWVzW2ldKSAhPSAtMSl7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICBGb3VuZCBVUkwgd2l0aCBVUkxDbGFzc0xvYWRlci5nZXRSZXNvdXJjZXMoXCJNRVRBLUlORi9cIikgIik7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICB1cmwgPSAiKyB1cmwpOwotCQkJCQlmb3VuZFJlc291cmNlID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZighZm91bmRSZXNvdXJjZSl7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIgIERpZG4ndCBmaW5kIFVSTCB3aXRoIFVSTENsYXNzTG9hZGVyLmdldFJlc291cmNlcyhcIk1FVEEtSU5GL1wiKSAiKTsKLQkJCX0KLQotCQkJWmlwRmlsZSB6aXBGaWxlID0gbmV3IFppcEZpbGUobG9uZ05hbWUpOwotCQkJRW51bWVyYXRpb24gZW50cmllcyA9IHppcEZpbGUuZW50cmllcygpOwotCQkJd2hpbGUoZW50cmllcy5oYXNNb3JlRWxlbWVudHMoKSl7Ci0JCQkJWmlwRW50cnkgZW50cnkgPSAoWmlwRW50cnkpZW50cmllcy5uZXh0RWxlbWVudCgpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICBFbnRyeSBmb3VuZCA9ICIrZW50cnkpOwotCQkJfQotCQkJCi0JCX0KLQl9Ci0JCiAJCiAJLyoqCi0JICogVG8gcnVuIHRoaXMgdGVzdCwgZmlyc3Qgb3ZlcnJpZGUgc2V0VXAoKSB0byBkbyBub3RoaW5nLCBhbmQgdGhlbiBpbXBvcnQgYQotCSAqIGZldyBlYXIgcHJvamVjdHMgY29udGFpbmluZyBtb2R1bGVzLgorCSAqIFRvIHJ1biB0aGlzIHRlc3QsIGZpcnN0IG92ZXJyaWRlIHNldFVwKCkgdG8gZG8gbm90aGluZywgYW5kIHRoZW4gaW1wb3J0IGEgZmV3IGVhciBwcm9qZWN0cworCSAqIGNvbnRhaW5pbmcgbW9kdWxlcy4KIAkgKiAKIAkgKiBAdGhyb3dzIEV4Y2VwdGlvbgogCSAqLwpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvZWpibW9kdWxlLXRlc3RzL29yZy9lY2xpcHNlL3d0cC9qMmVlL2hlYWRsZXNzL3Rlc3RzL2VqYi9vcGVyYXRpb25zL0VKQkV4cG9ydE9wZXJhdGlvblRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2VqYm1vZHVsZS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvajJlZS9oZWFkbGVzcy90ZXN0cy9lamIvb3BlcmF0aW9ucy9FSkJFeHBvcnRPcGVyYXRpb25UZXN0LmphdmEKaW5kZXggMjA5OGYyNS4uMWQxNTUyYSAxMDA2NDQKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvZWpibW9kdWxlLXRlc3RzL29yZy9lY2xpcHNlL3d0cC9qMmVlL2hlYWRsZXNzL3Rlc3RzL2VqYi9vcGVyYXRpb25zL0VKQkV4cG9ydE9wZXJhdGlvblRlc3QuamF2YQorKysgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9lamJtb2R1bGUtdGVzdHMvb3JnL2VjbGlwc2Uvd3RwL2oyZWUvaGVhZGxlc3MvdGVzdHMvZWpiL29wZXJhdGlvbnMvRUpCRXhwb3J0T3BlcmF0aW9uVGVzdC5qYXZhCkBAIC0xNCw3ICsxNCw3IEBACiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUpCSmFyRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsLkVKQkphckZpbGVJbXBsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5jb21wb25lbnRjb3JlLnV0aWwuRUpCQXJ0aWZhY3RFZGl0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm9qZWN0Lm9wZXJhdGlvbnMuRUpCQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKQEAgLTYzLDIxICs2MywxNyBAQAogCQogCXByb3RlY3RlZCB2b2lkIHRlc3REREV4cG9ydGVkKElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCUVKQkFydGlmYWN0RWRpdCBlamJFZGl0ID0gbnVsbDsKLQkJRUpCSmFyRmlsZSBlamJKYXJGaWxlID0gbnVsbDsKIAkJdHJ5IHsKIAkJCWVqYkVkaXQgPSBFSkJBcnRpZmFjdEVkaXQuZ2V0RUpCQXJ0aWZhY3RFZGl0Rm9yUmVhZChjb21wb25lbnQpOwotCQkJZWpiSmFyRmlsZSA9IChFSkJKYXJGaWxlKWVqYkVkaXQuYXNBcmNoaXZlKHRydWUpOworCQkJRUpCSmFyRmlsZUltcGwgYXJjaGl2ZSA9IChFSkJKYXJGaWxlSW1wbCkgZWpiRWRpdC5hc0FyY2hpdmUodHJ1ZSk7CiAJCQl0cnkgewotCQkJUmVzb3VyY2UgcmVzID0gZWpiSmFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7CisJCQlSZXNvdXJjZSByZXMgPSBhcmNoaXZlLmdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKIAkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAJCQkJZmFpbCgiRUpCIGRlcGxveW1lbnQgZGVzY3JpcHRvciBpcyBudWxsLiIpOwogCQkJfQogCQl9IGZpbmFsbHkgewogCQkJaWYgKGVqYkVkaXQgIT1udWxsKQogCQkJCWVqYkVkaXQuZGlzcG9zZSgpOwotCQkJaWYoZWpiSmFyRmlsZSAhPSBudWxsKXsKLQkJCQllamJKYXJGaWxlLmNsb3NlKCk7Ci0JCQl9CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL3dlYm1vZHVsZS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvajJlZS9oZWFkbGVzcy90ZXN0cy93ZWIvb3BlcmF0aW9ucy9XZWJFeHBvcnRPcGVyYXRpb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy93ZWJtb2R1bGUtdGVzdHMvb3JnL2VjbGlwc2Uvd3RwL2oyZWUvaGVhZGxlc3MvdGVzdHMvd2ViL29wZXJhdGlvbnMvV2ViRXhwb3J0T3BlcmF0aW9uVGVzdC5qYXZhCmluZGV4IDkxZDE3OTEuLjk0ZWQwNGUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL3dlYm1vZHVsZS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvajJlZS9oZWFkbGVzcy90ZXN0cy93ZWIvb3BlcmF0aW9ucy9XZWJFeHBvcnRPcGVyYXRpb25UZXN0LmphdmEKKysrIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvd2VibW9kdWxlLXRlc3RzL29yZy9lY2xpcHNlL3d0cC9qMmVlL2hlYWRsZXNzL3Rlc3RzL3dlYi9vcGVyYXRpb25zL1dlYkV4cG9ydE9wZXJhdGlvblRlc3QuamF2YQpAQCAtMTQsNyArMTQsNyBAQAogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLldBUkZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbC5XQVJGaWxlSW1wbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5hcmNoaXZlLm9wZXJhdGlvbnMuV2ViQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLmNvbXBvbmVudGNvcmUudXRpbC5XZWJBcnRpZmFjdEVkaXQ7CkBAIC0xMDgsMjEgKzEwOCwxNyBAQAogCQogCXByb3RlY3RlZCB2b2lkIHRlc3REREV4cG9ydGVkKElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCVdlYkFydGlmYWN0RWRpdCB3ZWJFZGl0ID0gbnVsbDsKLQkJV0FSRmlsZSB3YXJGaWxlID0gbnVsbDsKIAkJdHJ5IHsKIAkJCXdlYkVkaXQgPSBXZWJBcnRpZmFjdEVkaXQuZ2V0V2ViQXJ0aWZhY3RFZGl0Rm9yUmVhZChjb21wb25lbnQpOwotCQkJd2FyRmlsZSA9IChXQVJGaWxlKSB3ZWJFZGl0LmFzQXJjaGl2ZSh0cnVlKTsKKwkJCVdBUkZpbGVJbXBsIGFyY2hpdmUgPSAoV0FSRmlsZUltcGwpIHdlYkVkaXQuYXNBcmNoaXZlKHRydWUpOwogCQkJdHJ5IHsKLQkJCVJlc291cmNlIHJlcyA9IHdhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOworCQkJUmVzb3VyY2UgcmVzID0gYXJjaGl2ZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7CiAJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewogCQkJCWZhaWwoIldlYiBkZXBsb3ltZW50IGRlc2NyaXB0b3IgaXMgbnVsbC4iKTsKIAkJCX0KIAkJfSBmaW5hbGx5IHsKIAkJCWlmICh3ZWJFZGl0ICE9bnVsbCkKIAkJCQl3ZWJFZGl0LmRpc3Bvc2UoKTsKLQkJCWlmKHdhckZpbGUgIT0gbnVsbCl7Ci0JCQkJd2FyRmlsZS5jbG9zZSgpOwotCQkJfQogCQl9CiAJfQogCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy8uY2xhc3NwYXRoIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTEzMDgxYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJ3ZWJtb2R1bGUtdG9tY2F0LXRlc3RzIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzLy5jdnNpZ25vcmUgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzM2ZTM0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbgotdGVtcC5mb2xkZXIKLWJ1aWxkLnhtbAotdWkuamFyCi10ZXN0cy5qYXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzLy5wcm9qZWN0IGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMmMxY2YuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3QuajJlZS5zZXJ2bGV0LnRlc3RzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL1dBUkltcG9ydFRlc3RzL0V4YW1wbGUxLndhciBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL1dBUkltcG9ydFRlc3RzL0V4YW1wbGUxLndhcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMzMGEzOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy9XQVJJbXBvcnRUZXN0cy9FeGFtcGxlMS53YXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy9XQVJJbXBvcnRUZXN0cy9UZXN0MTJXZWIud2FyIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvV0FSSW1wb3J0VGVzdHMvVGVzdDEyV2ViLndhcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEyMjBiMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy9XQVJJbXBvcnRUZXN0cy9UZXN0MTJXZWIud2FyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvV0FSSW1wb3J0VGVzdHMvVGVzdDEzV2ViLndhciBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL1dBUkltcG9ydFRlc3RzL1Rlc3QxM1dlYi53YXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyYWE5MjYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvV0FSSW1wb3J0VGVzdHMvVGVzdDEzV2ViLndhcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL1dBUkltcG9ydFRlc3RzL1Rlc3QxNFdlYi53YXIgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy9XQVJJbXBvcnRUZXN0cy9UZXN0MTRXZWIud2FyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWIyYTNmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL1dBUkltcG9ydFRlc3RzL1Rlc3QxNFdlYi53YXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy9XQVJJbXBvcnRUZXN0cy9Zb3VyQ29tcGFueUV4YW1wbGUud2FyIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvV0FSSW1wb3J0VGVzdHMvWW91ckNvbXBhbnlFeGFtcGxlLndhcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM5NjI4Yy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy9XQVJJbXBvcnRUZXN0cy9Zb3VyQ29tcGFueUV4YW1wbGUud2FyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvYWJvdXQuaHRtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYzU5ODkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAyLCAyMDA2PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL2J1aWxkLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmQ1YWViLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXNvdXJjZS50ZXN0cy5qYXIgPSB3ZWJtb2R1bGUtdG9tY2F0LXRlc3RzLwotb3V0cHV0LnRlc3RzLmphciA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgdGVzdHMuamFyLFwKLSAgICAgICAgICAgICAgIFdBUkltcG9ydFRlc3RzLyxcCi0gICAgICAgICAgICAgICB0ZXN0LnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy9wbHVnaW4ucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjdmY2MzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1QTFVHSU49b3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMKLUlCTT1JQk0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy9wbHVnaW4ueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhiODBlZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4KLSAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cyIKLSAgIG5hbWU9IiVQTFVHSU4iCi0gICB2ZXJzaW9uPSIxLjEuMCIKLSAgIHByb3ZpZGVyLW5hbWU9IiVJQk0iCi0gICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMuU2VydmxldFRlc3RzUGx1Z2luIj4KLQotICAgPHJ1bnRpbWU+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJ0ZXN0cy5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYiIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuanVuaXQiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5qMmVlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUiLz4KLSAgICAgIAotICAgPC9yZXF1aXJlcz4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy90ZXN0LnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL3Rlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmJiOThmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL3Rlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTxwcm9qZWN0IG5hbWU9InRlc3RzdWl0ZSIgZGVmYXVsdD0icnVuIiBiYXNlZGlyPSIuIj4KLSAgPCEtLSBUaGUgcHJvcGVydHkgJHtlY2xpcHNlLWhvbWV9IHNob3VsZCBiZSBwYXNzZWQgaW50byB0aGlzIHNjcmlwdCAtLT4KLSAgPCEtLSBTZXQgYSBtZWFuaW5nZnVsIGRlZmF1bHQgdmFsdWUgZm9yIHdoZW4gaXQgaXMgbm90LiAtLT4KLSA8IS0tIDxwcm9wZXJ0eSBuYW1lPSJlY2xpcHNlLWhvbWUiIHZhbHVlPSIke2Jhc2VkaXJ9XC4uXC4uIi8+IC0tPgotCTxlY2hvIG1lc3NhZ2U9ImJhc2VkaXIgJHtiYXNlZGlyfSIgLz4KLQk8ZWNobyBtZXNzYWdlPSJlY2xpcHNlIHBsYWNlICR7ZWNsaXBzZS1ob21lfSIgLz4KLSAgPCEtLSBzZXRzIHRoZSBwcm9wZXJ0aWVzIHBsdWdpbi1uYW1lLCBhbmQgbGlicmFyeS1maWxlIC0tPgotICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cyIvPgotICA8cHJvcGVydHkgbmFtZT0ibGlicmFyeS1maWxlIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3BsdWdpbnMvb3JnLmVjbGlwc2UudGVzdF8zLjEuMC9saWJyYXJ5LnhtbCIvPgotICA8cHJvcGVydHkgbmFtZT0iZXh0cmFWTWFyZ3MiIHZhbHVlPSItRG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjUwPSR7dGVzdERpcn0vJHt0b21jYXQ1MERpcn0iLz4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGFsbCBpbml0aWFsaXphdGlvbiBjb2RlIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSBmb3IgLS0+Ci0gIDwhLS0gYWxsIHRlc3RzIHRoYXQgYXJlIHRvIGJlIHJ1bi4gSW5pdGlhbGl6YXRpb24gZm9yIGluZGl2aWR1YWwgdGVzdHMgLS0+Ci0gIDwhLS0gc2hvdWxkIGJlIGRvbmUgd2l0aGluIHRoZSBib2R5IG9mIHRoZSBzdWl0ZSB0YXJnZXQuIC0tPgotICA8dGFyZ2V0IG5hbWU9ImluaXQiPgotICAgIDx0c3RhbXAvPgotICAgIDxkZWxldGU+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7ZWNsaXBzZS1ob21lfSIgaW5jbHVkZXM9Im9yZyoueG1sIi8+Ci0gICAgPC9kZWxldGU+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgZGVmaW5lcyB0aGUgdGVzdHMgdGhhdCBuZWVkIHRvIGJlIHJ1bi4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0ic3VpdGUiPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJqc3QtZm9sZGVyIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L2pzdF9mb2xkZXIiLz4KLSAgICA8ZGVsZXRlIGRpcj0iJHtqc3QtZm9sZGVyfSIgcXVpZXQ9InRydWUiLz4KLSAgICA8YW50IHRhcmdldD0iY29yZS10ZXN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkYXRhLWRpciIgdmFsdWU9IiR7anN0LWZvbGRlcn0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3NuYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMuYnZ0LkF1dG9tYXRlZEJWVCIgLz4KLSAgIAkgIDxwcm9wZXJ0eSBuYW1lPSJleHRyYVZNYXJncyIgdmFsdWU9IiR7ZXh0cmFWTWFyZ3N9Ii8+Ci0gICAgPC9hbnQ+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgY29kZSB0byBjbGVhbnVwIHRoZSB0ZXN0aW5nIGVudmlyb25tZW50IGFmdGVyIC0tPgotICA8IS0tIGFmdGVyIGFsbCBvZiB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1bi4gWW91IGNhbiB1c2UgdGhpcyB0YXJnZXQgdG8gLS0+Ci0gIDwhLS0gZGVsZXRlIHRlbXBvcmFyeSBmaWxlcyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJjbGVhbnVwIj4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBydW5zIHRoZSB0ZXN0IHN1aXRlLiBBbnkgYWN0aW9ucyB0aGF0IG5lZWQgdG8gaGFwcGVuIC0tPgotICA8IS0tIGFmdGVyIGFsbCB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1biBzaG91bGQgZ28gaGVyZS4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0icnVuIiBkZXBlbmRzPSJpbml0LHN1aXRlLGNsZWFudXAiPgotICAgIDxhbnQgdGFyZ2V0PSJjb2xsZWN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpbmNsdWRlcyIgdmFsdWU9Im9yZyoueG1sIi8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0ib3V0cHV0LWZpbGUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfS54bWwiLz4KLSAgICA8L2FudD4KLSAgPC90YXJnZXQ+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvd2VibW9kdWxlLXRvbWNhdC10ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC90ZXN0cy9TZXJ2bGV0VGVzdHNQbHVnaW4uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL3dlYm1vZHVsZS10b21jYXQtdGVzdHMvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdGVzdHMvU2VydmxldFRlc3RzUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0YjJhN2EuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvd2VibW9kdWxlLXRvbWNhdC10ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC90ZXN0cy9TZXJ2bGV0VGVzdHNQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2bGV0VGVzdHNQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCS8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBTZXJ2bGV0VGVzdHNQbHVnaW4gcGx1Z2luOwotCS8vUmVzb3VyY2UgYnVuZGxlLgotCXByaXZhdGUgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBTZXJ2bGV0VGVzdHNQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHVwb24gcGx1Zy1pbiBhY3RpdmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHBsdWctaW4gaXMgc3RvcHBlZAotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQkJcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFNlcnZsZXRUZXN0c1BsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyBmcm9tIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICogb3IgJ2tleScgaWYgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gU2VydmxldFRlc3RzUGx1Z2luLmdldERlZmF1bHQoKS5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotCQl0cnkgewotCQkJcmV0dXJuIChidW5kbGUgIT0gbnVsbCkgPyBidW5kbGUuZ2V0U3RyaW5nKGtleSkgOiBrZXk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJdHJ5IHsKLQkJCWlmIChyZXNvdXJjZUJ1bmRsZSA9PSBudWxsKQotCQkJCXJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy5TZXJ2bGV0VGVzdHNQbHVnaW5SZXNvdXJjZXMiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24geCkgewotCQkJcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZUJ1bmRsZTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy93ZWJtb2R1bGUtdG9tY2F0LXRlc3RzL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3Rlc3RzL2J2dC9BdXRvbWF0ZWRCVlQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL3dlYm1vZHVsZS10b21jYXQtdGVzdHMvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdGVzdHMvYnZ0L0F1dG9tYXRlZEJWVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWIyYjI4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL3dlYm1vZHVsZS10b21jYXQtdGVzdHMvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdGVzdHMvYnZ0L0F1dG9tYXRlZEJWVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gQXByIDEsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byAKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzLmJ2dDsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIAotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBBdXRvbWF0ZWRCVlQgZXh0ZW5kcyBUZXN0U3VpdGUgewotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgYmFzZURpcmVjdG9yeSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKSArIGphdmEuaW8uRmlsZS5zZXBhcmF0b3JDaGFyICsgIldBUkltcG9ydFRlc3RzIiArIGphdmEuaW8uRmlsZS5zZXBhcmF0b3JDaGFyOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAKLSAgICBzdGF0aWMgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgVVJMIHVybCA9IFBsYXRmb3JtLmdldEJ1bmRsZSgib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMiKS5nZXRFbnRyeSgiLyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgCUF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ID0gUGxhdGZvcm0uYXNMb2NhbFVSTCh1cmwpLmdldEZpbGUoKSArICJUZXN0RGF0YSIrIGphdmEuaW8uRmlsZS5zZXBhcmF0b3JDaGFyOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7IAotCQkJU3lzdGVtLmVyci5wcmludGxuKCJVc2luZyB3b3JraW5nIGRpcmVjdG9yeSBzaW5jZSBhIHdvcmtzcGFjZSBVUkwgY291bGQgbm90IGJlIGxvY2F0ZWQuIik7IC8vJE5PTi1OTFMtMSQKLQkJfSAKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGludCB1bmltcGxlbWVudGVkTWV0aG9kczsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgdW5pbXBsZW1lbnRlZE1ldGhvZHMgPSAwOwotICAgICAgICBUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLSAgICAgICAgaWYgKHVuaW1wbGVtZW50ZWRNZXRob2RzID4gMCkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcbkNhbGxzIHRvIHdhcm5VbmltcGw6ICIgKyB1bmltcGxlbWVudGVkTWV0aG9kcyk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBBdXRvbWF0ZWRCVlQoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IChUZXN0U3VpdGUpIEF1dG9tYXRlZEJWVC5zdWl0ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN1aXRlLnRlc3RDb3VudCgpOyBpKyspIHsKLSAgICAgICAgICAgIGFkZFRlc3Qoc3VpdGUudGVzdEF0KGkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgiVGVzdCBmb3Igb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMuYnZ0Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgLy9zdWl0ZS5hZGRUZXN0KEFsbFRvbWNhdFRlc3RzLnN1aXRlKCkpOwotICAgICAgICByZXR1cm4gc3VpdGU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvd2VibW9kdWxlLXRvbWNhdC10ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC90ZXN0cy9idnQvQXV0b21hdGVkQlZURWNsaXBzZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvd2VibW9kdWxlLXRvbWNhdC10ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC90ZXN0cy9idnQvQXV0b21hdGVkQlZURWNsaXBzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjRmYmI0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL3dlYm1vZHVsZS10b21jYXQtdGVzdHMvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdGVzdHMvYnZ0L0F1dG9tYXRlZEJWVEVjbGlwc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAyNSwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMuYnZ0OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBBdXRvbWF0ZWRCVlRFY2xpcHNlIGV4dGVuZHMgQXV0b21hdGVkQlZUIHsKLQkKLQlwdWJsaWMgQXV0b21hdGVkQlZURWNsaXBzZSgpewotCQlzdXBlcigpOwotCQlVUkwgdXJsID0gUGxhdGZvcm0uZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cyIpLmdldEVudHJ5KCIvIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICB0cnkgewotICAgICAgICAJQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgPSBQbGF0Zm9ybS5hc0xvY2FsVVJMKHVybCkuZ2V0RmlsZSgpICsgIldBUkltcG9ydFRlc3RzIisgamF2YS5pby5GaWxlLnNlcGFyYXRvckNoYXI7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL3dlYm1vZHVsZS10b21jYXQtdGVzdHMvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdG9tY2F0L3Rlc3RzL0FsbFRvbWNhdFRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy93ZWJtb2R1bGUtdG9tY2F0LXRlc3RzL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3RvbWNhdC90ZXN0cy9BbGxUb21jYXRUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDhlMzVlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL3dlYm1vZHVsZS10b21jYXQtdGVzdHMvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdG9tY2F0L3Rlc3RzL0FsbFRvbWNhdFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBGZWIgMiwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudG9tY2F0LnRlc3RzOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWVXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEFsbFRvbWNhdFRlc3RzIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQkKLQlwdWJsaWMgc3RhdGljIElSdW50aW1lIFRPTUNBVF9SVU5USU1FID0gY3JlYXRlUnVudGltZSgpOwotCQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpewotICAgICAgICByZXR1cm4gbmV3IEFsbFRvbWNhdFRlc3RzKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBBbGxUb21jYXRUZXN0cygpewotICAgICAgICBzdXBlcigiV0VCIFRlc3RzIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYWRkVGVzdChXZWJQcm9qZWN0Q3JlYXRpb25Ub21jYXRUZXN0LnN1aXRlKCkpOwotICAgICAgICBhZGRUZXN0KFdlYkltcG9ydE9wZXJhdGlvblRvbWNhdFRlc3Quc3VpdGUoKSk7Ci0gICAgICAgIGFkZFRlc3QoV2ViRXhwb3J0T3BlcmF0aW9uVG9tY2F0VGVzdC5zdWl0ZSgpKTsKLSAgICAgICAgCi0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgSVJ1bnRpbWUgY3JlYXRlUnVudGltZSgpICB7Ci0gICAgCVN0cmluZyBzID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC41MCIpOyAvLyROT04tTkxTLTEkCi0gICAgCQotICAgIAlpZiAocyA9PSBudWxsIHx8IHMubGVuZ3RoKCkgPT0gMCkKLSAgICAJCXJldHVybiBudWxsOwotICAgIAl0cnkgewotICAgIAkJSVJ1bnRpbWVUeXBlIHJ0ID0gU2VydmVyQ29yZS5maW5kUnVudGltZVR5cGUoIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuNTAiKTsgLy8kTk9OLU5MUy0xJAotICAgIAkJSVJ1bnRpbWVXb3JraW5nQ29weSB3YyA9IHJ0LmNyZWF0ZVJ1bnRpbWUobnVsbCwgbnVsbCk7Ci0gICAgCQl3Yy5zZXRMb2NhdGlvbihuZXcgUGF0aChzKSk7Ci0gICAgCQlyZXR1cm4gd2Muc2F2ZSh0cnVlLCBudWxsKTsKLSAgICAJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgCQlyZXR1cm4gbnVsbDsKLSAgICAJfQotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL3dlYm1vZHVsZS10b21jYXQtdGVzdHMvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdG9tY2F0L3Rlc3RzL1dlYkV4cG9ydE9wZXJhdGlvblRvbWNhdFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL3dlYm1vZHVsZS10b21jYXQtdGVzdHMvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdG9tY2F0L3Rlc3RzL1dlYkV4cG9ydE9wZXJhdGlvblRvbWNhdFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWEzNTk3ZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy93ZWJtb2R1bGUtdG9tY2F0LXRlc3RzL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3RvbWNhdC90ZXN0cy9XZWJFeHBvcnRPcGVyYXRpb25Ub21jYXRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBKYW4gNiwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudG9tY2F0LnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIuYXJjaGl2ZS5vcGVyYXRpb25zLldlYkNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5TaW1wbGVUZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3RwLmhlYWRsZXNzLnRlc3RzLnNhdmVzdHJhdGVneS5Nb2R1bGVJbXBvcnRPcGVyYXRpb25UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5qMmVlLm9wZXJhdGlvbnMuTW9kdWxlRXhwb3J0T3BlcmF0aW9uVGVzdENhc2U7Ci0KLS8qKgotICogQGF1dGhvciBBZG1pbmlzdHJhdG9yCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlCi0gKiBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFdlYkV4cG9ydE9wZXJhdGlvblRvbWNhdFRlc3QgZXh0ZW5kcyBNb2R1bGVFeHBvcnRPcGVyYXRpb25UZXN0Q2FzZSB7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBleGNsdWRlQ29tcGlsZUpzcCA9IGZhbHNlOwotCi0JcHVibGljIFdlYkV4cG9ydE9wZXJhdGlvblRvbWNhdFRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRlc3RTdWl0ZShXZWJFeHBvcnRPcGVyYXRpb25Ub21jYXRUZXN0LmNsYXNzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnd0cC5qMmVlLmhlYWRsZXNzLnRlc3RzLmoyZWUub3BlcmF0aW9ucy5PcGVyYXRpb25UZXN0Q2FzZSNzZXRVcCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJZXhjbHVkZUNvbXBpbGVKc3AgPSBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXhjbHVkZUNvbXBpbGVKc3BPbigpIHRocm93cyBFeGNlcHRpb24gewotCQlleGNsdWRlQ29tcGlsZUpzcCA9IHRydWU7Ci0JCXRlc3RBbGxFeHBvcnRUZXN0Q2FzZXMoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnd0cC5qMmVlLmhlYWRsZXNzLnRlc3RzLmoyZWUub3BlcmF0aW9ucy5Nb2R1bGVFeHBvcnRPcGVyYXRpb25UZXN0Q2FzZSNnZXRNb2RlbEluc3RhbmNlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSURhdGFNb2RlbCBnZXRNb2RlbEluc3RhbmNlKCkgewotCQlyZXR1cm4gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IFdlYkNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3ZpZGVyKCkpOwotCX0KLQlwcm90ZWN0ZWQgSVByb2plY3RbXSBnZXRFeHBvcnRhYmxlUHJvamVjdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSVByb2plY3RbXSBwcm9qcyA9IHN1cGVyLmdldEV4cG9ydGFibGVQcm9qZWN0cygpOwotCQlMaXN0IGZpbHRlcmVkUHJvanMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvanMubGVuZ3RoOyBpKyspIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBwcm9qc1tpXTsKLQkJCWlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KHByb2plY3QpKQotCQkJCWZpbHRlcmVkUHJvanMuYWRkKHByb2plY3QpOwotCQl9Ci0JCXJldHVybiAoSVByb2plY3RbXSkgZmlsdGVyZWRQcm9qcy50b0FycmF5KG5ldyBJUHJvamVjdFtmaWx0ZXJlZFByb2pzLnNpemUoKV0pOwotCQkKLQl9Ci0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3RwLmoyZWUuaGVhZGxlc3MudGVzdHMuajJlZS5vcGVyYXRpb25zLk1vZHVsZUV4cG9ydE9wZXJhdGlvblRlc3RDYXNlI2dldEltcG9ydFRlc3RDYXNlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgTW9kdWxlSW1wb3J0T3BlcmF0aW9uVGVzdENhc2UgZ2V0SW1wb3J0VGVzdENhc2UoKSB7Ci0JCXJldHVybiBuZXcgV2ViSW1wb3J0T3BlcmF0aW9uVG9tY2F0VGVzdCgiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNb2R1bGVFeHBvcnRGaWxlRXh0KCkgewotCQlyZXR1cm4gIi53YXIiOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy93ZWJtb2R1bGUtdG9tY2F0LXRlc3RzL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3RvbWNhdC90ZXN0cy9XZWJJbXBvcnRPcGVyYXRpb25Ub21jYXRUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy93ZWJtb2R1bGUtdG9tY2F0LXRlc3RzL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3RvbWNhdC90ZXN0cy9XZWJJbXBvcnRPcGVyYXRpb25Ub21jYXRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiZTBiZGIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvd2VibW9kdWxlLXRvbWNhdC10ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC90b21jYXQvdGVzdHMvV2ViSW1wb3J0T3BlcmF0aW9uVG9tY2F0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gSmFuIDYsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRvbWNhdC50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5Qcm9qZWN0VXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLlNpbXBsZVRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53dHAuaGVhZGxlc3MudGVzdHMuc2F2ZXN0cmF0ZWd5Lk1vZHVsZUltcG9ydE9wZXJhdGlvblRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnd0cC5qMmVlLmhlYWRsZXNzLnRlc3RzLnBsdWdpbi5IZWFkbGVzc1Rlc3RzUGx1Z2luOwotCi0vKioKLSAqIEBhdXRob3IgQWRtaW5pc3RyYXRvcgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZQotICogR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJJbXBvcnRPcGVyYXRpb25Ub21jYXRUZXN0IGV4dGVuZHMgTW9kdWxlSW1wb3J0T3BlcmF0aW9uVGVzdENhc2UgewotCi0JcHVibGljIFdlYkltcG9ydE9wZXJhdGlvblRvbWNhdFRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRlc3RTdWl0ZShXZWJJbXBvcnRPcGVyYXRpb25Ub21jYXRUZXN0LmNsYXNzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnd0cC5qMmVlLmhlYWRsZXNzLnRlc3RzLmoyZWUub3BlcmF0aW9ucy5Nb2R1bGVJbXBvcnRPcGVyYXRpb25UZXN0Q2FzZSNnZXREaXJlY3RvcnkoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGlyZWN0b3J5KCkgewotCQlyZXR1cm4gIldBUkltcG9ydFRlc3RzIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3RwLmoyZWUuaGVhZGxlc3MudGVzdHMuajJlZS5vcGVyYXRpb25zLk1vZHVsZUltcG9ydE9wZXJhdGlvblRlc3RDYXNlI2dldE1vZGVsSW5zdGFuY2UoKQotCSAqLwotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGdldE1vZGVsSW5zdGFuY2UoKSB7Ci0JCXJldHVybiBudWxsOyAvLyBuZXcgV2ViTW9kdWxlSW1wb3J0RGF0YU1vZGVsKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5qMmVlLm9wZXJhdGlvbnMuTW9kdWxlSW1wb3J0T3BlcmF0aW9uVGVzdENhc2UjZ2V0SW1wb3J0YWJsZUFyY2hpdmVGaWxlTmFtZXMoKQotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldEltcG9ydGFibGVBcmNoaXZlRmlsZU5hbWVzKCkgewotCQlyZXR1cm4gUHJvamVjdFV0aWxpdHkuZ2V0V2Fyc0luRGlyZWN0b3J5KEhlYWRsZXNzVGVzdHNQbHVnaW4uZ2V0RGVmYXVsdCgpLCBURVNUU19QQVRIKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnd0cC5qMmVlLmhlYWRsZXNzLnRlc3RzLmoyZWUub3BlcmF0aW9ucy5Nb2R1bGVJbXBvcnRPcGVyYXRpb25UZXN0Q2FzZSNzZXRTZXJ2ZXJUYXJnZXRQcm9wZXJ0eShvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5vcGVyYXRpb25zLkoyRUVNb2R1bGVJbXBvcnREYXRhTW9kZWwpCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VydmVyVGFyZ2V0UHJvcGVydHkoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJLy8gZGF0YU1vZGVsLnNldFByb3BlcnR5KFNlcnZlclRhcmdldERhdGFNb2RlbC5SVU5USU1FX1RBUkdFVF9JRCxBbGxUb21jYXRUZXN0cy5UT01DQVRfUlVOVElNRS5nZXRJZCgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL3dlYm1vZHVsZS10b21jYXQtdGVzdHMvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdG9tY2F0L3Rlc3RzL1dlYlByb2plY3RDcmVhdGlvblRvbWNhdFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL3dlYm1vZHVsZS10b21jYXQtdGVzdHMvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdG9tY2F0L3Rlc3RzL1dlYlByb2plY3RDcmVhdGlvblRvbWNhdFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE1NGY3OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy93ZWJtb2R1bGUtdG9tY2F0LXRlc3RzL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3RvbWNhdC90ZXN0cy9XZWJQcm9qZWN0Q3JlYXRpb25Ub21jYXRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gSmFuIDYsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRvbWNhdC50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuSUFubm90YXRpb25zRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLmFyY2hpdmUub3BlcmF0aW9ucy5XZWJGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLkFkZFNlcnZsZXRPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRmFjZXREYXRhTW9kZWxNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbi5JQXJ0aWZhY3RFZGl0T3BlcmF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLkxvZ1V0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5Qcm9qZWN0VXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLlNpbXBsZVRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLlRhc2tWaWV3VXRpbGl0eTsKLQotLyoqIAotICogQGF1dGhvciBibGFuY2V0dAotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0KLSAqIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJQcm9qZWN0Q3JlYXRpb25Ub21jYXRUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIAotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVNpbXBsZVByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgSURhdGFNb2RlbCBkYXRhTW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgV2ViRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLSAgICAgICAgZGF0YU1vZGVsLnNldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUFJPSkVDVF9OQU1FLCBwcm9qZWN0TmFtZSk7Ci0gICAgICAgIHNldFNlcnZlclRhcmdldFByb3BlcnR5KGRhdGFNb2RlbCk7Ci0gICAgICAgIGRhdGFNb2RlbC5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZGF0YU1vZGVsCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmVyVGFyZ2V0UHJvcGVydHkoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLSAgICAgICAgZGF0YU1vZGVsLnNldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUlVOVElNRSwgQWxsVG9tY2F0VGVzdHMuVE9NQ0FUX1JVTlRJTUUuZ2V0SWQoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZVNlcnZsZXQoSURhdGFNb2RlbCBtb2RlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICBBZGRTZXJ2bGV0T3BlcmF0aW9uIG9wID0gbmV3IEFkZFNlcnZsZXRPcGVyYXRpb24obW9kZWwpOwotICAgICAgICAgb3AuZXhlY3V0ZShudWxsLG51bGwpOwotICAgICAgICAgUHJvamVjdFV0aWxpdHkudmVyaWZ5UHJvamVjdChvcC5nZXRUYXJnZXRQcm9qZWN0KCkuZ2V0TmFtZSgpLCB0cnVlKTsgCi0gICAgICAgICBUYXNrVmlld1V0aWxpdHkudmVyaWZ5Tm9FcnJvcnMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSURhdGFNb2RlbCBzZXR1cFN0YW5kYWxvbmVXZWJQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSwgaW50IGoyZWVWZXJzaW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgY3JlYXRlU2ltcGxlUHJvamVjdChwcm9qZWN0TmFtZSk7Ci0gICAgICAgIElEYXRhTW9kZWwgbW9kZWwgPSBnZXRXZWJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbChwcm9qZWN0TmFtZSwgajJlZVZlcnNpb24pOwotICAgICAgICBjcmVhdGVTdGFuZGFsb25lV2ViUHJvamVjdChtb2RlbCk7Ci0gICAgICAgIGNyZWF0ZVNlcnZsZXQocHJvamVjdE5hbWUpOwotICAgICAgICByZXR1cm4gbW9kZWw7Ci0gICAgfQotCi0gICAgcHVibGljIElEYXRhTW9kZWwgc2V0dXBTdGFuZGFsb25lQW5ub3RhdGVkV2ViUHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUsIGludCBqMmVlVmVyc2lvbikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGNyZWF0ZVNpbXBsZVByb2plY3QocHJvamVjdE5hbWUpOwotCi0gICAgICAgIElEYXRhTW9kZWwgbW9kZWwgPSBnZXRXZWJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbChwcm9qZWN0TmFtZSwgajJlZVZlcnNpb24pOwotICAgICAgICBjcmVhdGVTdGFuZGFsb25lV2ViUHJvamVjdChtb2RlbCk7Ci0gICAgICAgIGNyZWF0ZUFubm90YXRlZFNlcnZsZXQocHJvamVjdE5hbWUpOwotICAgICAgICByZXR1cm4gbW9kZWw7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVTdGFuZGFsb25lV2ViUHJvamVjdChJRGF0YU1vZGVsIG1vZGVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgSURhdGFNb2RlbE9wZXJhdGlvbiB3ZWJPcCA9IG1vZGVsLmdldERlZmF1bHRPcGVyYXRpb24oKTsKLSAgICAgICAgd2ViT3AuZXhlY3V0ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCBudWxsKTsKLSAgICAgICAgLy8gUHJvamVjdFV0aWxpdHkudmVyaWZ5UHJvamVjdChtb2RlbC5nZXRUYXJnZXRQcm9qZWN0KCkuZ2V0TmFtZSgpLAotICAgICAgICAvLyB0cnVlKTsKLSAgICAgICAgVGFza1ZpZXdVdGlsaXR5LnZlcmlmeU5vRXJyb3JzKCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgSURhdGFNb2RlbCBnZXRXZWJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbChTdHJpbmcgcHJvamVjdE5hbWUsIGludCBqMmVlVmVyc2lvbikgewotICAgICAgICBJUHJvamVjdCBqYXZhUHJvamVjdCA9IFByb2plY3RVdGlsaXR5LmdldFByb2plY3QocHJvamVjdE5hbWUpOwotICAgICAgICBTdHJpbmcgbW9kdWxlTmFtZSA9IHByb2plY3ROYW1lICsgIldlYk1vZHVsZSI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgU3RyaW5nIG1vZHVsZURlcGxveU5hbWUgPSBtb2R1bGVOYW1lICsgIi53YXIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIElEYXRhTW9kZWwgbW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgV2ViRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLSAgICAgICAgbW9kZWwuc2V0UHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9QUk9KRUNUX05BTUUsIGphdmFQcm9qZWN0LmdldE5hbWUoKSk7Ci0gICAgICAgIEZhY2V0RGF0YU1vZGVsTWFwIG1hcCA9IChGYWNldERhdGFNb2RlbE1hcCkgbW9kZWwuZ2V0UHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9ETV9NQVApOwotICAgICAgICBJRGF0YU1vZGVsIHdlYk1vZGVsID0gbWFwLmdldEZhY2V0RGF0YU1vZGVsKEoyRUVQcm9qZWN0VXRpbGl0aWVzLkRZTkFNSUNfV0VCKTsKLSAgICAgICAgd2ViTW9kZWwuc2V0SW50UHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9WRVJTSU9OLGoyZWVWZXJzaW9uKTsKLSAgICAgICAgcmV0dXJuIG1vZGVsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVNlcnZsZXQoU3RyaW5nIHByb2plY3ROYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgSURhdGFNb2RlbCBzZXJ2bGV0TW9kZWwgPSBzZXR1cFNlcnZsZXRDcmVhdGlvbkRhdGFNb2RlbChwcm9qZWN0TmFtZSwgZmFsc2UpOwotICAgICAgICBjcmVhdGVTZXJ2bGV0KHNlcnZsZXRNb2RlbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlQW5ub3RhdGVkU2VydmxldChTdHJpbmcgcHJvamVjdE5hbWUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBJRGF0YU1vZGVsIHNlcnZsZXRNb2RlbCA9IHNldHVwU2VydmxldENyZWF0aW9uRGF0YU1vZGVsKHByb2plY3ROYW1lLCB0cnVlKTsKLSAgICAgICAgY3JlYXRlU2VydmxldChzZXJ2bGV0TW9kZWwpOwotICAgIH0KLQotICAgIHB1YmxpYyBJRGF0YU1vZGVsIHNldHVwU2VydmxldENyZWF0aW9uRGF0YU1vZGVsKFN0cmluZyBwcm9qZWN0TmFtZSwgYm9vbGVhbiBpc0Fubm90YXRlZCkgewotICAgIAlJRGF0YU1vZGVsIHNlcnZsZXREYXRhTW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm92aWRlci5jbGFzcyk7Ci0gICAgICAgIHNlcnZsZXREYXRhTW9kZWwuc2V0UHJvcGVydHkoSUFydGlmYWN0RWRpdE9wZXJhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FLCBwcm9qZWN0TmFtZSk7Ci0gICAgICAgIHNlcnZsZXREYXRhTW9kZWwuc2V0UHJvcGVydHkoSUFydGlmYWN0RWRpdE9wZXJhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuQ09NUE9ORU5UX05BTUUsIHByb2plY3ROYW1lKTsKLSAgICAgICAgc2VydmxldERhdGFNb2RlbC5zZXRQcm9wZXJ0eShJTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5DTEFTU19OQU1FLCAiRm9vU2VydmxldCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHNlcnZsZXREYXRhTW9kZWwuc2V0UHJvcGVydHkoSU5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuRElTUExBWV9OQU1FLCAiRm9vU2VydmxldCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHNlcnZsZXREYXRhTW9kZWwuc2V0Qm9vbGVhblByb3BlcnR5KElBbm5vdGF0aW9uc0RhdGFNb2RlbC5VU0VfQU5OT1RBVElPTlMsIGlzQW5ub3RhdGVkKTsKLSAgICAgICAgcmV0dXJuIHNlcnZsZXREYXRhTW9kZWw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY3JlYXRlVmFpbGRQcm9qZWN0QW5kU2VydmxldENyZWF0aW9uKFN0cmluZyBwcm9qZWN0TmFtZSwgaW50IGoyZWVWZXJzaW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTG9nVXRpbGl0eS5nZXRJbnN0YW5jZSgpLnJlc2V0TG9nZ2luZygpOwotICAgICAgICBJRGF0YU1vZGVsIG1vZGVsID0gbnVsbDsKLSAgICAgICAgbW9kZWwgPSBzZXR1cFN0YW5kYWxvbmVXZWJQcm9qZWN0KHByb2plY3ROYW1lLCBqMmVlVmVyc2lvbik7Ci0gICAgICAgIExvZ1V0aWxpdHkuZ2V0SW5zdGFuY2UoKS52ZXJpZnlOb1dhcm5pbmdzKCk7Ci0gICAgICAgIGNoZWNrVmFsaWREYXRhTW9kZWwobW9kZWwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVZhaWxkQW5ub3RhdGVkUHJvamVjdEFuZFNlcnZsZXRDcmVhdGlvbihTdHJpbmcgcHJvamVjdE5hbWUsIGludCBqMmVlVmVyc2lvbikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIExvZ1V0aWxpdHkuZ2V0SW5zdGFuY2UoKS5yZXNldExvZ2dpbmcoKTsKLSAgICAgICAgSURhdGFNb2RlbCBtb2RlbCA9IG51bGw7Ci0gICAgICAgIG1vZGVsID0gc2V0dXBTdGFuZGFsb25lQW5ub3RhdGVkV2ViUHJvamVjdChwcm9qZWN0TmFtZSwgajJlZVZlcnNpb24pOwotICAgICAgICBMb2dVdGlsaXR5LmdldEluc3RhbmNlKCkudmVyaWZ5Tm9XYXJuaW5ncygpOwotICAgICAgICBjaGVja1ZhbGlkRGF0YU1vZGVsKG1vZGVsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbW9kZWwKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja1ZhbGlkRGF0YU1vZGVsKElEYXRhTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgLy8gRGF0YU1vZGVsVmVyaWZpZXIgdmVyaWZpZXIgPQotICAgICAgICAvLyBEYXRhTW9kZWxWZXJpZmllckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5jcmVhdGVWZXJpZmllcihtb2RlbCk7Ci0gICAgICAgIC8vIHRyeSB7Ci0gICAgICAgIC8vIHZlcmlmaWVyLnZlcmlmeShtb2RlbCk7Ci0gICAgICAgIC8vIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIC8vIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLSAgICAgICAgLy8gZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgLy8gfQotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFZhaWxkMTJXZWJQcm9qZWN0TmFtZUNyZWF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFByb2plY3RVdGlsaXR5LmRlbGV0ZUFsbFByb2plY3RzKCk7Ci0gICAgICAgIGNyZWF0ZVZhaWxkUHJvamVjdEFuZFNlcnZsZXRDcmVhdGlvbigiRm9vVG9tY2F0V2ViUHJvamVjdDEyIiwgSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfMl9JRCk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFRPRE8gVW5jb21tZW50IHRoaXMgbWV0aG9kIHdoZW4gQW5ub3RhdGlvbiBzdXBwb3J0IGZvciBzZXJ2bGV0cyBpcwotICAgICAqIGVuYWJsZWQgcHVibGljIHZvaWQgdGVzdFZhaWxkMTJBbm5vdGF0ZWRXZWJQcm9qZWN0TmFtZUNyZWF0aW9uKCkgdGhyb3dzCi0gICAgICogRXhjZXB0aW9uIHsgUHJvamVjdFV0aWxpdHkuZGVsZXRlQWxsUHJvamVjdHMoKTsKLSAgICAgKiBjcmVhdGVWYWlsZEFubm90YXRlZFByb2plY3RBbmRTZXJ2bGV0Q3JlYXRpb24oIkZvb0Fubm90YXRlZFRvbWNhdFdlYlByb2plY3QxMiIsCi0gICAgICogSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfMl9JRCk7IH0KLSAgICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWlsZDEzV2ViUHJvamVjdE5hbWVDcmVhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBQcm9qZWN0VXRpbGl0eS5kZWxldGVBbGxQcm9qZWN0cygpOwotICAgICAgICBjcmVhdGVWYWlsZFByb2plY3RBbmRTZXJ2bGV0Q3JlYXRpb24oIkZvbzFUb21jYXRXZWJQcm9qZWN0MTMiLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl8zX0lEKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIC8qCi0gICAgICogVE9ETyBVbmNvbW1lbnQgdGhpcyBtZXRob2Qgd2hlbiBBbm5vdGF0aW9uIHN1cHBvcnQgZm9yIHNlcnZsZXRzIGlzCi0gICAgICogZW5hYmxlZCBwdWJsaWMgdm9pZCB0ZXN0VmFpbGQxM0Fubm90YXRlZFdlYlByb2plY3ROYW1lQ3JlYXRpb24oKSB0aHJvd3MKLSAgICAgKiBFeGNlcHRpb24geyBQcm9qZWN0VXRpbGl0eS5kZWxldGVBbGxQcm9qZWN0cygpOwotICAgICAqIGNyZWF0ZVZhaWxkQW5ub3RhdGVkUHJvamVjdEFuZFNlcnZsZXRDcmVhdGlvbigiRm9vMVRvbWNhdFdlYlByb2plY3QxMyIsCi0gICAgICogSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfM19JRCk7IH0KLSAgICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWlsZDE0V2ViUHJvamVjdE5hbWVDcmVhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBQcm9qZWN0VXRpbGl0eS5kZWxldGVBbGxQcm9qZWN0cygpOwotICAgICAgICBjcmVhdGVWYWlsZFByb2plY3RBbmRTZXJ2bGV0Q3JlYXRpb24oIkZvbzFUb21jYXRXZWJQcm9qZWN0MTQiLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl80X0lEKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIC8qCi0gICAgICogVE9ETyBVbmNvbW1lbnQgdGhpcyBtZXRob2Qgd2hlbiBBbm5vdGF0aW9uIHN1cHBvcnQgZm9yIHNlcnZsZXRzIGlzCi0gICAgICogZW5hYmxlZCBwdWJsaWMgdm9pZCB0ZXN0VmFpbGQxNEFubm90YXRlZFdlYlByb2plY3ROYW1lQ3JlYXRpb24oKSB0aHJvd3MKLSAgICAgKiBFeGNlcHRpb24geyBQcm9qZWN0VXRpbGl0eS5kZWxldGVBbGxQcm9qZWN0cygpOwotICAgICAqIGNyZWF0ZVZhaWxkQW5ub3RhdGVkUHJvamVjdEFuZFNlcnZsZXRDcmVhdGlvbigiRm9vMVRvbWNhdFdlYlByb2plY3QxNCIsCi0gICAgICogSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfNF9JRCk7IH0KLSAgICAgKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVUZXN0U3VpdGUoV2ViUHJvamVjdENyZWF0aW9uVG9tY2F0VGVzdC5jbGFzcyk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5qMmVlLm9wZXJhdGlvbnMuTW9kdWxlUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uVGVzdCNnZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWwoKQotICAgICAqLwotICAgIHB1YmxpYyBJRGF0YU1vZGVsIGdldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbCgpIHsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS8uY2xhc3NwYXRoIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1NjIxNzIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJwcm9wZXJ0aWVzVmFsaWRhdG9yLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InByb3BlcnRpZXNWYWxGUy8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJwcm9wZXJ0aWVzVmFsV0IvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZmlsZXN5c3RlbUZXSy8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlLy5jdnNpZ25vcmUgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTEyZjAyMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotYmluCi1idWlsZC54bWwKLXJ1bnRpbWUKLXRlbXAuZm9sZGVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvLnByb2plY3QgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5MGI0NzcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9hYm91dC5odG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYzU5ODkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMiwgMjAwNjwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvYnVpbGQucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjdmODBlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotc291cmNlLnJ1bnRpbWUvcHJvcGVydGllc1ZhbGlkYXRvci5qYXIgPSBwcm9wZXJ0aWVzVmFsaWRhdG9yLyxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXNWYWxGUy8sXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzVmFsV0IvLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXN5c3RlbUZXSy8KLWJpbi5pbmNsdWRlcyA9IHJ1bnRpbWUvcHJvcGVydGllc1ZhbGlkYXRvci5qYXIsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBmaWxlc3lzdGVtLmJhdCxcCi0gICAgICAgICAgICAgICBwcm9wLmJhdCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1qYXJzLmNvbXBpbGUub3JkZXIgPSBydW50aW1lL3Byb3BlcnRpZXNWYWxpZGF0b3IuamFyCi1vdXRwdXQucnVudGltZS9wcm9wZXJ0aWVzVmFsaWRhdG9yLmphciA9IGJpbi8KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9maWxlc3lzdGVtLmJhdCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9maWxlc3lzdGVtLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRjODVhOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvZmlsZXN5c3RlbS5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTSAKLVJFTSAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAyLCAyMDAzIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCi1SRU0gVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSAKLVJFTSByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4gCi1SRU0gCi1SRU0gRElTQ0xBSU1FUiBPRiBXQVJSQU5USUVTLgotUkVNIFRoZSBmb2xsb3dpbmcgW2VuY2xvc2VkXSBjb2RlIGlzIHNhbXBsZSBjb2RlIGNyZWF0ZWQgYnkgSUJNCi1SRU0gQ29ycG9yYXRpb24uIFRoaXMgc2FtcGxlIGNvZGUgaXMgbm90IHBhcnQgb2YgYW55IHN0YW5kYXJkIG9yIElCTQotUkVNIHByb2R1Y3QgYW5kIGlzIHByb3ZpZGVkIHRvIHlvdSBzb2xlbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGFzc2lzdGluZwotUkVNIHlvdSBpbiB0aGUgZGV2ZWxvcG1lbnQgb2YgeW91ciBhcHBsaWNhdGlvbnMuICBUaGUgY29kZSBpcyBwcm92aWRlZAotUkVNICJBUyBJUyIuIElCTSBNQUtFUyBOTyBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQKLVJFTSBOT1QgTElNSVRFRCBUTyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwotUkVNIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgUkVHQVJESU5HIFRIRSBGVU5DVElPTiBPUiBQRVJGT1JNQU5DRSBPRgotUkVNIFRISVMgQ09ERS4gIFRISVMgQ09ERSBNQVkgQ09OVEFJTiBFUlJPUlMuICBJQk0gc2hhbGwgbm90IGJlIGxpYWJsZQotUkVNIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIG91dCBvZiB5b3VyIHVzZSBvZiB0aGUgc2FtcGxlIGNvZGUsIGV2ZW4KLVJFTSBpZiBpdCBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi1SRU0gCi1SRU0gVGhpcyBiYXRjaCBmaWxlIHJ1bnMgdGhlICJmaWxlc3lzdGVtIGZyYW1ld29yayIncyBhcHBsaWNhdGlvbgotUkVNCi1zZXRsb2NhbAotCi1pZiAiJUpBVkFfSE9NRSUiIEVRVSAiIiBnb3RvIHN5bnRheAotCi1zZXQgQ0xBU1NQQVRIPSVDTEFTU1BBVEglOy4uXGNvbS5pYm0uZXRvb2xzLmxvZ2dpbmcudXRpbF81LjEuMFxydW50aW1lXGxvZ3V0aWwuamFyCi1zZXQgQ0xBU1NQQVRIPSVDTEFTU1BBVEglOy4uXGNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24uY29yZV81LjEuMFxydW50aW1lXGNvbW1vbi5qYXIKLXNldCBDTEFTU1BBVEg9JUNMQVNTUEFUSCU7LlxydW50aW1lXHByb3BlcnRpZXNWYWxpZGF0b3IuamFyCi1zZXQgQ0xBU1NQQVRIPSVDTEFTU1BBVEglOy5ccnVudGltZVxmaWxlc3lzdGVtRldLLmphcgotc2V0IENMQVNTUEFUSD0lQ0xBU1NQQVRIJTsuXHJ1bnRpbWVccHJvcGVydGllc1ZhbFdCLmphcgotc2V0IENMQVNTUEFUSD0lQ0xBU1NQQVRIJTsuXHJ1bnRpbWVccHJvcGVydGllc1ZhbEZTLmphcgotCi0lSkFWQV9IT01FJVxiaW5camF2YSBjb20uaWJtLmV0b29scy52YWxpZGF0aW9uLmZpbGVzeXN0ZW0uRmlsZXN5c3RlbUFwcGxpY2F0aW9uICUxCi1nb3RvIDplbmQKLQotOnN5bnRheAotZWNoby4KLWVjaG8gVGhlIEpBVkFfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBtdXN0IGJlIHNldCB0byB0aGUgSlJFIGRpcmVjdG9yeS4KLWVjaG8gZS5nLiwgc2V0IEpBVkFfSE9NRT1DOlxKUkUKLWVjaG8gd2hlcmUgSlJFIGhhcyBhIHN1YmRpcmVjdG9yeSBuYW1lZCAiYmluIgotZWNoby4KLWVjaG8uCi1nb3RvIDplbmQKLQotOmVuZAotZW5kbG9jYWwKLUBlY2hvIG9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL2ZpbGVzeXN0ZW1GV0svZmlsZXN5c3RlbS5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL2ZpbGVzeXN0ZW1GV0svZmlsZXN5c3RlbS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzI4MzQ5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9maWxlc3lzdGVtRldLL2ZpbGVzeXN0ZW0ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMKLSMgTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0gCi0jIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDIsIDIwMDMgLSBBbGwgUmlnaHRzIFJlc2VydmVkLiAKLSMgVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSAKLSMgcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuIAotIwotIyAgRElTQ0xBSU1FUiBPRiBXQVJSQU5USUVTLgotIyAgVGhlIGZvbGxvd2luZyBbZW5jbG9zZWRdIGNvZGUgaXMgc2FtcGxlIGNvZGUgY3JlYXRlZCBieSBJQk0KLSMgIENvcnBvcmF0aW9uLiBUaGlzIHNhbXBsZSBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFueSBzdGFuZGFyZCBvciBJQk0KLSMgIHByb2R1Y3QgYW5kIGlzIHByb3ZpZGVkIHRvIHlvdSBzb2xlbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGFzc2lzdGluZwotIyAgeW91IGluIHRoZSBkZXZlbG9wbWVudCBvZiB5b3VyIGFwcGxpY2F0aW9ucy4gIFRoZSBjb2RlIGlzIHByb3ZpZGVkCi0jICAiQVMgSVMiLiBJQk0gTUFLRVMgTk8gV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUCi0jICBOT1QgTElNSVRFRCBUTyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwotIyAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBSRUdBUkRJTkcgVEhFIEZVTkNUSU9OIE9SIFBFUkZPUk1BTkNFIE9GCi0jICBUSElTIENPREUuICBUSElTIENPREUgTUFZIENPTlRBSU4gRVJST1JTLiAgSUJNIHNoYWxsIG5vdCBiZSBsaWFibGUKLSMgIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIG91dCBvZiB5b3VyIHVzZSBvZiB0aGUgc2FtcGxlIGNvZGUsIGV2ZW4KLSMgIGlmIGl0IGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLSMKLQotIyBWRkZTID0gVmFsaWRhdGlvbiBGcmFtZXdvcmsgRmlsZSBTeXN0ZW0gCi1WRkZTMDAwMCA9IFZGRlMwMDAwRTogSW50ZXJuYWwgZXJyb3IgY2F1c2VkIHByZW1hdHVyZSB0ZXJtaW5hdGlvbiBvZiB2YWxpZGF0b3IgezB9LiBTZWUgdGhlIHN0YWNrIHRyYWNlIGJlbG93LgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9maWxlc3lzdGVtRldLL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9maWxlc3lzdGVtL0ZpbGVzeXN0ZW1BcHBsaWNhdGlvbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL2ZpbGVzeXN0ZW1GV0svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL2ZpbGVzeXN0ZW0vRmlsZXN5c3RlbUFwcGxpY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMDA3MzIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL2ZpbGVzeXN0ZW1GV0svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL2ZpbGVzeXN0ZW0vRmlsZXN5c3RlbUFwcGxpY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS5maWxlc3lzdGVtOwotLyoKLSAqIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNIAotICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMiwgMjAwMyAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAotICogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSAKLSAqIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLiAKLSAqCi0gKiBESVNDTEFJTUVSIE9GIFdBUlJBTlRJRVMuCi0gKiBUaGUgZm9sbG93aW5nIFtlbmNsb3NlZF0gY29kZSBpcyBzYW1wbGUgY29kZSBjcmVhdGVkIGJ5IElCTQotICogQ29ycG9yYXRpb24uIFRoaXMgc2FtcGxlIGNvZGUgaXMgbm90IHBhcnQgb2YgYW55IHN0YW5kYXJkIG9yIElCTQotICogcHJvZHVjdCBhbmQgaXMgcHJvdmlkZWQgdG8geW91IHNvbGVseSBmb3IgdGhlIHB1cnBvc2Ugb2YgYXNzaXN0aW5nCi0gKiB5b3UgaW4gdGhlIGRldmVsb3BtZW50IG9mIHlvdXIgYXBwbGljYXRpb25zLiAgVGhlIGNvZGUgaXMgcHJvdmlkZWQKLSAqICJBUyBJUyIuIElCTSBNQUtFUyBOTyBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCi0gKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIFJFR0FSRElORyBUSEUgRlVOQ1RJT04gT1IgUEVSRk9STUFOQ0UgT0YKLSAqIFRISVMgQ09ERS4gIFRISVMgQ09ERSBNQVkgQ09OVEFJTiBFUlJPUlMuICBJQk0gc2hhbGwgbm90IGJlIGxpYWJsZQotICogZm9yIGFueSBkYW1hZ2VzIGFyaXNpbmcgb3V0IG9mIHlvdXIgdXNlIG9mIHRoZSBzYW1wbGUgY29kZSwgZXZlbgotICogaWYgaXQgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotICogCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5JRmlsZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0b3JMYXVuY2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdGhlIHJlcHJlc2VudGF0aW9uIG9mIGEgZmlsZSBzeXN0ZW0gYmFzZWQgYXBwbGljYXRpb24KLSAqIHdoaWNoIG5lZWRzIHRvIHVzZSB0aGUgY29tbW9uIHZhbGlkYXRpb24gQVBJcy4KLSAqLwotcHVibGljIGNsYXNzIEZpbGVzeXN0ZW1BcHBsaWNhdGlvbiB7Ci0JLyoqCi0JICogVGhlIGFyZ3ZbXSBwYXJhbWV0ZXIgbmVlZHMgdG8gYmUgYSBmdWxseS1xdWFsaWZpZWQgbGlzdCBvZiBmaWxlIG5hbWVzIAotCSAqIG9mIGZpbGVzIHRoYXQgc2hvdWxkIGJlIHZhbGlkYXRlZC4gCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3ZbXSkgewotCQlJRmlsZURlbHRhW10gZmlsZXMgPSBGaWxlc3lzdGVtTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0RmlsZURlbHRhcyhhcmd2KTsKLQkJYm9vbGVhbiBmdWxsQnVpbGQgPSAoKGZpbGVzID09IG51bGwpIHx8IChmaWxlcy5sZW5ndGggPT0gMCkpOwotCi0JCUlSZXBvcnRlciByZXBvcnRlciA9IG51bGw7Ci0JCWlmIChmdWxsQnVpbGQpIHsKLQkJCXJlcG9ydGVyID0gbmV3IEZ1bGxSZXBvcnRlcigpOwotCQl9Ci0JCWVsc2UgewotCQkJcmVwb3J0ZXIgPSBuZXcgSW5jcmVtZW50YWxSZXBvcnRlcigpOwotCQl9Ci0KLQkJRmlsZXN5c3RlbUxvYWRlciBsb2FkZXJzW10gPSBGaWxlc3lzdGVtTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0TG9hZGVycyhmaWxlcyk7Ci0JCWZvciAoaW50IGk9MDsgaTxsb2FkZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlGaWxlc3lzdGVtTG9hZGVyIGxvYWRlciA9IGxvYWRlcnNbaV07Ci0JCQl0cnkgewotCQkJCVZhbGlkYXRvckxhdW5jaGVyLmdldExhdW5jaGVyKCkuc3RhcnQobG9hZGVyLmdldEhlbHBlcigpLCBsb2FkZXIuZ2V0VmFsaWRhdG9yKCksIHJlcG9ydGVyKTsKLQkJCQlpZiAoIWZ1bGxCdWlsZCkgewotCQkJCQkoKEluY3JlbWVudGFsUmVwb3J0ZXIpcmVwb3J0ZXIpLnJlcG9ydCgpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChWYWxpZGF0aW9uRXhjZXB0aW9uIGV4YykgewotCQkJCU1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBNZXNzYWdlKCJmaWxlc3lzdGVtIiwgSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwgIlZGRlMwMDAwIiwgbmV3IFN0cmluZ1tde2xvYWRlci5nZXRWYWxpZGF0b3IoKS5nZXRDbGFzcygpLmdldE5hbWUoKX0pOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCQkJcmVwb3J0ZXIuZGlzcGxheVN1YnRhc2sobG9hZGVyLmdldFZhbGlkYXRvcigpLCBtZXNzYWdlKTsKLQkJCQkKLQkJCQlpZihleGMuZ2V0QXNzb2NpYXRlZE1lc3NhZ2UoKSAhPSBudWxsKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihleGMuZ2V0QXNzb2NpYXRlZE1lc3NhZ2UoKSk7Ci0JCQkJfQotCQkJCQotCQkJCWV4Yy5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQlpZihleGMuZ2V0QXNzb2NpYXRlZEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCQkJZXhjLmdldEFzc29jaWF0ZWRFeGNlcHRpb24oKS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQkJLy8gY29udGludWUgd2l0aCB0aGUgbmV4dCB2YWxpZGF0aW9uCi0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGV4YykgewotCQkJCU1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBNZXNzYWdlKCJmaWxlc3lzdGVtIiwgSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwgIlZGRlMwMDAwIiwgbmV3IFN0cmluZ1tde2xvYWRlci5nZXRWYWxpZGF0b3IoKS5nZXRDbGFzcygpLmdldE5hbWUoKX0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlyZXBvcnRlci5kaXNwbGF5U3VidGFzayhsb2FkZXIuZ2V0VmFsaWRhdG9yKCksIG1lc3NhZ2UpOwotCQkJCS8vIGNvbnRpbnVlIHdpdGggdGhlIG5leHQgdmFsaWRhdGlvbgotCQkJCWV4Yy5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9maWxlc3lzdGVtRldLL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9maWxlc3lzdGVtL0ZpbGVzeXN0ZW1Mb2FkZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9maWxlc3lzdGVtRldLL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9maWxlc3lzdGVtL0ZpbGVzeXN0ZW1Mb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI0NGZjNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvZmlsZXN5c3RlbUZXSy9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvZmlsZXN5c3RlbS9GaWxlc3lzdGVtTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS5maWxlc3lzdGVtOwotLyoKLSAqIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNIAotICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMiwgMjAwMyAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAotICogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSAKLSAqIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLiAKLSAqCi0gKiBESVNDTEFJTUVSIE9GIFdBUlJBTlRJRVMuCi0gKiBUaGUgZm9sbG93aW5nIFtlbmNsb3NlZF0gY29kZSBpcyBzYW1wbGUgY29kZSBjcmVhdGVkIGJ5IElCTQotICogQ29ycG9yYXRpb24uIFRoaXMgc2FtcGxlIGNvZGUgaXMgbm90IHBhcnQgb2YgYW55IHN0YW5kYXJkIG9yIElCTQotICogcHJvZHVjdCBhbmQgaXMgcHJvdmlkZWQgdG8geW91IHNvbGVseSBmb3IgdGhlIHB1cnBvc2Ugb2YgYXNzaXN0aW5nCi0gKiB5b3UgaW4gdGhlIGRldmVsb3BtZW50IG9mIHlvdXIgYXBwbGljYXRpb25zLiAgVGhlIGNvZGUgaXMgcHJvdmlkZWQKLSAqICJBUyBJUyIuIElCTSBNQUtFUyBOTyBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCi0gKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIFJFR0FSRElORyBUSEUgRlVOQ1RJT04gT1IgUEVSRk9STUFOQ0UgT0YKLSAqIFRISVMgQ09ERS4gIFRISVMgQ09ERSBNQVkgQ09OVEFJTiBFUlJPUlMuICBJQk0gc2hhbGwgbm90IGJlIGxpYWJsZQotICogZm9yIGFueSBkYW1hZ2VzIGFyaXNpbmcgb3V0IG9mIHlvdXIgdXNlIG9mIHRoZSBzYW1wbGUgY29kZSwgZXZlbgotICogaWYgaXQgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotICogCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGFzc29jaWF0ZXMgYSBWYWxpZGF0b3Igd2l0aCBhIEhlbHBlciBhbmQgdGhlIGZpbGUgZXh0ZW5zaW9ucyB0aGF0Ci0gKiB0aGUgdmFsaWRhdG9yIHJ1bnMgb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlc3lzdGVtTG9hZGVyIHsKLQlwcml2YXRlIElGaWxlc3lzdGVtSGVscGVyIF9oZWxwZXIgPSBudWxsOwotCXByaXZhdGUgSVZhbGlkYXRvciBfdmFsaWRhdG9yID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZ1tdIF9maWxlRXh0ZW5zaW9ucyA9IG51bGw7Ci0JCi0JcHVibGljIEZpbGVzeXN0ZW1Mb2FkZXIoU3RyaW5nW10gZmlsZUV4dGVuc2lvbnMsIElGaWxlc3lzdGVtSGVscGVyIGhlbHBlciwgSVZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQkJc3VwZXIoKTsKLQotCQlfZmlsZUV4dGVuc2lvbnMgPSBmaWxlRXh0ZW5zaW9uczsKLQkJX2hlbHBlciA9IGhlbHBlcjsKLQkJX3ZhbGlkYXRvciA9IHZhbGlkYXRvcjsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBoZWxwZXIgdGhhdCB0aGUgdmFsaWRhdG9yIG5lZWRzIHRvIGFjY2VzcyBpbmZvcm1hdGlvbiAKLQkgKiBpbiB0aGUgZmlsZXN5c3RlbSB2YWxpZGF0aW9uIGZyYW1ld29yay4KLQkgKi8KLQlwdWJsaWMgSUZpbGVzeXN0ZW1IZWxwZXIgZ2V0SGVscGVyKCkgewotCQlyZXR1cm4gX2hlbHBlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHZhbGlkYXRvciB0aGF0IGNoZWNrcyB0aGUgcnVsZXMuCi0JICovCi0JcHVibGljIElWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gX3ZhbGlkYXRvcjsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBvZiBmaWxlIG5hbWUgZXh0ZW5zaW9ucyB0aGF0IHRoaXMgdmFsaWRhdG9yIHZhbGlkYXRlcy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0RmlsZUV4dGVuc2lvbnMoKSB7Ci0JCXJldHVybiBfZmlsZUV4dGVuc2lvbnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL2ZpbGVzeXN0ZW1GV0svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL2ZpbGVzeXN0ZW0vRmlsZXN5c3RlbU1hbmFnZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9maWxlc3lzdGVtRldLL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9maWxlc3lzdGVtL0ZpbGVzeXN0ZW1NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZDM4M2EuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL2ZpbGVzeXN0ZW1GV0svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL2ZpbGVzeXN0ZW0vRmlsZXN5c3RlbU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS5maWxlc3lzdGVtOwotLyoKLSAqIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNIAotICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMiwgMjAwMyAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAotICogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSAKLSAqIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLiAKLSAqCi0gKiBESVNDTEFJTUVSIE9GIFdBUlJBTlRJRVMuCi0gKiBUaGUgZm9sbG93aW5nIFtlbmNsb3NlZF0gY29kZSBpcyBzYW1wbGUgY29kZSBjcmVhdGVkIGJ5IElCTQotICogQ29ycG9yYXRpb24uIFRoaXMgc2FtcGxlIGNvZGUgaXMgbm90IHBhcnQgb2YgYW55IHN0YW5kYXJkIG9yIElCTQotICogcHJvZHVjdCBhbmQgaXMgcHJvdmlkZWQgdG8geW91IHNvbGVseSBmb3IgdGhlIHB1cnBvc2Ugb2YgYXNzaXN0aW5nCi0gKiB5b3UgaW4gdGhlIGRldmVsb3BtZW50IG9mIHlvdXIgYXBwbGljYXRpb25zLiAgVGhlIGNvZGUgaXMgcHJvdmlkZWQKLSAqICJBUyBJUyIuIElCTSBNQUtFUyBOTyBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCi0gKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIFJFR0FSRElORyBUSEUgRlVOQ1RJT04gT1IgUEVSRk9STUFOQ0UgT0YKLSAqIFRISVMgQ09ERS4gIFRISVMgQ09ERSBNQVkgQ09OVEFJTiBFUlJPUlMuICBJQk0gc2hhbGwgbm90IGJlIGxpYWJsZQotICogZm9yIGFueSBkYW1hZ2VzIGFyaXNpbmcgb3V0IG9mIHlvdXIgdXNlIG9mIHRoZSBzYW1wbGUgY29kZSwgZXZlbgotICogaWYgaXQgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotICogCi0gKi8KLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLkZpbGVEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLklGaWxlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdGhlIGhlYXJ0IG9mIHRoZSBmaWxlc3lzdGVtIHZhbGlkYXRpb24gZnJhbWV3b3JrLgotICogSXQgJnF1b3Q7bG9hZHMmcXVvdDsgZWFjaCB2YWxpZGF0b3IncyBtZXRhZGF0YQotICovCi1wdWJsaWMgY2xhc3MgRmlsZXN5c3RlbU1hbmFnZXIgewotCXByaXZhdGUgc3RhdGljIEZpbGVzeXN0ZW1NYW5hZ2VyIF9pbnN0ID0gbnVsbDsKLQlwcml2YXRlIFNldCBfbG9hZGVycyA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBGaWxlc3lzdGVtTWFuYWdlcigpIHsKLQkJX2xvYWRlcnMgPSBuZXcgSGFzaFNldCgpOwotCQkKLQkJLy8gUGxlYXNlIHByZXRlbmQgdGhhdCB0aGlzIG1ldGFkYXRhLCBpLmUuLCB0aGUgZmlsZSBleHRlbnNpb24sIGZ1bGx5LXF1YWxpZmllZAotCQkvLyBjbGFzcyBuYW1lIG9mIHRoZSBoZWxwZXIsIGFuZCBmdWxseS1xdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgdmFsaWRhdG9yLCAKLQkJLy8gd2FzIGxvYWRlZCBnZW5lcmljYWxseSBzb21laG93LiBJbiBwcmFjdGljZSwgdGhpcyBpbmZvcm1hdGlvbiBjb3VsZCBiZSBzdG9yZWQKLQkJLy8gaW4gLnhtbCBmaWxlcywgaW4gYSBjb25maWd1cmF0aW9uIGZpbGUsIGV0Yy4sIHRoYXQgdGhlIGZyYW1ld29yayB3b3VsZCByZWFkCi0JCS8vIHRvIGZpbmQgdGhlIGluc3RhbGxlZCB2YWxpZGF0b3JzLgotCQl0cnkgewotCQkJX2xvYWRlcnMuYWRkKG5ldyBGaWxlc3lzdGVtTG9hZGVyKG5ldyBTdHJpbmdbXXsiLnByb3BlcnRpZXMifSwgbG9hZEhlbHBlcigib3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlLmZpbGVzeXN0ZW1pbXBsLkZpbGVzeXN0ZW1Qcm9wZXJ0aWVzSGVscGVyIiksIGxvYWRWYWxpZGF0b3IoIm9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS5Qcm9wZXJ0aWVzVmFsaWRhdG9yIikpKTsgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQkJY2F0Y2goSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4YykgewotCQkJZXhjLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCWNhdGNoKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZXhjKSB7Ci0JCQlleGMucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJY2F0Y2goSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleGMpIHsKLQkJCWV4Yy5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQljYXRjaChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGV4YykgewotCQkJZXhjLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEdpdmVuIGEgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgYSBoZWxwZXIsIHJldHVybiBhbiBpbnN0YW5jZSBvZiBpdC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJRmlsZXN5c3RlbUhlbHBlciBsb2FkSGVscGVyKFN0cmluZyBjbGFzc05hbWUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24gIHsKLQkJcmV0dXJuIChJRmlsZXN5c3RlbUhlbHBlcilsb2FkQ2xhc3MoY2xhc3NOYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogR2l2ZW4gYSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiBhIHZhbGlkYXRvciwgcmV0dXJuIGFuIGluc3RhbmNlIG9mIGl0LgotCSAqLwotCXByaXZhdGUgc3RhdGljIElWYWxpZGF0b3IgbG9hZFZhbGlkYXRvcihTdHJpbmcgY2xhc3NOYW1lKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uICB7Ci0JCXJldHVybiAoSVZhbGlkYXRvcilsb2FkQ2xhc3MoY2xhc3NOYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcyBpZGVudGlmaWVkIGJ5IHRoZSBjbGFzc05hbWUgcGFyYW1ldGVyLAotCSAqIHdoaWNoIGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY2xhc3MuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGxvYWRDbGFzcyhTdHJpbmcgY2xhc3NOYW1lKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKLQkJaWYoY2xhc3NOYW1lID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImxvYWRDbGFzcyBhcmd1bWVudCBtdXN0IG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJQ2xhc3MgY2xhenogPSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7Ci0JCXJldHVybiBjbGF6ei5uZXdJbnN0YW5jZSgpOwkJCi0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgRmlsZXN5c3RlbU1hbmFnZXIgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZXN5c3RlbU1hbmFnZXIgZ2V0TWFuYWdlcigpIHsKLQkJaWYoX2luc3QgPT0gbnVsbCkgewotCQkJX2luc3QgPSBuZXcgRmlsZXN5c3RlbU1hbmFnZXIoKTsKLQkJfQotCQlyZXR1cm4gX2luc3Q7Ci0JfQotCi0JLyoqCi0JICogR2l2ZW4gYW4gYXJyYXkgb2YgZmlsZSBuYW1lcywgcmV0dXJuIGFuIGFycmF5IG9mIElGaWxlRGVsdGEKLQkgKiBpbnN0YW5jZXMgdG8gcGFzcyB0byB0aGUgdmFsaWRhdG9yIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBJRmlsZURlbHRhW10gZ2V0RmlsZURlbHRhcyhTdHJpbmdbXSBmaWxlTmFtZXMpIHsKLQkJaWYoKGZpbGVOYW1lcyA9PSBudWxsKSB8fCAoZmlsZU5hbWVzLmxlbmd0aCA9PSAwKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCUZpbGVEZWx0YVtdIGZpbGVzID0gbmV3IEZpbGVEZWx0YVtmaWxlTmFtZXMubGVuZ3RoXTsKLQkJZm9yKGludCBpPTA7IGk8ZmlsZU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlmaWxlc1tpXSA9IG5ldyBGaWxlRGVsdGEoZmlsZU5hbWVzW2ldLCBJRmlsZURlbHRhLkNIQU5HRUQpOwotCQl9Ci0JCXJldHVybiBmaWxlczsKLQl9Ci0JCi0JLyoqCi0JICogR2l2ZW4gYW4gYXJyYXkgb2YgSUZpbGVEZWx0YSBpbnN0YW5jZXMsIHJldHVybiBhbiBhcnJheQotCSAqIG9mIHRoZSBJVmFsaWRhdG9yIGluc3RhbmNlcywgd2l0aCB0aGVpciBhc3NvY2lhdGVkIElWYWxpZGF0aW9uQ29udGV4dCBpbnN0YW5jZXMsCi0JICogdGhhdCB2YWxpZGF0ZSB0aGVzZSBwYXJ0aWN1bGFyIGRlbHRhIGluc3RhbmNlcy4KLQkgKi8KLQlwdWJsaWMgRmlsZXN5c3RlbUxvYWRlcltdIGdldExvYWRlcnMoSUZpbGVEZWx0YVtdIGRlbHRhcykgewotCQlpZihkZWx0YXMgPT0gbnVsbCkgewotCQkJcmV0dXJuIGdldEFsbExvYWRlcnMoKTsKLQkJfQotCi0JCVNldCBsb2FkZXJzID0gbmV3IEhhc2hTZXQoKTsJCQotCQlmb3IoaW50IGk9MDsgaTxkZWx0YXMubGVuZ3RoOyBpKyspIHsKLQkJCUZpbGVzeXN0ZW1Mb2FkZXJbXSBsb2FkZXJBcnJheSA9IGdldExvYWRlcnNGb3IoZGVsdGFzW2ldKTsKLQkJCWlmKGxvYWRlckFycmF5ICE9IG51bGwpIHsKLQkJCQlmb3IoaW50IGo9MDsgajxsb2FkZXJBcnJheS5sZW5ndGg7IGorKykgewotCQkJCQlsb2FkZXJzLmFkZChsb2FkZXJBcnJheVtqXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlGaWxlc3lzdGVtTG9hZGVyW10gcmVzdWx0ID0gbmV3IEZpbGVzeXN0ZW1Mb2FkZXJbbG9hZGVycy5zaXplKCldOwotCQlsb2FkZXJzLnRvQXJyYXkocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JLyoqCi0JICogR2l2ZW4gYW4gSVZhbGlkYXRvciBpbnN0YW5jZSwgcmV0dXJuIHRoZSBJVmFsaWRhdGlvbkNvbnRleHQgaW5zdGFuY2UgdGhhdCB0aGUKLQkgKiBJVmFsaWRhdG9yIHVzZXMgdG8gbG9hZCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBmaWxlc3lzdGVtIHZhbGlkYXRpb24KLQkgKiBmcmFtZXdvcmsgZW52aXJvbm1lbnQuCi0JICovCi0JcHVibGljIElGaWxlc3lzdGVtSGVscGVyIGdldEhlbHBlcihJVmFsaWRhdG9yIHZhbGlkYXRvcikgewotCQlpZih2YWxpZGF0b3IgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gX2xvYWRlcnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlGaWxlc3lzdGVtTG9hZGVyIGxvYWRlciA9IChGaWxlc3lzdGVtTG9hZGVyKWl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmKHZhbGlkYXRvci5lcXVhbHMobG9hZGVyLmdldFZhbGlkYXRvcigpKSkgewotCQkJCXJldHVybiBsb2FkZXIuZ2V0SGVscGVyKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBHaXZlbiB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHZhbGlkYXRvciwgcmV0dXJuIHRoZSBJVmFsaWRhdG9yIGluc3RhbmNlLgotCSAqIG51bGwgd2lsbCBiZSByZXR1cm5lZCBpZiB0aGUgSVZhbGlkYXRvciBjYW5ub3QgYmUgZm91bmQuCi0JICovCi0JcHVibGljIElWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKFN0cmluZyB2YWxpZGF0b3JDbGFzc05hbWUpIHsKLQkJaWYodmFsaWRhdG9yQ2xhc3NOYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlJdGVyYXRvciBpdGVyYXRvciA9IF9sb2FkZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJRmlsZXN5c3RlbUxvYWRlciBsb2FkZXIgPSAoRmlsZXN5c3RlbUxvYWRlcilpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZih2YWxpZGF0b3JDbGFzc05hbWUuZXF1YWxzKGxvYWRlci5nZXRWYWxpZGF0b3IoKS5nZXRDbGFzcygpLmdldE5hbWUoKSkpIHsKLQkJCQlyZXR1cm4gbG9hZGVyLmdldFZhbGlkYXRvcigpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IG9mIGFsbCBGaWxlc3lzdGVtTG9hZGVyIGluc3RhbmNlcy4gRWFjaCBsb2FkZXIgaGFzCi0JICogb25lIElWYWxpZGF0b3IgYW5kIG9uZSBJVmFsaWRhdGlvbkNvbnRleHQuCi0JICovCi0JcHVibGljIEZpbGVzeXN0ZW1Mb2FkZXJbXSBnZXRBbGxMb2FkZXJzKCkgewotCQlGaWxlc3lzdGVtTG9hZGVyW10gcmVzdWx0ID0gbmV3IEZpbGVzeXN0ZW1Mb2FkZXJbX2xvYWRlcnMuc2l6ZSgpXTsKLQkJX2xvYWRlcnMudG9BcnJheShyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEdpdmVuIGEgZmlsZSBuYW1lLCByZXR1cm4gdGhlIGxvYWRlciB3aGljaCBjb250YWlucyB0aGUgdmFsaWRhdG9yICYgaGVscGVyCi0JICogd2hpY2ggY2FuIHZhbGlkYXRlIHRoYXQgZmlsZSwgaWYgb25lIGV4aXN0cy4KLQkgKi8KLQlwdWJsaWMgRmlsZXN5c3RlbUxvYWRlcltdIGdldExvYWRlcnNGb3IoSUZpbGVEZWx0YSBkZWx0YSkgewotCQlJdGVyYXRvciBpdGVyYXRvciA9IF9sb2FkZXJzLml0ZXJhdG9yKCk7Ci0JCUZpbGVzeXN0ZW1Mb2FkZXJbXSB0ZW1wTG9hZGVycyA9IG5ldyBGaWxlc3lzdGVtTG9hZGVyW19sb2FkZXJzLnNpemUoKV07Ci0JCWludCBjb3VudCA9IDA7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJRmlsZXN5c3RlbUxvYWRlciBsb2FkZXIgPSAoRmlsZXN5c3RlbUxvYWRlcilpdGVyYXRvci5uZXh0KCk7Ci0JCQlTdHJpbmdbXSBmaWxlRXh0ZW5zaW9ucyA9IGxvYWRlci5nZXRGaWxlRXh0ZW5zaW9ucygpOwotCQkJaWYoZmlsZUV4dGVuc2lvbnMgPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlmb3IoaW50IGk9MDsgaTxmaWxlRXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWlmKGRlbHRhLmdldEZpbGVOYW1lKCkuZW5kc1dpdGgoZmlsZUV4dGVuc2lvbnNbaV0pICYmIChkZWx0YS5nZXREZWx0YVR5cGUoKSA9PSBJRmlsZURlbHRhLkFEREVEIHx8IGRlbHRhLmdldERlbHRhVHlwZSgpID09IElGaWxlRGVsdGEuQ0hBTkdFRCB8fCBkZWx0YS5nZXREZWx0YVR5cGUoKSA9PSBJRmlsZURlbHRhLkRFTEVURUQpKSB7Ci0JCQkJCXRlbXBMb2FkZXJzW2NvdW50KytdID0gbG9hZGVyOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJRmlsZXN5c3RlbUxvYWRlcltdIHJlc3VsdCA9IG5ldyBGaWxlc3lzdGVtTG9hZGVyW2NvdW50XTsKLQkJU3lzdGVtLmFycmF5Y29weSh0ZW1wTG9hZGVycywgMCwgcmVzdWx0LCAwLCBjb3VudCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvZmlsZXN5c3RlbUZXSy9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvZmlsZXN5c3RlbS9GdWxsUmVwb3J0ZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9maWxlc3lzdGVtRldLL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9maWxlc3lzdGVtL0Z1bGxSZXBvcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTU5YjJhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9maWxlc3lzdGVtRldLL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9maWxlc3lzdGVtL0Z1bGxSZXBvcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUuZmlsZXN5c3RlbTsKLS8qCi0gKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTSAKLSAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDIsIDIwMDMgLSBBbGwgUmlnaHRzIFJlc2VydmVkLiAKLSAqIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUgCi0gKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4gCi0gKgotICogRElTQ0xBSU1FUiBPRiBXQVJSQU5USUVTLgotICogVGhlIGZvbGxvd2luZyBbZW5jbG9zZWRdIGNvZGUgaXMgc2FtcGxlIGNvZGUgY3JlYXRlZCBieSBJQk0KLSAqIENvcnBvcmF0aW9uLiBUaGlzIHNhbXBsZSBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFueSBzdGFuZGFyZCBvciBJQk0KLSAqIHByb2R1Y3QgYW5kIGlzIHByb3ZpZGVkIHRvIHlvdSBzb2xlbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGFzc2lzdGluZwotICogeW91IGluIHRoZSBkZXZlbG9wbWVudCBvZiB5b3VyIGFwcGxpY2F0aW9ucy4gIFRoZSBjb2RlIGlzIHByb3ZpZGVkCi0gKiAiQVMgSVMiLiBJQk0gTUFLRVMgTk8gV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUCi0gKiBOT1QgTElNSVRFRCBUTyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwotICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBSRUdBUkRJTkcgVEhFIEZVTkNUSU9OIE9SIFBFUkZPUk1BTkNFIE9GCi0gKiBUSElTIENPREUuICBUSElTIENPREUgTUFZIENPTlRBSU4gRVJST1JTLiAgSUJNIHNoYWxsIG5vdCBiZSBsaWFibGUKLSAqIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIG91dCBvZiB5b3VyIHVzZSBvZiB0aGUgc2FtcGxlIGNvZGUsIGV2ZW4KLSAqIGlmIGl0IGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLSAqIAotICovCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotCi0vKioKLSAqIFRoaXMgcmVwb3J0ZXIgaXMgdXNlZCB3aGVuIGZ1bGwgdmFsaWRhdGlvbiBpcyBuZWVkZWQuIEl0IGRvZXNuJ3QgY2FjaGUKLSAqIGFueXRoaW5nLCBzbyBpdCdzIGZhc3RlciB0aGFuIHRoZSBJbmNyZW1lbnRhbFJlcG9ydGVyLgotICovCi1wdWJsaWMgY2xhc3MgRnVsbFJlcG9ydGVyIGltcGxlbWVudHMgSVJlcG9ydGVyIHsKLQlwdWJsaWMgRnVsbFJlcG9ydGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVJlcG9ydGVyI2FkZE1lc3NhZ2UoSVZhbGlkYXRvciwgSU1lc3NhZ2UpCi0JICovCi0JcHVibGljIHZvaWQgYWRkTWVzc2FnZShJVmFsaWRhdG9yIHZhbGlkYXRvciwgSU1lc3NhZ2UgbWVzc2FnZSkgewotCQlpZiAobWVzc2FnZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlTeXN0ZW0ub3V0LnByaW50bG4oTWVzc2FnZU1hbmFnZXIuZm9ybWF0TWVzc2FnZSh2YWxpZGF0b3IsIG1lc3NhZ2UpKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBJUmVwb3J0ZXIjZGlzcGxheVN1YnRhc2soSVZhbGlkYXRvciwgSU1lc3NhZ2UpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcGxheVN1YnRhc2soSVZhbGlkYXRvciB2YWxpZGF0b3IsIElNZXNzYWdlIG1lc3NhZ2UpIHsKLQkJLy8gRmx1c2ggdGhlIG1lc3NhZ2UgdG8gdGhlIHVzZXIgaW1tZWRpYXRlbHkuCi0JCVN5c3RlbS5lcnIucHJpbnRsbihtZXNzYWdlLmdldFRleHQoKSk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSVJlcG9ydGVyI2dldE1lc3NhZ2VzKCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNZXNzYWdlcygpIHsKLQkJLy8gdGhpcyByZXBvcnRlciBkb2VzIG5vdCBzdXBwb3J0IG1lc3NhZ2UgYWNjZXNzIAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBJUmVwb3J0ZXIjaXNDYW5jZWxsZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2FuY2VsbGVkKCkgewotCQkvLyB0byBtYWtlIHRoaW5ncyBlYXN5LCBkbyBub3QgYWxsb3cgdGhlIHVzZXIgdG8gY2FuY2VsIHZhbGlkYXRpb24uCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBJUmVwb3J0ZXIjcmVtb3ZlQWxsTWVzc2FnZXMoSVZhbGlkYXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVBbGxNZXNzYWdlcyhJVmFsaWRhdG9yIHZhbGlkYXRvcikgewotCQkvLyBzaW5jZSBubyBtZXNzYWdlcyBhcmUgc3RvcmVkLCB0aGVyZSdzIG5vdGhpbmcgdG8gcmVtb3ZlCi0JfQotCQotCS8qKgotCSAqIEBzZWUgSVJlcG9ydGVyI3JlbW92ZUFsbE1lc3NhZ2VzKElWYWxpZGF0b3IsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVBbGxNZXNzYWdlcyhJVmFsaWRhdG9yIHZhbGlkYXRvciwgT2JqZWN0IG9iamVjdCkgewotCQkvLyBzaW5jZSBubyBtZXNzYWdlcyBhcmUgc3RvcmVkLCB0aGVyZSdzIG5vdGhpbmcgdG8gcmVtb3ZlCi0JfQotCQotCS8qKgotCSAqIEBzZWUgSVJlcG9ydGVyI3JlbW92ZU1lc3NhZ2VTdWJzZXQoSVZhbGlkYXRvciwgT2JqZWN0LCBTdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTWVzc2FnZVN1YnNldChJVmFsaWRhdG9yIHZhbGlkYXRvciwgT2JqZWN0IG9iaiwgU3RyaW5nIGdyb3VwTmFtZSkgewotCQkvLyBTaW5jZSB0aGlzIHJlcG9ydGVyIGRvZXNuJ3Qgc3RvcmUgbWVzc2FnZXMsIHRoZXJlIGlzIG5vIHJlbW92YWwgb2YgYW55IG1lc3NhZ2VzCi0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL2ZpbGVzeXN0ZW1GV0svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL2ZpbGVzeXN0ZW0vSUZpbGVzeXN0ZW1IZWxwZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9maWxlc3lzdGVtRldLL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9maWxlc3lzdGVtL0lGaWxlc3lzdGVtSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5Mzg1MTMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL2ZpbGVzeXN0ZW1GV0svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL2ZpbGVzeXN0ZW0vSUZpbGVzeXN0ZW1IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlLmZpbGVzeXN0ZW07Ci0vKgotICogTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0gCi0gKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAyLCAyMDAzIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCi0gKiBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlIAotICogcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuIAotICoKLSAqIERJU0NMQUlNRVIgT0YgV0FSUkFOVElFUy4KLSAqIFRoZSBmb2xsb3dpbmcgW2VuY2xvc2VkXSBjb2RlIGlzIHNhbXBsZSBjb2RlIGNyZWF0ZWQgYnkgSUJNCi0gKiBDb3Jwb3JhdGlvbi4gVGhpcyBzYW1wbGUgY29kZSBpcyBub3QgcGFydCBvZiBhbnkgc3RhbmRhcmQgb3IgSUJNCi0gKiBwcm9kdWN0IGFuZCBpcyBwcm92aWRlZCB0byB5b3Ugc29sZWx5IGZvciB0aGUgcHVycG9zZSBvZiBhc3Npc3RpbmcKLSAqIHlvdSBpbiB0aGUgZGV2ZWxvcG1lbnQgb2YgeW91ciBhcHBsaWNhdGlvbnMuICBUaGUgY29kZSBpcyBwcm92aWRlZAotICogIkFTIElTIi4gSUJNIE1BS0VTIE5PIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVAotICogTk9UIExJTUlURUQgVE8gVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKLSAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgUkVHQVJESU5HIFRIRSBGVU5DVElPTiBPUiBQRVJGT1JNQU5DRSBPRgotICogVEhJUyBDT0RFLiAgVEhJUyBDT0RFIE1BWSBDT05UQUlOIEVSUk9SUy4gIElCTSBzaGFsbCBub3QgYmUgbGlhYmxlCi0gKiBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBvdXQgb2YgeW91ciB1c2Ugb2YgdGhlIHNhbXBsZSBjb2RlLCBldmVuCi0gKiBpZiBpdCBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0gKiAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dDsKLQotLyoqCi0gKiBUbyBpbnRlZ3JhdGUgYSB2YWxpZGF0b3IgaW50byB0aGlzIGZyYW1ld29yaywgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhpcwotICogSVZhbGlkYXRpb25Db250ZXh0IG11c3QgYmUgcHJvdmlkZWQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUZpbGVzeXN0ZW1IZWxwZXIgZXh0ZW5kcyBJVmFsaWRhdGlvbkNvbnRleHQgewotCS8qKgotCSAqIFJldHVybiB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGZpbGUgd2hpY2ggdGhlIElNZXNzYWdlIGlzIHJlcG9ydGVkIGFnYWluc3QuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWxlTmFtZShJTWVzc2FnZSBtZXNzYWdlKTsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9maWxlc3lzdGVtRldLL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9maWxlc3lzdGVtL0luY3JlbWVudGFsUmVwb3J0ZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9maWxlc3lzdGVtRldLL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9maWxlc3lzdGVtL0luY3JlbWVudGFsUmVwb3J0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThlM2RiYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvZmlsZXN5c3RlbUZXSy9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvZmlsZXN5c3RlbS9JbmNyZW1lbnRhbFJlcG9ydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUuZmlsZXN5c3RlbTsKLS8qCi0gKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTSAKLSAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDIsIDIwMDMgLSBBbGwgUmlnaHRzIFJlc2VydmVkLiAKLSAqIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUgCi0gKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4gCi0gKgotICogRElTQ0xBSU1FUiBPRiBXQVJSQU5USUVTLgotICogVGhlIGZvbGxvd2luZyBbZW5jbG9zZWRdIGNvZGUgaXMgc2FtcGxlIGNvZGUgY3JlYXRlZCBieSBJQk0KLSAqIENvcnBvcmF0aW9uLiBUaGlzIHNhbXBsZSBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFueSBzdGFuZGFyZCBvciBJQk0KLSAqIHByb2R1Y3QgYW5kIGlzIHByb3ZpZGVkIHRvIHlvdSBzb2xlbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGFzc2lzdGluZwotICogeW91IGluIHRoZSBkZXZlbG9wbWVudCBvZiB5b3VyIGFwcGxpY2F0aW9ucy4gIFRoZSBjb2RlIGlzIHByb3ZpZGVkCi0gKiAiQVMgSVMiLiBJQk0gTUFLRVMgTk8gV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUCi0gKiBOT1QgTElNSVRFRCBUTyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwotICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBSRUdBUkRJTkcgVEhFIEZVTkNUSU9OIE9SIFBFUkZPUk1BTkNFIE9GCi0gKiBUSElTIENPREUuICBUSElTIENPREUgTUFZIENPTlRBSU4gRVJST1JTLiAgSUJNIHNoYWxsIG5vdCBiZSBsaWFibGUKLSAqIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIG91dCBvZiB5b3VyIHVzZSBvZiB0aGUgc2FtcGxlIGNvZGUsIGV2ZW4KLSAqIGlmIGl0IGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLSAqIAotICovCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHRoZSBmaWxlIHN5c3RlbSBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZiBhbiBpbmNyZW1lbnRhbCBJUmVwb3J0ZXIuCi0gKiBJdCBjYWNoZXMgdmFsaWRhdGlvbiBtZXNzYWdlcywgc28gdGhhdCBtZXNzYWdlcyBjYW4gYm90aCBiZSBhZGRlZCBhbmQgZGVsZXRlZC4KLSAqLwotcHVibGljIGNsYXNzIEluY3JlbWVudGFsUmVwb3J0ZXIgaW1wbGVtZW50cyBJUmVwb3J0ZXIgewotCQotCXB1YmxpYyBJbmNyZW1lbnRhbFJlcG9ydGVyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIElSZXBvcnRlciNhZGRNZXNzYWdlKElWYWxpZGF0b3IsIElNZXNzYWdlKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZE1lc3NhZ2UoSVZhbGlkYXRvciB2YWxpZGF0b3IsIElNZXNzYWdlIG1lc3NhZ2UpIHsKLQkJaWYgKHZhbGlkYXRvciA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAobWVzc2FnZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlWYWxpZGF0b3JNZXNzYWdlcyB2bSA9IE1lc3NhZ2VNYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRNZXNzYWdlcyh2YWxpZGF0b3IpOwotCQlpZiAodm0gIT0gbnVsbCkgewotCQkJdm0uYWRkVmFsaWRhdGlvbk1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElSZXBvcnRlciNkaXNwbGF5U3VidGFzayhJVmFsaWRhdG9yLCBJTWVzc2FnZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwbGF5U3VidGFzayhJVmFsaWRhdG9yIHZhbGlkYXRvciwgSU1lc3NhZ2UgbWVzc2FnZSkgewotCQkvLyBGbHVzaCB0aGUgbWVzc2FnZSB0byB0aGUgdXNlciBpbW1lZGlhdGVseS4KLQkJU3lzdGVtLmVyci5wcmludGxuKG1lc3NhZ2UuZ2V0VGV4dCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElSZXBvcnRlciNnZXRNZXNzYWdlcygpCi0JICovCi0JcHVibGljIExpc3QgZ2V0TWVzc2FnZXMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIE1hcCBvZiBTdHJpbmcgZnVsbHktcXVhbGlmaWVkIHZhbGlkYXRvciBjbGFzcyBuYW1lcywKLQkgKiB3aXRoIGEgdmFsdWUgb2YgQ29sbGVjdGlvbiwgYW5kIHRoZSBDb2xsZWN0aW9uIGNvbnRhaW5zIHRoZQotCSAqIE1lc3NhZ2VNZXRhRGF0YSByZXBvcnRlZCBieSB0aGUgdmFsaWRhdG9yLCBvZiB0aGUgZ2l2ZW4gc2V2ZXJpdHkuCi0JICovCi0JcHVibGljIE1hcCBnZXRNZXNzYWdlcyhpbnQgbWVzc2FnZVR5cGUpIHsKLQkJcmV0dXJuIE1lc3NhZ2VNYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRNZXNzYWdlcyhtZXNzYWdlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJUmVwb3J0ZXIjaXNDYW5jZWxsZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2FuY2VsbGVkKCkgewotCQkvLyBGb3Igc2ltcGxpY2l0eSwgbmV2ZXIgYWxsb3cgY2FuY2VsbGF0aW9uLgotCQkvLyBJbiBhIHByb2R1Y3Rpb24gc3lzdGVtLCB0aGlzIG1ldGhvZCBtaWdodCBxdWVyeSBhbm90aGVyIG9iamVjdCB0byBmaW5kIG91dCBpdHMgY2FuY2VsbGF0aW9uIHN0YXR1cy4KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVJlcG9ydGVyI3JlbW92ZUFsbE1lc3NhZ2VzKElWYWxpZGF0b3IpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQWxsTWVzc2FnZXMoSVZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQkJaWYgKHZhbGlkYXRvciA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJTWVzc2FnZU1hbmFnZXIuZ2V0TWFuYWdlcigpLnJlbW92ZUFsbE1lc3NhZ2VzKHZhbGlkYXRvcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJUmVwb3J0ZXIjcmVtb3ZlQWxsTWVzc2FnZXMoSVZhbGlkYXRvciwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUFsbE1lc3NhZ2VzKElWYWxpZGF0b3IgdmFsaWRhdG9yLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmICh2YWxpZGF0b3IgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCi0JCU1lc3NhZ2VNYW5hZ2VyLmdldE1hbmFnZXIoKS5yZW1vdmVBbGxNZXNzYWdlcyh2YWxpZGF0b3IsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJUmVwb3J0ZXIjcmVtb3ZlTWVzc2FnZVN1YnNldChJVmFsaWRhdG9yLCBPYmplY3QsIFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVNZXNzYWdlU3Vic2V0KElWYWxpZGF0b3IgdmFsaWRhdG9yLCBPYmplY3Qgb2JqLCBTdHJpbmcgZ3JvdXBOYW1lKSB7Ci0JCS8vIGltcGxlbWVudCBsYXRlcgotCX0KLQotCS8qKgotCSAqIERpc3BsYXkgYSBmb3JtYXR0ZWQgbGlzdCBvZiBhbGwgb2YgdGhlIHByb2JsZW1zIGZvdW5kIHdoaWxlCi0JICogdmFsaWRhdGluZyB0aGUgZmlsZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXBvcnQoKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIG1lc3NhZ2VzIik7IC8vJE5PTi1OTFMtMSQKLQkJTWFwIG1lc3NhZ2VzID0gZ2V0TWVzc2FnZXMoSU1lc3NhZ2UuSElHSF9TRVZFUklUWSk7Ci0JCXJlcG9ydChtZXNzYWdlcyk7Ci0KLQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiV2FybmluZyBtZXNzYWdlcyIpOyAvLyROT04tTkxTLTEkCi0JCW1lc3NhZ2VzID0gZ2V0TWVzc2FnZXMoSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZKTsKLQkJcmVwb3J0KG1lc3NhZ2VzKTsKLQotCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJJbmZvcm1hdGlvbiBtZXNzYWdlcyIpOyAvLyROT04tTkxTLTEkCi0JCW1lc3NhZ2VzID0gZ2V0TWVzc2FnZXMoSU1lc3NhZ2UuTE9XX1NFVkVSSVRZKTsKLQkJcmVwb3J0KG1lc3NhZ2VzKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBJUmVwb3J0ZXIjcmVwb3J0KE1hcCkKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgcmVwb3J0KE1hcCBtZXNzYWdlcykgewotCQlpZihtZXNzYWdlcy5zaXplKCkgPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlJdGVyYXRvciBpdGVyYXRvciA9IG1lc3NhZ2VzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJU3RyaW5nIHZhbGlkYXRvckNsYXNzTmFtZSA9IChTdHJpbmcpaXRlcmF0b3IubmV4dCgpOwotCQkJSVZhbGlkYXRvciB2YWxpZGF0b3IgPSBGaWxlc3lzdGVtTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0VmFsaWRhdG9yKHZhbGlkYXRvckNsYXNzTmFtZSk7Ci0JCQlJRmlsZXN5c3RlbUhlbHBlciBoZWxwZXIgPSBGaWxlc3lzdGVtTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0SGVscGVyKHZhbGlkYXRvcik7Ci0JCQlMaXN0IG1zc2dMaXN0ID0gKExpc3QpbWVzc2FnZXMuZ2V0KHZhbGlkYXRvcik7Ci0JCQlpZihtc3NnTGlzdCA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkKLQkJCUNvbGxlY3Rpb25zLnNvcnQobXNzZ0xpc3QsIE1lc3NhZ2VNYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRNZXNzYWdlQ29tcGFyYXRvcihoZWxwZXIpKTsKLQkJCQotCQkJZm9yKGludCBpPTA7IGk8bXNzZ0xpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQlJTWVzc2FnZSBtc3NnID0gKElNZXNzYWdlKW1zc2dMaXN0LmdldChpKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oTWVzc2FnZU1hbmFnZXIuZm9ybWF0TWVzc2FnZSh2YWxpZGF0b3IsIG1zc2cpKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9maWxlc3lzdGVtRldLL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9maWxlc3lzdGVtL01lc3NhZ2VNYW5hZ2VyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvZmlsZXN5c3RlbUZXSy9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvZmlsZXN5c3RlbS9NZXNzYWdlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGIxYzllLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9maWxlc3lzdGVtRldLL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9maWxlc3lzdGVtL01lc3NhZ2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTQgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUuZmlsZXN5c3RlbTsKLS8qCi0gKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTSAKLSAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDIsIDIwMDMgLSBBbGwgUmlnaHRzIFJlc2VydmVkLiAKLSAqIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUgCi0gKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4gCi0gKgotICogRElTQ0xBSU1FUiBPRiBXQVJSQU5USUVTLgotICogVGhlIGZvbGxvd2luZyBbZW5jbG9zZWRdIGNvZGUgaXMgc2FtcGxlIGNvZGUgY3JlYXRlZCBieSBJQk0KLSAqIENvcnBvcmF0aW9uLiBUaGlzIHNhbXBsZSBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFueSBzdGFuZGFyZCBvciBJQk0KLSAqIHByb2R1Y3QgYW5kIGlzIHByb3ZpZGVkIHRvIHlvdSBzb2xlbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGFzc2lzdGluZwotICogeW91IGluIHRoZSBkZXZlbG9wbWVudCBvZiB5b3VyIGFwcGxpY2F0aW9ucy4gIFRoZSBjb2RlIGlzIHByb3ZpZGVkCi0gKiAiQVMgSVMiLiBJQk0gTUFLRVMgTk8gV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUCi0gKiBOT1QgTElNSVRFRCBUTyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwotICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBSRUdBUkRJTkcgVEhFIEZVTkNUSU9OIE9SIFBFUkZPUk1BTkNFIE9GCi0gKiBUSElTIENPREUuICBUSElTIENPREUgTUFZIENPTlRBSU4gRVJST1JTLiAgSUJNIHNoYWxsIG5vdCBiZSBsaWFibGUKLSAqIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIG91dCBvZiB5b3VyIHVzZSBvZiB0aGUgc2FtcGxlIGNvZGUsIGV2ZW4KLSAqIGlmIGl0IGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLSAqIAotICovCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgbWFuYWdlcyB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlcyBmb3IgZWFjaCB2YWxpZGF0b3IuIEVhY2ggdmFsaWRhdG9yJ3MKLSAqIG1lc3NhZ2VzIGNhbiBiZSByZXRyaWV2ZWQgYnkgdXNpbmcgdGhlIHZhbGlkYXRvcidzIHVuaXF1ZSBuYW1lIGFzIGEga2V5IGludG8gdGhlCi0gKiB0YWJsZS4gKGkuZS4sIGNhbGwgZ2V0TWVzc2FnZXMgd2l0aCB0aGUgdmFsaWRhdG9yJ3MgdW5pcXVlIG5hbWUgYXMgdGhlIHBhcmFtZXRlci4pCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlTWFuYWdlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgTWVzc2FnZU1hbmFnZXIgX3NpbmdsZXRvbiA9IG51bGw7Ci0JcHJpdmF0ZSBDb21wYXJhdG9yIF9jb21wYXJhdG9yID0gbnVsbDsKLQotCXByaXZhdGUgTWFwIF92YWxpZGF0aW9uTWVzc2FnZXMgPSBudWxsOwotCi0JcHJpdmF0ZSBNZXNzYWdlTWFuYWdlcigpIHsKLQkJc3VwZXIoKTsKLQotCQlfdmFsaWRhdGlvbk1lc3NhZ2VzID0gbmV3IEhhc2hNYXAoMTApOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgTWVzc2FnZU1hbmFnZXIgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWVzc2FnZU1hbmFnZXIgZ2V0TWFuYWdlcigpIHsKLQkJaWYgKF9zaW5nbGV0b24gPT0gbnVsbCkgewotCQkJX3NpbmdsZXRvbiA9IG5ldyBNZXNzYWdlTWFuYWdlcigpOwotCQl9Ci0JCXJldHVybiBfc2luZ2xldG9uOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBtYXAgb2YgYWxsIG1lc3NhZ2VzIG9mIHRoZSBnaXZlbiBzZXZlcml0eS4gVGhlIGtleSBvZiB0aGUgbWFwCi0JICogaXMgdGhlIElWYWxpZGF0b3IsIHRoZSB2YWx1ZSBvZiB0aGUgSVZhbGlkYXRvciBpcyB0aGUgTGlzdCBvZiBJTWVzc2FnZQotCSAqIGluc3RhbmNlcyBvZiB0aGUgZ2l2ZW4gc2V2ZXJpdHkuCi0JICovCi0JcHVibGljIE1hcCBnZXRNZXNzYWdlcyhpbnQgbWVzc2FnZVR5cGVzKSB7Ci0JCU1hcCBtZXNzYWdlcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBfdmFsaWRhdGlvbk1lc3NhZ2VzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJVmFsaWRhdG9yTWVzc2FnZXMgbXNzZyA9IChWYWxpZGF0b3JNZXNzYWdlcykgaXRlcmF0b3IubmV4dCgpOwotCi0JCQltZXNzYWdlcy5wdXQobXNzZy5nZXRWYWxpZGF0b3IoKS5nZXRDbGFzcygpLmdldE5hbWUoKSwgbXNzZy5nZXRNZXNzYWdlcyhtZXNzYWdlVHlwZXMpKTsKLQkJfQotCQlyZXR1cm4gbWVzc2FnZXM7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIFZhbGlkYXRpb25NZXNzYWdlIG93bmVkIGJ5IHRoZSBpZGVudGlmaWVkIHZhbGlkYXRvciwKLQkgKiBpZiBvbmUgZXhpc3RzLiBJZiBvbmUgZG9lc24ndCBleGlzdCwgaXQgaXMgY3JlYXRlZCAmIHJlZ2lzdGVyZWQsIGFuZCB0aGVuIAotCSAqIHJldHVybmVkLgotCSAqLwotCXB1YmxpYyBWYWxpZGF0b3JNZXNzYWdlcyBnZXRNZXNzYWdlcyhJVmFsaWRhdG9yIHZhbGlkYXRvcikgewotCQlpZiAodmFsaWRhdG9yID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJVmFsaWRhdG9yTWVzc2FnZXMgbWVzc2FnZSA9IChWYWxpZGF0b3JNZXNzYWdlcykgX3ZhbGlkYXRpb25NZXNzYWdlcy5nZXQodmFsaWRhdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQkJaWYgKG1lc3NhZ2UgPT0gbnVsbCkgewotCQkJLy8gaWYgaXQgZG9lc24ndCBleGlzdCwgY3JlYXRlIGl0LgotCQkJbWVzc2FnZSA9IG5ldyBWYWxpZGF0b3JNZXNzYWdlcyh2YWxpZGF0b3IpOwotCQkJX3ZhbGlkYXRpb25NZXNzYWdlcy5wdXQodmFsaWRhdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpLCBtZXNzYWdlKTsKLQkJfQotCQlyZXR1cm4gbWVzc2FnZTsKLQl9Ci0JCi0JLyoqCi0JICogUmVtb3ZlIGFsbCBtZXNzYWdlcyBvd25lZCBieSB0aGUgaWRlbnRpZmllZCB2YWxpZGF0b3IuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQWxsTWVzc2FnZXMoSVZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQkJaWYgKHZhbGlkYXRvciA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlfdmFsaWRhdGlvbk1lc3NhZ2VzLnJlbW92ZSh2YWxpZGF0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZW1vdmUgYWxsIG1lc3NhZ2VzLCBvd25lZCBieSB0aGUgaWRlbnRpZmllZCB2YWxpZGF0b3IsIHJlcG9ydGVkCi0JICogYWdhaW5zdCB0aGUgZ2l2ZW4gdGFyZ2V0IG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVBbGxNZXNzYWdlcyhJVmFsaWRhdG9yIHZhbGlkYXRvciwgT2JqZWN0IG9iamVjdCkgewotCQlpZiAodmFsaWRhdG9yID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCVZhbGlkYXRvck1lc3NhZ2VzIG1lc3NhZ2UgPSBnZXRNZXNzYWdlcyh2YWxpZGF0b3IpOwotCQlpZiAobWVzc2FnZSAhPSBudWxsKSB7Ci0JCQltZXNzYWdlLnJlbW92ZUFsbE1lc3NhZ2VzKG9iamVjdCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVG8gc3VwcG9ydCByZW1vdmFsIG9mIGEgc3Vic2V0IG9mIHZhbGlkYXRpb24gbWVzc2FnZXMsIGFuIElWYWxpZGF0b3IKLQkgKiBtYXkgYXNzaWduIGdyb3VwIG5hbWVzIHRvIElNZXNzYWdlcy4gQW4gSU1lc3NhZ2Ugc3Vic2V0IHdpbGwgYmUgaWRlbnRpZmllZAotCSAqIGJ5IHRoZSBuYW1lIG9mIGl0cyBncm91cC4gRGVmYXVsdCAobnVsbCkgbWVhbnMgbm8gZ3JvdXAuIFRoaXMgbWV0aG9kIHdpbGwKLQkgKiByZW1vdmUgb25seSB0aGUgSU1lc3NhZ2UncyB0aGF0IGFyZSBpbiB0aGUgZ3JvdXAgaWRlbnRpZmllZCBieSBncm91cE5hbWUuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTWVzc2FnZVN1YnNldChJVmFsaWRhdG9yIHZhbGlkYXRvciwgT2JqZWN0IG9iamVjdCwgU3RyaW5nIGdyb3VwTmFtZSkgewotCQlpZiAodmFsaWRhdG9yID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCVZhbGlkYXRvck1lc3NhZ2VzIG1lc3NhZ2UgPSBnZXRNZXNzYWdlcyh2YWxpZGF0b3IpOwotCQlpZiAobWVzc2FnZSAhPSBudWxsKSB7Ci0JCQltZXNzYWdlLnJlbW92ZUFsbE1lc3NhZ2VzKG9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIElNZXNzYWdlIGFzIGEgU3RyaW5nIHN1aXRhYmxlIGZvciBkaXNwbGF5aW5nIHRvIHRoZSB1c2VyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcm1hdE1lc3NhZ2UoSVZhbGlkYXRvciB2YWxpZGF0b3IsIElNZXNzYWdlIG1lc3NhZ2UpIHsKLQkJaWYgKG1lc3NhZ2UgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpbnQgc2V2ZXJpdHkgPSBtZXNzYWdlLmdldFNldmVyaXR5KCk7Ci0JCU9iamVjdCBvYmplY3QgPSBtZXNzYWdlLmdldFRhcmdldE9iamVjdCgpOwotCQlTdHJpbmdCdWZmZXIgZm9ybWF0dGVkTWVzc2FnZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJc3dpdGNoIChzZXZlcml0eSkgewotCQkJY2FzZSAoSU1lc3NhZ2UuSElHSF9TRVZFUklUWSkgOgotCQkJCXsKLQkJCQkJZm9ybWF0dGVkTWVzc2FnZS5hcHBlbmQoIkVycm9yOiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCWNhc2UgKElNZXNzYWdlLkxPV19TRVZFUklUWSkgOgotCQkJCXsKLQkJCQkJZm9ybWF0dGVkTWVzc2FnZS5hcHBlbmQoIkluZm9ybWF0aW9uOiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCWNhc2UgKElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSkgOgotCQkJZGVmYXVsdCA6Ci0JCQkJewotCQkJCQlmb3JtYXR0ZWRNZXNzYWdlLmFwcGVuZCgiV2FybmluZzogIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQl9Ci0KLQkJZm9ybWF0dGVkTWVzc2FnZS5hcHBlbmQobWVzc2FnZS5nZXRUZXh0KCkpOwotCi0JCWlmIChvYmplY3QgIT0gbnVsbCkgewotCQkJU3RyaW5nIGZpbGVOYW1lID0gRmlsZXN5c3RlbU1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldEhlbHBlcih2YWxpZGF0b3IpLmdldEZpbGVOYW1lKG1lc3NhZ2UpOwotCQkJaW50IGxpbmVOdW1iZXIgPSBtZXNzYWdlLmdldExpbmVOdW1iZXIoKTsKLQotCQkJaWYoKGZpbGVOYW1lICE9IG51bGwpIHx8IChsaW5lTnVtYmVyICE9IElNZXNzYWdlLkxJTkVOT19VTlNFVCkpIHsKLQkJCQlmb3JtYXR0ZWRNZXNzYWdlLmFwcGVuZCgiWyIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYoZmlsZU5hbWUgIT0gbnVsbCkgewotCQkJCQlmb3JtYXR0ZWRNZXNzYWdlLmFwcGVuZChmaWxlTmFtZSk7Ci0JCQkJfQotCQkJCWlmKGxpbmVOdW1iZXIgIT0gSU1lc3NhZ2UuTElORU5PX1VOU0VUKSB7Ci0JCQkJCWZvcm1hdHRlZE1lc3NhZ2UuYXBwZW5kKCIgbGluZSBudW1iZXI6ICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWZvcm1hdHRlZE1lc3NhZ2UuYXBwZW5kKFN0cmluZy52YWx1ZU9mKGxpbmVOdW1iZXIpKTsKLQkJCQl9Ci0JCQkJZm9ybWF0dGVkTWVzc2FnZS5hcHBlbmQoIl0gIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmb3JtYXR0ZWRNZXNzYWdlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBDb21wYXJhdG9yIGlzIHVzZWQgdG8gc29ydCBtZXNzYWdlcyBmaXJzdCBieSBmaWxlIG5hbWUsIHRoZW4gYnkgbGluZSBudW1iZXIuCi0JICovCi0JcHVibGljIENvbXBhcmF0b3IgZ2V0TWVzc2FnZUNvbXBhcmF0b3IoZmluYWwgSUZpbGVzeXN0ZW1IZWxwZXIgaGVscGVyKSB7Ci0JCWlmKF9jb21wYXJhdG9yID09IG51bGwpIHsKLQkJCV9jb21wYXJhdG9yID0gCW5ldyBDb21wYXJhdG9yKCkgewotCQkJCXByb3RlY3RlZCBpbnQgY29tcGFyZShTdHJpbmcgYSwgU3RyaW5nIGIpIHsKLQkJCQkJaWYoKGEgPT0gbnVsbCkgJiYgKGIgPT0gbnVsbCkpIHsKLQkJCQkJCXJldHVybiAwOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYoYSA9PSBudWxsKSB7Ci0JCQkJCQlyZXR1cm4gLTE7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZihiID09IG51bGwpIHsKLQkJCQkJCXJldHVybiAxOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlyZXR1cm4gYS5jb21wYXJlVG8oYik7Ci0JCQkJfQotCQkJCQotCQkJCXByb3RlY3RlZCBpbnQgY29tcGFyZShpbnQgYSwgaW50IGIpIHsKLQkJCQkJaWYoKGEgPT0gSU1lc3NhZ2UuTElORU5PX1VOU0VUKSAmJiAoYiA9PSBJTWVzc2FnZS5MSU5FTk9fVU5TRVQpKSB7Ci0JCQkJCQlyZXR1cm4gMDsKLQkJCQkJfQotCQkJCQllbHNlIGlmKGEgPT0gSU1lc3NhZ2UuTElORU5PX1VOU0VUKSB7Ci0JCQkJCQlyZXR1cm4gLTE7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZihiID09IElNZXNzYWdlLkxJTkVOT19VTlNFVCkgewotCQkJCQkJcmV0dXJuIDE7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCXJldHVybiAoYSAtIGIpOwotCQkJCX0KLQkJCQkKLQkJCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGEsIE9iamVjdCBiKSB7Ci0JCQkJCWlmKChhID09IG51bGwpICYmIChiID09IG51bGwpKSB7Ci0JCQkJCQlyZXR1cm4gMDsKLQkJCQkJfQotCQkJCQllbHNlIGlmKGEgPT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIC0xOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYoYiA9PSBudWxsKSB7Ci0JCQkJCQlyZXR1cm4gMTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJSU1lc3NhZ2UgYU1zc2cgPSAoSU1lc3NhZ2UpYTsKLQkJCQkJSU1lc3NhZ2UgYk1zc2cgPSAoSU1lc3NhZ2UpYjsKLQkJCQkJCi0JCQkJCS8vIFNvcnQgYnkgZmlsZSBuYW1lLCB0aGVuIGxpbmUgbnVtYmVyLiBVbnNldCBsaW5lIG51bWJlcnMgZ28gdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaXN0LgotCQkJCQlTdHJpbmcgYUZpbGVOYW1lID0gaGVscGVyLmdldEZpbGVOYW1lKGFNc3NnKTsKLQkJCQkJU3RyaW5nIGJGaWxlTmFtZSA9IGhlbHBlci5nZXRGaWxlTmFtZShiTXNzZyk7Ci0JCQkJCWludCByZXN1bHQgPSBjb21wYXJlKGFGaWxlTmFtZSwgYkZpbGVOYW1lKTsKLQkJCQkJaWYocmVzdWx0ICE9IDApIHsKLQkJCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCWludCBhTGluZU51bWJlciA9IGFNc3NnLmdldExpbmVOdW1iZXIoKTsKLQkJCQkJaW50IGJMaW5lTnVtYmVyID0gYk1zc2cuZ2V0TGluZU51bWJlcigpOwotCQkJCQlyZXR1cm4gY29tcGFyZShhTGluZU51bWJlciwgYkxpbmVOdW1iZXIpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIF9jb21wYXJhdG9yOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9maWxlc3lzdGVtRldLL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9maWxlc3lzdGVtL1ZhbGlkYXRvck1lc3NhZ2VzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvZmlsZXN5c3RlbUZXSy9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvZmlsZXN5c3RlbS9WYWxpZGF0b3JNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzE2ZGYwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9maWxlc3lzdGVtRldLL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9maWxlc3lzdGVtL1ZhbGlkYXRvck1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUuZmlsZXN5c3RlbTsKLS8qCi0gKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTSAKLSAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDIsIDIwMDMgLSBBbGwgUmlnaHRzIFJlc2VydmVkLiAKLSAqIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUgCi0gKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4gCi0gKgotICogRElTQ0xBSU1FUiBPRiBXQVJSQU5USUVTLgotICogVGhlIGZvbGxvd2luZyBbZW5jbG9zZWRdIGNvZGUgaXMgc2FtcGxlIGNvZGUgY3JlYXRlZCBieSBJQk0KLSAqIENvcnBvcmF0aW9uLiBUaGlzIHNhbXBsZSBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFueSBzdGFuZGFyZCBvciBJQk0KLSAqIHByb2R1Y3QgYW5kIGlzIHByb3ZpZGVkIHRvIHlvdSBzb2xlbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGFzc2lzdGluZwotICogeW91IGluIHRoZSBkZXZlbG9wbWVudCBvZiB5b3VyIGFwcGxpY2F0aW9ucy4gIFRoZSBjb2RlIGlzIHByb3ZpZGVkCi0gKiAiQVMgSVMiLiBJQk0gTUFLRVMgTk8gV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUCi0gKiBOT1QgTElNSVRFRCBUTyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwotICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBSRUdBUkRJTkcgVEhFIEZVTkNUSU9OIE9SIFBFUkZPUk1BTkNFIE9GCi0gKiBUSElTIENPREUuICBUSElTIENPREUgTUFZIENPTlRBSU4gRVJST1JTLiAgSUJNIHNoYWxsIG5vdCBiZSBsaWFibGUKLSAqIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIG91dCBvZiB5b3VyIHVzZSBvZiB0aGUgc2FtcGxlIGNvZGUsIGV2ZW4KLSAqIGlmIGl0IGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLSAqIAotICovCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3I7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBtYW5hZ2VzIG1lc3NhZ2VzIGZvciBvbmUgdmFsaWRhdG9yLiBFYWNoIHZhbGlkYXRvciAKLSAqIGNhbiBzdG9yZSB0aHJlZSB0eXBlcyBvZiBtZXNzYWdlczogZXJyb3IgKFNldmVyaXR5RW51bS5ISUdIX1NFVkVSSVRZKSwgCi0gKiB3YXJuaW5nIChTZXZlcml0eUVudW0uTk9STUFMX1NFVkVSSVRZKSwgYW5kIGluZm8gKFNldmVyaXR5RW51bS5MT1dfU0VWRVJJVFkpLgotICogRWFjaCBtZXNzYWdlIGlzIGFzc29jaWF0ZWQgd2l0aCBhbiBPYmplY3QgKGZvciBpbmNyZW1lbnRhbCB2YWxpZGF0aW9uKS4KLSAqIElmIGEgbWVzc2FnZSBkb2VzIG5vdCBhcHBseSB0byBhIHBhcnRpY3VsYXIgT2JqZWN0LCB0aGUgZGVmYXVsdCBPYmplY3QKLSAqIGlzIHVzZWQuCi0gKgotICogRWFjaCBPYmplY3QgaXMgYXNzb2NpYXRlZCB3aXRoIGVpdGhlciAwLCAxLCBvciA+MSBtZXNzYWdlcy4gCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0b3JNZXNzYWdlcyB7Ci0JcHJpdmF0ZSBNYXAgX21lc3NhZ2VzID0gbnVsbDsKLQlwcml2YXRlIElWYWxpZGF0b3IgX3ZhbGlkYXRvciA9IG51bGw7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgREVGQVVMVF9PQkpFQ1QgPSBuZXcgT2JqZWN0KCk7Ci0KLQlwdWJsaWMgVmFsaWRhdG9yTWVzc2FnZXMoSVZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQkJX21lc3NhZ2VzID0gbmV3IEhhc2hNYXAoKTsKLQkJX3ZhbGlkYXRvciA9IHZhbGlkYXRvcjsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB2YWxpZGF0b3IgdGhhdCBvd25zIHRoZXNlIG1lc3NhZ2VzLgotCSAqLwotCXB1YmxpYyBJVmFsaWRhdG9yIGdldFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIF92YWxpZGF0b3I7Ci0JfQotCQotCS8qKgotCSAqIEFkZCBhbiBJTWVzc2FnZSB0byB0aGUgZGVmYXVsdCBncm91cC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRWYWxpZGF0aW9uTWVzc2FnZShJTWVzc2FnZSBtZXNzYWdlKSB7Ci0JCWFkZFZhbGlkYXRpb25NZXNzYWdlKG1lc3NhZ2UsIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBBZGQgYW4gSU1lc3NhZ2UgdG8gdGhlIG5hbWVkIGdyb3VwLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFZhbGlkYXRpb25NZXNzYWdlKElNZXNzYWdlIG1lc3NhZ2UsIFN0cmluZyBncm91cE5hbWUpIHsKLQkJaWYgKG1lc3NhZ2UgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKG1lc3NhZ2UuZ2V0VGFyZ2V0T2JqZWN0KCkgPT0gbnVsbCkgewotCQkJLy8gSWYgb2JqZWN0IGlzIG51bGwsIHRoZSBlcnJvciBtZXNzYWdlIGRvZXMgbm90IGFwcGx5IHRvIGEgcGFydGljdWxhciBvYmplY3QuCi0JCQkvLwotCQkJLy8gVGhpcyB2YWx1ZSBtaWdodCBiZSB1c2VkIGlmLCBmb3IgZXhhbXBsZSwgdGhlIHZhbGlkYXRvciBleHBlcmllbmNlcyBhbiBpbnRlcm5hbCwgdW5yZWNvdmVyYWJsZSBlcnJvci4KLQkJCS8vIFlvdSBuZWVkIHRvIGxldCB0aGUgdXNlciBrbm93IHRoYXQgdmFsaWRhdGlvbiB0ZXJtaW5hdGVkIGFibm9ybWFsbHksIGJ1dCBhIGxpc3QKLQkJCS8vIG9mIHRoZSB2YWxpZGF0aW9uIHdoaWNoIHByb2NlZWRlZCBub3JtYWxseSBjYW4gaGVscCB0byBuYXJyb3cgZG93biB3aGF0IHBhcnQgb2YgdGhlCi0JCQkvLyBjb2RlIGNhdXNlZCBhIHByb2JsZW0uCi0JCQkvLwotCQkJLy8gT3IgaXQgY291bGQgYmUgc29tZXRoaW5nIGdlbmVyaWMsIGUuZy4gaXQgYXBwbGllcyB0byBhIC5qYXIgZmlsZSwgaW5zdGVhZCBvZiBhIGZpbGUgaW4gdGhlIC5qYXIuCi0JCQltZXNzYWdlLnNldFRhcmdldE9iamVjdChnZXREZWZhdWx0T2JqZWN0KCkpOwotCQl9Ci0JCQotCQlpZihncm91cE5hbWUgIT0gbnVsbCkgewotCQkJbWVzc2FnZS5zZXRHcm91cE5hbWUoZ3JvdXBOYW1lKTsKLQkJfQotCi0JCUxpc3QgbGlzdCA9IChMaXN0KSBfbWVzc2FnZXMuZ2V0KG1lc3NhZ2UuZ2V0VGFyZ2V0T2JqZWN0KCkpOwotCQlpZiAobGlzdCA9PSBudWxsKSB7Ci0JCQlsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCWxpc3QuYWRkKG1lc3NhZ2UpOwotCQlfbWVzc2FnZXMucHV0KG1lc3NhZ2UuZ2V0VGFyZ2V0T2JqZWN0KCksIGxpc3QpOwotCX0KLQkKLQkvKioKLQkgKiBJZiB0aGUgSU1lc3NhZ2UgZG9lcyBub3QgaGF2ZSBhIHRhcmdldCBvYmplY3QsIHRoZSBvYmplY3QKLQkgKiByZXR1cm5lZCBieSB0aGlzIG1ldGhvZCBpcyB1c2VkIGFzIHRoZSBrZXkgaW4gdGhlIE1hcC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXREZWZhdWx0T2JqZWN0KCkgewotCQlyZXR1cm4gREVGQVVMVF9PQkpFQ1Q7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhbGwgbWVzc2FnZXMgd2hvc2Ugc2V2ZXJpdHkgbWF0Y2hlcyB0aGUgbWVzc2FnZVR5cGVzIHNldmVyaXR5LgotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1lc3NhZ2VzKGludCBtZXNzYWdlVHlwZXMpIHsKLQkJTGlzdCBtZXNzYWdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlJdGVyYXRvciBpdGVyYXRvciA9IF9tZXNzYWdlcy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlMaXN0IGxpc3QgPSAoTGlzdCkgaXRlcmF0b3IubmV4dCgpOwotCi0JCQlPYmplY3RbXSBsaXN0Q29udGVudHMgPSBsaXN0LnRvQXJyYXkoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdENvbnRlbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IChJTWVzc2FnZSkgbGlzdENvbnRlbnRzW2ldOwotCi0JCQkJaWYgKChtZXNzYWdlVHlwZXMgJiBtZXNzYWdlLmdldFNldmVyaXR5KCkpICE9IDApIHsKLQkJCQkJbWVzc2FnZXMuYWRkKG1lc3NhZ2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbWVzc2FnZXM7Ci0JfQotCQotCS8qKgotCSAqIFJlbW92ZSBhbGwgbWVzc2FnZXMgdGhhdCBhcHBseSB0byB0aGUgZ2l2ZW4gb2JqZWN0LiBJZiBvYmplY3QgaXMKLQkgKiBudWxsLCB0aGUgbWVzc2FnZXMgb3duZWQgYnkgdGhlIGRlZmF1bHQgb2JqZWN0IGFyZSByZW1vdmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUFsbE1lc3NhZ2VzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCA9PSBudWxsKSB7Ci0JCQlvYmplY3QgPSBnZXREZWZhdWx0T2JqZWN0KCk7Ci0JCX0KLQotCQlfbWVzc2FnZXMucmVtb3ZlKG9iamVjdCk7Ci0JfQotCQotCS8qKgotCSAqIFJlbW92ZSBhbGwgbWVzc2FnZXMgdGhhdCBhcHBseSB0byB0aGUgZ2l2ZW4gb2JqZWN0IHdoaWNoIGFyZSBpbgotCSAqIHRoZSBuYW1lZCBncm91cC4gSWYgT2JqZWN0IGlzIG51bGwsIHRoZSBkZWZhdWx0IG9iamVjdCBpcyB1c2VkLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZU1lc3NhZ2VTdWJzZXQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIGdyb3VwTmFtZSkgewotCQlpZiAoZ3JvdXBOYW1lID09IG51bGwpIHsKLQkJCXJlbW92ZUFsbE1lc3NhZ2VzKG9iamVjdCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAob2JqZWN0ID09IG51bGwpIHsKLQkJCW9iamVjdCA9IGdldERlZmF1bHRPYmplY3QoKTsKLQkJfQotCi0JCUxpc3QgbGlzdCA9IChMaXN0KSBfbWVzc2FnZXMuZ2V0KG9iamVjdCk7Ci0JCWlmIChsaXN0ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChsaXN0LnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJSU1lc3NhZ2UgbXNnID0gKElNZXNzYWdlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlTdHJpbmcgbXNnR3JvdXBOYW1lID0gbXNnLmdldEdyb3VwTmFtZSgpOwotCQkJaWYgKGdyb3VwTmFtZS5lcXVhbHMobXNnR3JvdXBOYW1lKSkgewotCQkJCWxpc3QucmVtb3ZlKG1zZyk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcGx1Z2luLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjA4ZDAyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4KLSAgIGlkPSJvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUiCi0gICBuYW1lPSJQcm9wZXJ0aWVzIFZhbGlkYXRvciIKLSAgIHZlcnNpb249IjEuMS4wIgotICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS53b3JrYmVuY2hpbXBsLlByb3BlcnRpZXNWYWxpZGF0b3JQbHVnaW4iPgotCi0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9InJ1bnRpbWUvcHJvcGVydGllc1ZhbGlkYXRvci5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZHQuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuaGVscCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmplbS51dGlsIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0KLTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhLS0gUHJvcGVydGllcyBWYWxpZGF0b3IgQ29udHJpYnV0aW9ucyAgICAtLT4KLTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJQcm9wZXJ0aWVzVmFsaWRhdG9yIgotICAgICAgICAgbmFtZT0iUHJvcGVydGllcyBWYWxpZGF0b3IiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udmFsaWRhdG9yIj4KLSAgICAgIDx2YWxpZGF0b3I+Ci0gICAgICAgICA8cHJvamVjdE5hdHVyZQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmUiPgotICAgICAgICAgPC9wcm9qZWN0TmF0dXJlPgotICAgICAgICAgPGZpbHRlcgotICAgICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotICAgICAgICAgICAgICAgbmFtZUZpbHRlcj0iKi5wcm9wZXJ0aWVzIgotICAgICAgICAgICAgICAgYWN0aW9uPSJhZGQsIGNoYW5nZSI+Ci0gICAgICAgICA8L2ZpbHRlcj4KLSAgICAgICAgIDxydW4KLSAgICAgICAgICAgICAgIGVuYWJsZWQ9ImZhbHNlIgotICAgICAgICAgICAgICAgYXN5bmM9ImZhbHNlIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS5Qcm9wZXJ0aWVzVmFsaWRhdG9yIj4KLSAgICAgICAgIDwvcnVuPgotICAgICAgICAgPGhlbHBlcgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS53b3JrYmVuY2hpbXBsLlByb3BlcnRpZXNIZWxwZXIiPgotICAgICAgICAgPC9oZWxwZXI+Ci0gICAgICA8L3ZhbGlkYXRvcj4KLSAgIDwvZXh0ZW5zaW9uPgotPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCEtLSBWYWxpZGF0aW9uIERvY3VtZW50YXRpb24gICAgICAgICAgICAgIC0tPgotPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSBWYWxpZGF0b3IgRGV2ZWxvcGVyJ3MgR3VpZGUgICAgICAgICAgIC0tPgotPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj4KLSAgICAgIDx0b2MKLSAgICAgICAgICAgIGZpbGU9ImRvYy9kZXZlbG9wZXJHdWlkZS90b2MueG1sIgotICAgICAgICAgICAgcHJpbWFyeT0idHJ1ZSI+Ci0gICAgICA8L3RvYz4KLSAgIDwvZXh0ZW5zaW9uPgotLS0+Ci08IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tIFZhbGlkYXRpb24gR3VpZGUgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC50b2MiPgotICAgICAgPHRvYwotICAgICAgICAgICAgZmlsZT0iZG9jL2d1aWRlL3RvYy54bWwiCi0gICAgICAgICAgICBwcmltYXJ5PSJ0cnVlIj4KLSAgICAgIDwvdG9jPgotICAgPC9leHRlbnNpb24+Ci0tLT4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcC5iYXQgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcC5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwYmY5NDAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3AuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0gCi1SRU0gKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMiwgMjAwMyAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAotUkVNIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUgCi1SRU0gcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuIAotUkVNIAotUkVNIERJU0NMQUlNRVIgT0YgV0FSUkFOVElFUy4KLVJFTSBUaGUgZm9sbG93aW5nIFtlbmNsb3NlZF0gY29kZSBpcyBzYW1wbGUgY29kZSBjcmVhdGVkIGJ5IElCTQotUkVNIENvcnBvcmF0aW9uLiBUaGlzIHNhbXBsZSBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFueSBzdGFuZGFyZCBvciBJQk0KLVJFTSBwcm9kdWN0IGFuZCBpcyBwcm92aWRlZCB0byB5b3Ugc29sZWx5IGZvciB0aGUgcHVycG9zZSBvZiBhc3Npc3RpbmcKLVJFTSB5b3UgaW4gdGhlIGRldmVsb3BtZW50IG9mIHlvdXIgYXBwbGljYXRpb25zLiAgVGhlIGNvZGUgaXMgcHJvdmlkZWQKLVJFTSAiQVMgSVMiLiBJQk0gTUFLRVMgTk8gV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUCi1SRU0gTk9UIExJTUlURUQgVE8gVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKLVJFTSBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIFJFR0FSRElORyBUSEUgRlVOQ1RJT04gT1IgUEVSRk9STUFOQ0UgT0YKLVJFTSBUSElTIENPREUuICBUSElTIENPREUgTUFZIENPTlRBSU4gRVJST1JTLiAgSUJNIHNoYWxsIG5vdCBiZSBsaWFibGUKLVJFTSBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBvdXQgb2YgeW91ciB1c2Ugb2YgdGhlIHNhbXBsZSBjb2RlLCBldmVuCi1SRU0gaWYgaXQgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotUkVNIAotUkVNIFRoaXMgYmF0Y2ggZmlsZSBmaXJlcyBvZmYgdGhlIHByb3BlcnR5IGZpbGUgcGFyc2Ugb3IgY29tcGFyaXNvbi4KLVJFTQotc2V0bG9jYWwKLQotaWYgIiVKQVZBX0hPTUUlIiBFUVUgIiIgZ290byBOT19KQVZBCi0KLXNldCBDTEFTU1BBVEg9JUNMQVNTUEFUSCU7Li5cY29tLmlibS5ldG9vbHMudmFsaWRhdGlvbi5jb3JlXzUuMS4wXHJ1bnRpbWVcY29tbW9uLmphcgotc2V0IENMQVNTUEFUSD0lQ0xBU1NQQVRIJTsuXHJ1bnRpbWVccHJvcGVydGllc1ZhbGlkYXRvci5qYXIKLWlmICIlMSIgPT0gIiIgZ290byBzeW50YXgKLQotJUpBVkFfSE9NRSVcYmluXGphdmEgY29tLmlibS5ldG9vbHMucGFyc2VyLk1haW4gJTEgJTIgJTMKLWdvdG8gOmVuZAotCi06Tk9fSkFWQQotZWNoby4KLWVjaG8gVGhlIEpBVkFfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBtdXN0IGJlIHNldCB0byB0aGUgSlJFIGRpcmVjdG9yeS4KLWVjaG8gZS5nLiwgc2V0IEpBVkFfSE9NRT1DOlxKUkUKLWVjaG8gd2hlcmUgSlJFIGhhcyBhIHN1YmRpcmVjdG9yeSBuYW1lZCAiYmluIgotZWNoby4KLWdvdG8gOmVuZAotCi06c3ludGF4Ci0lSkFWQV9IT01FJVxiaW5camF2YSBjb20uaWJtLmV0b29scy5wYXJzZXIuTWFpbgotCi06ZW5kCi1lbmRsb2NhbAotQGVjaG8gb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcGVydGllc1ZhbEZTL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9maWxlc3lzdGVtaW1wbC9GaWxlc3lzdGVtUHJvcGVydGllc0hlbHBlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxGUy9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvZmlsZXN5c3RlbWltcGwvRmlsZXN5c3RlbVByb3BlcnRpZXNIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJiYmZiMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcGVydGllc1ZhbEZTL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9maWxlc3lzdGVtaW1wbC9GaWxlc3lzdGVtUHJvcGVydGllc0hlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlLmZpbGVzeXN0ZW1pbXBsOwotLyoKLSAqIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNIAotICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMiwgMjAwMyAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAotICogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSAKLSAqIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLiAKLSAqCi0gKiBESVNDTEFJTUVSIE9GIFdBUlJBTlRJRVMuCi0gKiBUaGUgZm9sbG93aW5nIFtlbmNsb3NlZF0gY29kZSBpcyBzYW1wbGUgY29kZSBjcmVhdGVkIGJ5IElCTQotICogQ29ycG9yYXRpb24uIFRoaXMgc2FtcGxlIGNvZGUgaXMgbm90IHBhcnQgb2YgYW55IHN0YW5kYXJkIG9yIElCTQotICogcHJvZHVjdCBhbmQgaXMgcHJvdmlkZWQgdG8geW91IHNvbGVseSBmb3IgdGhlIHB1cnBvc2Ugb2YgYXNzaXN0aW5nCi0gKiB5b3UgaW4gdGhlIGRldmVsb3BtZW50IG9mIHlvdXIgYXBwbGljYXRpb25zLiAgVGhlIGNvZGUgaXMgcHJvdmlkZWQKLSAqICJBUyBJUyIuIElCTSBNQUtFUyBOTyBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCi0gKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIFJFR0FSRElORyBUSEUgRlVOQ1RJT04gT1IgUEVSRk9STUFOQ0UgT0YKLSAqIFRISVMgQ09ERS4gIFRISVMgQ09ERSBNQVkgQ09OVEFJTiBFUlJPUlMuICBJQk0gc2hhbGwgbm90IGJlIGxpYWJsZQotICogZm9yIGFueSBkYW1hZ2VzIGFyaXNpbmcgb3V0IG9mIHlvdXIgdXNlIG9mIHRoZSBzYW1wbGUgY29kZSwgZXZlbgotICogaWYgaXQgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotICogCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkxpbmVOdW1iZXJSZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUuUE1vZGVsRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUuZmlsZXN5c3RlbS5JRmlsZXN5c3RlbUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUucGFyc2VyLkFQcm9wZXJ0eUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlLnBhcnNlci5Qcm9wZXJ0eUxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5GaWxlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5JRmlsZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB0aGUgSVZhbGlkYXRpb25Db250ZXh0IGltcGxlbWVudGF0aW9uLCB1c2VkIGJ5IHRoZSBQcm9wZXJ0aWVzVmFsaWRhdG9yLAotICogd2hlbiB0aGUgdmFsaWRhdG9yIGlzIHJ1biBpbiB0aGUgZmlsZXN5c3RlbSB2YWxpZGF0aW9uIGZyYW1ld29yay4KLSAqLwotcHVibGljIGNsYXNzIEZpbGVzeXN0ZW1Qcm9wZXJ0aWVzSGVscGVyIGltcGxlbWVudHMgSUZpbGVzeXN0ZW1IZWxwZXIgewotCXB1YmxpYyBGaWxlc3lzdGVtUHJvcGVydGllc0hlbHBlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24uY29yZS5JVmFsaWRhdGlvbkNvbnRleHQjbG9hZE1vZGVsKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGxvYWRNb2RlbChTdHJpbmcgc3ltYm9saWNOYW1lKSB7Ci0JCXJldHVybiBsb2FkTW9kZWwoc3ltYm9saWNOYW1lLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24uY29yZS5JVmFsaWRhdGlvbkNvbnRleHQjbG9hZE1vZGVsKFN0cmluZywgT2JqZWN0W10pCi0JICovCi0JcHVibGljIE9iamVjdCBsb2FkTW9kZWwoU3RyaW5nIHN5bWJvbGljTmFtZSwgT2JqZWN0W10gcGFybSkgewotCQlpZiAoKHN5bWJvbGljTmFtZSA9PSBudWxsKSB8fCAoc3ltYm9saWNOYW1lLmVxdWFscygiIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaWYgKHN5bWJvbGljTmFtZS5lcXVhbHMoUE1vZGVsRW51bS5MSU5FSU5QVVRSRUFERVIpICYmIChwYXJtICE9IG51bGwpICYmIChwYXJtLmxlbmd0aCA9PSAxKSAmJiAocGFybVswXSBpbnN0YW5jZW9mIFN0cmluZykpIHsKLQkJCXJldHVybiBsb2FkTGluZU51bWJlclJlYWRlcigoU3RyaW5nKSBwYXJtWzBdKTsKLQkJfQotCQllbHNlIGlmIChzeW1ib2xpY05hbWUuZXF1YWxzKFBNb2RlbEVudW0uUkVMRUFTRV9MSU5FSU5QVVRSRUFERVIpICYmIChwYXJtICE9IG51bGwpICYmIChwYXJtLmxlbmd0aCA9PSAxKSAmJiAocGFybVswXSBpbnN0YW5jZW9mIExpbmVOdW1iZXJSZWFkZXIpKSB7Ci0JCQlyZXR1cm4gcmVsZWFzZUxpbmVOdW1iZXJSZWFkZXIoKExpbmVOdW1iZXJSZWFkZXIpIHBhcm1bMF0pOwotCQl9Ci0JCWVsc2UgaWYgKHN5bWJvbGljTmFtZS5lcXVhbHMoUE1vZGVsRW51bS5BTExfUFJPUEVSVElFU19GSUxFUykpIHsKLQkJCXJldHVybiBsb2FkQWxsUHJvcGVydGllc0ZpbGVzKCk7Ci0JCX0KLQkJZWxzZSBpZihzeW1ib2xpY05hbWUuZXF1YWxzKFBNb2RlbEVudW0uRklMVEVSKSkgewotCQkJLy8gQmVjYXVzZSB0aGlzIGVudmlyb25tZW50IGRvZXMgbm90IGNvcHkgcmVzb3VyY2VzIGludG8gYSAiYmluIiBkaXJlY3RvcnksCi0JCQkvLyB0aGUgaW5wdXQgaXMgYWxyZWFkeSBmaWx0ZXJlZC4KLQkJCXJldHVybiBwYXJtOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiB0aGUgZmlsZSBuYW1lIG9mIGFuIGV4aXN0aW5nIC5wcm9wZXJ0aWVzIGZpbGUsIHJldHVybgotCSAqIHRoZSBMaW5lTnVtYmVyUmVhZGVyIHRoYXQgd2lsbCByZWFkIHRoZSBmaWxlLgotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgbG9hZExpbmVOdW1iZXJSZWFkZXIoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCUZpbGUgcHJvcGVydHlGaWxlID0gbmV3IEZpbGUoZmlsZU5hbWUpOwotCQlpZiAoIXByb3BlcnR5RmlsZS5leGlzdHMoKSB8fCAhcHJvcGVydHlGaWxlLmlzRmlsZSgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUZpbGVSZWFkZXIgaW5wdXQgPSBudWxsOwotCQl0cnkgewotCQkJaW5wdXQgPSBuZXcgRmlsZVJlYWRlcihwcm9wZXJ0eUZpbGUpOwotCQl9Ci0JCWNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBCZWNhdXNlIHdlIHdhbnQgdG8gcmVhZCBpbiBhIGxpbmUgYXQgYSB0aW1lIGZyb20gdGhlIGZpbGUsIGNvbnZlcnQgdGhlIEZpbGVSZWFkZXIgdG8gYSBMaW5lUmVhZGVyCi0JCUxpbmVOdW1iZXJSZWFkZXIgbGluZUlucHV0ID0gbmV3IExpbmVOdW1iZXJSZWFkZXIoaW5wdXQpOwotCQlyZXR1cm4gbGluZUlucHV0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbG9hZCBhbnl0aGluZzsgaXQgcmVsZWFzZXMgdGhlIHJlc291cmNlcyBhbGxvY2F0ZWQKLQkgKiBieSB0aGUgbG9hZExpbmVOdW1iZXJSZWFkZXIgbWV0aG9kLiBJdHMgcmVzdWx0IHdpbGwgbmV2ZXIgYmUgdXNlZCwgc28gYWx3YXlzCi0JICogcmV0dXJuIG51bGwuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCByZWxlYXNlTGluZU51bWJlclJlYWRlcihMaW5lTnVtYmVyUmVhZGVyIHJlYWRlcikgewotCQlpZiAocmVhZGVyID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCXJlYWRlci5jbG9zZSgpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBXaGVuIHRoZSB2YWxpZGF0b3IgaXMgdG9sZCB0byBwZXJmb3JtIGEgZnVsbCB2YWxpZGF0aW9uLCB0aGlzCi0JICogbWV0aG9kIHJldHVybnMgYW4gSUZpbGVEZWx0YVtdLCB3aXRoIG9uZSBJRmlsZURlbHRhIGZvciBldmVyeQotCSAqIC5wcm9wZXJ0aWVzIGZpbGUgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGFuZCBpdHMgc3ViZGlyZWN0b3JpZXMuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBsb2FkQWxsUHJvcGVydGllc0ZpbGVzKCkgewotCQlTdHJpbmcgcHdkID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpOyAvLyROT04tTkxTLTEkCi0JCUZpbGUgcHdkRGlyID0gbmV3IEZpbGUocHdkKTsKLQkJaWYgKCFwd2REaXIuZXhpc3RzKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaWYgKCFwd2REaXIuaXNEaXJlY3RvcnkoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlTZXQgdGVtcFNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCXRyYXZlcnNlRGlyZWN0b3JpZXMocHdkRGlyLCB0ZW1wU2V0KTsKLQkJCi0JCUlGaWxlRGVsdGFbXSByZXN1bHQgPSBuZXcgSUZpbGVEZWx0YVt0ZW1wU2V0LnNpemUoKV07Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gdGVtcFNldC5pdGVyYXRvcigpOwotCQlpbnQgY291bnQgPSAwOwotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUZpbGUgZmlsZSA9IChGaWxlKWl0ZXJhdG9yLm5leHQoKTsKLQkJCXJlc3VsdFtjb3VudCsrXSA9IG5ldyBGaWxlRGVsdGEoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgSUZpbGVEZWx0YS5DSEFOR0VEKTsKLQkJfQotCQl0ZW1wU2V0LmNsZWFyKCk7Ci0JCXRlbXBTZXQgPSBudWxsOwotCQlpdGVyYXRvciA9IG51bGw7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVHJhdmVyc2UgdGhlIGRpcmVjdG9yeSwgbG9va2luZyBmb3IgLnByb3BlcnRpZXMgZmlsZXMsIGFuZCBpZiBhCi0JICogLnByb3BlcnRpZXMgZmlsZSBpcyBmb3VuZCB0aGVuIGFkZCBpdCB0byB0aGUgU2V0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRyYXZlcnNlRGlyZWN0b3JpZXMoRmlsZSBkaXJlY3RvcnlUb1NlYXJjaCwgU2V0IHJlc3VsdCkgewotCQlpZiAoZGlyZWN0b3J5VG9TZWFyY2ggPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKGRpcmVjdG9yeVRvU2VhcmNoLmlzRGlyZWN0b3J5KCkpIHsKLQkJCS8vIFRyYXZlcnNlIGludG8gdGhpcyBkaXJlY3RvcnkncyBjaGlsZHJlbi4KLQkJCVN0cmluZ1tdIGNoaWxkcmVuID0gZGlyZWN0b3J5VG9TZWFyY2gubGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCUZpbGUgY2hpbGQgPSBuZXcgRmlsZShkaXJlY3RvcnlUb1NlYXJjaCwgY2hpbGRyZW5baV0pOwotCQkJCXRyYXZlcnNlRGlyZWN0b3JpZXMoY2hpbGQsIHJlc3VsdCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZihkaXJlY3RvcnlUb1NlYXJjaC5pc0ZpbGUoKSkgewotCQkJU3RyaW5nIGZpbGVOYW1lID0gZGlyZWN0b3J5VG9TZWFyY2guZ2V0TmFtZSgpOwotCQkJaWYoKGZpbGVOYW1lICE9IG51bGwpICYmIGZpbGVOYW1lLmVuZHNXaXRoKCJwcm9wZXJ0aWVzIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdC5hZGQoZGlyZWN0b3J5VG9TZWFyY2gpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIEdpdmVuIGFuIElNZXNzYWdlLCByZXR1cm4gdGhlIGZpbGUgbmFtZSBvZiB0aGUgLnByb3BlcnRpZXMgZmlsZSB0aGF0Ci0JICogdGhlIG1lc3NhZ2Ugd2FzIHJlcG9ydGVkIGFnYWluc3QuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWxlTmFtZShJTWVzc2FnZSBtZXNzYWdlKSB7Ci0JCU9iamVjdCBvYmplY3QgPSBtZXNzYWdlLmdldFRhcmdldE9iamVjdCgpOwotCQlpZihvYmplY3QgaW5zdGFuY2VvZiBQcm9wZXJ0eUxpbmUpIHsKLQkJCVByb3BlcnR5TGluZSBsaW5lID0gKFByb3BlcnR5TGluZSlvYmplY3Q7Ci0JCQlBUHJvcGVydHlGaWxlIHBGaWxlID0gbGluZS5nZXRGaWxlKCk7Ci0JCQlyZXR1cm4gcEZpbGUuZ2V0UXVhbGlmaWVkRmlsZU5hbWUoKTsgLy8gYSBWYWxpZGF0aW9uUHJvcGVydHlGaWxlIHJldHVybnMgdGhlIGZpbGUgbmFtZSBhcyBpdHMgcXVhbGlmaWVkIG5hbWUKLQkJfQotCQllbHNlIGlmKG9iamVjdCBpbnN0YW5jZW9mIEFQcm9wZXJ0eUZpbGUpIHsKLQkJCUFQcm9wZXJ0eUZpbGUgcEZpbGUgPSAoQVByb3BlcnR5RmlsZSlvYmplY3Q7Ci0JCQlyZXR1cm4gcEZpbGUuZ2V0UXVhbGlmaWVkRmlsZU5hbWUoKTsgLy8gYSBWYWxpZGF0aW9uUHJvcGVydHlGaWxlIHJldHVybnMgdGhlIGZpbGUgbmFtZSBhcyBpdHMgcXVhbGlmaWVkIG5hbWUKLQkJfQotCQlyZXR1cm4gIiI7CS8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0VVJJcygpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcGVydGllc1ZhbFdCL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS93b3JrYmVuY2hpbXBsL1BsdWdpblByb3BlcnR5RmlsZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxXQi9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvd29ya2JlbmNoaW1wbC9QbHVnaW5Qcm9wZXJ0eUZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRkYzcwNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcGVydGllc1ZhbFdCL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS93b3JrYmVuY2hpbXBsL1BsdWdpblByb3BlcnR5RmlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMyICswLDAgQEAKLS8qCi0gKiAoYykgQ29weXJpZ2h0IDIwMDEgTXlDb3Jwb3JhdGlvbi4KLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlLndvcmtiZW5jaGltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkxpbmVOdW1iZXJSZWFkZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbHVnaW5SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS5wYXJzZXIuQVByb3BlcnR5RmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUucGFyc2VyLk1lc3NhZ2VNZXRhRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0vKioKLSAqIEEgUGx1Z2luUHJvcGVydHlGaWxlIHJlcHJlc2VudHMgYSByZXNvdXJjZSBidW5kbGUgdGhhdCBpcyBleHBvcnRlZCBieSBhIHBsdWdpbi4KLSAqLwotcHVibGljIGNsYXNzIFBsdWdpblByb3BlcnR5RmlsZSBleHRlbmRzIEFQcm9wZXJ0eUZpbGUgewotCXByaXZhdGUgU3RyaW5nIF9idW5kbGVOYW1lID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBfcGx1Z2luSWQgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIF9sYW5nVmFyaWFudCA9IG51bGw7IC8vIGUuZy4sIGVuX1VTIHZzIGVuCi0JcHJpdmF0ZSBDbGFzc0xvYWRlciBfY2xhc3NMb2FkZXIgPSBudWxsOyAvLyB0aGUgQ2xhc3NMb2FkZXIgdXNlZCB0byBsb2FkIHRoZSBidW5kbGUKLQkKLQkKLQkvKioKLQkgKiBCb3RoIHRoZSBwbHVnaW5JZCBhbmQgdGhlIGJ1bmRsZU5hbWUgbXVzdCBub3QgYmUgbnVsbCwgbXVzdAotCSAqIHJlZmVyIHRvIGFuIGV4aXN0aW5nIHBsdWdpbiwgYW5kIG11c3QgcmVmZXIgdG8gYW4gZXhpc3RpbmcgYnVuZGxlIAotCSAqIGV4cG9ydGVkIGJ5IHRoYXQgcGx1Z2luLgotCSAqLwotCXB1YmxpYyBQbHVnaW5Qcm9wZXJ0eUZpbGUoU3RyaW5nIHBsdWdpbklkLCBTdHJpbmcgYnVuZGxlTmFtZSkgewotCQlfcGx1Z2luSWQgPSBwbHVnaW5JZDsKLQkJX2J1bmRsZU5hbWUgPSBidW5kbGVOYW1lOwotCQkKLQkJQ2xhc3NMb2FkZXIgY2wgPSBudWxsOwotCQlJbnB1dFN0cmVhbSBpblMgPSBudWxsOwotCQlQbHVnaW4gcGx1Z2luID0gZ2V0UGx1Z2luKHBsdWdpbklkKTsJCQkKLQkJaWYoYnVuZGxlTmFtZS5lcXVhbHMoInBsdWdpbiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIFRyeSBsb2FkaW5nIGl0IGZyb20gdGhlIFBsdWdpbiBwYXJlbnQgKGEgInBsdWdpbi5wcm9wZXJ0aWVzIikKLQkJCWNsID0gZ2V0UGx1Z2luUHJvcGVydGllc0NsYXNzTG9hZGVyKHBsdWdpbik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQljbCA9IHBsdWdpbi5nZXREZXNjcmlwdG9yKCkuZ2V0UGx1Z2luQ2xhc3NMb2FkZXIoKTsKLQkJfQotCQlpblMgPSBnZXRJbnB1dFN0cmVhbShjbCwgYnVuZGxlTmFtZSk7Ci0JCQotCQlJbnB1dFN0cmVhbVJlYWRlciBpblIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW5TKTsKLQkJTGluZU51bWJlclJlYWRlciBsaW5lUiA9IG5ldyBMaW5lTnVtYmVyUmVhZGVyKGluUik7Ci0JCXBhcnNlRmlsZShsaW5lUik7IC8vIHBvcHVsYXRlIHRoaXMgcHJvcGVydHkgZmlsZQotCQl0cnkgewotCQkJbGluZVIuY2xvc2UoKTsKLQkJCWluUi5jbG9zZSgpOwotCQl9Ci0JCWNhdGNoKElPRXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IFByb3BlcnRpZXNWYWxpZGF0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7OwotCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJfQotCQl9Ci0JCQotCQl0cnkgewotCQkJaWYoaW5TICE9IG51bGwpIHsKLQkJCQlpblMuY2xvc2UoKTsKLQkJCX0KLQkJfQotCQljYXRjaChJT0V4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBQcm9wZXJ0aWVzVmFsaWRhdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJfQotCQl9Ci0JCQotCQlfY2xhc3NMb2FkZXIgPSBjbDsgLy8gc3RvcmUgdGhlIENsYXNzTG9hZGVyIHdoaWNoIHdhcyB1c2VkIHRvIGxvYWQgdGhlIGJ1bmRsZQotCX0KLQkKLQlwcml2YXRlIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKENsYXNzTG9hZGVyIGNsLCBTdHJpbmcgYnVuZGxlTmFtZSkgewotCQlMb2NhbGUgbCA9IExvY2FsZS5nZXREZWZhdWx0KCk7Ci0JCVN0cmluZyBsYW5ndWFnZSA9IGwuZ2V0TGFuZ3VhZ2UoKTsKLQkJU3RyaW5nIGNvdW50cnkgPSBsLmdldENvdW50cnkoKTsKLQkJU3RyaW5nIHZhcmlhbnQgPSBsLmdldFZhcmlhbnQoKTsKLQkJCi0JCVN0cmluZyBsYW5nID0gbnVsbDsKLQkJU3RyaW5nIGxhbmdfY291bnRyeSA9IG51bGw7Ci0JCVN0cmluZyBsYW5nX2NvdW50cnlfdmFyaWFudCA9IG51bGw7Ci0JCWlmKChsYW5ndWFnZSAhPSBudWxsKSAmJiAhKGxhbmd1YWdlLmVxdWFscygiIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWxhbmcgPSAiXyIgKyBsYW5ndWFnZTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYoKGNvdW50cnkgIT0gbnVsbCkgJiYgIShjb3VudHJ5LmVxdWFscygiIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWxhbmdfY291bnRyeSA9IGxhbmcgKyAiXyIgKyBjb3VudHJ5OyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZigodmFyaWFudCAhPSBudWxsKSAmJiAhKHZhcmlhbnQuZXF1YWxzKCIiKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJbGFuZ19jb3VudHJ5X3ZhcmlhbnQgPSBsYW5nX2NvdW50cnkgKyAiXyIgKyB2YXJpYW50OyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCUlucHV0U3RyZWFtIGluUyA9IG51bGw7Ci0JCWlmKGxhbmdfY291bnRyeV92YXJpYW50ICE9IG51bGwpIHsKLQkJCWluUyA9IGdldFJlc291cmNlQXNTdHJlYW0oY2wsIGJ1bmRsZU5hbWUsIGxhbmdfY291bnRyeV92YXJpYW50KTsKLQkJCWlmKGluUyAhPSBudWxsKSB7Ci0JCQkJX2xhbmdWYXJpYW50ID0gbGFuZ19jb3VudHJ5X3ZhcmlhbnQ7Ci0JCQkJcmV0dXJuIGluUzsKLQkJCX0KLQkJfQotCQkKLQkJaWYobGFuZ19jb3VudHJ5ICE9IG51bGwpIHsKLQkJCWluUyA9IGdldFJlc291cmNlQXNTdHJlYW0oY2wsIGJ1bmRsZU5hbWUsIGxhbmdfY291bnRyeSk7Ci0JCQlpZihpblMgIT0gbnVsbCkgewotCQkJCV9sYW5nVmFyaWFudCA9IGxhbmdfY291bnRyeTsKLQkJCQlyZXR1cm4gaW5TOwotCQkJfQotCQl9Ci0JCQotCQlpZihsYW5nICE9IG51bGwpIHsKLQkJCWluUyA9IGdldFJlc291cmNlQXNTdHJlYW0oY2wsIGJ1bmRsZU5hbWUsIGxhbmcpOwotCQkJaWYoaW5TICE9IG51bGwpIHsKLQkJCQlfbGFuZ1ZhcmlhbnQgPSBsYW5nOwotCQkJCXJldHVybiBpblM7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmKExvY2FsZS5nZXREZWZhdWx0KCkuZXF1YWxzKExvY2FsZS5VUykpIHsKLQkJCS8vIFJ1bm5pbmcgdGhlIFRWVCBwbHVnaW4gaW4gZW5fVVMgbW9kZSwgc28gcmV0dXJuIHRoZSBkZWZhdWx0IC5wcm9wZXJ0aWVzIGZpbGUuCi0JCQlpblMgPSBnZXRSZXNvdXJjZUFzU3RyZWFtKGNsLCBidW5kbGVOYW1lLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmKGluUyAhPSBudWxsKSB7Ci0JCQkJX2xhbmdWYXJpYW50ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gaW5TOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgSW5wdXRTdHJlYW0gZ2V0UmVzb3VyY2VBc1N0cmVhbShmaW5hbCBDbGFzc0xvYWRlciBjbCwgZmluYWwgU3RyaW5nIGJ1bmRsZU5hbWUsIGZpbmFsIFN0cmluZyBsYW5ndWFnZSkgewotCQlTdHJpbmcgcmVzTmFtZSA9IGJ1bmRsZU5hbWUucmVwbGFjZSgnLicsICcvJykgKyBsYW5ndWFnZSArICIucHJvcGVydGllcyI7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGNsLmdldFJlc291cmNlQXNTdHJlYW0ocmVzTmFtZSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIENsYXNzTG9hZGVyIGdldFBsdWdpblByb3BlcnRpZXNDbGFzc0xvYWRlcihQbHVnaW4gcCkgewotCQkvLyBDb3BpZWQgZnJvbSBQbHVnaW5EZXNjcmlwdG9yLmphdmEncyBnZXRSZXNvdXJjZUJ1bmRsZSBtZXRob2QuCi0JCVVSTFtdIGNwID0gKChVUkxDbGFzc0xvYWRlcilwLmdldERlc2NyaXB0b3IoKS5nZXRQbHVnaW5DbGFzc0xvYWRlcigpKS5nZXRVUkxzKCk7Ci0JCVVSTFtdIG5ld2NwID0gbmV3IFVSTFtjcC5sZW5ndGgrMV07Ci0JCWZvciAoaW50IGk9MDsgaTxjcC5sZW5ndGg7IGkrKykgbmV3Y3BbaSsxXSA9IGNwW2ldOwotCQl0cnkgewotCQkJbmV3Y3BbMF0gPSBQbGF0Zm9ybS5yZXNvbHZlKHAuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoIi8iKSk7IC8vJE5PTi1OTFMtMSQgLy8gYWx3YXlzIHRyeSB0byByZXNvbHZlIFVSTHMgdXNlZCBpbiBsb2FkZXJzCi0JCX0gY2F0Y2goSU9FeGNlcHRpb24gZSkgewotCQkJbmV3Y3BbMF0gPSBwLmdldEJ1bmRsZSgpLmdldEVudHJ5KCIvIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlDbGFzc0xvYWRlciByZXNvdXJjZUxvYWRlciA9IG5ldyBVUkxDbGFzc0xvYWRlcihuZXdjcCwgbnVsbCk7Ci0JCXJldHVybiByZXNvdXJjZUxvYWRlcjsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgUGx1Z2luIGdldFBsdWdpbihTdHJpbmcgcGx1Z2luSWQpIHsKLQkJaWYgKHBsdWdpbklkID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJSVBsdWdpblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0UGx1Z2luUmVnaXN0cnkoKTsKLQkJSVBsdWdpbkRlc2NyaXB0b3IgcGx1Z2luRGVzYyA9IHJlZ2lzdHJ5LmdldFBsdWdpbkRlc2NyaXB0b3IocGx1Z2luSWQpOwotCQlpZihwbHVnaW5EZXNjID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQl0cnkgewotCQkJcmV0dXJuIHBsdWdpbkRlc2MuZ2V0UGx1Z2luKCk7Ci0JCX0KLQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBQcm9wZXJ0aWVzVmFsaWRhdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOzsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCX0KLQotCQotCS8qCi0JICogQHNlZSBBUHJvcGVydHlGaWxlI3JlcG9ydChTdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgcmVwb3J0KFN0cmluZyBzdHIpIHsKLQkJYWRkUGFyc2VXYXJuaW5nKG5ldyBNZXNzYWdlTWV0YURhdGEoc3RyKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlcG9ydChJTWVzc2FnZSBtZXNzYWdlKSB7Ci0JCU1lc3NhZ2VNZXRhRGF0YSBtbWQgPSBuZXcgTWVzc2FnZU1ldGFEYXRhKG1lc3NhZ2UuZ2V0QnVuZGxlTmFtZSgpLCBtZXNzYWdlLmdldFNldmVyaXR5KCksIG1lc3NhZ2UuZ2V0SWQoKSwgbWVzc2FnZS5nZXRQYXJhbXMoKSwgbWVzc2FnZS5nZXRUYXJnZXRPYmplY3QoKSwgbWVzc2FnZS5nZXRMaW5lTnVtYmVyKCksIG1lc3NhZ2UuZ2V0T2Zmc2V0KCksIG1lc3NhZ2UuZ2V0TGVuZ3RoKCkpOwotCQlhZGRQYXJzZVdhcm5pbmcobW1kKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVwb3J0KE1lc3NhZ2VNZXRhRGF0YSBtbWQpIHsKLQkJYWRkUGFyc2VXYXJuaW5nKG1tZCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZFBhcnNlV2FybmluZyhJTWVzc2FnZSBtZXNzYWdlKSB7Ci0JCU1lc3NhZ2VNZXRhRGF0YSBtbWQgPSBuZXcgTWVzc2FnZU1ldGFEYXRhKG1lc3NhZ2UuZ2V0QnVuZGxlTmFtZSgpLCBtZXNzYWdlLmdldFNldmVyaXR5KCksIG1lc3NhZ2UuZ2V0SWQoKSwgbWVzc2FnZS5nZXRQYXJhbXMoKSwgbWVzc2FnZS5nZXRUYXJnZXRPYmplY3QoKSwgbWVzc2FnZS5nZXRMaW5lTnVtYmVyKCksIG1lc3NhZ2UuZ2V0T2Zmc2V0KCksIG1lc3NhZ2UuZ2V0TGVuZ3RoKCkpOwotCQlhZGRQYXJzZVdhcm5pbmcobW1kKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRQbHVnaW5JZCgpIHsKLQkJcmV0dXJuIF9wbHVnaW5JZDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEJ1bmRsZU5hbWUoKSB7Ci0JCXJldHVybiBfYnVuZGxlTmFtZTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRRdWFsaWZpZWRGaWxlTmFtZSgpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoZ2V0UGx1Z2luSWQoKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoIjo6Iik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZChnZXRCdW5kbGVOYW1lKCkpOwotCQlidWZmZXIuYXBwZW5kKF9sYW5nVmFyaWFudCk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhbmdWYXJpYW50KCkgewotCQlyZXR1cm4gX2xhbmdWYXJpYW50OwotCX0KLQkKLQlwdWJsaWMgQ2xhc3NMb2FkZXIgZ2V0Q2xhc3NMb2FkZXIoKSB7Ci0JCXJldHVybiBfY2xhc3NMb2FkZXI7Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wcm9wZXJ0aWVzVmFsV0Ivb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL3dvcmtiZW5jaGltcGwvUHJvcGVydGllc0hlbHBlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxXQi9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvd29ya2JlbmNoaW1wbC9Qcm9wZXJ0aWVzSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzZmE4YWEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxXQi9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvd29ya2JlbmNoaW1wbC9Qcm9wZXJ0aWVzSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzQgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUud29ya2JlbmNoaW1wbDsKLS8qCi0gKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTSAKLSAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDIsIDIwMDMgLSBBbGwgUmlnaHRzIFJlc2VydmVkLiAKLSAqIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUgCi0gKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4gCi0gKgotICogRElTQ0xBSU1FUiBPRiBXQVJSQU5USUVTLgotICogVGhlIGZvbGxvd2luZyBbZW5jbG9zZWRdIGNvZGUgaXMgc2FtcGxlIGNvZGUgY3JlYXRlZCBieSBJQk0KLSAqIENvcnBvcmF0aW9uLiBUaGlzIHNhbXBsZSBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFueSBzdGFuZGFyZCBvciBJQk0KLSAqIHByb2R1Y3QgYW5kIGlzIHByb3ZpZGVkIHRvIHlvdSBzb2xlbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGFzc2lzdGluZwotICogeW91IGluIHRoZSBkZXZlbG9wbWVudCBvZiB5b3VyIGFwcGxpY2F0aW9ucy4gIFRoZSBjb2RlIGlzIHByb3ZpZGVkCi0gKiAiQVMgSVMiLiBJQk0gTUFLRVMgTk8gV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUCi0gKiBOT1QgTElNSVRFRCBUTyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwotICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBSRUdBUkRJTkcgVEhFIEZVTkNUSU9OIE9SIFBFUkZPUk1BTkNFIE9GCi0gKiBUSElTIENPREUuICBUSElTIENPREUgTUFZIENPTlRBSU4gRVJST1JTLiAgSUJNIHNoYWxsIG5vdCBiZSBsaWFibGUKLSAqIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIG91dCBvZiB5b3VyIHVzZSBvZiB0aGUgc2FtcGxlIGNvZGUsIGV2ZW4KLSAqIGlmIGl0IGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLSAqIAotICovCi0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkxpbmVOdW1iZXJSZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS5QTW9kZWxFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS5wYXJzZXIuQVByb3BlcnR5RmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUucGFyc2VyLlByb3BlcnR5TGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLklGaWxlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5Xb3JrYmVuY2hDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuV29ya2JlbmNoRmlsZURlbHRhOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgV2ViU3BoZXJlIFN0dWRpbyBJVmFsaWRhdGlvbkNvbnRleHQgZm9yIHRoZSAKLSAqIFByb3BlcnRpZXMgVmFsaWRhdG9yLgotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydGllc0hlbHBlciBleHRlbmRzIFdvcmtiZW5jaENvbnRleHQgewotCXB1YmxpYyBQcm9wZXJ0aWVzSGVscGVyKCkgewotCQlzdXBlcigpOwotCQkgCi0JCXJlZ2lzdGVyTW9kZWwoUE1vZGVsRW51bS5MSU5FSU5QVVRSRUFERVIsICJsb2FkTGluZU51bWJlclJlYWRlciIsIG5ldyBDbGFzc1tde2phdmEubGFuZy5TdHJpbmcuY2xhc3N9KTsgLy8kTk9OLU5MUy0xJAotCQlyZWdpc3Rlck1vZGVsKFBNb2RlbEVudW0uUkVMRUFTRV9MSU5FSU5QVVRSRUFERVIsICJyZWxlYXNlTGluZU51bWJlclJlYWRlciIsIG5ldyBDbGFzc1tde2phdmEuaW8uTGluZU51bWJlclJlYWRlci5jbGFzc30pOyAvLyROT04tTkxTLTEkCi0JCXJlZ2lzdGVyTW9kZWwoUE1vZGVsRW51bS5BTExfUFJPUEVSVElFU19GSUxFUywgImxvYWRBbGxQcm9wZXJ0aWVzRmlsZXMiKTsgLy8kTk9OLU5MUy0xJAotCQlyZWdpc3Rlck1vZGVsKFBNb2RlbEVudW0uTVNHTE9HR0VSLCAiZ2V0TXNnTG9nZ2VyIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVnaXN0ZXJNb2RlbChQTW9kZWxFbnVtLkZJTFRFUiwgImZpbHRlciIsIG5ldyBDbGFzc1tde0lGaWxlRGVsdGFbXS5jbGFzc30pOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy52YWxpZGF0ZS5JV29ya2JlbmNoQ29udGV4dCNnZXRUYXJnZXRPYmplY3ROYW1lKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldE9iamVjdE5hbWUoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy52YWxpZGF0ZS5JV29ya2JlbmNoQ29udGV4dCNnZXRSZXNvdXJjZShPYmplY3QpCi0JICovCi0JcHVibGljIElSZXNvdXJjZSBnZXRSZXNvdXJjZShPYmplY3Qgb2JqZWN0KSB7Ci0JCUlGaWxlIGZpbGUgPSBudWxsOwotCQlpZihvYmplY3QgaW5zdGFuY2VvZiBQcm9wZXJ0eUxpbmUpIHsKLQkJCVByb3BlcnR5TGluZSBsaW5lID0gKFByb3BlcnR5TGluZSlvYmplY3Q7Ci0JCQlBUHJvcGVydHlGaWxlIHBGaWxlID0gbGluZS5nZXRGaWxlKCk7Ci0JCQlTdHJpbmcgZmlsZU5hbWUgPSBwRmlsZS5nZXRRdWFsaWZpZWRGaWxlTmFtZSgpOyAvLyBhIFZhbGlkYXRpb25Qcm9wZXJ0eUZpbGUgcmV0dXJucyB0aGUgZmlsZSBuYW1lIGFzIGl0cyBxdWFsaWZpZWQgbmFtZQotCQkJZmlsZSA9IGdldEZpbGUoZmlsZU5hbWUpOwotCQl9Ci0JCWVsc2UgaWYob2JqZWN0IGluc3RhbmNlb2YgQVByb3BlcnR5RmlsZSkgewotCQkJQVByb3BlcnR5RmlsZSBwRmlsZSA9IChBUHJvcGVydHlGaWxlKW9iamVjdDsKLQkJCVN0cmluZyBmaWxlTmFtZSA9IHBGaWxlLmdldFF1YWxpZmllZEZpbGVOYW1lKCk7IC8vIGEgVmFsaWRhdGlvblByb3BlcnR5RmlsZSByZXR1cm5zIHRoZSBmaWxlIG5hbWUgYXMgaXRzIHF1YWxpZmllZCBuYW1lCi0JCQlmaWxlID0gZ2V0RmlsZShmaWxlTmFtZSk7Ci0JCX0KLQkJCi0JCWlmKChmaWxlID09IG51bGwpIHx8ICghZmlsZS5leGlzdHMoKSkpIHsKLQkJCXJldHVybiBzdXBlci5nZXRSZXNvdXJjZShvYmplY3QpOwotCQl9Ci0JCXJldHVybiBmaWxlOwotCX0KLQkKLQkvKioKLQkgKiBXaGVuIGEgZnVsbCB2YWxpZGF0aW9uIGlzIHBlcmZvcm1lZCwgdGhpcyBtZXRob2QgcmV0dXJucyBhbgotCSAqIElGaWxlRGVsdGFbXSBjb250YWluaW5nIG9uZSBJRmlsZURlbHRhIGZvciBlYWNoIC5wcm9wZXJ0aWVzIAotCSAqIGZpbGUgaW4gdGhlIElQcm9qZWN0LgotCSAqLwotCXB1YmxpYyBJRmlsZURlbHRhW10gbG9hZEFsbFByb3BlcnRpZXNGaWxlcygpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoKTsKLQkJCi0JCWZpbmFsIFNldCBmaWxlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCUlSZXNvdXJjZVZpc2l0b3IgdmlzaXRvciA9IG5ldyBJUmVzb3VyY2VWaXNpdG9yKCkgewotCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlIHJlcykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCWlmKCFyZXMuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOyAvLyBpZiB0aGUgcmVzb3VyY2UgaXNuJ3QgYWNjZXNzaWJsZSB0aGVuIG5laXRoZXIgYXJlIGl0cyBjaGlsZHJlbgotCQkJCX0KLQkJCQkKLQkJCQlpZihpc1NyY0ZpbGUocmVzKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCVdvcmtiZW5jaEZpbGVEZWx0YSBuZXdGaWxlRGVsdGEgPSBuZXcgV29ya2JlbmNoRmlsZURlbHRhKHJlcy5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIElGaWxlRGVsdGEuQ0hBTkdFRCwgcmVzKTsKLQkJCQkJZmlsZXMuYWRkKG5ld0ZpbGVEZWx0YSk7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIHRydWU7IC8vIHZpc2l0IHRoZSByZXNvdXJjZSdzIGNoaWxkcmVuIGFzIHdlbGwKLQkJCX0KLQkJfTsKLQotCQl0cnkgewotCQkJcHJvamVjdC5hY2NlcHQodmlzaXRvciwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCB0cnVlKTsgLy8gdHJ1ZSBtZWFucyBpbmNsdWRlIHBoYW50b20gcmVzb3VyY2VzCi0JCX0KLQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShlKTsKLQkJCX0KLQkJfQotCQkKLQkJSUZpbGVEZWx0YVtdIHJlc3VsdCA9IG5ldyBJRmlsZURlbHRhW2ZpbGVzLnNpemUoKV07Ci0JCWZpbGVzLnRvQXJyYXkocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBJRmlsZSBoYW5kbGUgZm9yIHRoZSBmaWxlIGlkZW50aWZpZWQgYnkgZmlsZU5hbWUuCi0JICogbnVsbCB3aWxsIGJlIHJldHVybmVkIGlmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LgotCSAqLwotCXB1YmxpYyBJRmlsZSBnZXRGaWxlKFN0cmluZyBmaWxlTmFtZSkgewotCQlJRmlsZSBmaWxlID0gKElGaWxlKVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcihmaWxlTmFtZSk7Ci0JCXJldHVybiBmaWxlOwotCX0KLQkKLQkvKioKLQkgKiBHaXZlbiB0aGUgZmlsZSBuYW1lIG9mIGFuIGV4aXN0aW5nIC5wcm9wZXJ0aWVzIGZpbGUsIHJldHVybgotCSAqIHRoZSBMaW5lTnVtYmVyUmVhZGVyIHRoYXQgd2lsbCByZWFkIHRoZSBmaWxlLgotCSAqLwotCXB1YmxpYyBMaW5lTnVtYmVyUmVhZGVyIGxvYWRMaW5lTnVtYmVyUmVhZGVyKFN0cmluZyBmaWxlTmFtZSkgewotCQl0cnkgewotCQkJSUZpbGUgZmlsZSA9IGdldEZpbGUoZmlsZU5hbWUpOwotCQkJSW5wdXRTdHJlYW0gaW4gPSBmaWxlLmdldENvbnRlbnRzKCk7Ci0JCQlJbnB1dFN0cmVhbVJlYWRlciByZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW4pOwotCQotCQkJLy8gQmVjYXVzZSB3ZSB3YW50IHRvIHJlYWQgaW4gYSBsaW5lIGF0IGEgdGltZSBmcm9tIHRoZSBmaWxlLCBjb252ZXJ0IHRoZSBJbnB1dFN0cmVhbVJlYWRlciB0byBhIExpbmVSZWFkZXIKLQkJCUxpbmVOdW1iZXJSZWFkZXIgbGluZUlucHV0ID0gbmV3IExpbmVOdW1iZXJSZWFkZXIocmVhZGVyKTsKLQkJCXJldHVybiBsaW5lSW5wdXQ7Ci0JCX0KLQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBnZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKGV4Yyk7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBkb2Vzbid0IGxvYWQgYW55dGhpbmc7IGl0IHJlbGVhc2VzIHRoZSByZXNvdXJjZXMgYWxsb2NhdGVkCi0JICogYnkgdGhlIGxvYWRMaW5lTnVtYmVyUmVhZGVyIG1ldGhvZC4gSXRzIHJlc3VsdCB3aWxsIG5ldmVyIGJlIHVzZWQsIHNvIGFsd2F5cwotCSAqIHJldHVybiBudWxsLgotCSAqLwotCXB1YmxpYyBMaW5lTnVtYmVyUmVhZGVyIHJlbGVhc2VMaW5lTnVtYmVyUmVhZGVyKExpbmVOdW1iZXJSZWFkZXIgcmVhZGVyKSB7Ci0JCWlmKHJlYWRlciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJdHJ5IHsKLQkJCXJlYWRlci5jbG9zZSgpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBnZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKGV4Yyk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogVGhlIE1zZ0xvZ2dlciBmcm9tIHRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGxvZyBleGNlcHRpb25zLgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgbmV2ZXIgcmV0dXJuIG51bGwuCi0JICovCi0JcHVibGljIExvZ2dlciBnZXRNc2dMb2dnZXIoKSB7Ci0JCXJldHVybiBQcm9wZXJ0aWVzVmFsaWRhdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCX0KLQkKLQkvLyBwYWNrYWdlIHZpc2liaWxpdHkgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMgKHN5bnRoZXRpYyBhY2Nlc3NvciBtZXRob2QpCi0JYm9vbGVhbiBpc1NyY0ZpbGUoSVJlc291cmNlIHJlcykgewotCQkvLyBXYW50IHRvIGZpbHRlciBvdXQgdGhlIGNvcGllcyBpbiB0aGUgImJpbiIgZGlyZWN0b3J5LgotCQlpZihyZXMgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZighKHJlcyBpbnN0YW5jZW9mIElGaWxlKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZighInByb3BlcnRpZXMiLmVxdWFscyhyZXMuZ2V0RmlsZUV4dGVuc2lvbigpKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7IAkJCi0JCX0KLQkJCi0JCWlmKHJlcy5pc0Rlcml2ZWQoKSkgewotCQkJLy8gQ3JlYXRlZCBieSBlY2xpcHNlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwdWJsaWMgSUZpbGVEZWx0YVtdIGZpbHRlcihJRmlsZURlbHRhW10gY2hhbmdlZEZpbGVzKSB7Ci0JCUlGaWxlRGVsdGFbXSB0ZW1wID0gbmV3IElGaWxlRGVsdGFbY2hhbmdlZEZpbGVzLmxlbmd0aF07Ci0JCWludCBjb3VudCA9IDA7Ci0JCWZvcihpbnQgaT0wOyBpPGNoYW5nZWRGaWxlcy5sZW5ndGg7IGkrKykgewotCQkJSUZpbGVEZWx0YSBmZCA9IGNoYW5nZWRGaWxlc1tpXTsKLQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9ICgoV29ya2JlbmNoRmlsZURlbHRhKWZkKS5nZXRSZXNvdXJjZSgpOwotCQkJaWYoaXNTcmNGaWxlKHJlc291cmNlKSkgewotCQkJCXRlbXBbY291bnQrK10gPSBmZDsKLQkJCX0KLQkJfQotCQkKLQkJaWYoY291bnQgPT0gY2hhbmdlZEZpbGVzLmxlbmd0aCkgewotCQkJcmV0dXJuIGNoYW5nZWRGaWxlczsKLQkJfQotCQkKLQkJSUZpbGVEZWx0YVtdIHJlc3VsdCA9IG5ldyBJRmlsZURlbHRhW2NvdW50XTsKLQkJU3lzdGVtLmFycmF5Y29weSh0ZW1wLCAwLCByZXN1bHQsIDAsIGNvdW50KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wcm9wZXJ0aWVzVmFsV0Ivb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL3dvcmtiZW5jaGltcGwvUHJvcGVydGllc1ZhbGlkYXRvclBsdWdpbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxXQi9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvd29ya2JlbmNoaW1wbC9Qcm9wZXJ0aWVzVmFsaWRhdG9yUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmMzI2ZDIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxXQi9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvd29ya2JlbmNoaW1wbC9Qcm9wZXJ0aWVzVmFsaWRhdG9yUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS53b3JrYmVuY2hpbXBsOwotLyoKLSAqIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDIsIDIwMDMgLSBBbGwgUmlnaHRzIFJlc2VydmVkLiBVUwotICogR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSByZXN0cmljdGVkIGJ5IEdTQSBBRFAKLSAqIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuCi0gKiAKLSAqIERJU0NMQUlNRVIgT0YgV0FSUkFOVElFUy4gVGhlIGZvbGxvd2luZyBbZW5jbG9zZWRdIGNvZGUgaXMgc2FtcGxlIGNvZGUgY3JlYXRlZCBieSBJQk0KLSAqIENvcnBvcmF0aW9uLiBUaGlzIHNhbXBsZSBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFueSBzdGFuZGFyZCBvciBJQk0gcHJvZHVjdCBhbmQgaXMgcHJvdmlkZWQgdG8geW91Ci0gKiBzb2xlbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGFzc2lzdGluZyB5b3UgaW4gdGhlIGRldmVsb3BtZW50IG9mIHlvdXIgYXBwbGljYXRpb25zLiBUaGUgY29kZSBpcwotICogcHJvdmlkZWQgIkFTIElTIi4gSUJNIE1BS0VTIE5PIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBSRUdBUkRJTkcgVEhFCi0gKiBGVU5DVElPTiBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIENPREUuIFRISVMgQ09ERSBNQVkgQ09OVEFJTiBFUlJPUlMuIElCTSBzaGFsbCBub3QgYmUgbGlhYmxlIGZvcgotICogYW55IGRhbWFnZXMgYXJpc2luZyBvdXQgb2YgeW91ciB1c2Ugb2YgdGhlIHNhbXBsZSBjb2RlLCBldmVuIGlmIGl0IGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlCi0gKiBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0gKiAgCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLldUUFBsdWdpbjsKLS8qKgotICogVGhpcyBjbGFzcyBpcyB0aGUgUGx1Z2luIGNsYXNzIGlkZW50aWZpZWQgYnkgdGhlIGNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24uY29yZS5wcm9wJ3MgcGx1Z2luLnhtbAotICogZmlsZSAoaS5lLiwgdGhlICZsdDtwbHVnaW4gPGJyPjxicj4KLSAqIGNsYXNzPSZxdW90O2NsYXNzPSJjb20uaWJtLmV0b29scy52YWxpZGF0aW9uLmNvcmUucHJvcGVydGllcy53b3JrYmVuY2hpbXBsLlByb3BlcnRpZXNWYWxpZGF0b3JQbHVnaW4iJnF1b3QmZ3Q7Ci0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0aWVzVmFsaWRhdG9yUGx1Z2luIGV4dGVuZHMgV1RQUGx1Z2luIHsKLQlwcml2YXRlIHN0YXRpYyBQcm9wZXJ0aWVzVmFsaWRhdG9yUGx1Z2luIF9pbnN0ID0gbnVsbDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIExvZ2dlciBfbG9nZ2VyOwotCXB1YmxpYyBQcm9wZXJ0aWVzVmFsaWRhdG9yUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlpZiAoX2luc3QgPT0gbnVsbCkgewotCQkJX2luc3QgPSB0aGlzOwotCQl9Ci0JfQotCXB1YmxpYyBzdGF0aWMgUHJvcGVydGllc1ZhbGlkYXRvclBsdWdpbiBnZXRQbHVnaW4oKSB7Ci0JCXJldHVybiBfaW5zdDsKLQl9Ci0JcHVibGljIExvZ2dlciBnZXRNc2dMb2dnZXIoKSB7Ci0JCWlmIChfbG9nZ2VyID09IG51bGwpCi0JCQlfbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcigpOwotCQlyZXR1cm4gX2xvZ2dlcjsKLQl9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnd0cC5jb21tb24uV1RQUGx1Z2luI2dldFBsdWdpbklEKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBsdWdpbklEKCkgewotCQlyZXR1cm4gUExVR0lOX0lEOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wcm9wZXJ0aWVzVmFsaWRhdG9yL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9QTW9kZWxFbnVtLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcGVydGllc1ZhbGlkYXRvci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvUE1vZGVsRW51bS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjE2ZWVkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wcm9wZXJ0aWVzVmFsaWRhdG9yL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9QTW9kZWxFbnVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZTsKLS8qCi0gKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTSAKLSAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDIsIDIwMDMgLSBBbGwgUmlnaHRzIFJlc2VydmVkLiAKLSAqIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUgCi0gKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4gCi0gKgotICogRElTQ0xBSU1FUiBPRiBXQVJSQU5USUVTLgotICogVGhlIGZvbGxvd2luZyBbZW5jbG9zZWRdIGNvZGUgaXMgc2FtcGxlIGNvZGUgY3JlYXRlZCBieSBJQk0KLSAqIENvcnBvcmF0aW9uLiBUaGlzIHNhbXBsZSBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFueSBzdGFuZGFyZCBvciBJQk0KLSAqIHByb2R1Y3QgYW5kIGlzIHByb3ZpZGVkIHRvIHlvdSBzb2xlbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGFzc2lzdGluZwotICogeW91IGluIHRoZSBkZXZlbG9wbWVudCBvZiB5b3VyIGFwcGxpY2F0aW9ucy4gIFRoZSBjb2RlIGlzIHByb3ZpZGVkCi0gKiAiQVMgSVMiLiBJQk0gTUFLRVMgTk8gV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUCi0gKiBOT1QgTElNSVRFRCBUTyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwotICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBSRUdBUkRJTkcgVEhFIEZVTkNUSU9OIE9SIFBFUkZPUk1BTkNFIE9GCi0gKiBUSElTIENPREUuICBUSElTIENPREUgTUFZIENPTlRBSU4gRVJST1JTLiAgSUJNIHNoYWxsIG5vdCBiZSBsaWFibGUKLSAqIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIG91dCBvZiB5b3VyIHVzZSBvZiB0aGUgc2FtcGxlIGNvZGUsIGV2ZW4KLSAqIGlmIGl0IGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLSAqIAotICovCi0KLS8qKgotICogVGhpcyBjbGFzcyBjb250YWlucyB0aGUgY29uc3RhbnRzIHRoYXQgdW5pcXVlbHkgaWRlbnRpZnkgZWFjaAotICogbW9kZWwgdGhhdCB0aGUgUHJvcGVydGllcyBWYWxpZGF0b3IncyBoZWxwZXIgbXVzdCBsb2FkLiBBbGwgb2YKLSAqIHRoZXNlIG1vZGVscyBtdXN0IGJlIHN1cHBvcnRlZCBieSB0aGUgSVZhbGlkYXRpb25Db250ZXh0IGltcGxlbWVudGF0aW9uCi0gKiBvciB0aGUgaGVscGVyIGNhbm5vdCBiZSB1c2VkIHRvIHN1cHBvcnQgdGhlIFByb3BlcnRpZXMgVmFsaWRhdG9yLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBNb2RlbEVudW0gewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJTkVJTlBVVFJFQURFUiA9ICJnZXQgYSBMaW5lSW5wdXRSZWFkZXIgZm9yIGEgLnByb3BlcnRpZXMgZmlsZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUxFQVNFX0xJTkVJTlBVVFJFQURFUiA9ICJyZWxhc2UgKGNsb3NlKSB0aGUgTGluZUlucHV0UmVhZGVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMTF9QUk9QRVJUSUVTX0ZJTEVTID0gInJldHVybiBhbiBJRmlsZURlbHRhW10gb2YgYWxsIG9mIHRoZSAucHJvcGVydGllcyBmaWxlcyBpbiB0aGUgcHJvamVjdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dMT0dHRVIgPSAiZ2V0IHRoZSBNc2dMb2dnZXIgbmVlZGVkIHRvIGxvZyBtZXNzYWdlcy4gVGhpcyBNc2dMb2dnZXIgbXVzdCBuZXZlciBiZSBudWxsLiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxURVIgPSAiZ2V0IG9ubHkgdGhlIC5wcm9wZXJ0aWVzIGZpbGVzIHRoYXQgYXJlIGluIHNyYyBkaXI7IGZpbHRlciBvdXQgdGhlIC5wcm9wZXJ0aWVzIGZpbGVzIHRoYXQgYXJlIGluIGJpbiBkaXIgKGkuZS4sIGRvbid0IHZhbGlkYXRlIHRoZSBzYW1lIGZpbGUgdHdpY2UiOyAvLyROT04tTkxTLTEkCi0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wcm9wZXJ0aWVzVmFsaWRhdG9yL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9Qcm9wZXJ0aWVzVmFsaWRhdG9yLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcGVydGllc1ZhbGlkYXRvci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvUHJvcGVydGllc1ZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWJmYjI4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wcm9wZXJ0aWVzVmFsaWRhdG9yL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9Qcm9wZXJ0aWVzVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGU7Ci0vKgotICogTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0gCi0gKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAyLCAyMDAzIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCi0gKiBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlIAotICogcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuIAotICoKLSAqIERJU0NMQUlNRVIgT0YgV0FSUkFOVElFUy4KLSAqIFRoZSBmb2xsb3dpbmcgW2VuY2xvc2VkXSBjb2RlIGlzIHNhbXBsZSBjb2RlIGNyZWF0ZWQgYnkgSUJNCi0gKiBDb3Jwb3JhdGlvbi4gVGhpcyBzYW1wbGUgY29kZSBpcyBub3QgcGFydCBvZiBhbnkgc3RhbmRhcmQgb3IgSUJNCi0gKiBwcm9kdWN0IGFuZCBpcyBwcm92aWRlZCB0byB5b3Ugc29sZWx5IGZvciB0aGUgcHVycG9zZSBvZiBhc3Npc3RpbmcKLSAqIHlvdSBpbiB0aGUgZGV2ZWxvcG1lbnQgb2YgeW91ciBhcHBsaWNhdGlvbnMuICBUaGUgY29kZSBpcyBwcm92aWRlZAotICogIkFTIElTIi4gSUJNIE1BS0VTIE5PIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVAotICogTk9UIExJTUlURUQgVE8gVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKLSAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgUkVHQVJESU5HIFRIRSBGVU5DVElPTiBPUiBQRVJGT1JNQU5DRSBPRgotICogVEhJUyBDT0RFLiAgVEhJUyBDT0RFIE1BWSBDT05UQUlOIEVSUk9SUy4gIElCTSBzaGFsbCBub3QgYmUgbGlhYmxlCi0gKiBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBvdXQgb2YgeW91ciB1c2Ugb2YgdGhlIHNhbXBsZSBjb2RlLCBldmVuCi0gKiBpZiBpdCBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0gKiAKLSAqLwotCi1pbXBvcnQgamF2YS5pby5MaW5lTnVtYmVyUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUucGFyc2VyLklWYWxpZGF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuSUZpbGVEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgY2hlY2tzIHRoYXQgdGhlIC5wcm9wZXJ0aWVzIGZpbGVzIGhhcyBubyBzeW50YXggb3IKLSAqIG9yIHByb2JsZW1zLiBUaGlzIHZhbGlkYXRvciBjYW4gcnVuIGluIGFueSB2YWxpZGF0aW9uIGZyYW1ld29yawotICogaW1wbGVtZW50YXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0aWVzVmFsaWRhdG9yIGltcGxlbWVudHMgSVZhbGlkYXRvciB7Ci0KLQkvKgotCSAqIEBzZWUgSVZhbGlkYXRvciNjbGVhbnVwKElSZXBvcnRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhbnVwKElSZXBvcnRlciByZXBvcnRlcikgewotCQkvLyBUaGlzIHZhbGlkYXRvciBkb2Vzbid0IGNhY2hlIGFueXRoaW5nIHNvIGl0IGRvZXNuJ3QgbmVlZCB0byBjbGVhbiBhbnl0aGluZyB1cC4KLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVZhbGlkYXRvciN2YWxpZGF0ZShJVmFsaWRhdGlvbkNvbnRleHQsIElSZXBvcnRlciwgSUZpbGVEZWx0YVtdKQotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIElSZXBvcnRlciByZXBvcnRlcikgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlJRmlsZURlbHRhW10gZmlsZVVSSXMgPSBudWxsOwotCQlpZigoZmlsZVVSSXMgPT0gbnVsbCkgfHwgKGZpbGVVUklzLmxlbmd0aCA9PSAwKSkgewotCQkJZmlsZVVSSXMgPSAoSUZpbGVEZWx0YVtdKWhlbHBlci5sb2FkTW9kZWwoUE1vZGVsRW51bS5BTExfUFJPUEVSVElFU19GSUxFUyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBGaWx0ZXIgb3V0IHRoZSBmaWxlcyB0aGF0IGFyZSBpbiB0aGUgImJpbiIgZGlyZWN0b3J5LgotCQkJZmlsZVVSSXMgPSAoSUZpbGVEZWx0YVtdKWhlbHBlci5sb2FkTW9kZWwoUE1vZGVsRW51bS5GSUxURVIsIG5ldyBPYmplY3RbXXtoZWxwZXIuZ2V0VVJJcygpfSk7Ci0JCX0KLQkJaWYoZmlsZVVSSXMgPT0gbnVsbCkgewotCQkJLy8gUHJvYmxlbSBsb2FkaW5nIHRoZSBmaWxlcy4gCi0JCQlMb2dnZXIgbG9nZ2VyID0gKExvZ2dlciloZWxwZXIubG9hZE1vZGVsKFBNb2RlbEVudW0uTVNHTE9HR0VSKTsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwiY2hhbmdlZEZpbGVzID09IG51bGw7IHRlcm1pbmF0aW5nIHZhbGlkYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlTdHJpbmdbXSB1cmlzID0gaGVscGVyLmdldFVSSXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1cmlzLmxlbmd0aDsgaSsrKSB7Ci0JCQkvLyBMb2FkIHRoZSByZWFkZXIgZm9yIHRoZSBmaWxlCi0JCQlMaW5lTnVtYmVyUmVhZGVyIHJlYWRlciA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXJlYWRlciA9IChMaW5lTnVtYmVyUmVhZGVyKWhlbHBlci5sb2FkTW9kZWwoUE1vZGVsRW51bS5MSU5FSU5QVVRSRUFERVIsIG5ldyBPYmplY3RbXXt1cmlzW2ldfSk7Ci0JCQkJaWYocmVhZGVyID09IG51bGwpIHsKLQkJCQkJLy8gRWl0aGVyOiAKLQkJCQkJLy8gMS4gVGhlIGZpbGUgZG9lc24ndCBleGlzdCBvcgotCQkJCQkvLyAyLiBUaGUgZmlsZSBpc24ndCBhIC5wcm9wZXJ0aWVzIGZpbGUgb3IKLQkJCQkJLy8gMy4gVGhlIGZpbGUgY2FuJ3QgYmUgcmVhZAotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gbmV3IE1lc3NhZ2UoSVZhbGlkYXRpb25Db25zdGFudHMuQlVORExFTkFNRSwgSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZLCBJVmFsaWRhdGlvbkNvbnN0YW50cy5BQkNEMDA5MCwgbmV3IFN0cmluZ1tde3VyaXNbaV19KTsKLQkJCQkJcmVwb3J0ZXIuYWRkTWVzc2FnZSh0aGlzLCBtZXNzYWdlKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQotCQkJCS8vIElmIHdlIGNhbiBnZXQgYSByZWFkZXIgdGhlbiB3ZSBjYW4gZ2V0IGEgUHJvcGVydHlGaWxlCi0JCQkJVmFsaWRhdG9yUHJvcGVydHlGaWxlIHByb3BGaWxlID0gbmV3IFZhbGlkYXRvclByb3BlcnR5RmlsZShyZWFkZXIsIHVyaXNbaV0sIHJlcG9ydGVyLCB0aGlzKTsKLQkJCQlwcm9wRmlsZS5wcmludFN5bnRheFdhcm5pbmdzKCk7Ci0JCQkJcHJvcEZpbGUucHJpbnREdXBsaWNhdGVNZXNzYWdlSWQoKTsKLQkJCQlwcm9wRmlsZS5wcmludER1cGxpY2F0ZU1lc3NhZ2VQcmVmaXgoKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCS8vIERvbid0IGNhdGNoIFRocm93YWJsZSwgTWVzc2FnZUxpbWl0RXhjZXB0aW9uLCBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiwgb3IgVmFsaWRhdGlvbkV4Y2VwdGlvbi4KLQkJCQkvLyBMZXQgdGhlbSB0cmF2ZWwgdXAgdG8gdGhlIGZyYW1ld29yayBhbmQgdGhlIGZyYW1ld29yayB3aWxsIGxvZyBvciBjbGVhbnVwIGFzIGFwcHJvcHJpYXRlLgotCQkJCWlmKHJlYWRlciAhPSBudWxsKSB7Ci0JCQkJCS8vIFJlbGVhc2UgdGhlIHJlYWRlciBmb3IgdGhlIGZpbGUuCi0JCQkJCS8vIEJlY2F1c2UgZGlmZmVyZW50IHZhbGlkYXRpb24gZnJhbWV3b3JrcyBtYXkgYWxsb2NhdGUgTGluZU51bWJlclJlYWRlcnMKLQkJCQkJLy8gZGlmZmVyZW50bHksIGRvbid0IGNsb3NlIHRoZSByZWFkZXIgaW4gdGhlIHZhbGlkYXRvci4gSW5zdGVhZCwgcGFzcyB0aGUKLQkJCQkJLy8gcmVhZGVyIGJhY2sgdG8gdGhlIGhlbHBlciwgYW5kIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgcmVhZGVyIHNob3VsZCAKLQkJCQkJLy8gYmUgY2xvc2VkIG9yIHJldXNlZCwgdGhlIGhlbHBlciBrbm93cyB0aGUgcmlnaHQgdGhpbmcgdG8gZG8gZm9yIGl0cwotCQkJCQkvLyBmcmFtZXdvcmsgZW52aXJvbm1lbnQuCi0JCQkJCWhlbHBlci5sb2FkTW9kZWwoUE1vZGVsRW51bS5SRUxFQVNFX0xJTkVJTlBVVFJFQURFUiwgbmV3IE9iamVjdFtde3JlYWRlcn0pOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wcm9wZXJ0aWVzVmFsaWRhdG9yL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9WYWxpZGF0b3JQcm9wZXJ0eUZpbGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wcm9wZXJ0aWVzVmFsaWRhdG9yL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9WYWxpZGF0b3JQcm9wZXJ0eUZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFkZDM2ZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcGVydGllc1ZhbGlkYXRvci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvVmFsaWRhdG9yUHJvcGVydHlGaWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGU7Ci0vKgotICogTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0gCi0gKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAyLCAyMDAzIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCi0gKiBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlIAotICogcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuIAotICoKLSAqIERJU0NMQUlNRVIgT0YgV0FSUkFOVElFUy4KLSAqIFRoZSBmb2xsb3dpbmcgW2VuY2xvc2VkXSBjb2RlIGlzIHNhbXBsZSBjb2RlIGNyZWF0ZWQgYnkgSUJNCi0gKiBDb3Jwb3JhdGlvbi4gVGhpcyBzYW1wbGUgY29kZSBpcyBub3QgcGFydCBvZiBhbnkgc3RhbmRhcmQgb3IgSUJNCi0gKiBwcm9kdWN0IGFuZCBpcyBwcm92aWRlZCB0byB5b3Ugc29sZWx5IGZvciB0aGUgcHVycG9zZSBvZiBhc3Npc3RpbmcKLSAqIHlvdSBpbiB0aGUgZGV2ZWxvcG1lbnQgb2YgeW91ciBhcHBsaWNhdGlvbnMuICBUaGUgY29kZSBpcyBwcm92aWRlZAotICogIkFTIElTIi4gSUJNIE1BS0VTIE5PIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVAotICogTk9UIExJTUlURUQgVE8gVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKLSAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgUkVHQVJESU5HIFRIRSBGVU5DVElPTiBPUiBQRVJGT1JNQU5DRSBPRgotICogVEhJUyBDT0RFLiAgVEhJUyBDT0RFIE1BWSBDT05UQUlOIEVSUk9SUy4gIElCTSBzaGFsbCBub3QgYmUgbGlhYmxlCi0gKiBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBvdXQgb2YgeW91ciB1c2Ugb2YgdGhlIHNhbXBsZSBjb2RlLCBldmVuCi0gKiBpZiBpdCBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0gKiAKLSAqLwotCi1pbXBvcnQgamF2YS5pby5MaW5lTnVtYmVyUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlLnBhcnNlci5BUHJvcGVydHlGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS5wYXJzZXIuTWVzc2FnZU1ldGFEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYW4gQVByb3BlcnR5RmlsZSB0aGF0IGlzIGluc3RhbnRpYXRlZCBieSBhIHZhbGlkYXRvci4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRvclByb3BlcnR5RmlsZSBleHRlbmRzIEFQcm9wZXJ0eUZpbGUgewotCXByaXZhdGUgSVJlcG9ydGVyIF9yZXBvcnRlciA9IG51bGw7Ci0JcHJpdmF0ZSBJVmFsaWRhdG9yIF92YWxpZGF0b3IgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIF9maWxlTmFtZSA9IG51bGw7IC8vIGlmIHRoaXMgaXMgY3JlYXRlZCBmcm9tIGEgcmVhZGVyIGluc3RlYWQgb2YgYSBmaWxlIG5hbWUsIHdlIG9ubHkgaGF2ZSB0aGUgYnVuZGxlIG5hbWUKLQkKLQlwdWJsaWMgVmFsaWRhdG9yUHJvcGVydHlGaWxlKExpbmVOdW1iZXJSZWFkZXIgcmVhZGVyLCBTdHJpbmcgZmlsZU5hbWUsIElSZXBvcnRlciByZXBvcnRlciwgSVZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQkJc3VwZXIoKTsKLQkJc2V0RmlsZU5hbWUoZmlsZU5hbWUpOwotCQlfcmVwb3J0ZXIgPSByZXBvcnRlcjsKLQkJX3ZhbGlkYXRvciA9IHZhbGlkYXRvcjsKLQkJcGFyc2VGaWxlKHJlYWRlcik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEZpbGVOYW1lKFN0cmluZyBidW5kbGVOYW1lKSB7Ci0JCV9maWxlTmFtZSA9IGJ1bmRsZU5hbWU7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgLnByb3BlcnRpZXMgZmlsZSAob3IgYnVuZGxlKS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZpbGVOYW1lKCkgewotCQlyZXR1cm4gX2ZpbGVOYW1lOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgQVByb3BlcnR5RmlsZSNyZXBvcnQoU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlcG9ydChTdHJpbmcgc3RyKSB7Ci0JCS8vIE5ldmVyIHByaW50IHRpdGxlcyBsaWtlICJEVVBMSUNBVEUgTUVTU0FHRSBJRFMiLiBQcmludCBvbmx5IHRoZSBJTWVzc2FnZS4KLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIEFQcm9wZXJ0eUZpbGUjcmVwb3J0KE1lc3NhZ2VNZXRhRGF0YSkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXBvcnQoTWVzc2FnZU1ldGFEYXRhIG1tZCkgewotCQlJTWVzc2FnZSBtZXNzYWdlID0gbmV3IE1lc3NhZ2UoKTsKLQkJbWVzc2FnZS5zZXRCdW5kbGVOYW1lKG1tZC5nZXRCdW5kbGVOYW1lKCkpOwotCQltZXNzYWdlLnNldFNldmVyaXR5KGdldFNldmVyaXR5KG1tZC5nZXRTZXZlcml0eSgpKSk7Ci0JCW1lc3NhZ2Uuc2V0SWQobW1kLmdldElkKCkpOwotCQltZXNzYWdlLnNldFBhcmFtcyhtbWQuZ2V0UGFyYW1zKCkpOwotCQltZXNzYWdlLnNldFRhcmdldE9iamVjdChtbWQuZ2V0VGFyZ2V0T2JqZWN0KCkpOwotCQltZXNzYWdlLnNldExpbmVObyhtbWQuZ2V0TGluZU51bWJlcigpKTsKLQkJbWVzc2FnZS5zZXRMZW5ndGgobW1kLmdldExlbmd0aCgpKTsKLQkJbWVzc2FnZS5zZXRPZmZzZXQobW1kLmdldE9mZnNldCgpKTsKLQkJbWVzc2FnZS5zZXRMZW5ndGgobW1kLmdldExlbmd0aCgpKTsKLQkJX3JlcG9ydGVyLmFkZE1lc3NhZ2UoZ2V0VmFsaWRhdG9yKCksIG1lc3NhZ2UpOwotCX0KLQkKLQkvKioKLQkgKiBHaXZlbiB0aGUgc2V2ZXJpdHkgb2YgdGhlIE1lc3NhZ2VNZXRhRGF0YSwgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nCi0JICogc2V2ZXJpdHkgb2YgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRTZXZlcml0eShpbnQgbW1kU2V2ZXJpdHkpIHsKLQkJc3dpdGNoKG1tZFNldmVyaXR5KSB7Ci0JCQljYXNlKE1lc3NhZ2VNZXRhRGF0YS5FUlJPUik6IHsKLQkJCQlyZXR1cm4gSU1lc3NhZ2UuSElHSF9TRVZFUklUWTsKLQkJCX0KLQkJCQotCQkJY2FzZShNZXNzYWdlTWV0YURhdGEuSU5GTyk6IHsKLQkJCQlyZXR1cm4gSU1lc3NhZ2UuTE9XX1NFVkVSSVRZOwotCQkJfQotCQkJCi0JCQlkZWZhdWx0OiB7Ci0JCQkJcmV0dXJuIElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIElWYWxpZGF0b3IgaW5zdGFuY2UgdGhhdCBpcyBjaGVja2luZyB0aGlzIGZpbGUuCi0JICovCi0JcHVibGljIElWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gX3ZhbGlkYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyBmaWxlIHRoYXQgaWRlbnRpZmllcyB0aGlzIGZpbGUgdW5pcXVlbHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRRdWFsaWZpZWRGaWxlTmFtZSgpIHsKLQkJcmV0dXJuIGdldEZpbGVOYW1lKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wcm9wZXJ0aWVzVmFsaWRhdG9yL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9wYXJzZXIvQVByb3BlcnR5RmlsZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxpZGF0b3Ivb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL3BhcnNlci9BUHJvcGVydHlGaWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkYzhiOWUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxpZGF0b3Ivb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL3BhcnNlci9BUHJvcGVydHlGaWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MjggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUucGFyc2VyOwotLyoKLSAqIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNIAotICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMiwgMjAwMyAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAotICogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSAKLSAqIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLiAKLSAqCi0gKiBESVNDTEFJTUVSIE9GIFdBUlJBTlRJRVMuCi0gKiBUaGUgZm9sbG93aW5nIFtlbmNsb3NlZF0gY29kZSBpcyBzYW1wbGUgY29kZSBjcmVhdGVkIGJ5IElCTQotICogQ29ycG9yYXRpb24uIFRoaXMgc2FtcGxlIGNvZGUgaXMgbm90IHBhcnQgb2YgYW55IHN0YW5kYXJkIG9yIElCTQotICogcHJvZHVjdCBhbmQgaXMgcHJvdmlkZWQgdG8geW91IHNvbGVseSBmb3IgdGhlIHB1cnBvc2Ugb2YgYXNzaXN0aW5nCi0gKiB5b3UgaW4gdGhlIGRldmVsb3BtZW50IG9mIHlvdXIgYXBwbGljYXRpb25zLiAgVGhlIGNvZGUgaXMgcHJvdmlkZWQKLSAqICJBUyBJUyIuIElCTSBNQUtFUyBOTyBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCi0gKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIFJFR0FSRElORyBUSEUgRlVOQ1RJT04gT1IgUEVSRk9STUFOQ0UgT0YKLSAqIFRISVMgQ09ERS4gIFRISVMgQ09ERSBNQVkgQ09OVEFJTiBFUlJPUlMuICBJQk0gc2hhbGwgbm90IGJlIGxpYWJsZQotICogZm9yIGFueSBkYW1hZ2VzIGFyaXNpbmcgb3V0IG9mIHlvdXIgdXNlIG9mIHRoZSBzYW1wbGUgY29kZSwgZXZlbgotICogaWYgaXQgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotICogCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkxpbmVOdW1iZXJSZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgLnByb3BlcnRpZXMgZmlsZTsgZXh0ZW5zaW9ucyBvZiB0aGlzIGNsYXNzIGltcGxlbWVudAotICogZW52aXJvbm1lbnQtc3BlY2lmaWMgbWVzc2FnZXMsIHN1Y2ggYXMgaG93IHRvIHJlcG9ydCB0aGUga25vd24gcHJvYmxlbXMuIFRoaXMKLSAqIGNsYXNzLCBhbmQgZXZlcnkgY2xhc3MgaW4gdGhlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS5wYXJzZXIgcGFja2FnZSwgaXMgaW5kZXBlbmRlbnQKLSAqIG9mIHRoZSBmcmFtZXdvcmsgZW52aXJvbm1lbnQuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBUHJvcGVydHlGaWxlIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVFVQUxTID0gIj0iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIExpc3QgX3Byb3BlcnR5TGluZXMgPSBudWxsOyAvLyBUaGUgTGlzdCBvZiBQcm9wZXJ0eUxpbmUgaW5zdGFuY2VzLgotCXByaXZhdGUgTGlzdCBfcGFyc2VXYXJuaW5ncyA9IG51bGw7IC8vIFRoZSBMaXN0IG9mIE1lc3NhZ2VNZXRhRGF0YSB3YXJuaW5ncyBmb3VuZCB3aGVuIHBhcnNpbmcgdGhlIC5wcm9wZXJ0aWVzIGZpbGUuCi0JcHJpdmF0ZSBib29sZWFuIF9kZWJ1ZyA9IGZhbHNlOwotCi0JLyoqCi0JICogUmV0dXJuIGEgbmFtZSB0aGF0IGlkZW50aWZpZXMgdGhpcyBmaWxlIHVuaXF1ZWx5LgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0UXVhbGlmaWVkRmlsZU5hbWUoKTsKLQkKLQkvKioKLQkgKiBUZWxsIHRoZSB1c2VyIHRoYXQgdGhlcmUgaXMgYSBwcm9ibGVtIC0gaW4gV2ViU3BoZXJlIFN0dWRpbywgdGhpcwotCSAqIHNob3dzIHVwIGFzIGEgcm93IGluIHRoZSBUYXNrIFZpZXc7IGluIHRoZSBzYW1wbGUgZmlsZXN5c3RlbSBmcmFtZXdvcmssCi0JICogdGhpcyBhcHBlYXJzIGFzIGEgbWVzc2FnZSB0byBTeXN0ZW0ub3V0LgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlcG9ydChTdHJpbmcgc3RyKTsKLQkKLQkvKioKLQkgKiBUZWxsIHRoZSB1c2VyIHRoYXQgdGhlcmUgaXMgYSBwcm9ibGVtIC0gaW4gV2ViU3BoZXJlIFN0dWRpbywgdGhpcwotCSAqIHNob3dzIHVwIGFzIGEgcm93IGluIHRoZSBUYXNrIFZpZXc7IGluIHRoZSBzYW1wbGUgZmlsZXN5c3RlbSBmcmFtZXdvcmssCi0JICogdGhpcyBhcHBlYXJzIGFzIGEgbWVzc2FnZSB0byBTeXN0ZW0ub3V0LgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlcG9ydChNZXNzYWdlTWV0YURhdGEgbW1kKTsKLQkKLQlwcm90ZWN0ZWQgQVByb3BlcnR5RmlsZSgpIHsKLQkJX3Byb3BlcnR5TGluZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCV9wYXJzZVdhcm5pbmdzID0gbmV3IEFycmF5TGlzdCgpOwotCX0KLQkKLQkvKioKLQkgKiBBZGQgdGhlIExpc3Qgb2YgTWVzc2FnZU1ldGFEYXRhIHRvIHRoZSBsaXN0IG9mIHdhcm5pbmcgbWVzc2FnZXMuCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGFyc2VXYXJuaW5ncyhMaXN0IGxpc3QpIHsKLQkJX3BhcnNlV2FybmluZ3MuYWRkQWxsKGxpc3QpOwotCX0KLQotCS8qKgotCSAqIEFkZCBhIHNpbmdsZSB3YXJuaW5nIG1lc3NhZ2UgdG8gdGhlIGxpc3Qgb2YgcGFyc2Ugd2FybmluZ3MuCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGFyc2VXYXJuaW5nKE1lc3NhZ2VNZXRhRGF0YSBtbWQpIHsKLQkJX3BhcnNlV2FybmluZ3MuYWRkKG1tZCk7Ci0JfQotCQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIExpc3Qgb2Ygd2FybmluZyBtZXNzYWdlcyB0aGF0IHJlcG9ydCBwcm9ibGVtcyBmb3VuZAotCSAqIHdoaWxlIHBhcnNpbmcgdGhlIC5wcm9wZXJ0aWVzIGZpbGUuCi0JICovCi0JcHVibGljIExpc3QgZ2V0UGFyc2VXYXJuaW5ncygpIHsKLQkJcmV0dXJuIF9wYXJzZVdhcm5pbmdzOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gZ2V0UXVhbGlmaWVkRmlsZU5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBTaG91bGQgZGVidWcgaW5mb3JtYXRpb24gYmUgcHJpbnRlZCB3aGVuIHBhcnNpbmc/Ci0JICovCQotCXB1YmxpYyBib29sZWFuIGRlYnVnKCkgewotCQlyZXR1cm4gX2RlYnVnOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWJ1Zyhib29sZWFuIGQpIHsKLQkJX2RlYnVnID0gZDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCWlmKG8gPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZighKG8gaW5zdGFuY2VvZiBQcm9wZXJ0eUZpbGUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCVByb3BlcnR5RmlsZSBmaWxlID0gKFByb3BlcnR5RmlsZSlvOwotCQlyZXR1cm4gZ2V0UXVhbGlmaWVkRmlsZU5hbWUoKS5lcXVhbHMoZmlsZS5nZXRRdWFsaWZpZWRGaWxlTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIGdldFF1YWxpZmllZEZpbGVOYW1lKCkuaGFzaENvZGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBtZXNzYWdlcyBpbiB0aGUgZmlsZSwgaW5jbHVkaW5nIGR1cGxpY2F0ZXMgJiBibGFua3MuCi0JICovCi0JcHVibGljIGludCBnZXROdW1Qcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gX3Byb3BlcnR5TGluZXMuc2l6ZSgpOwotCX0KLQotCS8qKgotCSAqIEV4Y2x1ZGluZyBtZXNzYWdlIGlkcyBhbmQgZXJyb3IgaWRzLCBvdXRwdXQgdGhlIG51bWJlciBvZiB3b3JkcyBpbiB0aGUKLQkgKiAucHJvcGVydGllcyBmaWxlLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TnVtV29yZHMoKSB7Ci0JCS8vIE5PVCBhIGZhc3QgbWV0aG9kLi4uLmhvdyB0byBvcHRpbWl6ZT8KLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBfcHJvcGVydHlMaW5lcy5pdGVyYXRvcigpOwotCQlpbnQgY291bnQgPSAwOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlQcm9wZXJ0eUxpbmUgbGluZSA9IChQcm9wZXJ0eUxpbmUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWNvdW50ICs9IGxpbmUuZ2V0TnVtV29yZHMoKTsKLQkJfQotCQlyZXR1cm4gY291bnQ7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIGNvdW50IG9mIHRoZSBudW1iZXIgb2YgdW5pcXVlIG1lc3NhZ2UgcHJlZml4ZXMgaW4gdGhlIGZpbGUuCi0JICogKEEgbWVzc2FnZSBwcmVmaXggc3RhcnRzIHRoZSBtZXNzYWdlIHRleHQsIGUuZy4sIEFCQ0QwMDAwRS4pCi0JICovCi0JcHVibGljIGludCBnZXROdW1VbmlxdWVQcmVmaXhlcygpIHsKLQkJU2V0IHVuaXF1ZUlkcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0UHJvcGVydHlMaW5lcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJUHJvcGVydHlMaW5lIGxpbmUgPSAoUHJvcGVydHlMaW5lKWl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmKGxpbmUuaGFzTWVzc2FnZVByZWZpeCgpKSB7Ci0JCQkJdW5pcXVlSWRzLmFkZChsaW5lLmdldE1lc3NhZ2VQcmVmaXgoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHVuaXF1ZUlkcy5zaXplKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIGNvdW50IG9mIHRoZSBudW1iZXIgb2YgbWVzc2FnZSBwcmVmaXhlcyB1c2VkIGluIHRoZSBmaWxlLgotCSAqIFVzdWFsbHkgdGhpcyBpcyB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIHVuaXF1ZSBwcmVmaXhlcywgYnV0IGlmIAotCSAqIGEgLnByb3BlcnRpZXMgZmlsZSBoYXMgdmFyaWF0aW9ucyBvZiBhIG1lc3NhZ2UgKHNsaWdodGx5IGRpZmZlcmVudCAKLQkgKiB3b3JkaW5nIGZvciBhIGRpZmZlcmVudCBjb250ZXh0KSwgdGhlbiB0aGUgbnVtYmVyIG9mIHByZWZpeGVzIHdpbGwgCi0JICogYmUgbGFyZ2VyIHRoYW4gdGhlIG51bWJlciBvZiB1bmlxdWUgcHJlZml4ZXNzLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TnVtUHJlZml4ZXMoKSB7Ci0JCWludCBjb3VudCA9IDA7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0UHJvcGVydHlMaW5lcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJUHJvcGVydHlMaW5lIGxpbmUgPSAoUHJvcGVydHlMaW5lKWl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmKGxpbmUuaGFzTWVzc2FnZVByZWZpeCgpKSB7Ci0JCQkJY291bnQrKzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY291bnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgY291bnQgb2YgdGhlIG51bWJlciBvZiBtZXNzYWdlcyB0aGF0IGRvIG5vdCB1c2UgcHJlZml4ZXMgaW4gdGhlIGZpbGUuCi0JICovCi0JcHVibGljIGludCBnZXROdW1XaXRob3V0UHJlZml4ZXMoKSB7Ci0JCWludCBjb3VudCA9IDA7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0UHJvcGVydHlMaW5lcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJUHJvcGVydHlMaW5lIGxpbmUgPSAoUHJvcGVydHlMaW5lKWl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmKCFsaW5lLmhhc01lc3NhZ2VQcmVmaXgoKSkgewotCQkJCWNvdW50Kys7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvdW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIExpc3Qgb2YgdGhlIFByb3BlcnR5TGluZSBpbnN0YW5jZXMgY29udGFpbmVkIGluIHRoaXMgZmlsZS4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eUxpbmVzKCkgewotCQlyZXR1cm4gX3Byb3BlcnR5TGluZXM7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgUHJvcGVydHlMaW5lIGluc3RhbmNlIHRoYXQgaXMgaWRlbnRpZmllZCBieSB0aGUgCi0JICogZ2l2ZW4gbWVzc2FnZUlkLgotCSAqLwotCXB1YmxpYyBQcm9wZXJ0eUxpbmUgZ2V0UHJvcGVydHlMaW5lKFN0cmluZyBtZXNzYWdlSWQpIHsKLQkJQ29sbGVjdGlvbnMuc29ydChfcHJvcGVydHlMaW5lcywgUHJvcGVydHlMaW5lQ29tcGFyYXRvci5nZXRNZXNzYWdlSWRDb21wYXJhdG9yKCkpOwotCQlpbnQgaW5kZXggPSBDb2xsZWN0aW9ucy5iaW5hcnlTZWFyY2goX3Byb3BlcnR5TGluZXMsIG1lc3NhZ2VJZCwgUHJvcGVydHlMaW5lQ29tcGFyYXRvci5nZXRNZXNzYWdlSWRDb21wYXJhdG9yKCkpOwotCQlpZihpbmRleCA8IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlQcm9wZXJ0eUxpbmUgcmVzdWx0ID0gKFByb3BlcnR5TGluZSlfcHJvcGVydHlMaW5lcy5nZXQoaW5kZXgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFBhcnNlIHRoZSBmaWxlIHRvIGNyZWF0ZSBhIGNvbGxlY3Rpb24gb2YgdW5pcXVlbHkgaWRlbnRpZmllZCAKLQkgKiBrZXlzIHdpdGggdGhlaXIgYXNzb2NpYXRlZCB2YWx1ZXMuIElmIHRoZXJlIGFyZSBhbnkgZHVwbGljYXRlIAotCSAqIGtleXMsIHRoZSBsYXN0IHZhbHVlIGlzIHRoZSBvbmUgdGhhdCBpcyBzdG9yZWQuIFN0b3JlIHRoZSAKLQkgKiB2YWx1ZSBvZiB0aGUgZHVwbGljYXRlIGtleXMsIGFuZCB0aGUgbGluZSBudW1iZXIgb24gd2hpY2ggCi0JICogZWFjaCBpbnN0YW5jZSBvZiB0aGUga2V5IChhbmQgaXRzIHZhbHVlKSBhcmUgbG9jYXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwYXJzZUZpbGUoRmlsZSBwcm9wZXJ0eUZpbGUpIHsKLQkJRmlsZVJlYWRlciBpbnB1dCA9IG51bGw7Ci0JCUxpbmVOdW1iZXJSZWFkZXIgbGluZUlucHV0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlucHV0ID0gbmV3IEZpbGVSZWFkZXIocHJvcGVydHlGaWxlKTsKLQkJfQotCQljYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFdlIGNhbiBpZ25vcmUgdGhpcyBleGNlcHRpb24gYmVjYXVzZSB3ZSBoYXZlIGFscmVhZHkgY2hlY2tlZCBpbiB0aGUgY29uc3RydWN0b3IgdGhhdCB0aGUKLQkJCS8vIGZpbGUgZXhpc3RzLgotCQl9Ci0KLQkJLy8gQmVjYXVzZSB3ZSB3YW50IHRvIHJlYWQgaW4gYSBsaW5lIGF0IGEgdGltZSBmcm9tIHRoZSBmaWxlLCBjb252ZXJ0IHRoZSBGaWxlUmVhZGVyIHRvIGEgTGluZVJlYWRlcgotCQlsaW5lSW5wdXQgPSBuZXcgTGluZU51bWJlclJlYWRlcihpbnB1dCk7Ci0JCQotCQlwYXJzZUZpbGUobGluZUlucHV0KTsKLQkJCi0JCXRyeSB7Ci0JCQlsaW5lSW5wdXQuY2xvc2UoKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQl9Ci0JCWlucHV0ID0gbnVsbDsKLQkJbGluZUlucHV0ID0gbnVsbDsKLQl9Ci0JCQotCS8qKgotCSAqIEdpdmVuIGEgTGluZU51bWJlclJlYWRlciBvbiBhIC5wcm9wZXJ0aWVzIGZpbGUsIHJlYWQgdGhlCi0JICogZmlsZSBhbmQgbm90ZSBhbnkgcHJvYmxlbXMgdGhhdCBtYXkgbmVlZCB0byBiZSByZXBvcnRlZCB0bwotCSAqIHRoZSB1c2VyLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBhcnNlRmlsZShMaW5lTnVtYmVyUmVhZGVyIGxpbmVJbnB1dCkgewotCQlfcHJvcGVydHlMaW5lcy5jbGVhcigpOwotCQlfcGFyc2VXYXJuaW5ncy5jbGVhcigpOwotCi0JCWJvb2xlYW4gaXNOZXdLZXkgPSB0cnVlOwotCQlTdHJpbmcga2V5ID0gbnVsbDsKLQkJaW50IGxpbmVOdW1iZXIgPSAwOwotCQlTdHJpbmcgdmFsdWUgPSBudWxsOwotCQlpbnQgb2Zmc2V0ID0gMDsgLy8gZWFjaCAucHJvcGVydGllcyBsaW5lIG5lZWRzIHRvIGtub3cgaXRzIG9mZnNldCBzbyB0aGF0IGNvbHVtbnMgaW4gdGhlIGxpbmUgY2FuIGJlIGNhbGN1bGF0ZWQuCi0JCWludCBtZXNzYWdlT2Zmc2V0ID0gMDsgLy8gdGhlIG9mZnNldCwgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lLCB3aGVyZSB0aGUgbWVzc2FnZSBwcmVmaXggc3RhcnRzCi0JCVN0cmluZyBsaW5lID0gbnVsbDsKLQkJd2hpbGUgKHRydWUpIHsKLQkJCXRyeSB7Ci0JCQkJbGluZSA9IGxpbmVJbnB1dC5yZWFkTGluZSgpOyAvLyBjYWxjdWxhdGUgdGhlIG9mZnNldCBpbiB0aGUgZmluYWxseSBibG9jawotCQkJCWlmIChsaW5lID09IG51bGwpCi0JCQkJCWJyZWFrOwotCQkJCWxpbmUgPSBsaW5lLnRyaW0oKTsKLQotCQkJCS8vIGlnbm9yZSBibGFuayBsaW5lcwotCQkJCWlmIChsaW5lLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJY29udGludWU7Ci0KLQkJCQkvLyBzdHJpcCBvZmYgbGluZXMgdGhhdCBiZWdpbiB3aXRoICcjJwotCQkJCWlmIChsaW5lLnN0YXJ0c1dpdGgoIiMiKSkgLy8kTk9OLU5MUy0xJAotCQkJCQljb250aW51ZTsKLQotCQkJCS8vIHN0cmlwIG9mZiBsaW5lcyB0aGF0IGJlZ2luIHdpdGggJy8nCi0JCQkJaWYgKGxpbmUuc3RhcnRzV2l0aCgiLyIpKSAvLyROT04tTkxTLTEkCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJaWYgKGlzTmV3S2V5KSB7Ci0JCQkJCS8vIFdlIGtub3cgdGhhdCB0aGUgbGluZSBpcyBvZiB0aGUgZm9ybQotCQkJCQkvLwotCQkJCQkvLyBLRVlOQU1FID0gVkFMVUUKLQkJCQkJLy8KLQkJCQkJaWYgKGxpbmUuaW5kZXhPZihFUVVBTFMpICE9IC0xKSB7Ci0JCQkJCQkvLyBNYWtlIHN1cmUgdGhlIGxpbmUgaXMgbm90IG9mIHRoZSBmb3JtICIgPSBNZXNzYWdlIiAoaS5lLiwgbWlzc2luZyB0aGUgbWVzc2FnZSBpZCkuCi0JCQkJCQlpZihsaW5lLmluZGV4T2YoRVFVQUxTKSA9PSAwKSB7Ci0JCQkJCQkJdGhyb3cgbmV3IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCS8vIFRoZSB1c2VyIG1heSBvciBtYXkgbm90IHB1dCBzcGFjZXMgYmV0d2VlbiB0aGUga2V5Ci0JCQkJCQkvLyBuYW1lLCB0aGUgZXF1YWxzIHNpZ24sIGFuZCB0aGUgdmFsdWUuIFRoaXMgZ2l2ZXMgdXMgZm91ciBjYXNlczoKLQkJCQkJCS8vICAgIDEuIGtleW5hbWU9dmFsdWUKLQkJCQkJCS8vICAgIDIuIGtleW5hbWU9IHZhbHVlCi0JCQkJCQkvLyAgICAzLiBrZXluYW1lID12YWx1ZQotCQkJCQkJLy8gICAgNC4ga2V5bmFtZSA9IHZhbHVlCi0JCQkJCQkvLyBUaGUgd2F5IHRvIGRlYWwgd2l0aCBhbGwgZm91ciBjYXNlcyBpcyB0byBmaW5kIHRoZSBpbmRleCBvZiB0aGUKLQkJCQkJCS8vICc9JyBzaWduLCBhbmQgdGhlIHZhbHVlIGlzIHRoZSByZW1haW5kZXIgb2YgdGhlIGxpbmUgYWZ0ZXIgdGhlCi0JCQkJCQkvLyBzaWduLgotCQkJCQkJLy8KLQkJCQkJCWtleSA9IGxpbmUuc3Vic3RyaW5nKDAsIGxpbmUuaW5kZXhPZihFUVVBTFMpKTsKLQkJCQkJCWtleSA9IGtleS50cmltKCk7Ci0KLQkJCQkJCS8vIGFkZCAxIHRvIHRoZSBFUVVBTFMgaW5kZXggYmVjYXVzZSAnPScgaXMgb25lIGNoYXJhY3RlciBsb25nCi0JCQkJCQl2YWx1ZSA9IGxpbmUuc3Vic3RyaW5nKGxpbmUuaW5kZXhPZihFUVVBTFMpICsgMSk7Ci0JCQkJCQl2YWx1ZSA9IHZhbHVlLnRyaW0oKTsKLQotCQkJCQkJbWVzc2FnZU9mZnNldCA9IGxpbmUuaW5kZXhPZih2YWx1ZSk7Ci0KLQkJCQkJCWxpbmVOdW1iZXIgPSBsaW5lSW5wdXQuZ2V0TGluZU51bWJlcigpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8gZXJyb3IgaW4gbGluZSBzeW50YXgKLQkJCQkJCXRocm93IG5ldyBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBuZWVkIHRvIHJlYWQgaW4gdGhlIG11bHRpcGxlIGxpbmVzIHRvIGdldCB0aGUgbXVsdGktbGluZSB2YWx1ZQotCQkJCQl2YWx1ZSArPSBsaW5lOwotCQkJCX0KLQotCQkJCWlmICh2YWx1ZS5lbmRzV2l0aCgiXFwiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCS8vIG11bHRpLWxpbmUgdmFsdWUKLQkJCQkJLy8gcmVhZCBpbiBldmVyeSBsaW5lIGZyb20gdGhlIGZpbGUgdW50aWwgeW91IHJlYWNoIGFuIGVuZC1vZi1saW5lCi0JCQkJCWlzTmV3S2V5ID0gZmFsc2U7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBlbmQgb2YgbXVsdGktbGluZSB2YWx1ZSwgb3IgZW5kIG9mIHNpbmdsZS1saW5lIHZhbHVlCi0JCQkJCWlzTmV3S2V5ID0gdHJ1ZTsKLQkJCQkJUHJvcGVydHlMaW5lIHBsaW5lID0gbmV3IFByb3BlcnR5TGluZSh0aGlzLCBvZmZzZXQsIG1lc3NhZ2VPZmZzZXQsIGtleSwgdmFsdWUsIGxpbmVOdW1iZXIpOwotCQkJCQlfcHJvcGVydHlMaW5lcy5hZGQocGxpbmUpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gV2hlbiB0aGVyZSBpcyBhbiBJT0V4Y2VwdGlvbiwgd2UgaGF2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGZpbGUuCi0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJCS8vIElmIGEgbGluZSBpcyBub3Qgb2YgdGhlIGZvcm0gS0VZTkFNRSA9IFZBTFVFLCB0aGVyZSBtaWdodCBiZSBhIG51bGwgZXhjZXB0aW9uLgotCQkJCS8vIEp1c3QgY29udGludWUgb250byB0aGUgbmV4dCBsaW5lIGluIHRoZSBmaWxlCi0JCQkJTWVzc2FnZU1ldGFEYXRhIG1tZCA9IG5ldyBNZXNzYWdlTWV0YURhdGEoSVZhbGlkYXRpb25Db25zdGFudHMuQlVORExFTkFNRSwgTWVzc2FnZU1ldGFEYXRhLkVSUk9SLCBJVmFsaWRhdGlvbkNvbnN0YW50cy5BQkNEMDA4MCwgbnVsbCwgdGhpcywgbGluZUlucHV0LmdldExpbmVOdW1iZXIoKSk7Ci0JCQkJcmVwb3J0KG1tZCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXRjaCAoamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZSkgewotCQkJCS8vIElmIGEgbGluZSBpcyBub3Qgb2YgdGhlIGZvcm0gS0VZTkFNRSA9IFZBTFVFLCB0aGVyZSBtaWdodCBiZSBhIE5vU3VjaEVsZW1lbnQgZXhjZXB0aW9uLgotCQkJCS8vIEp1c3QgY29udGludWUgb250byB0aGUgbmV4dCBsaW5lIGluIHRoZSBmaWxlCi0JCQkJTWVzc2FnZU1ldGFEYXRhIG1tZCA9IG5ldyBNZXNzYWdlTWV0YURhdGEoSVZhbGlkYXRpb25Db25zdGFudHMuQlVORExFTkFNRSwgTWVzc2FnZU1ldGFEYXRhLkVSUk9SLCBJVmFsaWRhdGlvbkNvbnN0YW50cy5BQkNEMDA4MCwgbnVsbCwgdGhpcywgbGluZUlucHV0LmdldExpbmVOdW1iZXIoKSk7Ci0JCQkJcmVwb3J0KG1tZCk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZihsaW5lICE9IG51bGwpIHsKLQkJCQkJb2Zmc2V0ICs9IGxpbmUubGVuZ3RoKCkgKyAyOyAvLyBoYWNrLiAKLQkJCQkJLy8gQ2FuJ3QgZ2V0IG9mZnNldCBmcm9tIEJ1ZmZlcmVkUmVhZGVyLCBhbmQgc2luY2UgdGhlIHJlYWRlciBzdHJpcHMgCi0JCQkJCS8vIHRoZSAnXG4nIGFuZCAnXHInIGZyb20gdGhlIGxpbmUgYmVmb3JlIHRoZSBsaW5lIGlzIHJldHVybmVkLCB0aGUgCi0JCQkJCS8vIHRydWUgbGVuZ3RoIG9mIHRoZSBsaW5lIGNhbid0IGJlIGFzY2VydGFpbmVkLiBUaGlzIGhhY2sgd2lsbCBub3QgCi0JCQkJCS8vIHdvcmsgb24gVW5peCBiZWNhdXNlIHVuaXgncyBFT0wgY2hhciBpcyBkaWZmZXJlbnQgdGhhbiBXaW5kb3dzLgotCQkJCQkvLwotCQkJCQkvLyBXaGVuIHRoZXJlJ3MgdGltZSwgbmVlZCB0byBmaW5kIGFuIGFsdGVybmF0aXZlIHRvIExpbmVOdW1iZXJSZWFkZXIuCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIFByaW50IGEgbGlzdCBvZiBhbGwgbWVzc2FnZSBwcmVmaXhlcywgZS5nLiwgQUJDRDAwMDBFLCB0aGF0IGFyZSB1c2VkCi0JICogaW4gdGhlIC5wcm9wZXJ0aWVzIGZpbGUuCi0JICovCi0JcHVibGljIHZvaWQgcHJpbnRBbGxNZXNzYWdlUHJlZml4ZXMoKSB7Ci0JCXJlcG9ydCgiTGluZSBOdW1iZXJcdE1lc3NhZ2UgcHJlZml4XHRNZXNzYWdlIGlkIik7IC8vJE5PTi1OTFMtMSQKLQkJQ29sbGVjdGlvbnMuc29ydChfcHJvcGVydHlMaW5lcywgUHJvcGVydHlMaW5lQ29tcGFyYXRvci5nZXRNZXNzYWdlUHJlZml4Q29tcGFyYXRvcigpKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBfcHJvcGVydHlMaW5lcy5pdGVyYXRvcigpOwotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVByb3BlcnR5TGluZSBsaW5lID0gKFByb3BlcnR5TGluZSlpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZigobGluZS5nZXRNZXNzYWdlUHJlZml4KCkgIT0gbnVsbCkgJiYgKCFsaW5lLmdldE1lc3NhZ2VQcmVmaXgoKS5lcXVhbHMoIiIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoU3RyaW5nLnZhbHVlT2YobGluZS5nZXRMaW5lTnVtYmVyKCkpKTsKLQkJCQlidWZmZXIuYXBwZW5kKCJcdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnVmZmVyLmFwcGVuZChsaW5lLmdldE1lc3NhZ2VQcmVmaXgoKSk7Ci0JCQkJYnVmZmVyLmFwcGVuZCgiXHQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJ1ZmZlci5hcHBlbmQobGluZS5nZXRNZXNzYWdlSWQoKSk7Ci0JCQkJcmVwb3J0KGJ1ZmZlci50b1N0cmluZygpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFByaW50IGEgbGlzdCBvZiBhbGwgb2YgdGhlIG1lc3NhZ2UgcHJlZml4ZXMsIGUuZy4sIEFCQ0QxMTExRSwgCi0JICogdGhhdCBhcmUgbm90IHVzZWQgaW4gdGhlIGZpbGUuIEEgbWVzc2FnZSBwcmVmaXggaXMgY29uc2lkZXJlZAotCSAqICZxdW90O21pc3NpbmcmcXVvdDsgaWYgYSBtZXNzYWdlIHByZWZpeCB0aGF0IHByZWNlZGVzIGl0LCAKLQkgKiBlLmcuIEFCQ0QwMDAwRSwgYW5kIGEgbWVzc2FnZSBwcmVmaXggdGhhdCBmb2xsb3dzIGl0LCAKLQkgKiBlLmcuIEFCQ0QyMjIyRSwgYXJlIGNvbnRhaW5lZCBpbiB0aGUgZmlsZSwgYnV0IHRoZSBwcmVmaXggaXMgbm90LgotCSAqIFRoaXMgbGlzdCBpcyB1c2VmdWwgd2hlbiBhZGRpbmcgYSBuZXcgbWVzc2FnZSB0byB0aGUgZmlsZTsKLQkgKiB0aGUgcHJlZml4ZXMgcHJpbnRlZCBieSB0aGlzIG1ldGhvZCBhcmUgdW51c2VkIGFuZCBvbmUgY2FuIGJlCi0JICogc2VsZWN0ZWQgZm9yIHRoZSBuZXcgbWV0aG9kLgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW50QWxsTWlzc2luZ01lc3NhZ2VQcmVmaXhlcygpIHsKLQkJaW50IGxhc3ROdW1iZXIgPSAtMTsKLQkJCi0JCUNvbGxlY3Rpb25zLnNvcnQoX3Byb3BlcnR5TGluZXMsIFByb3BlcnR5TGluZUNvbXBhcmF0b3IuZ2V0TWVzc2FnZVByZWZpeENvbXBhcmF0b3IoKSk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gX3Byb3BlcnR5TGluZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlQcm9wZXJ0eUxpbmUgbGluZSA9IChQcm9wZXJ0eUxpbmUpaXRlcmF0b3IubmV4dCgpOwotCQkJU3RyaW5nIHByZWZpeCA9IGxpbmUuZ2V0TWVzc2FnZVByZWZpeCgpOwotCQkJaW50IHByZWZpeE51bWJlciA9IDA7Ci0JCQlpZihwcmVmaXggPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlpZihwcmVmaXguZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkKLQkJCVN0cmluZyBwcmVmaXhMZXR0ZXJzID0gcHJlZml4LnN1YnN0cmluZygwLCA0KTsgLy8gIkFCQ0QiIG9mICJBQkNEMDAwMFciCi0JCQl0cnkgewotCQkJCS8vIFJlOiBtYWdpYyBudW1iZXJzICI0IiBhbmQgIjgiIGJlbG93LgotCQkJCS8vIFNpbmNlIHRoZSBtZXNzYWdlIHByZWZpeCBpcyBvZiB0aGUgZm9ybSBBQkNEMDAwMEUsCi0JCQkJLy8gc3RyaXAgb2ZmIHRoZSBmaXJzdCBmb3VyIGNoYXJhY3RlcnMgdXAgdG8gKGFuZCBleGNsdWRpbmcpIHRoZSAKLQkJCQkvLyBlaWdodGggY2hhcmFjdGVyLCAiRSIuCi0JCQkJcHJlZml4TnVtYmVyID0gSW50ZWdlci5wYXJzZUludChwcmVmaXguc3Vic3RyaW5nKDQsIDgpKTsKLQkJCX0KLQkJCWNhdGNoKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8ganVzdCBjb250aW51ZQotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYobGFzdE51bWJlciAhPSAtMSkgewotCQkJCWlmKHByZWZpeE51bWJlciAhPSAobGFzdE51bWJlciArIDEpKSB7Ci0JCQkJCS8vIFN0YXJ0IGF0IGxhc3ROdW1iZXIgKyAxIGJlY2F1c2UgbGFzdE51bWJlciBleGlzdHMuCi0JCQkJCS8vIEV4Y2x1ZGUgcHJlZml4TnVtYmVyIGJlY2F1c2UgcHJlZml4TnVtYmVyIGV4aXN0cy4KLQkJCQkJZm9yKGludCBpPWxhc3ROdW1iZXIrMTsgaTxwcmVmaXhOdW1iZXI7IGkrKykgewotCQkJCQkJcmVwb3J0KHByZWZpeExldHRlcnMgKyBpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWxhc3ROdW1iZXIgPSBwcmVmaXhOdW1iZXI7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmludCBhbGwgb2YgdGhlIG1lc3NhZ2VzIGluIHRoZSAucHJvcGVydGllcyBmaWxlIHRoYXQgdXNlCi0JICogYSBtZXNzYWdlIHByZWZpeCwgZS5nLiBBQkNEMDAwMEUuCi0JICovCi0JcHVibGljIHZvaWQgcHJpbnRBbGxNZXNzYWdlc1dpdGhBTWVzc2FnZVByZWZpeCgpIHsKLQkJcmVwb3J0KCJNRVNTQUdFUyBXSVRIIFBSRUZJWEVTIik7IC8vJE5PTi1OTFMtMSQKLQkJQ29sbGVjdGlvbnMuc29ydChfcHJvcGVydHlMaW5lcywgUHJvcGVydHlMaW5lQ29tcGFyYXRvci5nZXRMaW5lTm9Db21wYXJhdG9yKCkpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IF9wcm9wZXJ0eUxpbmVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJUHJvcGVydHlMaW5lIGxpbmUgPSAoUHJvcGVydHlMaW5lKWl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmKGxpbmUuaGFzTWVzc2FnZVByZWZpeCgpKSB7Ci0JCQkJcmVwb3J0KGxpbmUudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmludCBhbGwgb2YgdGhlIG1lc3NhZ2VzIGluIHRoZSAucHJvcGVydGllcyBmaWxlIHdob3NlIG1lc3NhZ2UKLQkgKiB0ZXh0IGRvZXMgbm90IGJlZ2luIHdpdGggYSBtZXNzYWdlIHByZWZpeCwgZS5nLiwgQUJDRDAwMDBFLgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW50QWxsTWVzc2FnZXNXaXRob3V0QU1lc3NhZ2VQcmVmaXgoKSB7Ci0JCXJlcG9ydCgiQkxBTksgTUVTU0FHRSBQUkVGSVgiKTsgLy8kTk9OLU5MUy0xJAotCQlDb2xsZWN0aW9ucy5zb3J0KF9wcm9wZXJ0eUxpbmVzLCBQcm9wZXJ0eUxpbmVDb21wYXJhdG9yLmdldExpbmVOb0NvbXBhcmF0b3IoKSk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gX3Byb3BlcnR5TGluZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlQcm9wZXJ0eUxpbmUgbGluZSA9IChQcm9wZXJ0eUxpbmUpaXRlcmF0b3IubmV4dCgpOwotCQkJaWYoIWxpbmUuaGFzTWVzc2FnZVByZWZpeCgpKSB7Ci0JCQkJcmVwb3J0KGxpbmUudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUHJpbnQgYSBsaXN0IG9mIGFsbCBtZXNzYWdlcyB3aG9zZSB0ZXh0IGlzIHRoZSBlbXB0eSBzdHJpbmcgKCZxdW90OyZxdW90OykuCi0JICovCi0JcHVibGljIHZvaWQgcHJpbnRBbGxNZXNzYWdlc1doaWNoQXJlQmxhbmsoKSB7Ci0JCXJlcG9ydCgiQkxBTksgTUVTU0FHRVMiKTsgLy8kTk9OLU5MUy0xJAotCQlDb2xsZWN0aW9ucy5zb3J0KF9wcm9wZXJ0eUxpbmVzLCBQcm9wZXJ0eUxpbmVDb21wYXJhdG9yLmdldExpbmVOb0NvbXBhcmF0b3IoKSk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gX3Byb3BlcnR5TGluZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlQcm9wZXJ0eUxpbmUgbGluZSA9IChQcm9wZXJ0eUxpbmUpaXRlcmF0b3IubmV4dCgpOwotCQkJaWYobGluZS5nZXRNZXNzYWdlKCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoImxpbmUgbnVtYmVyICIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnVmZmVyLmFwcGVuZChsaW5lLmdldExpbmVOdW1iZXIoKSk7Ci0JCQkJYnVmZmVyLmFwcGVuZCgiLCBtZXNzYWdlIGlkICIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnVmZmVyLmFwcGVuZChsaW5lLmdldE1lc3NhZ2VJZCgpKTsKLQkJCQlyZXBvcnQoYnVmZmVyLnRvU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIFByaW50IGEgbGlzdCBvZiB0aGUgbGluZXMgdGhhdCBoYXZlIHN5bnRheCBlcnJvcnMsIGZvciBleGFtcGxlLAotCSAqIG1pc3NpbmcgdGhlIGVxdWFscyBzaWduIGJldHdlZW4gdGhlIG1lc3NhZ2UgaWQgYW5kIHRoZSBtZXNzYWdlIAotCSAqIHRleHQuCi0JICovCi0JcHVibGljIHZvaWQgcHJpbnRTeW50YXhXYXJuaW5ncygpIHsKLQkJTGlzdCBwYXJzZVdhcm5pbmdzID0gZ2V0UGFyc2VXYXJuaW5ncygpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IHBhcnNlV2FybmluZ3MuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJcmVwb3J0KChNZXNzYWdlTWV0YURhdGEpaXRlcmF0b3IubmV4dCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByaW50IGEgbGlzdCBvZiBhbGwgb2YgdGhlIG1lc3NhZ2VzIGluIHRoZSAucHJvcGVydGllcyBmaWxlIHRoYXQKLQkgKiB1c2UgdGhlIHNhbWUgbWVzc2FnZSBpZC4gSWYgbW9yZSB0aGFuIG9uZSBtZXNzYWdlIHVzZXMgdGhlIHNhbWUKLQkgKiBpZCwgd2hlbiB0aGUgUmVzb3VyY2VCdW5kbGUgaXMgYXNrZWQgZm9yIHRoYXQgbWVzc2FnZSBpZCwgaXQgd2lsbAotCSAqIHJldHVybiB0aGUgbGFzdCBtZXNzYWdlIChpLmUuLCB0aGUgbGFyZ2VzdCBsaW5lIG51bWJlcikgd2l0aCB0aGF0Ci0JICogaWQgaW4gdGhlIGZpbGUuCi0JICovCi0JcHVibGljIHZvaWQgcHJpbnREdXBsaWNhdGVNZXNzYWdlSWQoKSB7Ci0JCXByaW50RHVwbGljYXRlTWVzc2FnZUlkKHRydWUpOwotCX0KLQkKLQkvKioKLQkgKiBQcmludCBhIGxpc3Qgb2YgYWxsIG9mIHRoZSBtZXNzYWdlcyBpbiB0aGUgLnByb3BlcnRpZXMgZmlsZSB0aGF0Ci0JICogdXNlIHRoZSBzYW1lIG1lc3NhZ2UgaWQuIElmIG1vcmUgdGhhbiBvbmUgbWVzc2FnZSB1c2VzIHRoZSBzYW1lCi0JICogaWQsIHdoZW4gdGhlIFJlc291cmNlQnVuZGxlIGlzIGFza2VkIGZvciB0aGF0IG1lc3NhZ2UgaWQsIGl0IHdpbGwKLQkgKiByZXR1cm4gdGhlIGxhc3QgbWVzc2FnZSAoaS5lLiwgdGhlIGxhcmdlc3QgbGluZSBudW1iZXIpIHdpdGggdGhhdAotCSAqIGlkIGluIHRoZSBmaWxlLgotCSAqIAotCSAqIFRoZSBib29sZWFuIHBhcmFtZXRlciBpcyB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIG9yIG5vdCAKLQkgKiB0aGUgJnF1b3Q7RFVQTElDQVRFIE1FU1NBR0UgSURTJnF1b3Q7IHRpdGxlIGlzIGVtaXR0ZWQgYmVmb3JlIAotCSAqIHRoZSBsaXN0IG9mIGR1cGxpY2F0ZXMuCi0JICovCi0JcHVibGljIHZvaWQgcHJpbnREdXBsaWNhdGVNZXNzYWdlSWQoYm9vbGVhbiBwcmludFRpdGxlKSB7Ci0JCWlmKHByaW50VGl0bGUpIHsKLQkJCXJlcG9ydCgiRFVQTElDQVRFIE1FU1NBR0UgSURTIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlDb21wYXJhdG9yIGMgPSBQcm9wZXJ0eUxpbmVDb21wYXJhdG9yLmdldE1lc3NhZ2VJZENvbXBhcmF0b3IoKTsKLQkJU3RyaW5nIG1lc3NhZ2VJZCA9IElWYWxpZGF0aW9uQ29uc3RhbnRzLkFCQ0QwMDYwOwotCQlDb2xsZWN0aW9ucy5zb3J0KF9wcm9wZXJ0eUxpbmVzLCBjKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBfcHJvcGVydHlMaW5lcy5pdGVyYXRvcigpOwotCQlQcm9wZXJ0eUxpbmUgbGFzdExpbmUgPSBudWxsOwotCQlQcm9wZXJ0eUxpbmUgbGluZSA9IG51bGw7Ci0JCWJvb2xlYW4gbmVlZFRvUHJpbnRMYXN0ID0gZmFsc2U7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJbGFzdExpbmUgPSBsaW5lOwotCQkJbGluZSA9IChQcm9wZXJ0eUxpbmUpaXRlcmF0b3IubmV4dCgpOwotCQkJCi0JCQlpZihjLmNvbXBhcmUobGFzdExpbmUsIGxpbmUpID09IDApIHsKLQkJCQluZWVkVG9QcmludExhc3QgPSB0cnVlOwotCQkJCU1lc3NhZ2VNZXRhRGF0YSBtbWQgPSBuZXcgTWVzc2FnZU1ldGFEYXRhKElWYWxpZGF0aW9uQ29uc3RhbnRzLkJVTkRMRU5BTUUsIE1lc3NhZ2VNZXRhRGF0YS5XQVJOSU5HLCBtZXNzYWdlSWQsIG5ldyBTdHJpbmdbXXtsYXN0TGluZS5nZXRNZXNzYWdlSWQoKX0sIGxhc3RMaW5lLCBsYXN0TGluZS5nZXRMaW5lTnVtYmVyKCkpOwotCQkJCXJlcG9ydChtbWQpOwotCQkJfQotCQkJZWxzZSBpZihuZWVkVG9QcmludExhc3QpIHsKLQkJCQkvLyBUaGUgbGFzdCBkdXBsaWNhdGUgbGluZSBuZWVkcyB0byBiZSBwcmludGVkLCBiZWNhdXNlIGxhc3RMaW5lIGlzIGFsd2F5cyBwcmludGVkIGJ1dCBsaW5lIG5lZWRzIHRvIGJlIHByaW50ZWQgdG9vLgotCQkJCW5lZWRUb1ByaW50TGFzdCA9IGZhbHNlOwotCQkJCU1lc3NhZ2VNZXRhRGF0YSBtbWQgPSBuZXcgTWVzc2FnZU1ldGFEYXRhKElWYWxpZGF0aW9uQ29uc3RhbnRzLkJVTkRMRU5BTUUsIE1lc3NhZ2VNZXRhRGF0YS5XQVJOSU5HLCBtZXNzYWdlSWQsIG5ldyBTdHJpbmdbXXtsYXN0TGluZS5nZXRNZXNzYWdlSWQoKX0sIGxhc3RMaW5lLCBsYXN0TGluZS5nZXRMaW5lTnVtYmVyKCkpOwotCQkJCXJlcG9ydChtbWQpOwotCQkJfQotCQl9Ci0KLQkJaWYobmVlZFRvUHJpbnRMYXN0KSB7Ci0JCQkvLyBUaGUgbGFzdCBkdXBsaWNhdGUgbGluZSBuZWVkcyB0byBiZSBwcmludGVkLCBiZWNhdXNlIGxhc3RMaW5lIGlzIGFsd2F5cyBwcmludGVkIGJ1dCBsaW5lIG5lZWRzIHRvIGJlIHByaW50ZWQgdG9vLgotCQkJTWVzc2FnZU1ldGFEYXRhIG1tZCA9IG5ldyBNZXNzYWdlTWV0YURhdGEoSVZhbGlkYXRpb25Db25zdGFudHMuQlVORExFTkFNRSwgTWVzc2FnZU1ldGFEYXRhLldBUk5JTkcsIG1lc3NhZ2VJZCwgbmV3IFN0cmluZ1tde2xpbmUuZ2V0TWVzc2FnZUlkKCl9LCBsaW5lLCBsaW5lLmdldExpbmVOdW1iZXIoKSk7Ci0JCQlyZXBvcnQobW1kKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBQcmludCBhIGxpc3Qgb2YgYWxsIG9mIHRoZSBtZXNzYWdlcyBpbiB0aGUgLnByb3BlcnRpZXMgZmlsZSB0aGF0Ci0JICogZG8gbm90IHVzZSBhIHVuaXF1ZSBtZXNzYWdlIHByZWZpeCAoZS5nLiwgQUJDRDAwMDBFKSwgd2l0aCB0aGUgCi0JICogZXhjZXB0aW9uIG9mIGFsbCBtZXNzYWdlcyB3aGljaCBhcmUgaW50ZW5kZWQgdG8gYmUgZHVwbGljYXRlcy4KLQkgKiBHZW5lcmFsbHksIHVzZXJzIGV4cGVjdCBvbmUgbWVzc2FnZSBwcmVmaXggcGVyIHByb2JsZW0sIHNvIAotCSAqIHJldXNlZCBtZXNzYWdlIHByZWZpeGVzIGNhbiBiZSBjb25mdXNpbmcuIEFueSBtZXNzYWdlIHdoaWNoIAotCSAqIGRlbGliZXJhdGVseSByZXVzZXMgYSBtZXNzYWdlIHByZWZpeCBtdXN0IHVzZSBhIG1lc3NhZ2UgaWQgCi0JICogdGhhdCBzdGFydHMgd2l0aCB0aGF0IHByZWZpeC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmludER1cGxpY2F0ZU1lc3NhZ2VQcmVmaXgoKSB7Ci0JCXByaW50RHVwbGljYXRlTWVzc2FnZVByZWZpeCh0cnVlKTsKLQl9Ci0JCi0JLyoqCi0JICogUHJpbnQgYSBsaXN0IG9mIGFsbCBvZiB0aGUgbWVzc2FnZXMgaW4gdGhlIC5wcm9wZXJ0aWVzIGZpbGUgdGhhdAotCSAqIGRvIG5vdCB1c2UgYSB1bmlxdWUgbWVzc2FnZSBwcmVmaXggKGUuZy4sIEFCQ0QwMDAwRSksIHdpdGggdGhlIAotCSAqIGV4Y2VwdGlvbiBvZiBhbGwgbWVzc2FnZXMgd2hpY2ggYXJlIGludGVuZGVkIHRvIGJlIGR1cGxpY2F0ZXMuCi0JICogR2VuZXJhbGx5LCB1c2VycyBleHBlY3Qgb25lIG1lc3NhZ2UgcHJlZml4IHBlciBwcm9ibGVtLCBzbyAKLQkgKiByZXVzZWQgbWVzc2FnZSBwcmVmaXhlcyBjYW4gYmUgY29uZnVzaW5nLiBBbnkgbWVzc2FnZSB3aGljaCAKLQkgKiBkZWxpYmVyYXRlbHkgcmV1c2VzIGEgbWVzc2FnZSBwcmVmaXggbXVzdCB1c2UgYSBtZXNzYWdlIGlkIAotCSAqIHRoYXQgc3RhcnRzIHdpdGggdGhhdCBwcmVmaXguCi0JICogCi0JICogVGhlIGJvb2xlYW4gcGFyYW1ldGVyIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IAotCSAqIHRoZSAmcXVvdDtEVVBMSUNBVEUgTUVTU0FHRSBQUkVGSVhFU1MmcXVvdDsgdGl0bGUgaXMgZW1pdHRlZCAKLQkgKiBiZWZvcmUgdGhlIGxpc3Qgb2YgZHVwbGljYXRlcy4KLQkgKi8JCi0JcHVibGljIHZvaWQgcHJpbnREdXBsaWNhdGVNZXNzYWdlUHJlZml4KGJvb2xlYW4gcHJpbnRUaXRsZSkgewotCQlpZihwcmludFRpdGxlKSB7Ci0JCQlyZXBvcnQoIkRVUExJQ0FURSBNRVNTQUdFIFBSRUZJWEVTIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlDb21wYXJhdG9yIGMgPSBQcm9wZXJ0eUxpbmVDb21wYXJhdG9yLmdldE1lc3NhZ2VQcmVmaXhDb21wYXJhdG9yKCk7Ci0JCUNvbGxlY3Rpb25zLnNvcnQoX3Byb3BlcnR5TGluZXMsIGMpOwotCQlTdHJpbmcgbWVzc2FnZUlkID0gSVZhbGlkYXRpb25Db25zdGFudHMuQUJDRDAwNzA7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gX3Byb3BlcnR5TGluZXMuaXRlcmF0b3IoKTsKLQkJUHJvcGVydHlMaW5lIGxhc3RMaW5lID0gbnVsbDsKLQkJUHJvcGVydHlMaW5lIGxpbmUgPSBudWxsOwotCQlib29sZWFuIG5lZWRUb1ByaW50TGFzdCA9IGZhbHNlOwotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWxhc3RMaW5lID0gbGluZTsKLQkJCWxpbmUgPSAoUHJvcGVydHlMaW5lKWl0ZXJhdG9yLm5leHQoKTsKLQkJCQotCQkJaWYobGFzdExpbmUgIT0gbnVsbCkgewotCQkJCWlmKCFsYXN0TGluZS5nZXRNZXNzYWdlSWQoKS5zdGFydHNXaXRoKGxhc3RMaW5lLmdldFNob3J0TWVzc2FnZVByZWZpeCgpKSkgewotCQkJCQlpZihjLmNvbXBhcmUobGFzdExpbmUsIGxpbmUpID09IDApIHsKLQkJCQkJCW5lZWRUb1ByaW50TGFzdCA9IHRydWU7Ci0JCQkJCQlNZXNzYWdlTWV0YURhdGEgbW1kID0gbmV3IE1lc3NhZ2VNZXRhRGF0YShJVmFsaWRhdGlvbkNvbnN0YW50cy5CVU5ETEVOQU1FLCBNZXNzYWdlTWV0YURhdGEuV0FSTklORywgbWVzc2FnZUlkLCBuZXcgU3RyaW5nW117bGFzdExpbmUuZ2V0TWVzc2FnZVByZWZpeCgpfSwgbGFzdExpbmUsIGxhc3RMaW5lLmdldExpbmVOdW1iZXIoKSk7Ci0JCQkJCQlyZXBvcnQobW1kKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmKG5lZWRUb1ByaW50TGFzdCkgewotCQkJCQkJLy8gVGhlIGxhc3QgZHVwbGljYXRlIGxpbmUgbmVlZHMgdG8gYmUgcHJpbnRlZCwgYmVjYXVzZSBsYXN0TGluZSBpcyBhbHdheXMgcHJpbnRlZCBidXQgbGluZSBuZWVkcyB0byBiZSBwcmludGVkIHRvby4KLQkJCQkJCW5lZWRUb1ByaW50TGFzdCA9IGZhbHNlOwotCQkJCQkJTWVzc2FnZU1ldGFEYXRhIG1tZCA9IG5ldyBNZXNzYWdlTWV0YURhdGEoSVZhbGlkYXRpb25Db25zdGFudHMuQlVORExFTkFNRSwgTWVzc2FnZU1ldGFEYXRhLldBUk5JTkcsIG1lc3NhZ2VJZCwgbmV3IFN0cmluZ1tde2xhc3RMaW5lLmdldE1lc3NhZ2VQcmVmaXgoKX0sIGxhc3RMaW5lLCBsYXN0TGluZS5nZXRMaW5lTnVtYmVyKCkpOwotCQkJCQkJcmVwb3J0KG1tZCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZihsYXN0TGluZSAhPSBudWxsKSB7Ci0JCQlpZighbGFzdExpbmUuZ2V0TWVzc2FnZUlkKCkuc3RhcnRzV2l0aChsYXN0TGluZS5nZXRTaG9ydE1lc3NhZ2VQcmVmaXgoKSkpIHsKLQkJCQlpZihuZWVkVG9QcmludExhc3QpIHsKLQkJCQkJLy8gVGhlIGxhc3QgZHVwbGljYXRlIGxpbmUgbmVlZHMgdG8gYmUgcHJpbnRlZCwgYmVjYXVzZSBsYXN0TGluZSBpcyBhbHdheXMgcHJpbnRlZCBidXQgbGluZSBuZWVkcyB0byBiZSBwcmludGVkIHRvby4KLQkJCQkJTWVzc2FnZU1ldGFEYXRhIG1tZCA9IG5ldyBNZXNzYWdlTWV0YURhdGEoSVZhbGlkYXRpb25Db25zdGFudHMuQlVORExFTkFNRSwgTWVzc2FnZU1ldGFEYXRhLldBUk5JTkcsIG1lc3NhZ2VJZCwgbmV3IFN0cmluZ1tde2xpbmUuZ2V0TWVzc2FnZVByZWZpeCgpfSwgbGluZSwgbGluZS5nZXRMaW5lTnVtYmVyKCkpOwotCQkJCQlyZXBvcnQobW1kKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmludCBhIGxpc3Qgb2YgbWVzc2FnZSBwcmVmaXhlcyB3aG9zZSBmaXJzdCBjaGFyYWN0ZXJzIG1hdGNoCi0JICogdGhlIHByZWZpeCBwYXJhbWV0ZXIuIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCB3aGVuIHlvdSB3YW50IHRvIHNlZQotCSAqIGlmIGEgcmFuZ2Ugb2YgcHJlZml4ZXMgaXMgaW4gdXNlIG9yIG5vdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmludE1lc3NhZ2VQcmVmaXhTdGFydGluZ1dpdGgoZmluYWwgU3RyaW5nIHByZWZpeCkgewotCQlyZXBvcnQoIkZpbmQgYWxsIGVycm9yIHByZWZpeGVzIHN0YXJ0aW5nIHdpdGggIiArIHByZWZpeCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGFyYXRvciBjID0gUHJvcGVydHlMaW5lQ29tcGFyYXRvci5nZXRNZXNzYWdlUHJlZml4Q29tcGFyYXRvcigpOwotCQlDb2xsZWN0aW9ucy5zb3J0KF9wcm9wZXJ0eUxpbmVzLCBjKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBfcHJvcGVydHlMaW5lcy5pdGVyYXRvcigpOwotCQlQcm9wZXJ0eUxpbmUgbGluZSA9IG51bGw7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJbGluZSA9IChQcm9wZXJ0eUxpbmUpaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGxpbmUuZ2V0TWVzc2FnZVByZWZpeCgpLnN0YXJ0c1dpdGgocHJlZml4KSkgewotCQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKFN0cmluZy52YWx1ZU9mKGxpbmUuZ2V0TGluZU51bWJlcigpKSk7Ci0JCQkJYnVmZmVyLmFwcGVuZCgiXHQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJ1ZmZlci5hcHBlbmQobGluZS5nZXRNZXNzYWdlUHJlZml4KCkpOwotCQkJCWJ1ZmZlci5hcHBlbmQoIlx0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlidWZmZXIuYXBwZW5kKGxpbmUuZ2V0TWVzc2FnZUlkKCkpOwotCQkJCXJlcG9ydChidWZmZXIudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUHJpbnQgdGhlIGxhc3QgcHJlZml4IChpLmUuLCB0aGUgb25lIHdpdGggdGhlIGxhcmdlc3QgbnVtYmVyLCAKLQkgKiBlLmcuIEFCQ0QyMjIyIGlzIGxhcmdlciB0aGFuIEFCQ0QxMTExIG9yIEFCQ0QwMDAwKSBpbiB0aGUgZmlsZSAKLQkgKiB3aG9zZSBmaXJzdCBjaGFyYWN0ZXJzIG1hdGNoIHRoZSBwcmVmaXggcGFyYW1ldGVyLiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmludExhc3RNZXNzYWdlUHJlZml4U3RhcnRpbmdXaXRoKGZpbmFsIFN0cmluZyBwcmVmaXgpIHsKLQkJcmVwb3J0KCJGaW5kIGxhc3QgZXJyb3IgcHJlZml4IHN0YXJ0aW5nIHdpdGggIiArIHByZWZpeCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGFyYXRvciBjID0gUHJvcGVydHlMaW5lQ29tcGFyYXRvci5nZXRNZXNzYWdlUHJlZml4Q29tcGFyYXRvcigpOwotCQlDb2xsZWN0aW9ucy5zb3J0KF9wcm9wZXJ0eUxpbmVzLCBjKTsKLQkJUHJvcGVydHlMaW5lW10gbGluZXMgPSBuZXcgUHJvcGVydHlMaW5lW19wcm9wZXJ0eUxpbmVzLnNpemUoKV07Ci0JCV9wcm9wZXJ0eUxpbmVzLnRvQXJyYXkobGluZXMpOwotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCWZvcihpbnQgaT1saW5lcy5sZW5ndGg7IGk+LTE7IGktLSkgewotCQkJUHJvcGVydHlMaW5lIGxpbmUgPSBsaW5lc1tpXTsKLQkJCWlmIChsaW5lLmdldE1lc3NhZ2VQcmVmaXgoKS5zdGFydHNXaXRoKHByZWZpeCkpIHsKLQkJCQlyZXBvcnQobGluZS50b1N0cmluZygpKTsKLQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYoIWZvdW5kKSB7Ci0JCQlyZXBvcnQoIk5vIGVycm9yIGlkcyB3ZXJlIGZvdW5kIHRoYXQgc3RhcnRlZCB3aXRoICIgKyBwcmVmaXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiBhbiBlc3RpbWF0ZSBvZiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gYSBzdWJzdGl0dXRpb24gcGFyYW1ldGVyLAotCSAqIHByaW50IGEgbGlzdCBvZiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gYSBnaXZlbiBtZXNzYWdlLCBpZiBlYWNoIAotCSAqIHBhcmFtZXRlciBpcyByZXBsYWNlZCB3aXRoICZxdW90O2xlbmd0aCZxdW90OyBjaGFyYWN0ZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW50RXhwZWN0ZWRTdHJpbmdMZW5ndGgoZmluYWwgaW50IGxlbmd0aCkgewotCQlyZXBvcnQoIkVYUEVDVEVEIExFTkdUSCBPRiBNRVNTQUdFIFdJVEggUEFSQU1FVEVSUyAiICsgbGVuZ3RoICsgIiBMT05HIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlDb21wYXJhdG9yIGMgPSBQcm9wZXJ0eUxpbmVDb21wYXJhdG9yLmdldFN0cmluZ0xlbmd0aENvbXBhcmF0b3IobGVuZ3RoKTsKLQkJQ29sbGVjdGlvbnMuc29ydChfcHJvcGVydHlMaW5lcywgYyk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gX3Byb3BlcnR5TGluZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlQcm9wZXJ0eUxpbmUgbGluZSA9IChQcm9wZXJ0eUxpbmUpaXRlcmF0b3IubmV4dCgpOwotCi0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigiTGVuZ3RoOiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJYnVmZmVyLmFwcGVuZChsaW5lLmdldEV4cGVjdGVkTGVuZ3RoKGxlbmd0aCkpOwotCQkJYnVmZmVyLmFwcGVuZCgiXHQiKTsgLy8kTk9OLU5MUy0xJAotCQkJYnVmZmVyLmFwcGVuZChsaW5lLnRvU3RyaW5nV2l0aEV4cGVjdGVkTGVuZ3RoKGxlbmd0aCkpOwotCQkJcmVwb3J0KGJ1ZmZlci50b1N0cmluZygpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByaW50IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBlYWNoIG1lc3NhZ2UuCi0JICovCi0JcHVibGljIHZvaWQgcHJpbnRTdHJpbmdMZW5ndGgoKSB7Ci0JCS8vICIwIiBtZWFucyBubyBzdWJzdGl0dXRpb24KLQkJcHJpbnRFeHBlY3RlZFN0cmluZ0xlbmd0aCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBQcmludCB0aGUgY29udGVudHMgb2YgdGhlIC5wcm9wZXJ0aWVzIGZpbGUsIHNvcnRlZCBieSBtZXNzYWdlIGlkLgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW50Q29udGVudHMoKSB7Ci0JCXJlcG9ydCgiQ09OVEVOVFMgT0YgLnByb3BlcnRpZXMgRklMRSwgU09SVEVEIEJZIE1FU1NBR0UgSUQiKTsgLy8kTk9OLU5MUy0xJAotCQlDb21wYXJhdG9yIGMgPSBQcm9wZXJ0eUxpbmVDb21wYXJhdG9yLmdldE1lc3NhZ2VJZENvbXBhcmF0b3IoKTsKLQkJQ29sbGVjdGlvbnMuc29ydChfcHJvcGVydHlMaW5lcywgYyk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gX3Byb3BlcnR5TGluZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlQcm9wZXJ0eUxpbmUgbGluZSA9IChQcm9wZXJ0eUxpbmUpaXRlcmF0b3IubmV4dCgpOwotCQkJcmVwb3J0KGxpbmUudG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcGVydGllc1ZhbGlkYXRvci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvcGFyc2VyL0NvbXBhcmVQcm9wZXJ0aWVzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcGVydGllc1ZhbGlkYXRvci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvcGFyc2VyL0NvbXBhcmVQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzYWI0MTEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxpZGF0b3Ivb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL3BhcnNlci9Db21wYXJlUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlLnBhcnNlcjsKLS8qCi0gKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTSAKLSAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDIsIDIwMDMgLSBBbGwgUmlnaHRzIFJlc2VydmVkLiAKLSAqIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUgCi0gKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4gCi0gKgotICogRElTQ0xBSU1FUiBPRiBXQVJSQU5USUVTLgotICogVGhlIGZvbGxvd2luZyBbZW5jbG9zZWRdIGNvZGUgaXMgc2FtcGxlIGNvZGUgY3JlYXRlZCBieSBJQk0KLSAqIENvcnBvcmF0aW9uLiBUaGlzIHNhbXBsZSBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFueSBzdGFuZGFyZCBvciBJQk0KLSAqIHByb2R1Y3QgYW5kIGlzIHByb3ZpZGVkIHRvIHlvdSBzb2xlbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGFzc2lzdGluZwotICogeW91IGluIHRoZSBkZXZlbG9wbWVudCBvZiB5b3VyIGFwcGxpY2F0aW9ucy4gIFRoZSBjb2RlIGlzIHByb3ZpZGVkCi0gKiAiQVMgSVMiLiBJQk0gTUFLRVMgTk8gV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUCi0gKiBOT1QgTElNSVRFRCBUTyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwotICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBSRUdBUkRJTkcgVEhFIEZVTkNUSU9OIE9SIFBFUkZPUk1BTkNFIE9GCi0gKiBUSElTIENPREUuICBUSElTIENPREUgTUFZIENPTlRBSU4gRVJST1JTLiAgSUJNIHNoYWxsIG5vdCBiZSBsaWFibGUKLSAqIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIG91dCBvZiB5b3VyIHVzZSBvZiB0aGUgc2FtcGxlIGNvZGUsIGV2ZW4KLSAqIGlmIGl0IGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLSAqIAotICovCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgY29tcGFyZXMgdHdvIC5wcm9wZXJ0aWVzIGZpbGUgYW5kIG91dHB1dHMgYSBsaXN0Ci0gKiBvZiB0aGUgZGlmZmVyZW5jZXMuIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBjb3VudCB0aGUgbnVtYmVyCi0gKiBvZiB3b3JkcyB0aGF0IGhhdmUgY2hhbmdlZC4KLSAqLwotcHVibGljIGNsYXNzIENvbXBhcmVQcm9wZXJ0aWVzIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBsaW5lU2VwYXJhdG9yID0gamF2YS5sYW5nLlN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgVHJlZVNldCBfZGVsZXRlZCA9IG51bGw7Ci0JcHJpdmF0ZSBUcmVlTWFwIF9jaGFuZ2VkID0gbnVsbDsKLQlwcml2YXRlIFRyZWVTZXQgX2FkZGVkID0gbnVsbDsKLS8vCXByaXZhdGUgUHJvcGVydHlGaWxlIF9vbGRGaWxlID0gbnVsbDsKLQlwcml2YXRlIFByb3BlcnR5RmlsZSBfbmV3RmlsZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gc3RvcmUgUHJvcGVydHlMaW5lIGluc3RhbmNlcyB3aGljaCBoYXZlIHRoZSBzYW1lCi0JICogbWVzc2FnZSBpZCwgYnV0IGRpZmZlcmVudCB2YWx1ZXMuIFdoZW4gdGhlIGxpc3Qgb2YgZGlmZmVyZW5jZXMgaXMgb3V0cHV0LAotCSAqIGFsbCB2YWx1ZXMgYXJlIG91dHB1dCBzbyB0aGF0IHRoZSB1c2VyIGNhbiBjb21wYXJlIHRoZSBsaW5lcyBtYW51YWxseSwgdG8KLQkgKiBzZWUgd2hhdCdzIGRpZmZlcmVudC4KLQkgKi8KLQljbGFzcyBDb21wYXJlTGluZSBpbXBsZW1lbnRzIENvbXBhcmFibGUgewotCQlwcml2YXRlIEFycmF5TGlzdCBfbGluZXM7Ci0JCXByaXZhdGUgZmluYWwgU3RyaW5nIF9tZXNzYWdlSWQ7Ci0KLQkJcHVibGljIENvbXBhcmVMaW5lKFN0cmluZyBtZXNzYWdlSWQpIHsKLQkJCV9tZXNzYWdlSWQgPSBtZXNzYWdlSWQ7Ci0JCQlfbGluZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBhZGQoUHJvcGVydHlMaW5lIG9sZExpbmUsIFByb3BlcnR5TGluZSBuZXdMaW5lKSB7Ci0JCQlfbGluZXMuYWRkKG5ldyBQcm9wZXJ0eUxpbmVbXXtvbGRMaW5lLCBuZXdMaW5lfSk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gX2xpbmVzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZChsaW5lU2VwYXJhdG9yKTsKLQkJCQlidWZmZXIuYXBwZW5kKCJcdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJUHJvcGVydHlMaW5lW10gbGluZXMgPSAoUHJvcGVydHlMaW5lW10paXRlcmF0b3IubmV4dCgpOwotCQkJCQotCQkJCWJ1ZmZlci5hcHBlbmQobGluZXNbMF0pOwotCQkJCWJ1ZmZlci5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlidWZmZXIuYXBwZW5kKGxpbmVzWzFdKTsKLQkJCX0KLQkJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBTaW5jZSB0aGlzIGlzIGEgY2hhbmdlZCBzdHJpbmcsIHJldHVybiB0aGUgYWJzb2x1dGUgZGlmZmVyZW5jZSBvZiB3b3JkcyBiZXR3ZWVuIHRoZSBzdHJpbmdzLgotCQkgKi8JCQotCQlwdWJsaWMgaW50IGdldE51bVdvcmRzKCkgewotCQkJaW50IG51bVdvcmRzID0gMDsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gX2xpbmVzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJUHJvcGVydHlMaW5lW10gbGluZXMgPSAoUHJvcGVydHlMaW5lW10paXRlcmF0b3IubmV4dCgpOwotCQkJCW51bVdvcmRzID0gbnVtV29yZHMgKyBjb21wYXJlKGxpbmVzWzBdLCBsaW5lc1sxXSk7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVtV29yZHM7Ci0JCX0KLQkJCi0JCXByaXZhdGUgaW50IGNvbXBhcmUoUHJvcGVydHlMaW5lIG9sZExpbmUsIFByb3BlcnR5TGluZSBuZXdMaW5lKSB7Ci0JCQkvLyBGb3IgZXZlcnkgd29yZCBpbiB0aGUgb2xkIHN0cmluZywgc2VlIGlmIGl0IGV4aXN0cyBpbiB0aGUgbmV3Ci0JCQkvLyBzdHJpbmcuIFRoZSBwb3NpdGlvbiBvZiB0aGUgd29yZCBkb2Vzbid0IG1hdHRlciAtIGlmIHRoZSB3b3JkCi0JCQkvLyBleGlzdHMgaW4gdGhlIG5ldywgdGhlbiB0aGUgd29yZCBpcyBub3QgY291bnRlZCBhcyBhICJjaGFuZ2VkIgotCQkJLy8gd29yZC4gCi0JCQkvLyAgICAxLiBJZiB0aGUgd29yZCBleGlzdHMsIHJlbW92ZSB0aGUgd29yZCBmcm9tIHRoZSBuZXdMaW5lIGFuZAotCQkJLy8gICAgICAgYWR2YW5jZSB0byB0aGUgbmV4dCBvbGQgdG9rZW4uIChSZW1vdmUgd29yZCBmcm9tIG5ld0xpbmUKLQkJCS8vICAgICAgIGluIGNhc2UgdGhlIHdvcmQgZXhpc3RlZCB0d2ljZSBpbiB0aGUgb2xkIHN0cmluZyBidXQgb25seQotCQkJLy8gICAgICAgb25jZSBpbiB0aGUgbmV3LiBUaGUgc2Vjb25kIG9sZFdvcmQgc2hvdWxkIGJlIGNvdW50ZWQgYXMKLQkJCS8vICAgICAgIGEgY2hhbmdlZCB3b3JkLikKLQkJCS8vICAgIDIuIElmIHRoZSB3b3JkIGRvZXNuJ3QgZXhpc3QsIG51bUNoYW5nZWQrKyBhbmQgYWR2YW5jZSB0byB0aGUKLQkJCS8vICAgICAgIG5leHQgb2xkIHRva2VuLgotCQkJLy8gICAgMy4gT25jZSBhbGwgb2YgdGhlIG9sZFdvcmRzIGhhdmUgYmVlbiBjaGVja2VkLCB0b2tlbml6ZSB0aGUKLQkJCS8vICAgICAgIHJlbWFpbmluZyBuZXdXb3JkIGFuZCBjb3VudCB0aGUgbnVtYmVyIG9mIHdvcmRzIGluIHRoZSBzdHJpbmcuCi0JCQkvLyAgICAgICBUaGVzZSB3b3JkcyBoYXZlIGJlZW4gYWRkZWQgYW5kIGVhY2ggb25lIGNvdW50cyBhcyBhIAotCQkJLy8gICAgICAgY2hhbmdlZCB3b3JkLgotCQkJaW50IG51bUNoYW5nZWRXb3JkcyA9IDA7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgb2xkVG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihvbGRMaW5lLmdldE1lc3NhZ2UoKSk7Ci0KLQkJCS8vIE5lZWQgdG8gYmUgY2FyZWZ1bC4uLndhbnQgdGhlIGVudGlyZSB3b3JkLCBub3Qgb2xkV29yZD0ib24iIG1pc3Rha2VuIGZvciBuZXdXb3JkPSJvbmUiIG9yIG5ld1dvcmQ9ImJvbmQiCi0JCQkvLyBFYXNpZXIgdG8gY3JlYXRlIGEgbGlzdCBvZiBuZXcgd29yZHMgdG8gY29tcGFyZSBhZ2FpbnN0LgotCQkJU3RyaW5nVG9rZW5pemVyIG5ld1Rva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobmV3TGluZS5nZXRNZXNzYWdlKCkpOwotCQkJTGlzdCBuZXdXb3JkcyA9IG5ldyBBcnJheUxpc3QoKTsgLy8gQ2FuJ3QgdXNlIGEgc2V0IGluIGNhc2UgdGhlIG5ld0xpbmUgdXNlcyBhIHdvcmQsIGUuZy4gInRoZSIsIG1vcmUgdGhhbiBvbmNlLgotCQkJd2hpbGUobmV3VG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCW5ld1dvcmRzLmFkZChuZXdUb2tlbml6ZXIubmV4dFRva2VuKCkpOwotCQkJfQotCQkJCi0JCQl3aGlsZShvbGRUb2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJU3RyaW5nIG9sZFdvcmQgPSBvbGRUb2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCQkJaWYobmV3V29yZHMuY29udGFpbnMob2xkV29yZCkpIHsKLQkJCQkJbmV3V29yZHMucmVtb3ZlKG9sZFdvcmQpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJbnVtQ2hhbmdlZFdvcmRzKys7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBDYW4gY291bnQgdGhlIHRva2VucyBidXQgbm90IHRoZSBlbG1lbnRzLgotCQkJbnVtQ2hhbmdlZFdvcmRzICs9IG5ld1dvcmRzLnNpemUoKTsKLQkJCXJldHVybiBudW1DaGFuZ2VkV29yZHM7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZCgpIHsKLQkJCXJldHVybiBfbWVzc2FnZUlkOwotCQl9Ci0KLQkJcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IG8pIHsKLQkJCS8vIGJ5IGRlZmF1bHQsIHNvcnQgYnkgbWVzc2FnZSBpZAotCQkJaWYgKCEobyBpbnN0YW5jZW9mIENvbXBhcmVMaW5lKSkgewotCQkJCS8vIHRoZW4gaG93IG9uIGVhcnRoIGRpZCB0aGlzIG1ldGhvZCBnZXQgY2FsbGVkPz8KLQkJCQkvLyBwdXQgaXQgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdAotCQkJCXJldHVybiAxOwotCQkJfQotCi0JCQlyZXR1cm4gZ2V0TWVzc2FnZUlkKCkuY29tcGFyZVRvKCgoQ29tcGFyZUxpbmUpIG8pLmdldE1lc3NhZ2VJZCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbXBhcmUgdGhlIHR3byBQcm9wZXJ0eUZpbGUgYW5kIHByaW50IG91dCBhIGxpc3Qgb2YgdGhlIGRpZmZlcmVuY2VzOyAKLQkgKiB0aGUgZmlyc3QgcGFyYW1ldGVyIGlzIHRoZSBvbGRlciAucHJvcGVydGllcyBmaWxlLCBhbmQgdGhlIHNlY29uZCAKLQkgKiBwYXJhbWV0ZXIgaXMgdGhlIG5ld2VyIC5wcm9wZXJ0aWVzIGZpbGUuCi0JICovCi0JcHVibGljIENvbXBhcmVQcm9wZXJ0aWVzKFByb3BlcnR5RmlsZSBvbGRGaWxlLCBQcm9wZXJ0eUZpbGUgbmV3RmlsZSkgewotCQlfZGVsZXRlZCA9IG5ldyBUcmVlU2V0KCk7Ci0JCV9jaGFuZ2VkID0gbmV3IFRyZWVNYXAoKTsKLQkJX2FkZGVkID0gbmV3IFRyZWVTZXQoKTsKLQkJCi0vLwkJX29sZEZpbGUgPSBvbGRGaWxlOwotCQlfbmV3RmlsZSA9IG5ld0ZpbGU7Ci0KLQkJY29tcGFyZShvbGRGaWxlLCBuZXdGaWxlKTsKLQl9Ci0JCi0JLyoqCi0JICogSW4gdGhlIG9sZGVyIFByb3BlcnR5RmlsZSwgdGhlIG1lc3NhZ2UgdGV4dCB3YXMgZGlmZmVyZW50OyBjYWNoZSB0aGUKLQkgKiBvbGRlciB2ZXJzaW9uIG9mIHRoZSBQcm9wZXJ0eUxpbmUgYW5kIHRoZSBuZXdlciB2ZXJzaW9uIG9mIHRoZSBQcm9wZXJ0eUxpbmUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZENoYW5nZWQoUHJvcGVydHlMaW5lIG9sZExpbmUsIFByb3BlcnR5TGluZSBuZXdMaW5lKSB7Ci0JCUNvbXBhcmVMaW5lIGNsID0gKENvbXBhcmVMaW5lKSBfY2hhbmdlZC5nZXQob2xkTGluZS5nZXRNZXNzYWdlSWQoKSk7Ci0JCWlmIChjbCA9PSBudWxsKSB7Ci0JCQljbCA9IG5ldyBDb21wYXJlTGluZShvbGRMaW5lLmdldE1lc3NhZ2VJZCgpKTsKLQkJfQotCQljbC5hZGQob2xkTGluZSwgbmV3TGluZSk7Ci0JCV9jaGFuZ2VkLnB1dChvbGRMaW5lLmdldE1lc3NhZ2VJZCgpLCBjbCk7Ci0JfQotCQotCS8qKgotCSAqIENvbXBhcmUgdGhlIHR3byBwcm9wZXJ0eSBmaWxlcyBhbmQgYnVpbGQgdGhlIGNvbGxlY3Rpb25zIG9mIHZhcmlhYmxlIG5hbWVzIHdpdGgKLQkgKiB0aGVpciBhc3NvY2lhdGVkIHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb21wYXJlKFByb3BlcnR5RmlsZSBvbGRGaWxlLCBQcm9wZXJ0eUZpbGUgbmV3RmlsZSkgewotCQlfYWRkZWQuY2xlYXIoKTsKLQkJX2RlbGV0ZWQuY2xlYXIoKTsKLQkJX2NoYW5nZWQuY2xlYXIoKTsKLQotCQkvLyBGb3IgZWFjaCBlbGVtZW50IGluIGZpbGUgMSwgc2VlIGlmIGl0IGV4aXN0cyBpbiBmaWxlIDIKLQkJLy8gICBhKSBpZiBpdCBkb2Vzbid0IGV4aXN0LCBhZGQgaXQgdG8gdGhlIGxpc3Qgb2YgImRlbGV0ZWQiIHN0cmluZ3MKLQkJLy8gICBiKSBpZiBpdCBleGlzdHMsIGFuZCBpZiB0aGUgdmFsdWUgaXMgZGlmZmVyZW50LCBhZGQgaXQgdG8gdGhlIGxpc3Qgb2YgImNoYW5nZWQiIHN0cmluZ3MKLQkJLy8gICBjKSBpZiBpdCBleGlzdHMsIGFuZCBpZiB0aGUgdmFsdWUgaXMgdGhlIHNhbWUsIGFkZCBpdCB0byB0aGUgbGlzdCBvZiAibm90IGNoYW5nZWQiIHN0cmluZ3MKLQkJLy8gICBkKSBkZWxldGUgdGhlIGVudHJ5LCBpZiBpdCBleGlzdHMsIGZyb20gZmlsZSAyJ3MgaGFzaHRhYmxlIHNvIHdlIGRvbid0IGNoZWNrIGl0IHR3aWNlLgotCQkvLyBGb3IgZWFjaCBlbGVtZW50IGluIGZpbGUgMiBub3QgY2hlY2tlZCBhbHJlYWR5LCBpdCBjYW5ub3QgZXhpc3QgaW4gZmlsZSAxLCBzbyBhZGQgaXQgdG8gdGhlIGxpc3Qgb2YgIm5ldyIgc3RyaW5ncwotCQkvLwotCQkvLyBOZWVkIHNvbWUgd2F5IHRvIGFib3J0IGNvbXBhcmlzb24gaWYgZWl0aGVyIG9mIHRoZSBmaWxlcyBjb250YWlucyBkdXBsaWNhdGUKLQkJLy8gbWVzc2FnZSBpZHMuCi0JCS8vCi0JCUxpc3Qgb2xkS2V5cyA9IG5ldyBBcnJheUxpc3Qob2xkRmlsZS5nZXRQcm9wZXJ0eUxpbmVzKCkpOwotCQlMaXN0IG5ld0tleXMgPSBuZXcgQXJyYXlMaXN0KG5ld0ZpbGUuZ2V0UHJvcGVydHlMaW5lcygpKTsKLQkJQ29sbGVjdGlvbnMuc29ydChvbGRLZXlzLCBQcm9wZXJ0eUxpbmVDb21wYXJhdG9yLmdldE1lc3NhZ2VJZENvbXBhcmF0b3IoKSk7Ci0JCUNvbGxlY3Rpb25zLnNvcnQobmV3S2V5cywgUHJvcGVydHlMaW5lQ29tcGFyYXRvci5nZXRNZXNzYWdlSWRDb21wYXJhdG9yKCkpOwotCQlJdGVyYXRvciBvbGRJdGVyYXRvciA9IG9sZEtleXMuaXRlcmF0b3IoKTsKLQkJSXRlcmF0b3IgbmV3SXRlcmF0b3IgPSBuZXdLZXlzLml0ZXJhdG9yKCk7Ci0JCVByb3BlcnR5TGluZSBvbGRMaW5lID0gKG9sZEl0ZXJhdG9yLmhhc05leHQoKSkgPyAoUHJvcGVydHlMaW5lKSBvbGRJdGVyYXRvci5uZXh0KCkgOiBudWxsOwotCQlQcm9wZXJ0eUxpbmUgbmV3TGluZSA9IChuZXdJdGVyYXRvci5oYXNOZXh0KCkpID8gKFByb3BlcnR5TGluZSkgbmV3SXRlcmF0b3IubmV4dCgpIDogbnVsbDsKLQkJd2hpbGUgKChvbGRMaW5lICE9IG51bGwpICYmIChuZXdMaW5lICE9IG51bGwpKSB7Ci0JCQkvLyBvbGRMaW5lIG1lc3NhZ2UgaWQgaXMgZWl0aGVyIDwsID0sIG9yID4gbmV3TGluZSBtZXNzYWdlIGlkLgotCQkJLy8gaWYgPCwgbWVzc2FnZSBpZCBoYXMgYmVlbiBkZWxldGVkLgotCQkJLy8gaWYgPSwgc2VlIGlmIGNoYW5nZWQgKG9yIGp1c3QgY29tcGFyZSBtZXNzYWdlIGlkcy4pCi0JCQkvLyBpZiA+LCBuZXcgbGluZSBpcyBhIG5ldyBtZXNzYWdlIGlkLgotCQkJLy8gdG8gaW5jcmVtZW50LCBpbmNyZW1lbnQgb25seSB0aGUgPCAod2hldGhlciBpdCdzIG9sZExpbmUgb3IgbmV3TGluZSkuCi0JCQlpbnQgY29tcGFyZSA9IG9sZExpbmUuZ2V0TWVzc2FnZUlkKCkuY29tcGFyZVRvKG5ld0xpbmUuZ2V0TWVzc2FnZUlkKCkpOwotCQkJaWYgKGNvbXBhcmUgPCAwKSB7Ci0JCQkJLy8gZGVsZXRlZAotCQkJCV9kZWxldGVkLmFkZChvbGRMaW5lKTsKLQkJCQlpZiAob2xkSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCW9sZExpbmUgPSAoUHJvcGVydHlMaW5lKSBvbGRJdGVyYXRvci5uZXh0KCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlvbGRMaW5lID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChjb21wYXJlID09IDApIHsKLQkJCQkvLyBleGlzdGVkIGJlZm9yZS4gQ2hlY2sgaWYgY2hhbmdlZC4KLQkJCQlpZiAoIW9sZExpbmUuZ2V0TWVzc2FnZSgpLmVxdWFscyhuZXdMaW5lLmdldE1lc3NhZ2UoKSkpIHsKLQkJCQkJLy8gY2hhbmdlZAotCQkJCQlhZGRDaGFuZ2VkKG9sZExpbmUsIG5ld0xpbmUpOwotCQkJCX0KLQkJCQlpZiAob2xkSXRlcmF0b3IuaGFzTmV4dCgpICYmIG5ld0l0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQlvbGRMaW5lID0gKFByb3BlcnR5TGluZSkgb2xkSXRlcmF0b3IubmV4dCgpOwotCQkJCQluZXdMaW5lID0gKFByb3BlcnR5TGluZSkgbmV3SXRlcmF0b3IubmV4dCgpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJb2xkTGluZSA9IG51bGw7Ci0JCQkJCW5ld0xpbmUgPSBudWxsOwotCQkJCX0KLQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gYWRkZWQKLQkJCQlfYWRkZWQuYWRkKG5ld0xpbmUpOwotCQkJCWlmIChuZXdJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJbmV3TGluZSA9IChQcm9wZXJ0eUxpbmUpIG5ld0l0ZXJhdG9yLm5leHQoKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCW5ld0xpbmUgPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChvbGRMaW5lICE9IG51bGwpIHsKLQkJCV9kZWxldGVkLmFkZChvbGRMaW5lKTsKLQkJfQotCi0JCWlmIChuZXdMaW5lICE9IG51bGwpIHsKLQkJCV9hZGRlZC5hZGQobmV3TGluZSk7Ci0JCX0KLQotCQl3aGlsZSAob2xkSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkvLyBhbGwgb2YgdGhlIHJlc3QgaGF2ZSBiZWVuIGRlbGV0ZWQKLQkJCV9kZWxldGVkLmFkZChvbGRJdGVyYXRvci5uZXh0KCkpOwotCQl9Ci0KLQkJd2hpbGUgKG5ld0l0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJLy8gYWxsIG9mIHRoZSByZXN0IGhhdmUgYmVlbiBhZGRlZAotCQkJX2FkZGVkLmFkZChuZXdJdGVyYXRvci5uZXh0KCkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIENvbGxjdGlvbiBvZiBQcm9wZXJ0eUxpbmUgaW5zdGFuY2VzIHRoYXQgZXhpc3QgaW4KLQkgKiB0aGUgbmV3ZXIgUHJvcGVydHlGaWxlIHRoYXQgYXJlbid0IGluIHRoZSBvbGRlciBQcm9wZXJ0eUZpbGUuCi0JICovCi0JcHVibGljIFNldCBnZXRBZGRlZCgpIHsKLQkJcmV0dXJuIF9hZGRlZDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgQ29sbGVjdGlvbiBvZiBDb21wYXJlTGluZSBpbnN0YW5jZXMgdGhhdCByZXByZXNlbnQKLQkgKiB0aGUgdHdvIFByb3BlcnR5TGluZSBpbnN0YW5jZXM7IG9uZSBmcm9tIHRoZSBvbGRlciBQcm9wZXJ0eUZpbGUsCi0JICogYW5kIG9uZSBmcm9tIHRoZSBuZXdlciBQcm9wZXJ0eUZpbGUuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hhbmdlZCgpIHsKLQkJcmV0dXJuIF9jaGFuZ2VkLnZhbHVlcygpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBDb2xsZWN0aW9uIG9mIFByb3BlcnR5TGluZSBpbnN0YW5jZXMgdGhhdCBkbyBub3QKLQkgKiBleGlzdCBpbiB0aGUgbmV3ZXIgUHJvcGVydHlGaWxlIHlldCB0aGF0IGV4aXN0IGluIHRoZSBvbGRlcgotCSAqIFByb3BlcnR5RmlsZS4KLQkgKi8KLQlwdWJsaWMgU2V0IGdldERlbGV0ZWQoKSB7Ci0JCXJldHVybiBfZGVsZXRlZDsKLQl9Ci0JCi0JLyoqCi0JICogUHJpbnQgb3V0IGFsbCBvZiB0aGUgY29sbGVjdGlvbnMgb2YgdmFyaWFibGUgc3RyaW5ncy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmludFJlc3VsdHMoKSB7Ci0JCS8vIGNyZWF0ZSBhbiBvdXRwdXQgbG9nIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwgYW5kIGluIGl0IGxpc3QgdGhlIHN0cmluZ3MgaW4gYSBzZWN0aW9uIGVhY2guCi0JCWludCBudW1OZXcgPSBwcmludFN0cmluZ3MoIk5FVyBQUk9QRVJUSUVTIiwgX2FkZGVkKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJaW50IG51bVdvcmRzRGVsZXRlZCA9IHByaW50U3RyaW5ncygiREVMRVRFRCBQUk9QRVJUSUVTIiwgX2RlbGV0ZWQpOyAvLyROT04tTkxTLTEkCi0JCWludCBudW1Xb3Jkc0NoYW5nZWQgPSAgcHJpbnRTdHJpbmdzKCJDSEFOR0VEIFBST1BFUlRJRVMiLCBfY2hhbmdlZC52YWx1ZXMoKSk7IC8vJE5PTi1OTFMtMSQKLQkJZmxvYXQgdG90YWxDaGFuZ2UgPSBudW1OZXcgKyBudW1Xb3Jkc0RlbGV0ZWQgKyBudW1Xb3Jkc0NoYW5nZWQ7Ci0JCWZsb2F0IG51bVdvcmRzID0gX25ld0ZpbGUuZ2V0TnVtV29yZHMoKTsKLQkJZmxvYXQgcGVyY2VudCA9IHRvdGFsQ2hhbmdlIC8gbnVtV29yZHMgKiAxMDA7Ci0JCQotCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJOdW1iZXIgb2YgbmV3IHdvcmRzOiAiICsgbnVtTmV3KTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oIk51bWJlciBvZiB3b3JkcyBpbiBkZWxldGVkIG1lc3NhZ2VzOiAiICsgbnVtV29yZHNEZWxldGVkKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oIk51bWJlciBvZiBjaGFuZ2VkIHdvcmRzIGluIG1vZGlmaWVkIG1lc3NhZ2VzOiAiICsgbnVtV29yZHNDaGFuZ2VkKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oIk51bWJlciBvZiB3b3JkcyBpbiBmaWxlICIgKyBfbmV3RmlsZS5nZXRRdWFsaWZpZWRGaWxlTmFtZSgpICsgIjogIiArIG51bVdvcmRzKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiVG90YWwgY2hhbmdlIG9mIHdvcmRzOiAiICsgdG90YWxDaGFuZ2UgKyAiLCB3aGljaCBpcyBhICIgKyBwZXJjZW50ICsgIiUgY2hhbmdlLiIpOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQl9Ci0JCi0JcHVibGljIHZvaWQgcHJpbnRSZXN1bHRzRm9yVHJhbnNsYXRpb24oKSB7Ci0JCS8vIGNyZWF0ZSBhbiBvdXRwdXQgbG9nIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwgYW5kIGluIGl0IGxpc3QgdGhlIHN0cmluZ3MgaW4gYSBzZWN0aW9uIGVhY2guCi0JCXByaW50U3RyaW5nc0ZvclRyYW5zbGF0aW9uKCJERUxFVEVEIFBST1BFUlRJRVMiLCBfZGVsZXRlZCk7IC8vJE5PTi1OTFMtMSQKLQkJcHJpbnRTdHJpbmdzRm9yVHJhbnNsYXRpb24oIk5FVyBQUk9QRVJUSUVTIiwgX2FkZGVkKTsgLy8kTk9OLU5MUy0xJAotCQlwcmludFN0cmluZ3NGb3JUcmFuc2xhdGlvbigiQ0hBTkdFRCBQUk9QRVJUSUVTIiwgX2NoYW5nZWQudmFsdWVzKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qKgotCSAqIFByaW50IHRoZSBudW1iZXIgb2YgbGluZXMgaW4gdGhlIC5wcm9wZXJ0aWVzIGZpbGUuCi0JICovCi0JcHJpdmF0ZSBpbnQgcHJpbnRTdHJpbmdzKFN0cmluZyBoZWFkZXIsIENvbGxlY3Rpb24gbGluZXMpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihoZWFkZXIpOwotCQlpbnQgY291bnQgPSAwOwotCQlpbnQgbnVtV29yZHMgPSAwOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IGxpbmVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBsaW5lID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYobGluZSBpbnN0YW5jZW9mIFByb3BlcnR5TGluZSkgewotCQkJCW51bVdvcmRzICs9ICgoUHJvcGVydHlMaW5lKWxpbmUpLmdldE51bVdvcmRzKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBtdXN0IGJlIGEgY29tcGFyZSBsaW5lCi0JCQkJbnVtV29yZHMgKz0gKChDb21wYXJlTGluZSlsaW5lKS5nZXROdW1Xb3JkcygpOwotCQkJfQotCQkJCi0JCQljb3VudCsrOwotCQkJU3lzdGVtLm91dC5wcmludGxuKGxpbmUpOwotCQl9Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiTnVtYmVyIG9mIHByb3BlcnRpZXM6ICIgKyBjb3VudCk7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCXJldHVybiBudW1Xb3JkczsKLQl9Ci0JCi0JLyoqCi0JICogUHJpbnQgdGhlIGNvbnRlbnRzIG9mIHRoZSBzb3J0ZWQgY29sbGVjdGlvbiBvZiBsaW5lcyBmcm9tIHRoZSAucHJvcGVydGllcyBmaWxlLgotCSAqLwotCXByaXZhdGUgdm9pZCBwcmludFN0cmluZ3NGb3JUcmFuc2xhdGlvbihTdHJpbmcgaGVhZGVyLCBDb2xsZWN0aW9uIGxpbmVzKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oaGVhZGVyKTsKLQkJaW50IGNvdW50ID0gMDsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBsaW5lcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQljb3VudCsrOwotCQkJT2JqZWN0IGxpbmUgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAobGluZSBpbnN0YW5jZW9mIFByb3BlcnR5TGluZSkgewotCQkJCVByb3BlcnR5TGluZSBwcm9wbGluZSA9IChQcm9wZXJ0eUxpbmUpIGxpbmU7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKHByb3BsaW5lLmdldE1lc3NhZ2VJZCgpKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGxpbmUgaW5zdGFuY2VvZiBDb21wYXJlTGluZSkgewotCQkJCUNvbXBhcmVMaW5lIHByb3BsaW5lID0gKENvbXBhcmVMaW5lKSBsaW5lOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihwcm9wbGluZS5nZXRNZXNzYWdlSWQoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImluc3RhbmNlIG9mICIgKyBsaW5lLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiVG90YWw6ICIgKyBjb3VudCk7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wcm9wZXJ0aWVzVmFsaWRhdG9yL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9wYXJzZXIvSVZhbGlkYXRpb25Db25zdGFudHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wcm9wZXJ0aWVzVmFsaWRhdG9yL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9wYXJzZXIvSVZhbGlkYXRpb25Db25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhhZTllNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcGVydGllc1ZhbGlkYXRvci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvcGFyc2VyL0lWYWxpZGF0aW9uQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS5wYXJzZXI7Ci0vKgotICogTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0gCi0gKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAyLCAyMDAzIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCi0gKiBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlIAotICogcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuIAotICoKLSAqIERJU0NMQUlNRVIgT0YgV0FSUkFOVElFUy4KLSAqIFRoZSBmb2xsb3dpbmcgW2VuY2xvc2VkXSBjb2RlIGlzIHNhbXBsZSBjb2RlIGNyZWF0ZWQgYnkgSUJNCi0gKiBDb3Jwb3JhdGlvbi4gVGhpcyBzYW1wbGUgY29kZSBpcyBub3QgcGFydCBvZiBhbnkgc3RhbmRhcmQgb3IgSUJNCi0gKiBwcm9kdWN0IGFuZCBpcyBwcm92aWRlZCB0byB5b3Ugc29sZWx5IGZvciB0aGUgcHVycG9zZSBvZiBhc3Npc3RpbmcKLSAqIHlvdSBpbiB0aGUgZGV2ZWxvcG1lbnQgb2YgeW91ciBhcHBsaWNhdGlvbnMuICBUaGUgY29kZSBpcyBwcm92aWRlZAotICogIkFTIElTIi4gSUJNIE1BS0VTIE5PIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVAotICogTk9UIExJTUlURUQgVE8gVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKLSAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgUkVHQVJESU5HIFRIRSBGVU5DVElPTiBPUiBQRVJGT1JNQU5DRSBPRgotICogVEhJUyBDT0RFLiAgVEhJUyBDT0RFIE1BWSBDT05UQUlOIEVSUk9SUy4gIElCTSBzaGFsbCBub3QgYmUgbGlhYmxlCi0gKiBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBvdXQgb2YgeW91ciB1c2Ugb2YgdGhlIHNhbXBsZSBjb2RlLCBldmVuCi0gKiBpZiBpdCBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0gKiAKLSAqLwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGNvbnRhaW5zIHRoZSBtZXNzYWdlIGlkcyBvZiBhbGwgb2YgdGhlIFByb3BlcnRpZXMKLSAqIFZhbGlkYXRvcidzIG1lc3NhZ2VzLCBhbmQgdGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIGJ1bmRsZSB0aGF0IAotICogY29udGFpbnMgdGhvc2UgbWVzc2FnZXMuIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElWYWxpZGF0aW9uQ29uc3RhbnRzIHsKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRU5BTUUgPSAicHJvcGVydGllc1ZhbGlkYXRvciI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIEFCQ0QwMDAwID0gIkFCQ0QwMDAwIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUJDRDAwMTBFID0gIkFCQ0QwMDEwRSI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIEFCQ0QwMDEwVyA9ICJBQkNEMDAxMFciOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBBQkNEMDAyMCA9ICJBQkNEMDAyMCI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIEFCQ0QwMDMwID0gIkFCQ0QwMDMwIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUJDRDAwNDAgPSAiQUJDRDAwNDAiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBBQkNEMDA1MCA9ICJBQkNEMDA1MCI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIEFCQ0QwMDYwID0gIkFCQ0QwMDYwIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUJDRDAwNzAgPSAiQUJDRDAwNzAiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBBQkNEMDA4MCA9ICJBQkNEMDA4MCI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIEFCQ0QwMDkwID0gIkFCQ0QwMDkwIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUJDRDAxMTAgPSAiQUJDRDAxMTAiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBBQkNEMDEyMCA9ICJBQkNEMDEyMCI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIEFCQ0QwMTMwID0gIkFCQ0QwMTMwIjsgLy8kTk9OLU5MUy0xJAotCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FX0xPQyA9ICJMSU5FX0xPQyI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wcm9wZXJ0aWVzVmFsaWRhdG9yL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9wYXJzZXIvTWFpbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxpZGF0b3Ivb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL3BhcnNlci9NYWluLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZDZlZTEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxpZGF0b3Ivb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL3BhcnNlci9NYWluLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUucGFyc2VyOwotLyoKLSAqIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNIAotICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMiwgMjAwMyAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAotICogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSAKLSAqIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLiAKLSAqCi0gKiBESVNDTEFJTUVSIE9GIFdBUlJBTlRJRVMuCi0gKiBUaGUgZm9sbG93aW5nIFtlbmNsb3NlZF0gY29kZSBpcyBzYW1wbGUgY29kZSBjcmVhdGVkIGJ5IElCTQotICogQ29ycG9yYXRpb24uIFRoaXMgc2FtcGxlIGNvZGUgaXMgbm90IHBhcnQgb2YgYW55IHN0YW5kYXJkIG9yIElCTQotICogcHJvZHVjdCBhbmQgaXMgcHJvdmlkZWQgdG8geW91IHNvbGVseSBmb3IgdGhlIHB1cnBvc2Ugb2YgYXNzaXN0aW5nCi0gKiB5b3UgaW4gdGhlIGRldmVsb3BtZW50IG9mIHlvdXIgYXBwbGljYXRpb25zLiAgVGhlIGNvZGUgaXMgcHJvdmlkZWQKLSAqICJBUyBJUyIuIElCTSBNQUtFUyBOTyBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCi0gKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIFJFR0FSRElORyBUSEUgRlVOQ1RJT04gT1IgUEVSRk9STUFOQ0UgT0YKLSAqIFRISVMgQ09ERS4gIFRISVMgQ09ERSBNQVkgQ09OVEFJTiBFUlJPUlMuICBJQk0gc2hhbGwgbm90IGJlIGxpYWJsZQotICogZm9yIGFueSBkYW1hZ2VzIGFyaXNpbmcgb3V0IG9mIHlvdXIgdXNlIG9mIHRoZSBzYW1wbGUgY29kZSwgZXZlbgotICogaWYgaXQgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotICogCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gcGVyZm9ybSB2YWxpZGF0aW9uIG9yIC5wcm9wZXJ0aWVzIGZpbGUgcXVlcmllcwotICogd2l0aG91dCB1c2luZyBhbiBJVmFsaWRhdG9yLiAKLSAqLwotcHVibGljIGNsYXNzIE1haW4gewotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3YpIHsKLQkJaWYoYXJndi5sZW5ndGggPCAxKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oInByb3AgLXRyIFstYSB8IC1hYyB8IC1hbSB8IC1hbiB8IC1hbCBQUkVGSVggfCAtYXAgUFJFRklYIHwgLWF1IHwgLWIgfCAtZGkgfCAtZHAgfCAtbCB8IC1sZSA8cG9zaXRpdmUgaW50ZWdlcj4gfCAtcCBdIGY6XFxkaXIxXFxkaXIyXFxteVByb3BlcnRpZXNGaWxlLnByb3BlcnRpZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJvciAiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJwcm9wIFstY3wtY3RdIGY6XFxkaXIxXFxkaXIyXFxteVByb3BlcnRpZXNGaWxlLnByb3BlcnRpZXMgZjpcXGRpcjFcXGRpcjJcXG15TmV3UHJvcGVydGllc0ZpbGUucHJvcGVydGllcyIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgIC1hOiBwcmludCBhbGwgZXJyb3Ivd2FybmluZy9pbmZvIHByZWZpeGVzIGluIHRoZSBmaWxlIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAtYWM6IHByaW50IGEgY291bnQgb2YgbWVzc2FnZXMgd2l0aCBhbmQgd2l0aG91dCBwcmVmaXhlcyBpbiB0aGUgZmlsZSIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgLWFtOiBwcmludCBhbGwgbWVzc2FnZXMgd2l0aCBhIHByZWZpeCIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgLWFuOiBwcmludCBhbGwgbWVzc2FnZXMgd2l0aG91dCBhbiBlcnJvciBwcmVmaXgiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCIgIC1hbDogcHJpbnQgdGhlIGxhc3QgZXJyb3Ivd2FybmluZy9pbmZvIHByZWZpeCwgc3RhcnRpbmcgd2l0aCBQUkVGSVgsIGluIHRoZSBmaWxlIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAtYXA6IHByaW50IGFueSBlcnJvci93YXJuaW5nL2luZm8gcHJlZml4ZXMsIHN0YXJ0aW5nIHdpdGggUFJFRklYLCBpbiB0aGUgZmlsZSIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgLWF1OiBwcmludCBhbGwgZXJyb3Ivd2FybmluZy9pbmZvIHByZWZpeGVzIHRoYXQgYXJlIG5vdCB1c2VkIGluIHRoZSBmaWxlIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgLWI6IHByaW50IGFueSBibGFuayBtZXNzYWdlcyBpbiB0aGUgcHJvcGVydGllcyBmaWxlIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgLWM6IGNvbXBhcmUgdGhlIHR3byBwcm9wZXJ0eSBmaWxlcyBsaXN0ZWQuIFRoZSBmaXJzdCBpcyB0aGUgb2xkZXIsIGFuZCB0aGUgc2Vjb25kIGlzIHRoZSBuZXdlci4iKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCIgIC1jdDogY29tcGFyZSB0aGUgdHdvIHByb3BlcnR5IGZpbGVzIGxpc3RlZC4gVGhlIGZpcnN0IGlzIHRoZSBvbGRlciwgYW5kIHRoZSBzZWNvbmQgaXMgdGhlIG5ld2VyLiBPdXRwdXQgYSBsaXN0IG9mIHRoZSBhZGRlZCwgZGVsZXRlZCwgYW5kIGNoYW5nZWQgc3RyaW5ncywgYnV0IHByaW50IG9ubHkgdGhlIG1lc3NhZ2UgaWQuIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAtZGk6IHByaW50IGFueSBkdXBsaWNhdGUgbWVzc2FnZSBpZHMgYW5kIHN5bnRheCBlcnJvcnMgaW4gdGhlIHByb3BlcnRpZXMgZmlsZSIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgLWRwOiBwcmludCBhbnkgZHVwbGljYXRlIGVycm9yL3dhcm5pbmcvaW5mbyBwcmVmaXhlcyBpbiB0aGUgZmlsZSIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgIC1sOiBwcmludCB0aGUgbGVuZ3RoIG9mIGVhY2ggbWVzc2FnZSBpbiB0aGUgZmlsZSIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgLWxlOiBwcmludCB0aGUgbGVuZ3RoIG9mIGVhY2ggbWVzc2FnZSBpbiB0aGUgZmlsZSBpZiBlYWNoIHBhcmFtZXRlciBpcyA8cG9zaXRpdmUgaW50ZWdlcj4gY2hhcmFjdGVycyBsb25nLiIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgIC1uOiBwcmludCB0aGUgbnVtYmVyIG9mIHdvcmRzIGluIHRoZSBmaWxlLCBpbmNsdWRpbmcgbWVzc2FnZSBwcmVmaXhlcyBhbmQgcGFyYW1ldGVycyIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgIC1wOiBwcmludCB0aGUgY29udGVudHMgb2YgdGhlIHByb3BlcnR5IGZpbGUsIHNvcnRlZCBieSBtZXNzYWdlIGlkIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAtdHI6IHByaW50IHRyYWNlIGluZm9ybWF0aW9uIHdoaWxlIHBhcnNpbmcgdGhlIC5wcm9wZXJ0aWVzIGZpbGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRoZSBkZWZhdWx0IGFjdGlvbiBpcyB0byBwcmludCB0aGUgc3ludGF4IGVycm9ycywgZHVwbGljYXRlcywgYW5kIG90aGVyIHR5cGVzIG9mIGVycm9ycyBpbiB0aGUgZ2l2ZW4gLnByb3BlcnRpZXMgZmlsZS4iKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLmV4aXQoLTEpOwotCQl9Ci0KLQkJLy8gVGhpcyBpcyBub3Qgcm9idXN0IGVycm9yLWNoZWNraW5nIGJ5IGFueSBzdHJldGNoIG9mIHRoZSBpbWFnaW5hdGlvbiEKLQkJaW50IGluZGV4ID0gMDsKLQkJU3RyaW5nIG9wdGlvbiA9IGFyZ3ZbaW5kZXgrK10udG9Mb3dlckNhc2UoKTsKLQkJYm9vbGVhbiB0cmFjZSA9IGZhbHNlOwotCQlpZihvcHRpb24uZXF1YWxzKCItdHIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl0cmFjZSA9IHRydWU7Ci0JCQlvcHRpb24gPSBhcmd2W2luZGV4KytdLnRvTG93ZXJDYXNlKCk7Ci0JCX0KLQkJCi0JCWlmIChvcHRpb24uZXF1YWxzKCItYSIpICYmIChhcmd2Lmxlbmd0aCA+PSAyKSkgeyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmdbXSBmaWxlcyA9IG5ldyBTdHJpbmdbYXJndi5sZW5ndGgtMV07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFyZ3YsIDEsIGZpbGVzLCAwLCBmaWxlcy5sZW5ndGgpOwotCQkJcHJpbnRBbGxFcnJvclByZWZpeCh0cmFjZSwgZmlsZXMpOwotCQl9Ci0JCWVsc2UgaWYgKG9wdGlvbi5lcXVhbHMoIi1hYyIpICYmIChhcmd2Lmxlbmd0aCA+PSAyKSkgeyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmdbXSBmaWxlcyA9IG5ldyBTdHJpbmdbYXJndi5sZW5ndGgtMV07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFyZ3YsIDEsIGZpbGVzLCAwLCBmaWxlcy5sZW5ndGgpOwotCQkJcHJpbnRQcmVmaXhDb3VudCh0cmFjZSwgZmlsZXMpOwotCQl9Ci0JCWVsc2UgaWYgKG9wdGlvbi5lcXVhbHMoIi1hbCIpICYmIChhcmd2Lmxlbmd0aCA+PSAzKSkgeyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmdbXSBmaWxlcyA9IG5ldyBTdHJpbmdbYXJndi5sZW5ndGgtMl07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFyZ3YsIDIsIGZpbGVzLCAwLCBmaWxlcy5sZW5ndGgpOwotCQkJcHJpbnRFcnJvclByZWZpeCh0cmFjZSwgYXJndltpbmRleF0sIGZpbGVzKTsKLQkJfQotCQllbHNlIGlmIChvcHRpb24uZXF1YWxzKCItYW0iKSAmJiAoYXJndi5sZW5ndGggPj0gMikpIHsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nW10gZmlsZXMgPSBuZXcgU3RyaW5nW2FyZ3YubGVuZ3RoLTFdOwotCQkJU3lzdGVtLmFycmF5Y29weShhcmd2LCAxLCBmaWxlcywgMCwgZmlsZXMubGVuZ3RoKTsKLQkJCXByaW50RXJyb3JNZXNzYWdlcyh0cmFjZSwgZmlsZXMpOwotCQl9Ci0JCWVsc2UgaWYgKG9wdGlvbi5lcXVhbHMoIi1hbiIpICYmIChhcmd2Lmxlbmd0aCA+PSAyKSkgeyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmdbXSBmaWxlcyA9IG5ldyBTdHJpbmdbYXJndi5sZW5ndGgtMV07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFyZ3YsIDEsIGZpbGVzLCAwLCBmaWxlcy5sZW5ndGgpOwotCQkJcHJpbnRNZXNzYWdlc1dpdGhvdXRQcmVmaXhlcyh0cmFjZSwgZmlsZXMpOwotCQl9Ci0JCWVsc2UgaWYgKG9wdGlvbi5lcXVhbHMoIi1hcCIpICYmIChhcmd2Lmxlbmd0aCA+PSAzKSkgeyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmdbXSBmaWxlcyA9IG5ldyBTdHJpbmdbYXJndi5sZW5ndGgtMl07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFyZ3YsIDIsIGZpbGVzLCAwLCBmaWxlcy5sZW5ndGgpOwotCQkJcHJpbnRFcnJvclByZWZpeFJhbmdlKHRyYWNlLCBhcmd2W2luZGV4XSwgZmlsZXMpOwotCQl9Ci0JCWVsc2UgaWYgKG9wdGlvbi5lcXVhbHMoIi1hdSIpICYmIChhcmd2Lmxlbmd0aCA+PSAyKSkgeyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmdbXSBmaWxlcyA9IG5ldyBTdHJpbmdbYXJndi5sZW5ndGgtMV07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFyZ3YsIDEsIGZpbGVzLCAwLCBmaWxlcy5sZW5ndGgpOwotCQkJcHJpbnRBbGxNaXNzaW5nRXJyb3JQcmVmaXgodHJhY2UsIGZpbGVzKTsKLQkJfQotCQllbHNlIGlmIChvcHRpb24uZXF1YWxzKCItYiIpICYmIChhcmd2Lmxlbmd0aCA+PSAyKSkgeyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmdbXSBmaWxlcyA9IG5ldyBTdHJpbmdbYXJndi5sZW5ndGgtMV07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFyZ3YsIDEsIGZpbGVzLCAwLCBmaWxlcy5sZW5ndGgpOwotCQkJcHJpbnRCbGFua3ModHJhY2UsIGZpbGVzKTsKLQkJfQotCQllbHNlIGlmIChvcHRpb24uZXF1YWxzKCItYyIpICYmIChhcmd2Lmxlbmd0aCA9PSAzKSkgeyAvLyROT04tTkxTLTEkCi0JCQlGaWxlIG9sZEZpbGUgPSBuZXcgRmlsZShhcmd2W2luZGV4KytdKTsKLQkJCUZpbGUgbmV3RmlsZSA9IG5ldyBGaWxlKGFyZ3ZbaW5kZXhdKTsKLQkJCWNvbXBhcmVGaWxlcyh0cmFjZSwgb2xkRmlsZSwgbmV3RmlsZSk7Ci0JCX0KLQkJZWxzZSBpZiAob3B0aW9uLmVxdWFscygiLWN0IikgJiYgKGFyZ3YubGVuZ3RoID09IDMpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCUZpbGUgb2xkRmlsZSA9IG5ldyBGaWxlKGFyZ3ZbaW5kZXgrK10pOwotCQkJRmlsZSBuZXdGaWxlID0gbmV3IEZpbGUoYXJndltpbmRleF0pOwotCQkJY29tcGFyZUZpbGVzRm9yVHJhbnNsYXRpb24odHJhY2UsIG9sZEZpbGUsIG5ld0ZpbGUpOwotCQl9Ci0JCWVsc2UgaWYgKG9wdGlvbi5lcXVhbHMoIi1kaSIpICYmIChhcmd2Lmxlbmd0aCA+PSAyKSkgeyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmdbXSBmaWxlcyA9IG5ldyBTdHJpbmdbYXJndi5sZW5ndGgtMV07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFyZ3YsIDEsIGZpbGVzLCAwLCBmaWxlcy5sZW5ndGgpOwotCQkJcHJpbnREdXBsaWNhdGVJZHModHJhY2UsIGZpbGVzKTsKLQkJfQotCQllbHNlIGlmIChvcHRpb24uZXF1YWxzKCItZHAiKSAmJiAoYXJndi5sZW5ndGggPj0gMikpIHsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nW10gZmlsZXMgPSBuZXcgU3RyaW5nW2FyZ3YubGVuZ3RoLTFdOwotCQkJU3lzdGVtLmFycmF5Y29weShhcmd2LCAxLCBmaWxlcywgMCwgZmlsZXMubGVuZ3RoKTsKLQkJCXByaW50RHVwbGljYXRlUHJlZml4ZXModHJhY2UsIGZpbGVzKTsKLQkJfQotCQllbHNlIGlmIChvcHRpb24uZXF1YWxzKCItbCIpICYmIChhcmd2Lmxlbmd0aCA+PSAyKSkgeyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmdbXSBmaWxlcyA9IG5ldyBTdHJpbmdbYXJndi5sZW5ndGgtMV07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFyZ3YsIDEsIGZpbGVzLCAwLCBmaWxlcy5sZW5ndGgpOwotCQkJcHJpbnRTdHJpbmdMZW5ndGgodHJhY2UsIGZpbGVzKTsKLQkJfQotCQllbHNlIGlmIChvcHRpb24uZXF1YWxzKCItbGUiKSAmJiAoYXJndi5sZW5ndGggPj0gMykpIHsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nW10gZmlsZXMgPSBuZXcgU3RyaW5nW2FyZ3YubGVuZ3RoLTJdOwotCQkJU3lzdGVtLmFycmF5Y29weShhcmd2LCAyLCBmaWxlcywgMCwgZmlsZXMubGVuZ3RoKTsKLQkJCXByaW50RXhwZWN0ZWRTdHJpbmdMZW5ndGgodHJhY2UsIGFyZ3ZbaW5kZXhdLCBmaWxlcyk7Ci0JCX0KLQkJZWxzZSBpZiAob3B0aW9uLmVxdWFscygiLW4iKSAmJiAoYXJndi5sZW5ndGggPj0gMikpIHsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nW10gZmlsZXMgPSBuZXcgU3RyaW5nW2FyZ3YubGVuZ3RoLTFdOwotCQkJU3lzdGVtLmFycmF5Y29weShhcmd2LCAxLCBmaWxlcywgMCwgZmlsZXMubGVuZ3RoKTsKLQkJCXByaW50V29yZENvdW50KHRyYWNlLCBmaWxlcyk7Ci0JCX0KLQkJZWxzZSBpZiAob3B0aW9uLmVxdWFscygiLXAiKSAmJiAoYXJndi5sZW5ndGggPj0gMikpIHsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nW10gZmlsZXMgPSBuZXcgU3RyaW5nW2FyZ3YubGVuZ3RoLTFdOwotCQkJU3lzdGVtLmFycmF5Y29weShhcmd2LCAxLCBmaWxlcywgMCwgZmlsZXMubGVuZ3RoKTsKLQkJCXByaW50RmlsZUNvbnRlbnRzKHRyYWNlLCBmaWxlcyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlwcmludERlZmF1bHQodHJhY2UsIGFyZ3YpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHByaW50QWxsRXJyb3JQcmVmaXgoYm9vbGVhbiB0cmFjZSwgU3RyaW5nW10gZmlsZXMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpOyAvLyROT04tTkxTLTEkCi0JCQkJUHJvcGVydHlGaWxlIHByb3BGaWxlID0gbmV3IFByb3BlcnR5RmlsZShmaWxlc1tpXSwgdHJhY2UpOwotCQkJCXByb3BGaWxlLnByaW50QWxsTWVzc2FnZVByZWZpeGVzKCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJfQotCQkJY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRBbGxNaXNzaW5nRXJyb3JQcmVmaXgoYm9vbGVhbiB0cmFjZSwgU3RyaW5nW10gZmlsZXMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpOyAvLyROT04tTkxTLTEkCi0JCQkJUHJvcGVydHlGaWxlIHByb3BGaWxlID0gbmV3IFByb3BlcnR5RmlsZShmaWxlc1tpXSwgdHJhY2UpOwotCQkJCXByb3BGaWxlLnByaW50QWxsTWlzc2luZ01lc3NhZ2VQcmVmaXhlcygpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJCX0KLQkJCWNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHByaW50QmxhbmtzKGJvb2xlYW4gdHJhY2UsIFN0cmluZ1tdIGZpbGVzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVByb3BlcnR5RmlsZSBwcm9wRmlsZSA9IG5ldyBQcm9wZXJ0eUZpbGUoZmlsZXNbaV0sIHRyYWNlKTsKLQkJCQlwcm9wRmlsZS5wcmludEFsbE1lc3NhZ2VzV2hpY2hBcmVCbGFuaygpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJCX0KLQkJCWNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHByaW50TWVzc2FnZXNXaXRob3V0UHJlZml4ZXMoYm9vbGVhbiB0cmFjZSwgU3RyaW5nW10gZmlsZXMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpOyAvLyROT04tTkxTLTEkCi0JCQkJUHJvcGVydHlGaWxlIHByb3BGaWxlID0gbmV3IFByb3BlcnR5RmlsZShmaWxlc1tpXSwgdHJhY2UpOwotCQkJCXByb3BGaWxlLnByaW50QWxsTWVzc2FnZXNXaXRob3V0QU1lc3NhZ2VQcmVmaXgoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpOyAvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCQl9Ci0JCQljYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb21wYXJlRmlsZXMoYm9vbGVhbiB0cmFjZSwgRmlsZSBvbGRGaWxlLCBGaWxlIG5ld0ZpbGUpIHsKLQkJaWYob2xkRmlsZS5pc0ZpbGUoKSAmJiBuZXdGaWxlLmlzRmlsZSgpKSB7Ci0JCQl0cnkgewotCQkJCVByb3BlcnR5RmlsZSBvbGRQcm9wRmlsZSA9IG5ldyBQcm9wZXJ0eUZpbGUob2xkRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgdHJhY2UpOwotCQkJCVByb3BlcnR5RmlsZSBuZXdQcm9wRmlsZSA9IG5ldyBQcm9wZXJ0eUZpbGUobmV3RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgdHJhY2UpOwotCQkJCUNvbXBhcmVQcm9wZXJ0aWVzIGNwID0gbmV3IENvbXBhcmVQcm9wZXJ0aWVzKG9sZFByb3BGaWxlLCBuZXdQcm9wRmlsZSk7Ci0JCQkJY3AucHJpbnRSZXN1bHRzKCk7Ci0JCQl9Ci0JCQljYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmKG9sZEZpbGUuaXNEaXJlY3RvcnkoKSAmJiBuZXdGaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCVN0cmluZ1tdIG9sZENoaWxkcmVuID0gb2xkRmlsZS5saXN0KCk7Ci0JCQlmb3IoaW50IGk9MDsgaTxvbGRDaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCUZpbGUgbmV3Q2hpbGQgPSBuZXcgRmlsZShuZXdGaWxlLCBvbGRDaGlsZHJlbltpXSk7Ci0JCQkJaWYobmV3Q2hpbGQuZXhpc3RzKCkpIHsKLQkJCQkJLy8gRm91bmQgYSBmaWxlIG9yIGRpcmVjdG9yeSB0aGF0IGlzIG5hbWVkIHRoZSBzYW1lIGluIHRoZSBvbGQgJiBuZXcuIENvbXBhcmUuCi0JCQkJCWNvbXBhcmVGaWxlcyh0cmFjZSwgbmV3IEZpbGUob2xkRmlsZSwgb2xkQ2hpbGRyZW5baV0pLCBuZXdDaGlsZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJDb21wYXJlIHR3byBmaWxlcyBvciB0d28gZGlyZWN0b3JpZXMuIERvIG5vdCBjb21wYXJlIGEgZmlsZSB0byBhIGRpcmVjdG9yeSAoIiArIG9sZEZpbGUuZ2V0TmFtZSgpICsgIiwgIiArIG5ld0ZpbGUuZ2V0TmFtZSgpICsgIikuIik7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbXBhcmVGaWxlc0ZvclRyYW5zbGF0aW9uKGJvb2xlYW4gdHJhY2UsIEZpbGUgb2xkRmlsZSwgRmlsZSBuZXdGaWxlKSB7Ci0JCWlmKG9sZEZpbGUuaXNGaWxlKCkgJiYgbmV3RmlsZS5pc0ZpbGUoKSkgewotCQkJdHJ5IHsKLQkJCQlQcm9wZXJ0eUZpbGUgb2xkUHJvcEZpbGUgPSBuZXcgUHJvcGVydHlGaWxlKG9sZEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIHRyYWNlKTsKLQkJCQlQcm9wZXJ0eUZpbGUgbmV3UHJvcEZpbGUgPSBuZXcgUHJvcGVydHlGaWxlKG5ld0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIHRyYWNlKTsKLQkJCQlDb21wYXJlUHJvcGVydGllcyBjcCA9IG5ldyBDb21wYXJlUHJvcGVydGllcyhvbGRQcm9wRmlsZSwgbmV3UHJvcEZpbGUpOwotCQkJCWNwLnByaW50UmVzdWx0c0ZvclRyYW5zbGF0aW9uKCk7Ci0JCQl9Ci0JCQljYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmKG9sZEZpbGUuaXNEaXJlY3RvcnkoKSAmJiBuZXdGaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCVN0cmluZ1tdIG9sZENoaWxkcmVuID0gb2xkRmlsZS5saXN0KCk7Ci0JCQlmb3IoaW50IGk9MDsgaTxvbGRDaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCUZpbGUgbmV3Q2hpbGQgPSBuZXcgRmlsZShuZXdGaWxlLCBvbGRDaGlsZHJlbltpXSk7Ci0JCQkJaWYobmV3Q2hpbGQuZXhpc3RzKCkpIHsKLQkJCQkJLy8gRm91bmQgYSBmaWxlIG9yIGRpcmVjdG9yeSB0aGF0IGlzIG5hbWVkIHRoZSBzYW1lIGluIHRoZSBvbGQgJiBuZXcuIENvbXBhcmUuCi0JCQkJCWNvbXBhcmVGaWxlc0ZvclRyYW5zbGF0aW9uKHRyYWNlLCBuZXcgRmlsZShvbGRGaWxlLCBvbGRDaGlsZHJlbltpXSksIG5ld0NoaWxkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNvbXBhcmUgdHdvIGZpbGVzIG9yIHR3byBkaXJlY3Rvcmllcy4gRG8gbm90IGNvbXBhcmUgYSBmaWxlIHRvIGEgZGlyZWN0b3J5ICgiICsgb2xkRmlsZS5nZXROYW1lKCkgKyAiLCAiICsgbmV3RmlsZS5nZXROYW1lKCkgKyAiKS4iKTsgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnREdXBsaWNhdGVJZHMoYm9vbGVhbiB0cmFjZSwgU3RyaW5nW10gZmlsZXMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpOyAvLyROT04tTkxTLTEkCi0JCQkJUHJvcGVydHlGaWxlIHByb3BGaWxlID0gbmV3IFByb3BlcnR5RmlsZShmaWxlc1tpXSwgdHJhY2UpOwotCQkJCXByb3BGaWxlLnByaW50RHVwbGljYXRlTWVzc2FnZUlkKCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJfQotCQkJY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRFcnJvclByZWZpeChib29sZWFuIHRyYWNlLCBTdHJpbmcgcHJlZml4LCBTdHJpbmdbXSBmaWxlcykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlQcm9wZXJ0eUZpbGUgcHJvcEZpbGUgPSBuZXcgUHJvcGVydHlGaWxlKGZpbGVzW2ldLCB0cmFjZSk7Ci0JCQkJcHJvcEZpbGUucHJpbnRMYXN0TWVzc2FnZVByZWZpeFN0YXJ0aW5nV2l0aChwcmVmaXgpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJCX0KLQkJCWNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHByaW50RXJyb3JQcmVmaXhSYW5nZShib29sZWFuIHRyYWNlLCBTdHJpbmcgcHJlZml4LCBTdHJpbmdbXSBmaWxlcykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlQcm9wZXJ0eUZpbGUgcHJvcEZpbGUgPSBuZXcgUHJvcGVydHlGaWxlKGZpbGVzW2ldLCB0cmFjZSk7Ci0JCQkJcHJvcEZpbGUucHJpbnRNZXNzYWdlUHJlZml4U3RhcnRpbmdXaXRoKHByZWZpeCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJfQotCQkJY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnREdXBsaWNhdGVQcmVmaXhlcyhib29sZWFuIHRyYWNlLCBTdHJpbmdbXSBmaWxlcykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlQcm9wZXJ0eUZpbGUgcHJvcEZpbGUgPSBuZXcgUHJvcGVydHlGaWxlKGZpbGVzW2ldLCB0cmFjZSk7Ci0JCQkJcHJvcEZpbGUucHJpbnREdXBsaWNhdGVNZXNzYWdlUHJlZml4KCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJfQotCQkJY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRTdHJpbmdMZW5ndGgoYm9vbGVhbiB0cmFjZSwgU3RyaW5nW10gZmlsZXMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpOyAvLyROT04tTkxTLTEkCi0JCQkJUHJvcGVydHlGaWxlIHByb3BGaWxlID0gbmV3IFByb3BlcnR5RmlsZShmaWxlc1tpXSwgdHJhY2UpOwotCQkJCXByb3BGaWxlLnByaW50U3RyaW5nTGVuZ3RoKCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJfQotCQkJY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRFeHBlY3RlZFN0cmluZ0xlbmd0aChib29sZWFuIHRyYWNlLCBTdHJpbmcgc2xlbmd0aCwgU3RyaW5nW10gZmlsZXMpIHsKLQkJaW50IGxlbmd0aCA9IDA7Ci0JCQotCQl0cnkgewotCQkJbGVuZ3RoID0gbmV3IEludGVnZXIoc2xlbmd0aCkuaW50VmFsdWUoKTsKLQkJfQotCQljYXRjaChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXhjKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUGFyYW1ldGVyIG11c3QgYmUgYW4gaW50ZWdlci4iKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVByb3BlcnR5RmlsZSBwcm9wRmlsZSA9IG5ldyBQcm9wZXJ0eUZpbGUoZmlsZXNbaV0sIHRyYWNlKTsKLQkJCQlwcm9wRmlsZS5wcmludEV4cGVjdGVkU3RyaW5nTGVuZ3RoKGxlbmd0aCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJfQotCQkJY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRFcnJvck1lc3NhZ2VzKGJvb2xlYW4gdHJhY2UsIFN0cmluZ1tdIGZpbGVzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVByb3BlcnR5RmlsZSBwcm9wRmlsZSA9IG5ldyBQcm9wZXJ0eUZpbGUoZmlsZXNbaV0sIHRyYWNlKTsKLQkJCQlwcm9wRmlsZS5wcmludEFsbE1lc3NhZ2VzV2l0aEFNZXNzYWdlUHJlZml4KCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJfQotCQkJY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRXb3JkQ291bnQoYm9vbGVhbiB0cmFjZSwgU3RyaW5nW10gZmlsZXMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpOyAvLyROT04tTkxTLTEkCi0JCQkJUHJvcGVydHlGaWxlIHByb3BGaWxlID0gbmV3IFByb3BlcnR5RmlsZShmaWxlc1tpXSwgdHJhY2UpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihwcm9wRmlsZS5nZXRRdWFsaWZpZWRGaWxlTmFtZSgpICsgIjo6IE51bWJlciBvZiB3b3JkcyA6OiAiICsgcHJvcEZpbGUuZ2V0TnVtV29yZHMoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpOyAvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCQl9Ci0JCQljYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBwcmludFByZWZpeENvdW50KGJvb2xlYW4gdHJhY2UsIFN0cmluZ1tdIGZpbGVzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVByb3BlcnR5RmlsZSBwcm9wRmlsZSA9IG5ldyBQcm9wZXJ0eUZpbGUoZmlsZXNbaV0sIHRyYWNlKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVzdWFsbHkgdGhlIG51bWJlciBvZiB1bmlxdWUgcHJlZml4ZXMgYW5kIHRoZSBudW1iZXIgb2YgcHJlZml4ZXMgaXMgdGhlIHNhbWUsIGJ1dCBpZiBhIC5wcm9wZXJ0aWVzIGZpbGUgaGFzIHZhcmlhdGlvbnMgb2YgYSBtZXNzYWdlIChzbGlnaHRseSBkaWZmZXJlbnQgd29yZGluZyBmb3IgYSBkaWZmZXJlbnQgY29udGV4dCksIHRoZW4gdGhlIG51bWJlciBvZiBwcmVmaXggbWVzc2FnZXMgd2lsbCBiZSBsYXJnZXIgdGhhbiB0aGUgbnVtYmVyIG9mIHVuaXF1ZSBwcmVmaXhlcy4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihwcm9wRmlsZS5nZXRRdWFsaWZpZWRGaWxlTmFtZSgpICsgIjo6IE51bWJlciBvZiB1bmlxdWUgcHJlZml4ZXMgOjogIiArIHByb3BGaWxlLmdldE51bVVuaXF1ZVByZWZpeGVzKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKHByb3BGaWxlLmdldFF1YWxpZmllZEZpbGVOYW1lKCkgKyAiOjogTnVtYmVyIG9mIG1lc3NhZ2VzIHdpdGggcHJlZml4ZXMgOjogIiArIHByb3BGaWxlLmdldE51bVByZWZpeGVzKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKHByb3BGaWxlLmdldFF1YWxpZmllZEZpbGVOYW1lKCkgKyAiOjogTnVtYmVyIG9mIG1lc3NhZ2VzIHdpdGhvdXQgcHJlZml4ZXMgOjogIiArIHByb3BGaWxlLmdldE51bVdpdGhvdXRQcmVmaXhlcygpKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJCX0KLQkJCWNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQl9Ci0JfQotCXB1YmxpYyBzdGF0aWMgdm9pZCBwcmludEZpbGVDb250ZW50cyhib29sZWFuIHRyYWNlLCBTdHJpbmdbXSBmaWxlcykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlQcm9wZXJ0eUZpbGUgcHJvcEZpbGUgPSBuZXcgUHJvcGVydHlGaWxlKGZpbGVzW2ldLCB0cmFjZSk7Ci0JCQkJcHJvcEZpbGUucHJpbnRDb250ZW50cygpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJCX0KLQkJCWNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHByaW50RGVmYXVsdChib29sZWFuIHRyYWNlLCBTdHJpbmdbXSBmaWxlcykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCS8vIHByaW50IGFsbCBlcnJvcnMsIHdhcm5pbmdzLCBldGMuCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVByb3BlcnR5RmlsZSBwcm9wRmlsZSA9IG5ldyBQcm9wZXJ0eUZpbGUoZmlsZXNbaV0sIHRyYWNlKTsKLQkJCQlwcm9wRmlsZS5wcmludFN5bnRheFdhcm5pbmdzKCk7Ci0JCQkJcHJvcEZpbGUucHJpbnREdXBsaWNhdGVNZXNzYWdlSWQoKTsKLQkJCQlwcm9wRmlsZS5wcmludER1cGxpY2F0ZU1lc3NhZ2VQcmVmaXgoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpOyAvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCQl9Ci0JCQljYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBwcmludChTdHJpbmdbXSBhcmd2KSB7Ci0JCWZvcihpbnQgaSA9MDtpPGFyZ3YubGVuZ3RoOyBpKyspIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihpICsgIi4gIiArIGFyZ3ZbaV0pOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxpZGF0b3Ivb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL3BhcnNlci9NZXNzYWdlTWV0YURhdGEuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wcm9wZXJ0aWVzVmFsaWRhdG9yL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9wYXJzZXIvTWVzc2FnZU1ldGFEYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwN2U1NTguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxpZGF0b3Ivb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL3BhcnNlci9NZXNzYWdlTWV0YURhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS5wYXJzZXI7Ci0vKgotICogTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0gCi0gKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAyLCAyMDAzIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCi0gKiBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlIAotICogcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuIAotICoKLSAqIERJU0NMQUlNRVIgT0YgV0FSUkFOVElFUy4KLSAqIFRoZSBmb2xsb3dpbmcgW2VuY2xvc2VkXSBjb2RlIGlzIHNhbXBsZSBjb2RlIGNyZWF0ZWQgYnkgSUJNCi0gKiBDb3Jwb3JhdGlvbi4gVGhpcyBzYW1wbGUgY29kZSBpcyBub3QgcGFydCBvZiBhbnkgc3RhbmRhcmQgb3IgSUJNCi0gKiBwcm9kdWN0IGFuZCBpcyBwcm92aWRlZCB0byB5b3Ugc29sZWx5IGZvciB0aGUgcHVycG9zZSBvZiBhc3Npc3RpbmcKLSAqIHlvdSBpbiB0aGUgZGV2ZWxvcG1lbnQgb2YgeW91ciBhcHBsaWNhdGlvbnMuICBUaGUgY29kZSBpcyBwcm92aWRlZAotICogIkFTIElTIi4gSUJNIE1BS0VTIE5PIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVAotICogTk9UIExJTUlURUQgVE8gVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKLSAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgUkVHQVJESU5HIFRIRSBGVU5DVElPTiBPUiBQRVJGT1JNQU5DRSBPRgotICogVEhJUyBDT0RFLiAgVEhJUyBDT0RFIE1BWSBDT05UQUlOIEVSUk9SUy4gIElCTSBzaGFsbCBub3QgYmUgbGlhYmxlCi0gKiBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBvdXQgb2YgeW91ciB1c2Ugb2YgdGhlIHNhbXBsZSBjb2RlLCBldmVuCi0gKiBpZiBpdCBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0gKiAKLSAqLwotCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaG9sZHMgdGhlIG1ldGFkYXRhIGZvciBhbiBJTWVzc2FnZSB0aGF0IG11c3QgYmUgCi0gKiByZXBvcnRlZCB0byB0aGUgdXNlciAoaS5lLiwgYSB2YWxpZGF0aW9uIGVycm9yLCB3YXJuaW5nLAotICogb3IgaW5mb3JtYXRpb24gbWVzc2FnZSkuIAotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZU1ldGFEYXRhIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRfVU5TRVQgPSAtMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUiA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklORyA9IDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GTyA9IDM7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgX2J1bmRsZU5hbWUgPSBudWxsOwotCXByaXZhdGUgaW50IF9zZXZlcml0eSA9IElOVF9VTlNFVDsKLQlwcml2YXRlIFN0cmluZyBfbWVzc2FnZUlkID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZ1tdIF9wYXJtcyA9IG51bGw7Ci0JcHJpdmF0ZSBPYmplY3QgX3RhcmdldE9iamVjdCA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgX2xpbmVOdW1iZXIgPSBJTlRfVU5TRVQ7Ci0JcHJpdmF0ZSBpbnQgX29mZnNldCA9IElOVF9VTlNFVDsKLQlwcml2YXRlIGludCBfbGVuZ3RoID0gSU5UX1VOU0VUOwotCXByaXZhdGUgU3RyaW5nIF90ZXh0ID0gbnVsbDsKLQkKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdG9yIHNob3VsZCBiZSB1c2VkIGlmIHRoZSBtZXNzYWdlIHRleHQgaGFzIGFscmVhZHkKLQkgKiBiZWVuIHRyYW5zbGF0ZWQuCi0JICovCi0JcHVibGljIE1lc3NhZ2VNZXRhRGF0YShTdHJpbmcgbWVzc2FnZVRleHQpIHsKLQkJX3RleHQgPSBtZXNzYWdlVGV4dDsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RvciBzaG91bGQgYmUgdXNlZCBpZiB0aGUgbWVzc2FnZSB0ZXh0IGlzIG5vdCB0cmFuc2xhdGVkCi0JICogdW50aWwganVzdCBiZWZvcmUgdGhlIHRleHQgc2hvdWxkIGJlIHNob3duIHRvIHRoZSB1c2VyLgotCSAqIAotCSAqIEBwYXJhbSBidW5kbGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIGJ1bmRsZSBpbiB3aGljaCB0aGUgbWVzc2FnZSBpcyBjb250YWluZWQKLQkgKiBAcGFyYW0gc2V2ZXJpdHkgLSBPbmUgb2YgdGhlIGNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24uY29yZS5TZXZlcml0eUVudW0gY29uc3RhbnRzOyB0aGlzIHBhcmFtZXRlciByZXByZXNlbnRzIHRoZSBzZXZlcml0eSBvZiB0aGUgSU1lc3NhZ2UuCi0JICogQHBhcmFtIG1lc3NhZ2VJZCAtIFRoZSBtZXNzYWdlIGlkIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgbWVzc2FnZSB0byBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgYnVuZGxlLgotCSAqIEBwYXJhbSBwYXJtcyAtIFRoZSBwYXJhbWV0ZXJzIHRvIGJlIHN1YnN0aXR1dGVkIGludG8gdGhlIGphdmEudGV4dC5NZXNzYWdlVGV4dCdzIHBhdHRlcm5zLgotCSAqIEBwYXJhbSB0YXJnZXRPYmplY3QgLSBUaGUgdGFyZ2V0IG9iamVjdCBvZiB0aGUgSU1lc3NhZ2UgKHNlZSBjb20uaWJtLmV0b29scy52YWxpZGF0aW9uLmNvcmUuSU1lc3NhZ2UpLgotCSAqIEBwYXJhbSBsaW5lTnVtYmVyIC0gVGhlIGxpbmUgbnVtYmVyIHdoZXJlIHRoZSBwcm9ibGVtIGNhbiBiZSBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgTWVzc2FnZU1ldGFEYXRhKFN0cmluZyBidW5kbGVOYW1lLCBpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlSWQsIFN0cmluZ1tdIHBhcm1zLCBPYmplY3QgdGFyZ2V0T2JqZWN0LCBpbnQgbGluZU51bWJlcikgewotCQl0aGlzKGJ1bmRsZU5hbWUsIHNldmVyaXR5LCBtZXNzYWdlSWQsIHBhcm1zLCB0YXJnZXRPYmplY3QsIGxpbmVOdW1iZXIsIElOVF9VTlNFVCwgSU5UX1VOU0VUKTsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RvciBzaG91bGQgYmUgdXNlZCBpZiB0aGUgbWVzc2FnZSB0ZXh0IGlzIG5vdCB0cmFuc2xhdGVkCi0JICogdW50aWwganVzdCBiZWZvcmUgdGhlIHRleHQgc2hvdWxkIGJlIHNob3duIHRvIHRoZSB1c2VyLgotCSAqIAotCSAqIEBwYXJhbSBidW5kbGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIGJ1bmRsZSBpbiB3aGljaCB0aGUgbWVzc2FnZSBpcyBjb250YWluZWQKLQkgKiBAcGFyYW0gc2V2ZXJpdHkgLSBPbmUgb2YgdGhlIGNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24uY29yZS5TZXZlcml0eUVudW0gY29uc3RhbnRzOyB0aGlzIHBhcmFtZXRlciByZXByZXNlbnRzIHRoZSBzZXZlcml0eSBvZiB0aGUgSU1lc3NhZ2UuCi0JICogQHBhcmFtIG1lc3NhZ2VJZCAtIFRoZSBtZXNzYWdlIGlkIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgbWVzc2FnZSB0byBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgYnVuZGxlLgotCSAqIEBwYXJhbSBwYXJtcyAtIFRoZSBwYXJhbWV0ZXJzIHRvIGJlIHN1YnN0aXR1dGVkIGludG8gdGhlIGphdmEudGV4dC5NZXNzYWdlVGV4dCdzIHBhdHRlcm5zLgotCSAqIEBwYXJhbSB0YXJnZXRPYmplY3QgLSBUaGUgdGFyZ2V0IG9iamVjdCBvZiB0aGUgSU1lc3NhZ2UgKHNlZSBjb20uaWJtLmV0b29scy52YWxpZGF0aW9uLmNvcmUuSU1lc3NhZ2UpLgotCSAqIEBwYXJhbSBsaW5lTnVtYmVyIC0gVGhlIGxpbmUgbnVtYmVyIHdoZXJlIHRoZSBwcm9ibGVtIGNhbiBiZSBmb3VuZC4KLQkgKiBAcGFyYW0gb2Zmc2V0IC0gSW4gbnVtYmVyIG9mIGNoYXJhY3RlcnMsIGhvdyBtYW55IGNoYXJhY3RlcnMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIC5wcm9wZXJ0aWVzIGZpbGUgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBwcm9ibGVtLgotCSAqIEBwYXJhbSBsZW5ndGggLSBJbiBudW1iZXIgb2YgY2hhcmFjdGVycywgaG93IG1hbnkgY2hhcmFjdGVycyBmcm9tIHRoZSBvZmZzZXQgdG8gdGhlIGVuZCBvZiB0aGUgcHJvYmxlbS4KLQkgKi8KLQlwdWJsaWMgTWVzc2FnZU1ldGFEYXRhKFN0cmluZyBidW5kbGVOYW1lLCBpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlSWQsIFN0cmluZ1tdIHBhcm1zLCBPYmplY3QgdGFyZ2V0T2JqZWN0LCBpbnQgbGluZU51bWJlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQlfYnVuZGxlTmFtZSA9IGJ1bmRsZU5hbWU7Ci0JCV9zZXZlcml0eSA9IHNldmVyaXR5OwotCQlfbWVzc2FnZUlkID0gbWVzc2FnZUlkOwotCQlfcGFybXMgPSBwYXJtczsKLQkJX3RhcmdldE9iamVjdCA9IHRhcmdldE9iamVjdDsKLQkJX2xpbmVOdW1iZXIgPSBsaW5lTnVtYmVyOwotCQlfb2Zmc2V0ID0gb2Zmc2V0OwotCQlfbGVuZ3RoID0gbGVuZ3RoOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEJ1bmRsZU5hbWUoKSB7Ci0JCXJldHVybiBfYnVuZGxlTmFtZTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRTZXZlcml0eSgpIHsKLQkJcmV0dXJuIF9zZXZlcml0eTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIF9tZXNzYWdlSWQ7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmdbXSBnZXRQYXJhbXMoKSB7Ci0JCXJldHVybiBfcGFybXM7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgZ2V0VGFyZ2V0T2JqZWN0KCkgewotCQlyZXR1cm4gX3RhcmdldE9iamVjdDsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRMaW5lTnVtYmVyKCkgewotCQlyZXR1cm4gX2xpbmVOdW1iZXI7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0T2Zmc2V0KCkgewotCQlyZXR1cm4gX29mZnNldDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIF9sZW5ndGg7Ci0JfQotCQotCS8qKgotCSAqIFVzZSB0aGUgZ2l2ZW4gQ2xhc3NMb2FkZXIgdG8gbG9hZCB0aGlzIG1lc3NhZ2UncyB0ZXh0Ci0JICogZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgewotCQlpZihfdGV4dCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0VGV4dChMb2NhbGUuZ2V0RGVmYXVsdCgpLCBjbGFzc0xvYWRlcik7Ci0JCX0KLQkJcmV0dXJuIF90ZXh0OwotCX0KLQotCS8qKgotCSAqIFVzZSB0aGUgZ2l2ZW4gQ2xhc3NMb2FkZXIgdG8gbG9hZCB0aGlzIG1lc3NhZ2UncyB0ZXh0LAotCSAqIGZvciB0aGUgTG9jYWxlLCBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUuCi0JICovCQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChMb2NhbGUgbG9jYWxlLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgewotCQlpZihfdGV4dCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0VGV4dChnZXRCdW5kbGVOYW1lKCksIGxvY2FsZSwgY2xhc3NMb2FkZXIsIGdldElkKCksIGdldFBhcmFtcygpKTsKLQkJfQotCQkKLQkJcmV0dXJuIF90ZXh0OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRyYW5zbGF0ZWQgbWVzc2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0gYnVuZGxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UgYnVuZGxlIHRvIHNlYXJjaCBmb3IgdGhlIG1lc3NhZ2UuCi0JICogQHBhcmFtIGxvY2FsZSBUaGUgTG9jYWxlIGZvciB3aGljaCB0aGUgbWVzc2FnZSBzaG91bGQgYmUgbG9hZGVkLgotCSAqIEBwYXJhbSBjbGFzc0xvYWRlciBUaGUgQ2xhc3NMb2FkZXIgd2hpY2ggY2FuIGxvY2F0ZSB0aGUgcmVzb3VyY2UgYnVuZGxlLgotCSAqIEBwYXJhbSBtZXNzYWdlSWQgVGhlIHVuaXF1ZSBpZCwgaW4gdGhlIHJlc291cmNlIGJ1bmRsZSwgdGhhdCBpZGVudGlmaWVzIHRoZSBtZXNzYWdlLgotCSAqIEBwYXJhbSBwYXJtcyBUaGUgcGFyYW1ldGVycyB0byBzdWJzdGl0dXRlIGludG8gdGhlIHBhdHRlcm4gb2YgdGhlIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0IG1lc3NhZ2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFRleHQoU3RyaW5nIGJ1bmRsZU5hbWUsIExvY2FsZSBsb2NhbGUsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyLCBTdHJpbmcgbWVzc2FnZUlkLCBTdHJpbmdbXSBwYXJtcykgewotCQlTdHJpbmcgbWVzc2FnZSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJaWYgKGxvY2FsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbWVzc2FnZTsKLQkJfQotCi0JCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IGdldEJ1bmRsZShidW5kbGVOYW1lLCBsb2NhbGUsIGNsYXNzTG9hZGVyKTsKLQkJaWYgKGJ1bmRsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbWVzc2FnZTsKLQkJfQotCi0JCXRyeSB7Ci0JCQltZXNzYWdlID0gYnVuZGxlLmdldFN0cmluZyhtZXNzYWdlSWQpOwotCi0JCQlpZiAocGFybXMgIT0gbnVsbCkgewotCQkJCW1lc3NhZ2UgPSBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdC5mb3JtYXQobWVzc2FnZSwgcGFybXMpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZXhjKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oZXhjLmdldE1lc3NhZ2UoKSk7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4obWVzc2FnZUlkKTsKLQkJfQotCQljYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXhjKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oZXhjLmdldE1lc3NhZ2UoKSk7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4obWVzc2FnZUlkKTsKLQkJfQotCi0JCXJldHVybiBtZXNzYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgYnVuZGxlIHdoaWNoIGNvbnRhaW5zIHRoZSBtZXNzYWdlcywgYXMgaWRlbnRpZmllZCBieQotCSAqIEBsaW5rICNnZXRCdW5kbGVOYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlQnVuZGxlIGdldEJ1bmRsZShTdHJpbmcgYnVuZGxlTmFtZSwgTG9jYWxlIGxvY2FsZSwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHsKLQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmIChjbGFzc0xvYWRlciA9PSBudWxsKSB7Ci0JCQkJYnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKGJ1bmRsZU5hbWUsIGxvY2FsZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlidW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoYnVuZGxlTmFtZSwgbG9jYWxlLCBjbGFzc0xvYWRlcik7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBidW5kbGU7Ci0JfQotCQotfQotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcGVydGllc1ZhbGlkYXRvci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvcGFyc2VyL1Byb3BlcnR5RmlsZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxpZGF0b3Ivb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL3BhcnNlci9Qcm9wZXJ0eUZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI2MGIxNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcGVydGllc1ZhbGlkYXRvci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvcGFyc2VyL1Byb3BlcnR5RmlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlLnBhcnNlcjsKLS8qCi0gKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTSAKLSAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDIsIDIwMDMgLSBBbGwgUmlnaHRzIFJlc2VydmVkLiAKLSAqIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUgCi0gKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4gCi0gKgotICogRElTQ0xBSU1FUiBPRiBXQVJSQU5USUVTLgotICogVGhlIGZvbGxvd2luZyBbZW5jbG9zZWRdIGNvZGUgaXMgc2FtcGxlIGNvZGUgY3JlYXRlZCBieSBJQk0KLSAqIENvcnBvcmF0aW9uLiBUaGlzIHNhbXBsZSBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFueSBzdGFuZGFyZCBvciBJQk0KLSAqIHByb2R1Y3QgYW5kIGlzIHByb3ZpZGVkIHRvIHlvdSBzb2xlbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGFzc2lzdGluZwotICogeW91IGluIHRoZSBkZXZlbG9wbWVudCBvZiB5b3VyIGFwcGxpY2F0aW9ucy4gIFRoZSBjb2RlIGlzIHByb3ZpZGVkCi0gKiAiQVMgSVMiLiBJQk0gTUFLRVMgTk8gV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUCi0gKiBOT1QgTElNSVRFRCBUTyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwotICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBSRUdBUkRJTkcgVEhFIEZVTkNUSU9OIE9SIFBFUkZPUk1BTkNFIE9GCi0gKiBUSElTIENPREUuICBUSElTIENPREUgTUFZIENPTlRBSU4gRVJST1JTLiAgSUJNIHNoYWxsIG5vdCBiZSBsaWFibGUKLSAqIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIG91dCBvZiB5b3VyIHVzZSBvZiB0aGUgc2FtcGxlIGNvZGUsIGV2ZW4KLSAqIGlmIGl0IGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLSAqIAotICovCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLS8qKgotICogVGhpcyBQcm9wZXJ0eUZpbGUgaXMgaW5zdGFudGlhdGVkIGJ5IGNvZGUgdGhhdCBpc24ndCBhbiBJVmFsaWRhdG9yLgotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlGaWxlIGV4dGVuZHMgQVByb3BlcnR5RmlsZSB7Ci0JcHJpdmF0ZSBTdHJpbmcgX2VuY2xvc2luZ1ppcEZpbGVOYW1lID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBfcHJvcGVydHlGaWxlTmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgX2ZpbGVOYW1lID0gbnVsbDsKLQkKLQlwdWJsaWMgUHJvcGVydHlGaWxlKFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQl0aGlzKGZpbGVOYW1lLCBmYWxzZSk7Ci0JfQotCi0JcHVibGljIFByb3BlcnR5RmlsZShTdHJpbmcgZmlsZU5hbWUsIGJvb2xlYW4gdHJhY2UpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJdGhpcyhuZXcgRmlsZShmaWxlTmFtZSksIHRyYWNlKTsKLQl9Ci0JCi0JcHVibGljIFByb3BlcnR5RmlsZShGaWxlIHByb3BlcnR5RmlsZSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQl0aGlzKHByb3BlcnR5RmlsZSwgZmFsc2UpOwotCX0KLQkKLQlwdWJsaWMgUHJvcGVydHlGaWxlKEZpbGUgcHJvcGVydHlGaWxlLCBib29sZWFuIHRyYWNlKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCXRoaXMobnVsbCwgcHJvcGVydHlGaWxlLCB0cmFjZSk7Ci0JfQotCQotCXB1YmxpYyBQcm9wZXJ0eUZpbGUoU3RyaW5nIGVuY2xvc2luZ1ppcEZpbGVOYW1lLCBGaWxlIHByb3BlcnR5RmlsZSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQl0aGlzKGVuY2xvc2luZ1ppcEZpbGVOYW1lLCBwcm9wZXJ0eUZpbGUsIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgUHJvcGVydHlGaWxlKFN0cmluZyBlbmNsb3NpbmdaaXBGaWxlTmFtZSwgRmlsZSBwcm9wZXJ0eUZpbGUsIGJvb2xlYW4gZGVidWcpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJaWYgKCFwcm9wZXJ0eUZpbGUuZXhpc3RzKCkpCi0JCQl0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbigiQ2Fubm90IGZpbmQgZmlsZSAiICsgcHJvcGVydHlGaWxlLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKCFwcm9wZXJ0eUZpbGUuaXNGaWxlKCkpCi0JCQl0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbihwcm9wZXJ0eUZpbGUuZ2V0TmFtZSgpICsgIiBpcyBub3QgYSBmaWxlIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKCFwcm9wZXJ0eUZpbGUuY2FuUmVhZCgpKQotCQkJdGhyb3cgbmV3IGphdmEuaW8uSU9FeGNlcHRpb24oIkNhbm5vdCByZWFkICIgKyBwcm9wZXJ0eUZpbGUuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoIXByb3BlcnR5RmlsZS5nZXROYW1lKCkuZW5kc1dpdGgoInByb3BlcnRpZXMiKSkgLy8kTk9OLU5MUy0xJAotCQkJdGhyb3cgbmV3IGphdmEuaW8uSU9FeGNlcHRpb24oIkNhbiBwYXJzZSBvbmx5IC5wcm9wZXJ0aWVzIGZpbGVzOyBpZ25vcmluZyAiICsgcHJvcGVydHlGaWxlLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlzZXREZWJ1ZyhkZWJ1Zyk7Ci0JCQkKLQkJX2VuY2xvc2luZ1ppcEZpbGVOYW1lID0gZW5jbG9zaW5nWmlwRmlsZU5hbWU7Ci0JCQotCQlfZmlsZU5hbWUgPSBwcm9wZXJ0eUZpbGUuZ2V0TmFtZSgpOwotCQkKLQkJcmVwb3J0KCJGaWxlIG5hbWU6ICIgKyBfZmlsZU5hbWUpOyAvLyROT04tTkxTLTEkCi0JCXBhcnNlRmlsZShwcm9wZXJ0eUZpbGUpOwotCQlyZXBvcnQoIiIpOyAvLyROT04tTkxTLTEkCi0KLQkJcHJvcGVydHlGaWxlID0gbnVsbDsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIEFQcm9wZXJ0eUZpbGUjcmVwb3J0KFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXBvcnQoU3RyaW5nIHN0cikgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oc3RyKTsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIEFQcm9wZXJ0eUZpbGUjcmVwb3J0KE1lc3NhZ2VNZXRhRGF0YSkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXBvcnQoTWVzc2FnZU1ldGFEYXRhIG1lc3NhZ2UpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIobWVzc2FnZS5nZXRUZXh0KGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSkpOwotCQlidWZmZXIuYXBwZW5kKFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKElWYWxpZGF0aW9uQ29uc3RhbnRzLkJVTkRMRU5BTUUsIElWYWxpZGF0aW9uQ29uc3RhbnRzLkxJTkVfTE9DLCBuZXcgU3RyaW5nW117U3RyaW5nLnZhbHVlT2YobWVzc2FnZS5nZXRMaW5lTnVtYmVyKCkpLCBnZXRRdWFsaWZpZWRGaWxlTmFtZSgpfSkpOwotCQlyZXBvcnQoYnVmZmVyLnRvU3RyaW5nKCkpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllZEZpbGVOYW1lKCkgewotCQlpZiAoX3Byb3BlcnR5RmlsZU5hbWUgPT0gbnVsbCkgewotCQkJaWYgKF9lbmNsb3NpbmdaaXBGaWxlTmFtZSA9PSBudWxsKSB7Ci0JCQkJX3Byb3BlcnR5RmlsZU5hbWUgPSBfZmlsZU5hbWU7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlfcHJvcGVydHlGaWxlTmFtZSA9IF9lbmNsb3NpbmdaaXBGaWxlTmFtZSArICI6OiIgKyBfZmlsZU5hbWU7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gX3Byb3BlcnR5RmlsZU5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGaWxlTmFtZSgpIHsKLQkJcmV0dXJuIF9maWxlTmFtZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxpZGF0b3Ivb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL3BhcnNlci9Qcm9wZXJ0eUxpbmUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wcm9wZXJ0aWVzVmFsaWRhdG9yL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9wYXJzZXIvUHJvcGVydHlMaW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3NjljN2YuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxpZGF0b3Ivb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL3BhcnNlci9Qcm9wZXJ0eUxpbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0MiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS5wYXJzZXI7Ci0vKgotICogTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0gCi0gKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAyLCAyMDAzIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCi0gKiBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlIAotICogcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuIAotICoKLSAqIERJU0NMQUlNRVIgT0YgV0FSUkFOVElFUy4KLSAqIFRoZSBmb2xsb3dpbmcgW2VuY2xvc2VkXSBjb2RlIGlzIHNhbXBsZSBjb2RlIGNyZWF0ZWQgYnkgSUJNCi0gKiBDb3Jwb3JhdGlvbi4gVGhpcyBzYW1wbGUgY29kZSBpcyBub3QgcGFydCBvZiBhbnkgc3RhbmRhcmQgb3IgSUJNCi0gKiBwcm9kdWN0IGFuZCBpcyBwcm92aWRlZCB0byB5b3Ugc29sZWx5IGZvciB0aGUgcHVycG9zZSBvZiBhc3Npc3RpbmcKLSAqIHlvdSBpbiB0aGUgZGV2ZWxvcG1lbnQgb2YgeW91ciBhcHBsaWNhdGlvbnMuICBUaGUgY29kZSBpcyBwcm92aWRlZAotICogIkFTIElTIi4gSUJNIE1BS0VTIE5PIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVAotICogTk9UIExJTUlURUQgVE8gVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKLSAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgUkVHQVJESU5HIFRIRSBGVU5DVElPTiBPUiBQRVJGT1JNQU5DRSBPRgotICogVEhJUyBDT0RFLiAgVEhJUyBDT0RFIE1BWSBDT05UQUlOIEVSUk9SUy4gIElCTSBzaGFsbCBub3QgYmUgbGlhYmxlCi0gKiBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBvdXQgb2YgeW91ciB1c2Ugb2YgdGhlIHNhbXBsZSBjb2RlLCBldmVuCi0gKiBpZiBpdCBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0gKiAKLSAqLwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotICogUHJvcGVydHlMaW5lIHJlcHJlc2VudHMgYSBsaW5lIGluIGEgUHJvcGVydHlGaWxlLiBJdCBoYXMgYSBtZXNzYWdlIGlkLAotICogYSBtZXNzYWdlIHZhbHVlICh0aGUgdGV4dCBvZiB0aGUgcHJvcGVydHk7IHRoaXMgaXMgdGhlIHRleHQgd2hpY2ggaXMKLSAqIHRyYW5zbGF0ZWQpLCBhIGxpbmUgbnVtYmVyLCBhbmQsIG9wdGlvbmFsbHksIGFuIHVuaXF1ZSBlcnJvciBpZCAob2YgdGhlCi0gKiBmb3JtIEFCQ0QxMjM0e0V8V3xJfSkuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eUxpbmUgaW1wbGVtZW50cyBDb21wYXJhYmxlIHsKLQlwcml2YXRlIFN0cmluZyBfbWVzc2FnZUlkOyAvLyB0aGUgbWVzc2FnZSBpZCAobm90IHRyYW5zbGF0ZWQpCi0JcHJpdmF0ZSBTdHJpbmcgX21lc3NhZ2UgPSBudWxsOyAvLyB0aGUgbWVzc2FnZSB2YWx1ZSB3aXRoIHRoZSBlcnJvciBpZCAodHJhbnNsYXRlZCkKLQlwcml2YXRlIFN0cmluZyBfbWVzc2FnZVByZWZpeCA9IG51bGw7IC8vIHRoZSBwcmVmaXggKGUuZy4gQUJDRDEyMzR7RXxXfEl9Ci0JcHJpdmF0ZSBTdHJpbmcgX3Nob3J0TWVzc2FnZSA9IG51bGw7IC8vIHRoZSBtZXNzYWdlIHZhbHVlIHdpdGhvdXQgdGhlIGVycm9yIGlkICh0cmFuc2xhdGVkKQotCXByaXZhdGUgaW50IF9saW5lTnVtYmVyID0gLTE7IC8vIHRoZSBsaW5lIG51bWJlciBvZiB0aGlzIG1lc3NhZ2UgdmFsdWUKLQlwcml2YXRlIGludCBfbnVtV29yZHMgPSAtMTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBFTVBUWSA9ICIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBBUHJvcGVydHlGaWxlIF9maWxlID0gbnVsbDsKLQlwcml2YXRlIGludCBfb2Zmc2V0ID0gLTE7IC8vIHRoZSBvZmZzZXQsIGluIHRoZSAucHJvcGVydGllcyBmaWxlLCB3aGVyZSB0aGlzIGxpbmUgYmVnaW5zCi0JcHJpdmF0ZSBpbnQgX21lc3NhZ2VPZmZzZXQgPSAtMTsgIC8vIHRoZSBvZmZzZXQgaW4gdGhlIGxpbmUsIGFmdGVyIHRoZSBFUVVBTFMsIHdoZXJlIHRoZSBtZXNzYWdlIHByZWZpeCBiZWdpbnMKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFFVT1RFID0gJ1wnJzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIE9CUkFDS0VUID0gJ3snOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgQ0JSQUNLRVQgPSAnfSc7Ci0KLQkvLyBUaGUgRW51bSBmb3IgdGhlIG1lc3NhZ2Ugc2V2ZXJpdHkgY2FuIGJlIG9uZSBvZiB0aGVzZSBmb3VyIHZhbHVlcy4gSWYgdGhlcmUgaXMgYW4gZXJyb3IgaWQsCi0JLy8gVU5BU1NJR05FRCBpbmRpY2F0ZXMgYW4gaW52YWxpZCB2YWx1ZS4gCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgVU5BU1NJR05FRCA9IDA7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRVJST1IgPSAweDE7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgV0FSTklORyA9IDB4MjsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBJTkZPID0gMHgzOwotCi0JcHJpdmF0ZSBpbnQgX3NldmVyaXR5ID0gVU5BU1NJR05FRDsgLy8gdGhlIHNldmVyaXR5IG9mIHRoZSBtZXNzYWdlLCBpZiB0aGlzIG1lc3NhZ2UgaGFzIGFuIGVycm9yIGlkLiBVTkFTU0lHTkVEIG1lYW5zIGVpdGhlciB0aGF0IHRoZSBzZXZlcml0eSB3YXMgYW4gaW52YWxpZCBzZXZlcml0eSAobm90IGluZm8sIHdhcm4sIG9yIGVycm9yKSwgb3IgdGhhdCB0aGUgbWVzc2FnZSBoYXMgbm8gZXJyb3IgaWQuIENoZWNrIHRoZSB2YWx1ZSBvZiB0aGUgZXJyb3IgaWQgdG8gZmluZCBvdXQgd2hpY2ggb2YgdGhlIHR3byBpcyB0aGUgY2FzZS4KLQlwcml2YXRlIGludCBfbnVtUGFybXMgPSAwOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBCTEFOSyA9ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi50b0NoYXJBcnJheSgpOyAvLyB0aGlzIHN0cmluZyBpcyAxMDAgY2hhcmFjdGVycyBsb25nLiBJdCdzIHVzZWQgdG8gcXVpY2tseSBnZXQgYSBibGFuayBzdHJpbmcgaW4gdGhlIGdldEJsYW5rKGludCkgbWV0aG9kLiBIb3BlZnVsbHkgdGhlIHVzZXIgd2lsbCBuZXZlciB3YW50IG1vcmUgdGhhbiAxMDAgY2hhciBpbiBhIGdpdmVuIHBhcmFtZXRlci4gLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIFByb3BlcnR5TGluZShBUHJvcGVydHlGaWxlIGZpbGUsIGludCBvZmZzZXQsIGludCBtZXNzYWdlT2Zmc2V0LCBTdHJpbmcgbWVzc2FnZUlkLCBTdHJpbmcgbWVzc2FnZSwgaW50IGxpbmVOdW1iZXIpIHsKLQkJLy8gQ29tbWVudCBvbiB0aGUgdXNlIG9mIGludGVybigpLgotCQkvLyBCZWNhdXNlIGl0J3MgbGlrZWx5IHRoYXQgd2UnbGwgYmUgY29tcGFyaW5nIHRoaXMgc3RyaW5nIGEgbG90LAotCQkvLyBsb2FkIGl0IGludG8gdGhlIEphdmEgY29uc3RhbnRzIHNwYWNlIHRocm91Z2ggaW50ZXJuKCkuIFNpbmNlIHdlIHdvbid0Ci0JCS8vIGJlIG1vZGlmeWluZyB0aGlzIHN0cmluZywgaXQncyBzYWZlIHRvIGxvYWQgaXQgaW50byB0aGUgY29uc3RhbnRzIHNwYWNlLgotCQkvLwotCQlfb2Zmc2V0ID0gb2Zmc2V0OyAvLyB0aGUgb2Zmc2V0IGluIHRoZSAucHJvcGVydGllcyBmaWxlIHdoZXJlIHRoaXMgbGluZSBiZWdpbnMKLQkJX21lc3NhZ2VPZmZzZXQgPSBtZXNzYWdlT2Zmc2V0OyAvLyB0aGUgb2Zmc2V0IGluIHRoZSBsaW5lLCBhZnRlciB0aGUgRVFVQUxTLCB3aGVyZSB0aGUgbWVzc2FnZSBwcmVmaXggYmVnaW5zCi0JCV9tZXNzYWdlSWQgPSBtZXNzYWdlSWQ7Ci0JCV9tZXNzYWdlID0gbWVzc2FnZTsgLy8gcmU6IGludGVybigpLiBEaXR0by4KLQkJX2xpbmVOdW1iZXIgPSBsaW5lTnVtYmVyOwotCQlfZmlsZSA9IGZpbGU7Ci0KLQkJcGFyc2UobWVzc2FnZSk7Ci0JfQotCi0JcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IG8pIHsKLQkJLy8gYnkgZGVmYXVsdCwgc29ydCBieSBtZXNzYWdlIGlkCi0JCWlmICghKG8gaW5zdGFuY2VvZiBQcm9wZXJ0eUxpbmUpKSB7Ci0JCQkvLyB0aGVuIGhvdyBvbiBlYXJ0aCBkaWQgdGhpcyBtZXRob2QgZ2V0IGNhbGxlZD8/Ci0JCQkvLyBwdXQgaXQgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdAotCQkJcmV0dXJuIDE7Ci0JCX0KLQotCQlyZXR1cm4gZ2V0TWVzc2FnZUlkKCkuY29tcGFyZVRvKCgoUHJvcGVydHlMaW5lKSBvKS5nZXRNZXNzYWdlSWQoKSk7Ci0JfQotCi0JcHVibGljIEFQcm9wZXJ0eUZpbGUgZ2V0RmlsZSgpIHsKLQkJcmV0dXJuIF9maWxlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZVByZWZpeCgpIHsKLQkJcmV0dXJuIF9tZXNzYWdlUHJlZml4OwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBoYXNNZXNzYWdlUHJlZml4KCkgewotCQlpZihfbWVzc2FnZVByZWZpeCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmKF9tZXNzYWdlUHJlZml4LmVxdWFscyhFTVBUWSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpIHsKLQkJcmV0dXJuIF9saW5lTnVtYmVyOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7Ci0JCXJldHVybiBfbWVzc2FnZTsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWQoKSB7Ci0JCXJldHVybiBfbWVzc2FnZUlkOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldFNob3J0TWVzc2FnZSgpIHsKLQkJcmV0dXJuIF9zaG9ydE1lc3NhZ2U7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIG51bWJlciBvZiB3b3JkcyBpbiB0aGUgbWVzc2FnZSBleGNsdWRpbmcgCi0JICogdGhlIG1lc3NhZ2UgZXJyb3IgaWQgcHJlZml4LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TnVtV29yZHMoKSB7Ci0JCWlmKF9udW1Xb3JkcyA9PSAtMSkgewotCQkJX251bVdvcmRzID0gMDsKLQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGdldFNob3J0TWVzc2FnZSgpKTsKLQkJCV9udW1Xb3JkcyA9IHRva2VuaXplci5jb3VudFRva2VucygpOwotCQl9Ci0JCXJldHVybiBfbnVtV29yZHM7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRoZSAKLQkgKiBtZXNzYWdlIGluY2x1ZGluZyB0aGUgbWVzc2FnZSBwcmVmaXggYW5kIHBhcmFtZXRlcnMuIChpLmUuLCB7MH0gd291bGQKLQkgKiBiZSBjb3VudGVkIGFzIHRocmVlIGNoYXJhY3RlcnMuKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gZ2V0TWVzc2FnZSgpLmxlbmd0aCgpOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0aGUgCi0JICogbWVzc2FnZSBpbmNsdWRpbmcgdGhlIG1lc3NhZ2UgcHJlZml4IGFuZCB0aGUgZXhwZWN0ZWQgCi0JICogbnVtYmVyIG9mIGNoYXJhY3RlcnMuIChUaGF0IGlzLCB0aGUgbGVuZ3RoUGFybSBwYXJhbWV0ZXIKLQkgKiBpcyB1c2VkIGFzIGFuIGFwcHJveGltYXRpb24gb2YgdGhlIGxlbmd0aCBvZiBlYWNoIHBhcmFtZXRlcgotCSAqIGluIHRoZSBtZXNzYWdlLikKLQkgKi8KLQlwdWJsaWMgaW50IGdldEV4cGVjdGVkTGVuZ3RoKGludCBsZW5ndGhQYXJtKSB7Ci0JCWlmKGhhc1BhcmFtZXRlcnMoKSAmJiAobGVuZ3RoUGFybSA+IDApKSB7Ci0JCQlyZXR1cm4gZ2V0RXhwZWN0ZWRNZXNzYWdlKGxlbmd0aFBhcm0pLmxlbmd0aCgpOwotCQl9Ci0JCXJldHVybiBnZXRMZW5ndGgoKTsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc3Vic3RpdHV0ZXMgYSBibGFuayBzdHViIG9mIHRoZSBnaXZlbiBsZW5ndGgKLQkgKiBldmVyeSBwbGFjZSBpbiB0aGUgc3RyaW5nIHdoZXJlIHRoZXJlIGlzIGEgcGFybS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEV4cGVjdGVkTWVzc2FnZShpbnQgbGVuZ3RoUGFybSkgewotCQlpZihoYXNQYXJhbWV0ZXJzKCkgJiYgKGxlbmd0aFBhcm0gPiAwKSkgewotCQkJLy8gbWVzc2FnZSBjYW5ub3QgYmUgbnVsbCBvciBibGFuayBvciBpdCB3b3VsZG4ndCBoYXZlIHBhcmFtZXRlcnMKLQkJCVN0cmluZyBibGFuayA9IGdldEJsYW5rKGxlbmd0aFBhcm0pOwotCQkJCi0JCQlpbnQgbnVtUGFybSA9IGdldE51bVBhcmFtZXRlcnMoKTsKLQkJCVN0cmluZ1tdIHBhcm0gPSBuZXcgU3RyaW5nW251bVBhcm1dOwotCQkJZm9yKGludCBpPTA7IGk8cGFybS5sZW5ndGg7IGkrKykgewotCQkJCXBhcm1baV0gPSBibGFuazsKLQkJCX0KLQkJCQotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldE1lc3NhZ2UoKSwgcGFybSk7Ci0JCQl9Ci0JCQljYXRjaChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhjKSB7Ci0JCQkJaWYoZ2V0RmlsZSgpLmRlYnVnKCkpIHsKLQkJCQkJZ2V0RmlsZSgpLnJlcG9ydChleGMuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJZ2V0RmlsZSgpLnJlcG9ydChnZXRGaWxlKCkuZ2V0UXVhbGlmaWVkRmlsZU5hbWUoKSArICI6OiIgKyBnZXRNZXNzYWdlSWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJcmV0dXJuIGdldE1lc3NhZ2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZ2V0TWVzc2FnZSgpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBibGFuayBzdHJpbmcgb2YgdGhlIGdpdmVuIGxlbmd0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRCbGFuayhpbnQgbGVuZ3RoKSB7Ci0JCWNoYXJbXSBibGFuayA9IG5ldyBjaGFyW2xlbmd0aF07Ci0JCWlmKGxlbmd0aCA+IEJMQU5LLmxlbmd0aCkgewotCQkJZm9yKGludCBpPTA7IGk8bGVuZ3RoOyBpKyspIHsKLQkJCQlibGFua1tpXSA9ICcgJzsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoQkxBTkssIDAsIGJsYW5rLCAwLCBsZW5ndGgpOwotCQl9Ci0JCXJldHVybiBuZXcgU3RyaW5nKGJsYW5rKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgbGluZSBoYXMgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQgcGF0dGVybnMuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzUGFyYW1ldGVycygpIHsKLQkJcmV0dXJuIGdldE51bVBhcmFtZXRlcnMoKSA+IDA7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0IHBhdHRlcm5zIGluIHRoZSBwcm9wZXJ0eSBsaW5lLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TnVtUGFyYW1ldGVycygpIHsKLQkJcmV0dXJuIF9udW1QYXJtczsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycywgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUsIHRvCi0JICogdGhlIGJlZ2lubmluZyBvZiB0aGUgbWVzc2FnZS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE1lc3NhZ2VPZmZzZXQoKSB7Ci0JCXJldHVybiBfbWVzc2FnZU9mZnNldDsKLQl9Ci0JCi0JLyoqCi0JICogVGhlIG9mZnNldCwgaW4gdGhlIC5wcm9wZXJ0aWVzIGZpbGUsIHdoZXJlIHRoaXMgbGluZSBiZWdpbnMuCi0JICovCi0JcHVibGljIGludCBnZXRPZmZzZXQoKSB7Ci0JCXJldHVybiBfb2Zmc2V0OwotCX0KLQkKLQkvKioKLQkgKiBUaGUgc2V2ZXJpdHkgb2YgdGhlIG1lc3NhZ2UsIGlmIHRoaXMgbWVzc2FnZSBoYXMgYW4gZXJyb3IgaWQuIAotCSAqIFVOQVNTSUdORUQgbWVhbnMgZWl0aGVyIHRoYXQgdGhlIHNldmVyaXR5IHdhcyBhbiBpbnZhbGlkIHNldmVyaXR5IAotCSAqIChub3QgaW5mbywgd2Fybiwgb3IgZXJyb3IpLCBvciB0aGF0IHRoZSBtZXNzYWdlIGhhcyBubyBlcnJvciBpZC4gQ2hlY2sgCi0JICogdGhlIHZhbHVlIG9mIHRoZSBlcnJvciBpZCB0byBmaW5kIG91dCB3aGljaCBvZiB0aGUgdHdvIGlzIHRoZSBjYXNlLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U2V2ZXJpdHkoKSB7Ci0JCXJldHVybiBfc2V2ZXJpdHk7Ci0JfQotCi0JLyoqCi0JKiBQYXJzZSB0aGUgbWVzc2FnZSB2YWx1ZSB0byBleHRyYWN0IHRoZSB1bmlxdWUgZXJyb3IgaWQsIGlmIGFueSBleGlzdHMuCi0JKiBUaGlzIG1ldGhvZCBpbml0aWFsaXplcyBzb21lIG9mIHRoZSBmaWVsZHMgaW4gdGhpcyBjbGFzcy4KLQkqLwotCXB1YmxpYyB2b2lkIHBhcnNlKFN0cmluZyBtZXNzYWdlKSB7Ci0JCS8vIFRvIHNlZSB3aHkgaXQncyBzYWZlIHRvIGNhbGwgaW50ZXJuKCksIHJlYWQgdGhlIGNvbW1lbnQgaW4gdGhlCi0JCS8vIGNvbnN0cnVjdG9yLgotCi0JCS8vIENhc2UgMTogQUJDRDAwMDBFOiBCbGFoIEJsYWggQmxhaAotCQkvLyBDYXNlIDI6IEFCQ0QwMDAwRSAgQmxhaCBCbGFoIEJsYWgKLQkJLy8gQ2FzZSAzOiBBQkNEMDAwMEUgOiBCbGFoIEJsYWggQmxhaAotCQkvLyBDYXNlIDQ6IEFCQ0QwMDAwRSAgQmxhaDpCbGFoIEJsYWgKLQkJLy8gQ2FzZSA1OiBBQkNEMDAwMEUgOgotCQkvLyBDYXNlIDY6IEJsYWggQmxhaCBCbGFoIChpLmUuLCBubyBwcmVmaXgpCi0JCS8vIENhc2UgNzogQUJDRDAwMDBFOiBCbGFoCi0JCS8vIENhc2UgODogQUJDRDAwMDBFICBCbGFoCi0JCS8vIENhc2UgOTogQUJDRDAwMDBFIDogQmxhaAotCQkvLyBDYXNlIDEwOiBBQkNEMDAwMEUgQmxhaAotCQkvLyBDYXNlIDExOiBBQkNEMDAwMEUKLQotCQlpZiAobWVzc2FnZSA9PSBudWxsKSB7Ci0JCQlfbWVzc2FnZVByZWZpeCA9IEVNUFRZOwotCQkJX3Nob3J0TWVzc2FnZSA9IEVNUFRZOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobWVzc2FnZSk7Ci0JCWludCBudW1Ub2tlbnMgPSB0b2tlbml6ZXIuY291bnRUb2tlbnMoKTsKLQkJaWYgKG51bVRva2VucyA9PSAwKSB7Ci0JCQlfbWVzc2FnZVByZWZpeCA9IEVNUFRZOwotCQkJX3Nob3J0TWVzc2FnZSA9IG1lc3NhZ2U7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlTdHJpbmcgZXJyb3JJZCA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJCWJvb2xlYW4gcHJlZml4RXhpc3RzID0gZmFsc2U7Ci0KLQkJCS8vIFNvbWV0aW1lcyB0aGUgJzonIGlzbid0IHRoZXJlIG9yIGlzbid0IGluIHRoZSByaWdodCBwbGFjZSwgc28gZG9uJ3QgZGV0ZXJtaW5lIHRoZSBtZXNzYWdlIHByZWZpeCBiYXNlZCBvbiB0aGF0LgotCQkJU3RyaW5nIGFmdGVyUHJlZml4ID0gbnVsbDsKLQkJCWlmKGVycm9ySWQubGVuZ3RoKCkgPj0gOSkgewotCQkJCWFmdGVyUHJlZml4ID0gZXJyb3JJZC5zdWJzdHJpbmcoMCwgOSk7IC8vIE11c3QgYmUgb2YgdGhlIGZvcm0gQUJDRDEyMzRFLCB3aGljaCBpcyA5IGNoYXIgbG9uZwotCQkJCWNoYXJbXSB0ZW1wID0gYWZ0ZXJQcmVmaXgudG9DaGFyQXJyYXkoKTsKLQkJCQlwcmVmaXhFeGlzdHMgPSBDaGFyYWN0ZXIuaXNMZXR0ZXIodGVtcFswXSkgJiYgQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHRlbXBbMF0pOwotCQkJCXByZWZpeEV4aXN0cyA9IHByZWZpeEV4aXN0cyAmJiBDaGFyYWN0ZXIuaXNMZXR0ZXIodGVtcFsxXSkgJiYgQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHRlbXBbMF0pOwotCQkJCXByZWZpeEV4aXN0cyA9IHByZWZpeEV4aXN0cyAmJiBDaGFyYWN0ZXIuaXNMZXR0ZXIodGVtcFsyXSkgJiYgQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHRlbXBbMF0pOwotCQkJCXByZWZpeEV4aXN0cyA9IHByZWZpeEV4aXN0cyAmJiBDaGFyYWN0ZXIuaXNMZXR0ZXIodGVtcFszXSkgJiYgQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHRlbXBbMF0pOwotCQkJCXByZWZpeEV4aXN0cyA9IHByZWZpeEV4aXN0cyAmJiBDaGFyYWN0ZXIuaXNEaWdpdCh0ZW1wWzRdKTsKLQkJCQlwcmVmaXhFeGlzdHMgPSBwcmVmaXhFeGlzdHMgJiYgQ2hhcmFjdGVyLmlzRGlnaXQodGVtcFs1XSk7Ci0JCQkJcHJlZml4RXhpc3RzID0gcHJlZml4RXhpc3RzICYmIENoYXJhY3Rlci5pc0RpZ2l0KHRlbXBbNl0pOwotCQkJCXByZWZpeEV4aXN0cyA9IHByZWZpeEV4aXN0cyAmJiBDaGFyYWN0ZXIuaXNEaWdpdCh0ZW1wWzddKTsKLQkJCQlwcmVmaXhFeGlzdHMgPSBwcmVmaXhFeGlzdHMgJiYgQ2hhcmFjdGVyLmlzTGV0dGVyKHRlbXBbOF0pICYmIENoYXJhY3Rlci5pc1VwcGVyQ2FzZSh0ZW1wWzBdKTsKLQotCQkJCWlmIChwcmVmaXhFeGlzdHMpIHsKLQkJCQkJc3dpdGNoICh0ZW1wWzhdKSB7Ci0JCQkJCQljYXNlICgnRScpIDoKLQkJCQkJCQl7Ci0JCQkJCQkJCV9zZXZlcml0eSA9IEVSUk9SOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQljYXNlICgnVycpIDoKLQkJCQkJCQl7Ci0JCQkJCQkJCV9zZXZlcml0eSA9IFdBUk5JTkc7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCWNhc2UgKCdJJykgOgotCQkJCQkJCXsKLQkJCQkJCQkJX3NldmVyaXR5ID0gSU5GTzsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQotCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJewotCQkJCQkJCQlfc2V2ZXJpdHkgPSBVTkFTU0lHTkVEOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCX0KLQkJCQkJX21lc3NhZ2VQcmVmaXggPSBhZnRlclByZWZpeDsKLQkJCQkJCi0JCQkJCWludCBjb2xvbkluZGV4ID0gZXJyb3JJZC5pbmRleE9mKCc6Jyk7Ci0JCQkJCWJvb2xlYW4gbm9Db2xvbiA9IChjb2xvbkluZGV4ID09IC0xKTsKLQkKLQkJCQkJaW50IHNob3J0TWVzc2FnZUluZGV4ID0gMTA7IC8vIGFzc3VtZSB0aGF0IG9ubHkgdGhlIEFCQ0QwMDAwRSBwcmVmaXggd2lsbCBiZSBzdHJpcHBlZCAoaS5lLiwgbm8gY29sb24pCi0JCQkJCWlmKG5vQ29sb24pIHsKLQkJCQkJCS8vIE5vIGNvbG9uIGZvbGxvd2luZyBtZXNzYWdlIHByZWZpeCBpbW1lZGlhdGVseS4KLQkJCQkJCS8vIElzIHRoZXJlIHdoaXRlc3BhY2UgYmVmb3JlIHRoZSBjb2xvbj8KLQkJCQkJCWlmIChudW1Ub2tlbnMgPiAxKSB7Ci0JCQkJCQkJU3RyaW5nIG5leHRUb2tlbiA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJCQkJCQljb2xvbkluZGV4ID0gbmV4dFRva2VuLmluZGV4T2YoJzonKTsKLQkJCQkJCQlub0NvbG9uID0gKChjb2xvbkluZGV4ID09IC0xKSB8fCAobmV4dFRva2VuLnRyaW0oKS5pbmRleE9mKCc6JykgIT0gMCkpOyAvLyBjYXNlIDQgdHJpbSBjb25kaXRpb24gd2lsbCBiZSB0cnVlCi0JCQkJCQkJCi0JCQkJCQkJLy8gIjoiIHNob3VsZCBmb2xsb3cgdGhlIG1lc3NhZ2UgcHJlZml4IGltbWVkaWF0ZWx5Ci0JCQkJCQkJLy8gS25vdyB0aGVyZSdzIGEgcHJlZml4LCBhbmQgdGhhdCdzIDkgY2hhcgotCQkJCQkJCWlmKG5vQ29sb24pIHsKLQkJCQkJCQkJLy8gQ2FzZSAyLCA0LCA4IG9yIDEwCi0vLwkJCQkJCQkJTWVzc2FnZU1ldGFEYXRhIG1tZCA9IG5ldyBNZXNzYWdlTWV0YURhdGEoSVZhbGlkYXRpb25Db25zdGFudHMuQlVORExFTkFNRSwgTWVzc2FnZU1ldGFEYXRhLklORk8sIElWYWxpZGF0aW9uQ29uc3RhbnRzLkFCQ0QwMTIwLCBuZXcgU3RyaW5nW117fSwgdGhpcywgZ2V0TGluZU51bWJlcigpKTsKLS8vCQkJCQkJCQlnZXRGaWxlKCkuYWRkUGFyc2VXYXJuaW5nKG1tZCk7Ci0JCQkJCQkJCXNob3J0TWVzc2FnZUluZGV4ID0gMTA7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgewotLy8JCQkJCQkJCU1lc3NhZ2VNZXRhRGF0YSBtbWQgPSBuZXcgTWVzc2FnZU1ldGFEYXRhKElWYWxpZGF0aW9uQ29uc3RhbnRzLkJVTkRMRU5BTUUsIE1lc3NhZ2VNZXRhRGF0YS5JTkZPLCBJVmFsaWRhdGlvbkNvbnN0YW50cy5BQkNEMDEzMCwgbmV3IFN0cmluZ1tde30sIHRoaXMsIGdldExpbmVOdW1iZXIoKSk7Ci0vLwkJCQkJCQkJZ2V0RmlsZSgpLmFkZFBhcnNlV2FybmluZyhtbWQpOwotCQkJCQkJCQkKLQkJCQkJCQkJaWYobnVtVG9rZW5zID4gMikgewotCQkJCQkJCQkJLy8gQ2FzZSAzIG9yIDkKLQkJCQkJCQkJCW5leHRUb2tlbiA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJCQkJCQkJCXNob3J0TWVzc2FnZUluZGV4ID0gbWVzc2FnZS5pbmRleE9mKG5leHRUb2tlbik7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCQkvLyBDYXNlIDUKLQkJCQkJCQkJCXNob3J0TWVzc2FnZUluZGV4ID0gY29sb25JbmRleCArIDE7Ci0JCQkJCQkJCX0JCQkJCQkJCQotCQkJCQkJCX0KLQkJCQkJCQlfc2hvcnRNZXNzYWdlID0gbWVzc2FnZS5zdWJzdHJpbmcoc2hvcnRNZXNzYWdlSW5kZXgsIG1lc3NhZ2UubGVuZ3RoKCkpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLy8gQ2FzZSAxMQotCQkJCQkJCV9zaG9ydE1lc3NhZ2UgPSBFTVBUWTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIENhc2UgMSBvciA3Ci0JCQkJCQlzaG9ydE1lc3NhZ2VJbmRleCA9IGNvbG9uSW5kZXggKyAxOwotCQkJCQkJX3Nob3J0TWVzc2FnZSA9IG1lc3NhZ2Uuc3Vic3RyaW5nKHNob3J0TWVzc2FnZUluZGV4LCBtZXNzYWdlLmxlbmd0aCgpKTsKLQkJCQkJfQotCQkJCX0KLQkKLQkJCX0KLQotCQkJaWYgKCFwcmVmaXhFeGlzdHMpIHsKLQkJCQkvLyBDYXNlIDYKLQkJCQlfbWVzc2FnZVByZWZpeCA9IEVNUFRZOwotCQkJCV9zaG9ydE1lc3NhZ2UgPSBtZXNzYWdlOwotCQkJfQotCQl9Ci0KLQkJZ2V0RmlsZSgpLmFkZFBhcnNlV2FybmluZ3MocGFyc2VNZXNzYWdlKCkpOwotCX0KLQotCS8qKgotCSAqIE9uY2UgdGhlIGZpZWxkIHRoYXQgaG9sZHMgdGhlIG1lc3NhZ2UgdGV4dCBoYXMgYmVlbiBzZXQgKGkuZS4sIHBhcnNlKFN0cmluZykKLQkgKiBoYXMgYmVlbiBjYWxsZWQpLCB0aGlzIG1ldGhvZCBwYXJzZXMgdGhlIG1lc3NhZ2UgdGV4dCwgZmluZHMgYW55IHN5bnRheCBvcgotCSAqIG90aGVyIHByb2JsZW1zLCBhbmQgcmV0dXJucyBhIExpc3Qgb2YgTWVzc2FnZU1ldGFEYXRhLCB3aXRoIG9uZSBNZXNzYWdlTWV0YURhdGEKLQkgKiBmb3IgZWFjaCBwcm9ibGVtLgotCSAqLwotCXB1YmxpYyBMaXN0IHBhcnNlTWVzc2FnZSgpIHsKLQkJLy8gbm93IHBhcnNlIHRvIHNlZSBpZiBhbGwgYXBvc3Ryb3BoZXMgYXJlIGluIHBhaXJzLCBpZiB0aGVyZSBhcmUgcGFyYW1ldGVycyBvciBub3QsIGV0Yy4KLQkJQXJyYXlMaXN0IGludExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWludCBudW1PYnJhY2tldHMgPSAwOwotCQlpbnQgbnVtQ2JyYWNrZXRzID0gMDsKLQkJaW50IGluZGV4ID0gMDsKLQkJY2hhciB0b2tlbjsKLQkJaW50IHNpbmdsZVF1b3RlSW5kZXggPSAtMTsKLQkJaW50IGRvdWJsZVF1b3RlSW5kZXggPSAtMTsKLQkJaW50IG1pc3NpbmdUZXJtaW5hdGluZ1F1b3RlSW5kZXggPSAtMTsKLQkJYm9vbGVhbiBwYXJtRXhpc3RzID0gZmFsc2U7Ci0JCWludCBudW1DaGFyQmVmb3JlU2hvcnQgPSBnZXRNZXNzYWdlT2Zmc2V0KCkgKyBnZXRNZXNzYWdlKCkuaW5kZXhPZihnZXRTaG9ydE1lc3NhZ2UoKSk7Ci0JCQotCQl3aGlsZSAoaW5kZXggPCBnZXRTaG9ydE1lc3NhZ2UoKS5sZW5ndGgoKSkgewotCQkJdG9rZW4gPSBnZXRTaG9ydE1lc3NhZ2UoKS5jaGFyQXQoaW5kZXgrKyk7Ci0JCQlpZiAodG9rZW4gPT0gUVVPVEUpIHsKLQkJCQlpZiAoaW5kZXggPCBnZXRTaG9ydE1lc3NhZ2UoKS5sZW5ndGgoKSkgewotCQkJCQl0b2tlbiA9IGdldFNob3J0TWVzc2FnZSgpLmNoYXJBdChpbmRleCsrKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXRva2VuID0gJyAnOwotCQkJCX0KLQkJCQkKLQkJCQlpZiAoKHRva2VuID09IE9CUkFDS0VUKSB8fCAodG9rZW4gPT0gQ0JSQUNLRVQpKXsKLQkJCQkJaWYgKGluZGV4IDwgZ2V0U2hvcnRNZXNzYWdlKCkubGVuZ3RoKCkpIHsKLQkJCQkJCXRva2VuID0gZ2V0U2hvcnRNZXNzYWdlKCkuY2hhckF0KGluZGV4KyspOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJdG9rZW4gPSAnICc7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCS8vIERvZXMgdGhlIHsgb3IgfSBjaGFyYWN0ZXIgaGF2ZSBhIHRlcm1pbmF0aW5nIHNpbmdsZSBxdW90ZT8KLQkJCQkJaWYodG9rZW4gIT0gUVVPVEUpIHsKLQkJCQkJCW1pc3NpbmdUZXJtaW5hdGluZ1F1b3RlSW5kZXggPSAobnVtQ2hhckJlZm9yZVNob3J0ICsgaW5kZXgtMSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoKHRva2VuID09IFFVT1RFKSkgewotCQkJCQlkb3VibGVRdW90ZUluZGV4ID0gKG51bUNoYXJCZWZvcmVTaG9ydCArIGluZGV4LTEpOwotCQkJCX0KLQkJCQllbHNlICB7Ci0JCQkJCS8vICd7JyBtZWFucyB0aGF0IGEgeyB3aWxsIGJlIG91dHB1dCwKLQkJCQkJLy8gJ30nIG1lYW5zIHRoYXQgYSB9IHdpbGwgYmUgb3V0cHV0LAotCQkJCQkvLyAnJyBtZWFucyB0aGF0IGEgJyB3aWxsIGJlIG91dHB1dC4KLQkJCQkJCi0JCQkJCS8vIFNpbmNlIHRoZSBxdW90ZSBpcyBhIHNwZWNpYWwgY2hhcmFjdGVyLCBhbmQgdGhlIG9wZW5pbmcgYnJhY2tldCBpcyBhIAotCQkJCQkvLyBzcGVjaWFsIGNoYXJhY3Rlciwga2VlcCB0cmFjayBvZiB0aGUgbnVtYmVyIG9mIG9wZW4gYnJhY2tldHMuIElmIHRoZQotCQkJCQkvLyBmb2xsb3dpbmcgY2hhcmFjdGVyIGlzbid0IGEgcXVvdGUgb3Igb3BlbmluZyBicmFja2V0LCB3YXJuIHRoZSB1c2VyIAotCQkJCQkvLyB0aGF0IGl0IHRha2VzIHR3byBhcG9zdHJvcGhlcyB0byBzZWUgb25lIGFwb3N0cm9waGUuCi0JCQkJCXNpbmdsZVF1b3RlSW5kZXggPSAobnVtQ2hhckJlZm9yZVNob3J0ICsgaW5kZXgtMSk7Ci0JCQkJfQotCQkJCQotCQkJfQotCQkJZWxzZSBpZiAodG9rZW4gPT0gT0JSQUNLRVQpIHsKLQkJCQludW1PYnJhY2tldHMrKzsKLQkJCQlwYXJtRXhpc3RzID0gdHJ1ZTsKLQkJCQlTdHJpbmdCdWZmZXIgbnVtQnVmZmVyID0gbnVsbDsKLQkJCQlpZiAoaW5kZXggPCBnZXRTaG9ydE1lc3NhZ2UoKS5sZW5ndGgoKSkgewotCQkJCQludW1CdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJCXdoaWxlIChpbmRleCA8IGdldFNob3J0TWVzc2FnZSgpLmxlbmd0aCgpKSB7Ci0JCQkJCQljaGFyIGRpZ2l0ID0gZ2V0U2hvcnRNZXNzYWdlKCkuY2hhckF0KGluZGV4KTsKLQkJCQkJCWlmICgoQ2hhcmFjdGVyLmlzRGlnaXQoZGlnaXQpKSB8fCAoZGlnaXQgPT0gJy0nKSB8fCAoZGlnaXQgPT0gJysnKSkgewotCQkJCQkJCW51bUJ1ZmZlci5hcHBlbmQoZGlnaXQpOwotCQkJCQkJCWluZGV4Kys7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gbm90IGFuIGVycm9yOyBqdXN0IG5vdCBhIG51bWJlci4gQ291bGQgYmUgb25lIG9mIHRoZSBvdGhlciAKLQkJCQkJLy8gQ2hvaWNlRm9ybWF0LCBvciB3aGF0ZXZlciwgZm9ybWF0cy4gRG8gbm90IGdldCB0aGUgbmV4dCAKLQkJCQkJLy8gdG9rZW4sIGJlY2F1c2Ugd2Ugc3RpbGwgbmVlZCB0byBwcm9jZXNzIHRoaXMgb25lLgotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQl0cnkgewotCQkJCQlpZiAoKG51bUJ1ZmZlciAhPSBudWxsKSAmJiAobnVtQnVmZmVyLmxlbmd0aCgpID4gMCkpIHsKLQkJCQkJCUludGVnZXIgcGFybU51bSA9IEludGVnZXIudmFsdWVPZihudW1CdWZmZXIudG9TdHJpbmcoKSk7Ci0JCQkJCQlpbnRMaXN0LmFkZChwYXJtTnVtKTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4YykgewotCQkJCQkvLyBub3QgYW4gZXJyb3I7IGp1c3Qgbm90IGEgbnVtYmVyLiBDb3VsZCBiZSBvbmUgb2YgdGhlIG90aGVyIAotCQkJCQkvLyBDaG9pY2VGb3JtYXQsIG9yIHdoYXRldmVyLCBmb3JtYXRzLiBEbyBub3QgZ2V0IHRoZSBuZXh0IAotCQkJCQkvLyB0b2tlbiwgYmVjYXVzZSB3ZSBzdGlsbCBuZWVkIHRvIHByb2Nlc3MgdGhpcyBvbmUuCi0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAodG9rZW4gPT0gQ0JSQUNLRVQpIHsKLQkJCQludW1DYnJhY2tldHMrKzsKLQkJCX0KLQkJfQotCQkKLQkJX251bVBhcm1zID0gTWF0aC5tYXgobnVtT2JyYWNrZXRzLCBudW1DYnJhY2tldHMpOwotCi0JCS8vIGZpbmQgcGFyc2Ugd2FybmluZ3MKLQkJTGlzdCBtZXNzYWdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKG51bU9icmFja2V0cyAhPSBudW1DYnJhY2tldHMpIHsKLQkJCU1lc3NhZ2VNZXRhRGF0YSBtbWQgPSBuZXcgTWVzc2FnZU1ldGFEYXRhKElWYWxpZGF0aW9uQ29uc3RhbnRzLkJVTkRMRU5BTUUsIE1lc3NhZ2VNZXRhRGF0YS5FUlJPUiwgSVZhbGlkYXRpb25Db25zdGFudHMuQUJDRDAwMDAsIG5ldyBTdHJpbmdbXXtTdHJpbmcudmFsdWVPZihudW1PYnJhY2tldHMpLCBTdHJpbmcudmFsdWVPZihudW1DYnJhY2tldHMpfSwgdGhpcywgZ2V0TGluZU51bWJlcigpKTsKLQkJCW1lc3NhZ2VzLmFkZChtbWQpOwotCQl9Ci0JCQotCQlpZihtaXNzaW5nVGVybWluYXRpbmdRdW90ZUluZGV4ICE9IC0xKSB7Ci0JCQlNZXNzYWdlTWV0YURhdGEgbW1kID0gbmV3IE1lc3NhZ2VNZXRhRGF0YShJVmFsaWRhdGlvbkNvbnN0YW50cy5CVU5ETEVOQU1FLCBNZXNzYWdlTWV0YURhdGEuSU5GTywgSVZhbGlkYXRpb25Db25zdGFudHMuQUJDRDAxMTAsIG5ldyBTdHJpbmdbXXtTdHJpbmcudmFsdWVPZihtaXNzaW5nVGVybWluYXRpbmdRdW90ZUluZGV4KX0sIHRoaXMsIGdldExpbmVOdW1iZXIoKSwgZ2V0T2Zmc2V0KCkgKyBtaXNzaW5nVGVybWluYXRpbmdRdW90ZUluZGV4LCAxKTsgLy8gbWFnaWMgbnVtYmVyIDEgYmVjYXVzZSBhIHF1b3RlIGlzIG9uZSBjaGFyYWN0ZXIgbG9uZwotCQkJbWVzc2FnZXMuYWRkKG1tZCk7Ci0JCX0KLQotCQkvLyBOb3cgc29ydCB0aGUgbGlzdCwgdG8gc2VlIGlmIHRoZXJlJ3MgYW55IG51bWJlcnMgbWlzc2luZywgZHVwbGljYXRlZCwgb3IgbmVnYXRpdmUKLQkJQ29sbGVjdGlvbnMuc29ydChpbnRMaXN0LCBuZXcgQ29tcGFyYXRvcigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgYSwgT2JqZWN0IGIpIHsKLQkJCQkvLyBuZWdhdGl2ZSA9IGIgYmVmb3JlIGEKLQkJCQkvLyB6ZXJvID0gYSA9IGIKLQkJCQkvLyBwb3NpdGl2ZSA9IGEgYmVmb3JlIGIKLQkJCQlyZXR1cm4gKChJbnRlZ2VyKSBhKS5pbnRWYWx1ZSgpIC0gKChJbnRlZ2VyKSBiKS5pbnRWYWx1ZSgpOwotCQkJfQotCQl9KTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBpbnRMaXN0Lml0ZXJhdG9yKCk7Ci0JCWludCBwYXJtQ291bnQgPSAwOwotCQlpbnQgbGFzdE51bWJlciA9IC0xOwotCQlpbnQgbGFyZ2VzdE51bWJlciA9IC0xOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlJbnRlZ2VyIHBhcm0gPSAoSW50ZWdlcikgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKHBhcm0uaW50VmFsdWUoKSA8IDApIHsKLQkJCQlNZXNzYWdlTWV0YURhdGEgbW1kID0gbmV3IE1lc3NhZ2VNZXRhRGF0YShJVmFsaWRhdGlvbkNvbnN0YW50cy5CVU5ETEVOQU1FLCBNZXNzYWdlTWV0YURhdGEuRVJST1IsIElWYWxpZGF0aW9uQ29uc3RhbnRzLkFCQ0QwMDEwRSwgbmV3IFN0cmluZ1tde1N0cmluZy52YWx1ZU9mKHBhcm0uaW50VmFsdWUoKSl9LCB0aGlzLCBnZXRMaW5lTnVtYmVyKCkpOwotCQkJCW1lc3NhZ2VzLmFkZChtbWQpOwotCQkJfQotCQkJZWxzZSBpZiAocGFybS5pbnRWYWx1ZSgpID09IGxhc3ROdW1iZXIpIHsKLQkJCQlNZXNzYWdlTWV0YURhdGEgbW1kID0gbmV3IE1lc3NhZ2VNZXRhRGF0YShJVmFsaWRhdGlvbkNvbnN0YW50cy5CVU5ETEVOQU1FLCBNZXNzYWdlTWV0YURhdGEuSU5GTywgSVZhbGlkYXRpb25Db25zdGFudHMuQUJDRDAwMjAsIG5ldyBTdHJpbmdbXXtTdHJpbmcudmFsdWVPZihsYXN0TnVtYmVyKX0sIHRoaXMsIGdldExpbmVOdW1iZXIoKSk7Ci0JCQkJbWVzc2FnZXMuYWRkKG1tZCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChwYXJtLmludFZhbHVlKCkgIT0gcGFybUNvdW50KSB7Ci0JCQkJTWVzc2FnZU1ldGFEYXRhIG1tZCA9IG5ldyBNZXNzYWdlTWV0YURhdGEoSVZhbGlkYXRpb25Db25zdGFudHMuQlVORExFTkFNRSwgTWVzc2FnZU1ldGFEYXRhLklORk8sIElWYWxpZGF0aW9uQ29uc3RhbnRzLkFCQ0QwMDMwLCBuZXcgU3RyaW5nW117U3RyaW5nLnZhbHVlT2YocGFybUNvdW50KX0sIHRoaXMsIGdldExpbmVOdW1iZXIoKSk7Ci0JCQkJbWVzc2FnZXMuYWRkKG1tZCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlwYXJtQ291bnQrKzsKLQkJCX0KLQkJCWxhc3ROdW1iZXIgPSBwYXJtLmludFZhbHVlKCk7Ci0JCQlsYXJnZXN0TnVtYmVyID0gTWF0aC5tYXgobGFyZ2VzdE51bWJlciwgcGFybS5pbnRWYWx1ZSgpKTsKLQkJfQotCQlpZihsYXJnZXN0TnVtYmVyID4gMCkgewotCQkJLy8gTm90IGEgY2hvaWNlIGZvcm1hdC4KLQkJCS8vCi0JCQkvLyBBbHRob3VnaCB0aGUgZmlyc3QgZGVmYXVsdCAoY291bnRpbmcgdGhlIG51bWJlciBvZiAKLQkJCS8vIGJyYWNrZXRzKSBpcyBva2F5IGluIG1vc3QgY2FzZXMsIHNvbWV0aW1lcyBhIHBhcmFtZXRlciAKLQkJCS8vIGlzIG1pc3NpbmcsIGFuZCBzbyB0aGUgbnVtYmVyIG9mIHBhcmFtdGVycyBwYXNzZWQgaW50byAKLQkJCS8vIHRoZSBNZXNzYWdlRm9ybWF0IG5lZWRzIHRvIGJlIGxhcmdlci4gKGUuZy4gezB9IHsyfSwgCi0JCQkvLyBuZWVkIFN0cmluZ1tdIHRvIGJlIHsiIiwgIiIsICIifSwgbm90IHsiIiwgIiJ9KS4gCi0JCQkKLQkJCS8vIE5lZWQgdG8gYWRkICIxIiB0byBpdCBiZWNhdXNlIHRoZSBudW1iZXJzIHN0YXJ0IGF0IGEgMCBpbmRleC4KLQkJCV9udW1QYXJtcyA9IGxhcmdlc3ROdW1iZXIgKyAxOyAKLQkJfQotCQkKLQkJaWYobGFyZ2VzdE51bWJlciA+IDkpIHsKLQkJCS8vIE1lc3NhZ2VGb3JtYXQgd2lsbCBub3Qgc3Vic3RpdHV0ZSBpbiBwYXJhbWV0ZXJzIGFmdGVyIHRoZSAxMCBwYXJhbWV0ZXIgKGkuZS4sIG51bWJlciA5KS4KLQkJCU1lc3NhZ2VNZXRhRGF0YSBtbWQgPSBuZXcgTWVzc2FnZU1ldGFEYXRhKElWYWxpZGF0aW9uQ29uc3RhbnRzLkJVTkRMRU5BTUUsIE1lc3NhZ2VNZXRhRGF0YS5XQVJOSU5HLCBJVmFsaWRhdGlvbkNvbnN0YW50cy5BQkNEMDAxMFcsIG5ldyBTdHJpbmdbXXtTdHJpbmcudmFsdWVPZihsYXJnZXN0TnVtYmVyKX0sIHRoaXMsIGdldExpbmVOdW1iZXIoKSk7Ci0JCQltZXNzYWdlcy5hZGQobW1kKTsKLQkJfQotCi0JCWlmICgoc2luZ2xlUXVvdGVJbmRleCA+IC0xKSAmJiBwYXJtRXhpc3RzKSB7Ci0JCQlNZXNzYWdlTWV0YURhdGEgbW1kID0gbmV3IE1lc3NhZ2VNZXRhRGF0YShJVmFsaWRhdGlvbkNvbnN0YW50cy5CVU5ETEVOQU1FLCBNZXNzYWdlTWV0YURhdGEuSU5GTywgSVZhbGlkYXRpb25Db25zdGFudHMuQUJDRDAwNDAsIG5ldyBTdHJpbmdbXXtTdHJpbmcudmFsdWVPZihzaW5nbGVRdW90ZUluZGV4KX0sIHRoaXMsIGdldExpbmVOdW1iZXIoKSwgZ2V0T2Zmc2V0KCkgKyBzaW5nbGVRdW90ZUluZGV4LCAxKTsgLy8gbWFnaWMgbnVtYmVyIDEgYmVjYXVzZSBhIHF1b3RlIGlzIG9uZSBjaGFyYWN0ZXIgbG9uZwotCQkJbWVzc2FnZXMuYWRkKG1tZCk7Ci0JCX0KLQkJZWxzZSBpZiAoKGRvdWJsZVF1b3RlSW5kZXggPiAtMSkgJiYgIXBhcm1FeGlzdHMpIHsKLQkJCU1lc3NhZ2VNZXRhRGF0YSBtbWQgPSBuZXcgTWVzc2FnZU1ldGFEYXRhKElWYWxpZGF0aW9uQ29uc3RhbnRzLkJVTkRMRU5BTUUsIE1lc3NhZ2VNZXRhRGF0YS5JTkZPLCBJVmFsaWRhdGlvbkNvbnN0YW50cy5BQkNEMDA1MCwgbmV3IFN0cmluZ1tde1N0cmluZy52YWx1ZU9mKGRvdWJsZVF1b3RlSW5kZXgpfSwgdGhpcywgZ2V0TGluZU51bWJlcigpLCBnZXRPZmZzZXQoKSArIGRvdWJsZVF1b3RlSW5kZXgsIDEpOyAvLyBtYWdpYyBudW1iZXIgMSBiZWNhdXNlIGEgcXVvdGUgaXMgb25lIGNoYXJhY3RlciBsb25nCi0JCQltZXNzYWdlcy5hZGQobW1kKTsKLQkJfQotCi0JCXJldHVybiBtZXNzYWdlczsKLQl9Ci0KLQkvKioKLQkgKiBGb3JtYXQgdGhpcyAucHJvcGVydGllcyBsaW5lIGZvciBkaXNwbGF5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBudWxsOwotCQlpZihnZXRGaWxlKCkgPT0gbnVsbCkgewotCQkJYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQl9Ci0JCWVsc2UgewotCQkJYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihnZXRGaWxlKCkuZ2V0UXVhbGlmaWVkRmlsZU5hbWUoKSk7Ci0JCX0KLQkJYnVmZmVyLmFwcGVuZCgiXHRMaW5lIG51bWJlcjogIik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZChTdHJpbmcudmFsdWVPZihnZXRMaW5lTnVtYmVyKCkpKTsKLQkJYnVmZmVyLmFwcGVuZCgiXHQiKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKGdldE1lc3NhZ2VJZCgpKTsKLQkJYnVmZmVyLmFwcGVuZCgiID0gIik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZChnZXRNZXNzYWdlKCkpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCQotCS8qKgotCSAqIEZvcm1hdCB0aGlzIC5wcm9wZXJ0aWVzIGxpbmUgZm9yIGRpc3BsYXksIGFuZCBzdWJzdGl0dXRlIGEgc3R1YiwKLQkgKiBvZiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaW50byBlYWNoIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0IHBhdHRlcm4uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZ1dpdGhFeHBlY3RlZExlbmd0aChpbnQgbGVuZ3RoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBudWxsOwotCQlpZihnZXRGaWxlKCkgPT0gbnVsbCkgewotCQkJYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQl9Ci0JCWVsc2UgewotCQkJYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihnZXRGaWxlKCkuZ2V0UXVhbGlmaWVkRmlsZU5hbWUoKSk7Ci0JCX0KLQkJYnVmZmVyLmFwcGVuZCgiXHRMaW5lIG51bWJlcjogIik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZChTdHJpbmcudmFsdWVPZihnZXRMaW5lTnVtYmVyKCkpKTsKLQkJYnVmZmVyLmFwcGVuZCgiXHQiKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKGdldE1lc3NhZ2VJZCgpKTsKLQkJYnVmZmVyLmFwcGVuZCgiID0gIik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZChnZXRFeHBlY3RlZE1lc3NhZ2UobGVuZ3RoKSk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtZXNzYWdlIHByZWZpeCB3aXRob3V0IHRoZSBzZXZlcml0eSwgZS5nLiwKLQkgKiBBQkNEMDAwMCBpbnN0ZWFkIG9mIEFCQ0QwMDAwRS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNob3J0TWVzc2FnZVByZWZpeCgpIHsKLQkJU3RyaW5nIHByZWZpeCA9IGdldE1lc3NhZ2VQcmVmaXgoKTsKLQkJaWYocHJlZml4LmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCWNoYXIgcHJlZml4RW5kID0gcHJlZml4LmNoYXJBdChwcmVmaXgubGVuZ3RoKCkgLSAxKTsKLQkJaWYgKChwcmVmaXhFbmQgPT0gJ0UnKSB8fCAocHJlZml4RW5kID09ICdXJykgfHwgKHByZWZpeEVuZCA9PSAnSScpKSB7Ci0JCQlwcmVmaXggPSBwcmVmaXguc3Vic3RyaW5nKDAsIHByZWZpeC5sZW5ndGgoKSAtIDEpOwotCQl9Ci0JCXJldHVybiBwcmVmaXg7Ci0JfQotCQotCS8qKgotCSAqIEEgUHJvcGVydHlMaW5lIGlzIGVxdWFsIGlmIGl0IGlzIGluIHRoZSBzYW1lIGZpbGUgYW5kIG9uIHRoZSBzYW1lIGxpbmUgbnVtYmVyLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlpZihvID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJaWYoIShvIGluc3RhbmNlb2YgUHJvcGVydHlMaW5lKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlQcm9wZXJ0eUxpbmUgb0xpbmUgPSAoUHJvcGVydHlMaW5lKW87Ci0JCWlmKCEoZ2V0TGluZU51bWJlcigpID09IG9MaW5lLmdldExpbmVOdW1iZXIoKSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJaWYoIWdldEZpbGUoKS5lcXVhbHMob0xpbmUuZ2V0RmlsZSgpKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIChnZXRGaWxlKCkuaGFzaENvZGUoKSArIGdldExpbmVOdW1iZXIoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wcm9wZXJ0aWVzVmFsaWRhdG9yL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9wYXJzZXIvUHJvcGVydHlMaW5lQ29tcGFyYXRvci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxpZGF0b3Ivb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL3BhcnNlci9Qcm9wZXJ0eUxpbmVDb21wYXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkYWFkMjkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxpZGF0b3Ivb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL3BhcnNlci9Qcm9wZXJ0eUxpbmVDb21wYXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTQgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUucGFyc2VyOwotLyoKLSAqIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNIAotICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMiwgMjAwMyAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAotICogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSAKLSAqIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLiAKLSAqCi0gKiBESVNDTEFJTUVSIE9GIFdBUlJBTlRJRVMuCi0gKiBUaGUgZm9sbG93aW5nIFtlbmNsb3NlZF0gY29kZSBpcyBzYW1wbGUgY29kZSBjcmVhdGVkIGJ5IElCTQotICogQ29ycG9yYXRpb24uIFRoaXMgc2FtcGxlIGNvZGUgaXMgbm90IHBhcnQgb2YgYW55IHN0YW5kYXJkIG9yIElCTQotICogcHJvZHVjdCBhbmQgaXMgcHJvdmlkZWQgdG8geW91IHNvbGVseSBmb3IgdGhlIHB1cnBvc2Ugb2YgYXNzaXN0aW5nCi0gKiB5b3UgaW4gdGhlIGRldmVsb3BtZW50IG9mIHlvdXIgYXBwbGljYXRpb25zLiAgVGhlIGNvZGUgaXMgcHJvdmlkZWQKLSAqICJBUyBJUyIuIElCTSBNQUtFUyBOTyBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCi0gKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIFJFR0FSRElORyBUSEUgRlVOQ1RJT04gT1IgUEVSRk9STUFOQ0UgT0YKLSAqIFRISVMgQ09ERS4gIFRISVMgQ09ERSBNQVkgQ09OVEFJTiBFUlJPUlMuICBJQk0gc2hhbGwgbm90IGJlIGxpYWJsZQotICogZm9yIGFueSBkYW1hZ2VzIGFyaXNpbmcgb3V0IG9mIHlvdXIgdXNlIG9mIHRoZSBzYW1wbGUgY29kZSwgZXZlbgotICogaWYgaXQgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotICogCi0gKi8KLQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgY29udGFpbnMgYWxsIG9mIHRoZSBDb21wYXJhdG9yIGNsYXNzZXMgdGhhdCBjYW4gYmUgdXNlZAotICogdG8gc29ydCBQcm9wZXJ0eUxpbmUgaW5zdGFuY2VzIGluIGFuIEFQcm9wZXJ0eUZpbGUuIChGb3IgZXhhbXBsZSwKLSAqIHRvIGZpbmQgZHVwbGljYXRlIG1lc3NhZ2UgaWRzLCB0aGUgTWVzc2FnZUlkQ29tcGFyYXRvciB3b3VsZCBiZSB1c2VkCi0gKiB0byBzb3J0IHRoZSBsaW5lcyBhY2NvcmRpbmcgdG8gbWVzc2FnZSBpZC4gVGhlIHNvcnRlZCBsaXN0IGlzIAotICogdHJhdmVyc2VkIHRvIGZpbmQgb3V0IGlmIG9uZSBsaW5lIGhhcyBhbiBpZGVudGljYWwgbWVzc2FnZSBpZCAKLSAqIHRvIHRoZSBsaW5lIHRoYXQgZm9sbG93cyBpdCwgYW5kIGlmIHNvLCBhIHBhcnNlIHdhcm5pbmcgaXMgcmVwb3J0ZWQuKQotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlMaW5lQ29tcGFyYXRvciB7Ci0JcHJpdmF0ZSBzdGF0aWMgUHJvcGVydHlMaW5lQ29tcGFyYXRvciBpbnN0ID0gbmV3IFByb3BlcnR5TGluZUNvbXBhcmF0b3IoKTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yIF9tZXNzYWdlUHJlZml4Q29tcGFyYXRvciA9IGluc3QubmV3IE1lc3NhZ2VQcmVmaXhDb21wYXJhdG9yKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29tcGFyYXRvciBfbWVzc2FnZUlkQ29tcGFyYXRvciA9IGluc3QubmV3IE1lc3NhZ2VJZENvbXBhcmF0b3IoKTsKLQlwcml2YXRlIHN0YXRpYyBDb21wYXJhdG9yIF9zdHJpbmdMZW5ndGhDb21wYXJhdG9yID0gbmV3IFN0cmluZ0xlbmd0aENvbXBhcmF0b3IoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yIF92YWx1ZUNvbXBhcmF0b3IgPSBpbnN0Lm5ldyBWYWx1ZUNvbXBhcmF0b3IoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yIF9saW5lTm9Db21wYXJhdG9yID0gaW5zdC5uZXcgTGluZU5vQ29tcGFyYXRvcigpOwotCi0JcHJpdmF0ZSBQcm9wZXJ0eUxpbmVDb21wYXJhdG9yKCkgewotCX0JCi0KLQkvKioKLQkgKiBUaGlzIGNsYXNzIGNvbXBhcmVzIFByb3BlcnR5TGluZSBpbnN0YW5jZXMgYW5kIHNvcnRzIHRoZW0gYWNjb3JkaW5nIHRvIAotCSAqIHRoZWlyIG1lc3NhZ2UgcHJlZml4IChlLmcuLCBBQkNEMDAwMEUpLgotCSAqLwotCXByaXZhdGUgY2xhc3MgTWVzc2FnZVByZWZpeENvbXBhcmF0b3IgaW1wbGVtZW50cyBqYXZhLnV0aWwuQ29tcGFyYXRvciB7Ci0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgYSwgT2JqZWN0IGIpIHsKLQkJCWlmKChhID09IG51bGwpICYmIChiID09IG51bGwpKSB7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQllbHNlIGlmKGEgPT0gbnVsbCkgewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCWVsc2UgaWYoYiA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCQkKLQkJCS8vIENhbid0IGp1c3QgbG9vayB0byBzZWUgaWYgdGhleSdyZSB0aGUgc2FtZTsgbmVlZCB0byBtYXJrCi0JCQkvLyB0aGVtIGFzIHRoZSBzYW1lIGV2ZW4gaWYgdGhlIGxhc3QgbGV0dGVyIChFfFd8SSkgaXMgZGlmZmVyZW50LgotCQkJU3RyaW5nIGFpZCA9ICgoUHJvcGVydHlMaW5lKSBhKS5nZXRNZXNzYWdlUHJlZml4KCk7Ci0JCQlTdHJpbmcgYmlkID0gKChQcm9wZXJ0eUxpbmUpIGIpLmdldE1lc3NhZ2VQcmVmaXgoKTsKLQkJCWlmKChhaWQgPT0gbnVsbCkgJiYgKGJpZCA9PSBudWxsKSkgewotCQkJCXJldHVybiAwOwotCQkJfQotCQkJZWxzZSBpZihhaWQgPT0gbnVsbCkgewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCWVsc2UgaWYoYmlkID09IG51bGwpIHsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJCQkKLQkJCWFpZCA9IGFpZC50b1VwcGVyQ2FzZSgpLnRyaW0oKTsKLQkJCWJpZCA9IGJpZC50b1VwcGVyQ2FzZSgpLnRyaW0oKTsKLQotCQkJaWYoKGFpZC5lcXVhbHMoIiIpKSAmJiAoYmlkLmVxdWFscygiIikpKSB7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCWVsc2UgaWYoYWlkLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCWVsc2UgaWYoYmlkLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiAxOwotCQkJfQotCi0JCQlyZXR1cm4gKChQcm9wZXJ0eUxpbmUpYSkuZ2V0U2hvcnRNZXNzYWdlUHJlZml4KCkudG9VcHBlckNhc2UoKS5jb21wYXJlVG8oKChQcm9wZXJ0eUxpbmUpYikuZ2V0U2hvcnRNZXNzYWdlUHJlZml4KCkudG9VcHBlckNhc2UoKSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBjb21wYXJhdG9yIHNvcnRzIFByb3BlcnR5TGluZSBieSB0aGVpciBtZXNzYWdlIGlkLgotCSAqLwotCXByaXZhdGUgY2xhc3MgTWVzc2FnZUlkQ29tcGFyYXRvciBpbXBsZW1lbnRzIGphdmEudXRpbC5Db21wYXJhdG9yIHsKLQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBhLCBPYmplY3QgYikgewotCQkJaWYoKGEgPT0gbnVsbCkgJiYgKGIgPT0gbnVsbCkpIHsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCWVsc2UgaWYoYSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJZWxzZSBpZihiID09IG51bGwpIHsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJCQotCQkJU3RyaW5nIGFNZXNzYWdlSWQgPSBudWxsOwotCQkJU3RyaW5nIGJNZXNzYWdlSWQgPSBudWxsOwotCQkJaWYoYSBpbnN0YW5jZW9mIFByb3BlcnR5TGluZSkgewotCQkJCWFNZXNzYWdlSWQgPSAoKFByb3BlcnR5TGluZSlhKS5nZXRNZXNzYWdlSWQoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWFNZXNzYWdlSWQgPSAoU3RyaW5nKWE7Ci0JCQl9Ci0JCQkKLQkJCWlmKGIgaW5zdGFuY2VvZiBQcm9wZXJ0eUxpbmUpIHsKLQkJCQliTWVzc2FnZUlkID0gKChQcm9wZXJ0eUxpbmUpYikuZ2V0TWVzc2FnZUlkKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQliTWVzc2FnZUlkID0gKFN0cmluZyliOwotCQkJfQotCQkJCQotCQkJCi0JCQlpZigoYU1lc3NhZ2VJZCA9PSBudWxsKSAmJiAoYk1lc3NhZ2VJZCA9PSBudWxsKSkgewotCQkJCXJldHVybiAwOwotCQkJfQotCQkJZWxzZSBpZihhTWVzc2FnZUlkID09IG51bGwpIHsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCQllbHNlIGlmKGJNZXNzYWdlSWQgPT0gbnVsbCkgewotCQkJCXJldHVybiAxOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIGFNZXNzYWdlSWQuY29tcGFyZVRvKGJNZXNzYWdlSWQpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIFNvcnQgdGhlIFByb3BlcnR5TGluZSBieSB0aGUgbGVuZ3RoIG9mIGNoYXJhY3RlcnMgaW4gdGhlIG1lc3NhZ2UgdGV4dDsKLQkgKiBpZiB5b3Ugd2FudCB0byBzdWJzdGl0dXRlIGNoYXJhY3RlcnMgZm9yIHRoZSBtZXNzYWdlIHBhcmFtZXRlcnMsIAotCSAqIHNldCB0aGUgbGVuZ3RoIGZpZWxkLgotCSAqLwotCXN0YXRpYyBjbGFzcyBTdHJpbmdMZW5ndGhDb21wYXJhdG9yIGltcGxlbWVudHMgamF2YS51dGlsLkNvbXBhcmF0b3IgewotCQlwdWJsaWMgc3RhdGljIGludCBsZW5ndGggPSAwOwotCQkKLQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBhLCBPYmplY3QgYikgewotCQkJLy8gcmV0dXJuIGEgbmVnYXRpdmUgbnVtYmVyIGlmIG9iamVjdCBhIGlzIGxlc3MgdGhhbiBvYmplY3QgYgotCQkJLy8gcmV0dXJuIGEgemVybyBpZiB0aGUgb2JqZWN0cyBhcmUgZXF1YWwKLQkJCS8vIHJldHVybiBhIHBvc2l0aXZlIG51bWJlciBpZiBvYmplY3QgYSBpcyBncmVhdGVyIHRoYW4gb2JqZWN0IGIKLQkJCWlmKChhID09IG51bGwpICYmIChiID09IG51bGwpKSB7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQllbHNlIGlmKGEgPT0gbnVsbCkgewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCWVsc2UgaWYoYiA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCQkKLQkJCWludCBhTGVuZ3RoID0gKChQcm9wZXJ0eUxpbmUpYSkuZ2V0RXhwZWN0ZWRMZW5ndGgobGVuZ3RoKTsKLQkJCWludCBiTGVuZ3RoID0gKChQcm9wZXJ0eUxpbmUpYikuZ2V0RXhwZWN0ZWRMZW5ndGgobGVuZ3RoKTsKLQkJCQkKLQkJCXJldHVybiAoYUxlbmd0aCAtIGJMZW5ndGgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEFscGhhYmV0aXplIHRoZSBtZXNzYWdlIHRleHQgb2YgdGhlIFByb3BlcnR5TGluZS4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIFZhbHVlQ29tcGFyYXRvciBpbXBsZW1lbnRzIGphdmEudXRpbC5Db21wYXJhdG9yIHsKLQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBhLCBPYmplY3QgYikgewotCQkJaWYoKGEgPT0gbnVsbCkgJiYgKGIgPT0gbnVsbCkpIHsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCWVsc2UgaWYoYSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJZWxzZSBpZihiID09IG51bGwpIHsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJCQotCQkJU3RyaW5nIGFNZXNzYWdlID0gKChQcm9wZXJ0eUxpbmUpYSkuZ2V0TWVzc2FnZSgpOwotCQkJU3RyaW5nIGJNZXNzYWdlID0gKChQcm9wZXJ0eUxpbmUpYikuZ2V0TWVzc2FnZSgpOwotCQkJaWYoKGFNZXNzYWdlID09IG51bGwpICYmIChiTWVzc2FnZSA9PSBudWxsKSkgewotCQkJCXJldHVybiAwOwotCQkJfQotCQkJZWxzZSBpZihhTWVzc2FnZSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJZWxzZSBpZihiTWVzc2FnZSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCQkJCi0JCQlyZXR1cm4gYU1lc3NhZ2UuY29tcGFyZVRvKGJNZXNzYWdlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBTb3J0IGJ5IGxpbmUgbnVtYmVyIG9mIHRoZSBQcm9wZXJ0eUxpbmUsIHdpdGggdGhlIHNtYWxsZXN0IGxpbmUKLQkgKiBudW1iZXIgZmlyc3QgaW4gdGhlIGxpc3QuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBMaW5lTm9Db21wYXJhdG9yIGltcGxlbWVudHMgamF2YS51dGlsLkNvbXBhcmF0b3IgewotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGEsIE9iamVjdCBiKSB7Ci0JCQkvLyByZXR1cm4gYSBuZWdhdGl2ZSBudW1iZXIgaWYgb2JqZWN0IGEgaXMgbGVzcyB0aGFuIG9iamVjdCBiCi0JCQkvLyByZXR1cm4gYSB6ZXJvIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVhbAotCQkJLy8gcmV0dXJuIGEgcG9zaXRpdmUgbnVtYmVyIGlmIG9iamVjdCBhIGlzIGdyZWF0ZXIgdGhhbiBvYmplY3QgYgotCQkJaWYoKGEgPT0gbnVsbCkgJiYgKGIgPT0gbnVsbCkpIHsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCWVsc2UgaWYoYSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJZWxzZSBpZihiID09IG51bGwpIHsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJCQotCQkJaW50IGFMaW5lTm8gPSAoKFByb3BlcnR5TGluZSlhKS5nZXRMaW5lTnVtYmVyKCk7Ci0JCQlpbnQgYkxpbmVObyA9ICgoUHJvcGVydHlMaW5lKWIpLmdldExpbmVOdW1iZXIoKTsKLQkJCWlmKChhTGluZU5vIDwgMCkgJiYgKGJMaW5lTm8gPCAwKSkgewotCQkJCXJldHVybiAwOwotCQkJfQotCQkJZWxzZSBpZihhTGluZU5vIDwgMCkgewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCWVsc2UgaWYoYkxpbmVObyA8IDApIHsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIChhTGluZU5vIC0gYkxpbmVObyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENvbXBhcmF0b3IgZ2V0TWVzc2FnZVByZWZpeENvbXBhcmF0b3IoKSB7Ci0JCXJldHVybiBfbWVzc2FnZVByZWZpeENvbXBhcmF0b3I7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDb21wYXJhdG9yIGdldE1lc3NhZ2VJZENvbXBhcmF0b3IoKSB7Ci0JCXJldHVybiBfbWVzc2FnZUlkQ29tcGFyYXRvcjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENvbXBhcmF0b3IgZ2V0U3RyaW5nTGVuZ3RoQ29tcGFyYXRvcihpbnQgbGVuZ3RoKSB7Ci0JCVN0cmluZ0xlbmd0aENvbXBhcmF0b3IubGVuZ3RoID0gbGVuZ3RoOwotCQlyZXR1cm4gX3N0cmluZ0xlbmd0aENvbXBhcmF0b3I7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDb21wYXJhdG9yIGdldFZhbHVlQ29tcGFyYXRvcigpIHsKLQkJcmV0dXJuIF92YWx1ZUNvbXBhcmF0b3I7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgQ29tcGFyYXRvciBnZXRMaW5lTm9Db21wYXJhdG9yKCkgewotCQlyZXR1cm4gX2xpbmVOb0NvbXBhcmF0b3I7Ci0JfQotfQotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcGVydGllc1ZhbGlkYXRvci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvcGFyc2VyL1Jlc291cmNlSGFuZGxlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxpZGF0b3Ivb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL3BhcnNlci9SZXNvdXJjZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRkN2I1NS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcGVydGllc1ZhbGlkYXRvci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvcGFyc2VyL1Jlc291cmNlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUucGFyc2VyOwotLyoKLSAqIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNIAotICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMiwgMjAwMyAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAotICogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSAKLSAqIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLiAKLSAqCi0gKiBESVNDTEFJTUVSIE9GIFdBUlJBTlRJRVMuCi0gKiBUaGUgZm9sbG93aW5nIFtlbmNsb3NlZF0gY29kZSBpcyBzYW1wbGUgY29kZSBjcmVhdGVkIGJ5IElCTQotICogQ29ycG9yYXRpb24uIFRoaXMgc2FtcGxlIGNvZGUgaXMgbm90IHBhcnQgb2YgYW55IHN0YW5kYXJkIG9yIElCTQotICogcHJvZHVjdCBhbmQgaXMgcHJvdmlkZWQgdG8geW91IHNvbGVseSBmb3IgdGhlIHB1cnBvc2Ugb2YgYXNzaXN0aW5nCi0gKiB5b3UgaW4gdGhlIGRldmVsb3BtZW50IG9mIHlvdXIgYXBwbGljYXRpb25zLiAgVGhlIGNvZGUgaXMgcHJvdmlkZWQKLSAqICJBUyBJUyIuIElCTSBNQUtFUyBOTyBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCi0gKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIFJFR0FSRElORyBUSEUgRlVOQ1RJT04gT1IgUEVSRk9STUFOQ0UgT0YKLSAqIFRISVMgQ09ERS4gIFRISVMgQ09ERSBNQVkgQ09OVEFJTiBFUlJPUlMuICBJQk0gc2hhbGwgbm90IGJlIGxpYWJsZQotICogZm9yIGFueSBkYW1hZ2VzIGFyaXNpbmcgb3V0IG9mIHlvdXIgdXNlIG9mIHRoZSBzYW1wbGUgY29kZSwgZXZlbgotICogaWYgaXQgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotICogCi0gKi8KLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcmV0cmlldmVzIHRoZSBTdHJpbmdzIGZyb20gdGhlIC5wcm9wZXJ0aWVzIGZpbGUgYXBwcm9wcmlhdGUKLSAqIGZvciB0aGUgbWFjaGluZSdzIExvY2FsZS4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFJlc291cmNlSGFuZGxlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgX2J1bmRsZSA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBSZXNvdXJjZUhhbmRsZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgYnVuZGxlIHdoaWNoIGNvbnRhaW5zIHRoZSBtZXNzYWdlcwotCSAqIGluIHRoZSByZXNvdXJjZSBpZGVudGlmaWVkIGJ5IGJ1bmRsZU5hbWUuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZ2V0QnVuZGxlKFN0cmluZyBidW5kbGVOYW1lKSB7Ci0JCWlmIChfYnVuZGxlID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJX2J1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShidW5kbGVOYW1lKTsKLQkJCX0KLQkJCWNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZXhjKSB7Ci0JCQkJX2J1bmRsZSA9IG51bGw7Ci0JCQkJZXhjLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBfYnVuZGxlOwotCX0KLQotCS8qKgotCSAqIEdpdmVuIHRoZSBuYW1lIG9mIHRoZSBidW5kbGUgYW5kIHRoZSBtZXNzYWdlIGlkIChrZXkpIGludG8gdGhlCi0JICogYnVuZGxlLCByZXR1cm4gdGhlIG1lc3NhZ2UgdGV4dCBpZGVudGlmaWVkIGJ5IHRoZSBpZC4KLQkgKi8JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShTdHJpbmcgYnVuZGxlTmFtZSwgU3RyaW5nIGtleSkgewotCQl0cnkgewotCQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gZ2V0QnVuZGxlKGJ1bmRsZU5hbWUpOwotCQkJaWYgKGJ1bmRsZSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIGtleTsKLQkJCX0KLQotCQkJcmV0dXJuIGJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLQkJfQotCQljYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXhjKSB7Ci0JCQlleGMucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIGtleTsKLQl9Ci0JCi0JLyoqCi0JICogR2l2ZW4gdGhlIG5hbWUgb2YgdGhlIGJ1bmRsZSwgdGhlIG1lc3NhZ2UgaWQgKGtleSkgaW50byB0aGUKLQkgKiBidW5kbGUsIGFuZCBwYXJhbWV0ZXJzIHRvIGJlIHN1YnN0aXR1dGVkIGludG8gdGhlIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0J3MKLQkgKiBwYXR0ZXJucywgcmV0dXJuIHRoZSBtZXNzYWdlIHdpdGggdGhlIHBhcmFtZXRlcnMgc3Vic3RpdHV0ZWQgaW4uCi0JICovCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEV4dGVybmFsaXplZE1lc3NhZ2UoU3RyaW5nIGJ1bmRsZU5hbWUsIFN0cmluZyBrZXksIFN0cmluZ1tdIHBhcm1zKSB7Ci0JCVN0cmluZyByZXMgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJcmVzID0gamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldEV4dGVybmFsaXplZE1lc3NhZ2UoYnVuZGxlTmFtZSwga2V5KSwgcGFybXMpOwotCQl9Ci0JCWNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZXhjKSB7Ci0JCQlleGMucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGV4YykgewotCQkJZXhjLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiByZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxpZGF0b3IvcHJvcGVydGllc1ZhbGlkYXRvci5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxpZGF0b3IvcHJvcGVydGllc1ZhbGlkYXRvci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2E1YmRlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wcm9wZXJ0aWVzVmFsaWRhdG9yL3Byb3BlcnRpZXNWYWxpZGF0b3IucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLSMKLSMgTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0gCi0jIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDIsIDIwMDMgLSBBbGwgUmlnaHRzIFJlc2VydmVkLiAKLSMgVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSAKLSMgcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuIAotIwotIyAgRElTQ0xBSU1FUiBPRiBXQVJSQU5USUVTLgotIyAgVGhlIGZvbGxvd2luZyBbZW5jbG9zZWRdIGNvZGUgaXMgc2FtcGxlIGNvZGUgY3JlYXRlZCBieSBJQk0KLSMgIENvcnBvcmF0aW9uLiBUaGlzIHNhbXBsZSBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFueSBzdGFuZGFyZCBvciBJQk0KLSMgIHByb2R1Y3QgYW5kIGlzIHByb3ZpZGVkIHRvIHlvdSBzb2xlbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGFzc2lzdGluZwotIyAgeW91IGluIHRoZSBkZXZlbG9wbWVudCBvZiB5b3VyIGFwcGxpY2F0aW9ucy4gIFRoZSBjb2RlIGlzIHByb3ZpZGVkCi0jICAiQVMgSVMiLiBJQk0gTUFLRVMgTk8gV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUCi0jICBOT1QgTElNSVRFRCBUTyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwotIyAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBSRUdBUkRJTkcgVEhFIEZVTkNUSU9OIE9SIFBFUkZPUk1BTkNFIE9GCi0jICBUSElTIENPREUuICBUSElTIENPREUgTUFZIENPTlRBSU4gRVJST1JTLiAgSUJNIHNoYWxsIG5vdCBiZSBsaWFibGUKLSMgIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIG91dCBvZiB5b3VyIHVzZSBvZiB0aGUgc2FtcGxlIGNvZGUsIGV2ZW4KLSMgIGlmIGl0IGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLSMKLQotQUJDRDAwMDAgPSBBQkNEMDAwMEU6IE1hdGNoIHRoZSBicmFjZXMgaW4gdGhlIG1lc3NhZ2UuIFRoZXJlIGFyZSB7MH0gJ3snIGFuZCB7MX0gJ30nLiBNZXNzYWdlRm9ybWF0IHdpbGwgdGhyb3cgYSBOdWxsUG9pbnRlckV4Y2VwdGlvbiB3aGVuIHRoZXJlIGFyZSBtaXNtYXRjaGluZyBicmFjZXMuCi1BQkNEMDAxMEUgPSBBQkNEMDAxMEU6IENoYW5nZSBhcmd1bWVudCAoJ3snezB9J30nKSB0byBhbiBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgOSBpbmNsdXNpdmUgaW4gdGhlIG1lc3NhZ2UuIE1lc3NhZ2VGb3JtYXQgY2Fubm90IHByb2Nlc3MgYW4gaW50ZWdlciBwYXJhbWV0ZXIgdGhhdCBpcyBsZXNzIHRoYW4gMC4KLUFCQ0QwMDEwVyA9IEFCQ0QwMDEwVzogQ2hhbmdlIGFyZ3VtZW50ICgneyd7MH0nfScpIHRvIGFuIGludGVnZXIgYmV0d2VlbiAwIGFuZCA5IGluY2x1c2l2ZSBpbiB0aGUgbWVzc2FnZS4gTWVzc2FnZUZvcm1hdCBpZ25vcmVzIGFueSBwYXJhbWV0ZXJzIGxhcmdlciB0aGFuIDkuCi1BQkNEMDAyMCA9IEFCQ0QwMDIwSTogUmVtb3ZlIHJlZHVuZGFudCBwYXJhbWV0ZXIgJ3snezB9J30nIGZyb20gdGhlIG1lc3NhZ2UuIE1ha2UgbWVzc2FnZXMgc3VjY2luY3QuCi1BQkNEMDAzMCA9IEFCQ0QwMDMwSTogQ2hlY2sgdGhhdCBhcmd1bWVudCAneyd7MH0nfScgd2FzIG9taXR0ZWQgZnJvbSB0aGUgbWVzc2FnZSBkZWxpYmVyYXRlbHkuIElmIGl0IHdhcyBvbWl0dGVkIGFjY2lkZW50YWxseSwgYW5kIHRoZSBjb2RlIGRvZXMgbm90IHByb3ZpZGUgZW5vdWdoIHBhcmFtZXRlcnMsIE1lc3NhZ2VGb3JtYXQgd2lsbCB0aHJvdyBhIE51bGxQb2ludGVyRXhjZXB0aW9uLgotQUJDRDAwNDAgPSBBQkNEMDA0MEk6IFVzZSB0d28gYXBvc3Ryb3BoZXMgaW4gdGhlIG1lc3NhZ2UgYXQgY29sdW1uIHswfS4gTWVzc2FnZUZvcm1hdCByZW1vdmVzIHNpbmdsZSBhcG9zdHJvcGhlczsgZm9yIHRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgYW4gYXBvc3Ryb3BoZSwgdHdvIGFwb3N0cm9waGVzIG11c3QgZXhpc3QgaW4gdGhlIHN0cmluZy4gKEFuIGFwb3N0cm9waGUgaXMgYSByZXNlcnZlZCBjaGFyYWN0ZXIgb2YgTWVzc2FnZUZvcm1hdC4pCi1BQkNEMDA1MCA9IEFCQ0QwMDUwSTogVXNlIG9uZSBhcG9zdHJvcGhlIGluIHRoZSBtZXNzYWdlIGF0IGNvbHVtbiB7MH0uIE1lc3NhZ2VGb3JtYXQgcHJvY2Vzc2VzIG9ubHkgbWVzc2FnZXMgd2l0aCBwYXJhbWV0ZXJzOyB3aXRob3V0IE1lc3NhZ2VGb3JtYXQsIHRoZSBleHRyYSBhcG9zdHJvcGhlIHdpbGwgbm90IGJlIHJlbW92ZWQuCi0KLUFCQ0QwMDYwID0gQUJDRDAwNjBXOiBNYWtlIHswfSB1bmlxdWUuIFdoZW4gYW4gaWQgaXMgdXNlZCBtb3JlIHRoYW4gb25jZSBpbiBhIGZpbGUsIFJlc291cmNlQnVuZGxlIHdpbGwgdXNlIHRoZSB2YWx1ZSBvZiB0aGUgbGFzdCBtZXNzYWdlIGlkLgotQUJDRDAwNzAgPSBBQkNEMDA3MFc6IHswfSBtYXkgbmVlZCB0byBiZSB1bmlxdWUuIENvbnZlbnRpb25hbGx5LCBhIG1lc3NhZ2UgcHJlZml4IGFwcGxpZXMgdG8gb25seSBvbmUgZXJyb3IgY29uZGl0aW9uLgotCi1BQkNEMDA4MCA9IEFCQ0QwMDgwRTogRml4IHRoZSBzeW50YXggZXJyb3I7IGVhY2ggbGluZSBtdXN0IGZvcm0gTUVTU0FHRV9JRCA9IE1FU1NBR0UuCi1BQkNEMDA5MCA9IEFCQ0QwMDkwVzogQ2hlY2sgdGhlIHJlYWQgcGVybWlzc2lvbnMgb2YgZmlsZSB7MH0uIFRoZSBQcm9wZXJ0aWVzVmFsaWRhdG9yIGVpdGhlciBjYW5ub3QgcmVhZCBvciBjYW5ub3QgZmluZCB0aGUgZmlsZS4KLQotQUJDRDAxMTAgPSBBQkNEMDExMEk6IEFkZCBhIHRlcm1pbmF0aW5nIGFwb3N0cm9waGUgYXQgY29sdW1uIHswfS4gVGhlICd7JyBhbmQgJ30nIGNoYXJhY3RlcnMgbXVzdCBiZSBlbmNsb3NlZCBpbiBhcG9zdHJvcGhlcy4KLQotQUJDRDAxMjAgPSBBQkNEMDEyMEk6IFRlcm1pbmF0ZSBtZXNzYWdlIHByZWZpeCB7MH0gd2l0aCBhICcnOicnLiBUaGUgSUJNIHN0YW5kYXJkIHJlcXVpcmVzIHRoYXQgbWVzc2FnZSBwcmVmaXhlcyBlbmQgd2l0aCBhIGNvbG9uLgotQUJDRDAxMzAgPSBBQkNEMDEzMEk6IFJlbW92ZSB0aGUgd2hpdGVzcGFjZSBiZXR3ZWVuIHswfSBhbmQgdGhlICcnOicnLiBUaGUgSUJNIHN0YW5kYXJkIHJlcXVpcmVzIGFuIGFic2VuY2Ugb2Ygd2hpdGVzcGFjZSBiZXR3ZWVuIHRoZSBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBhbmQgdGhlIGNvbG9uLgotCi0jIE91dHNpZGUgV1NBRCwgYXBwZW5kIHRoZSBsaW5lIG51bWJlciBhbmQgZmlsZSBuYW1lIHRvIHRoZSBlbmQgb2YgdGhlIG1lc3NhZ2UuCi1MSU5FX0xPQyA9IExpbmUgezB9LCBmaWxlIHsxfS4KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Rlc3QvdGVzdC5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Rlc3QvdGVzdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGJjOTgyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS90ZXN0L3Rlc3QucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLSMKLSMgTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0gCi0jIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDIsIDIwMDMgLSBBbGwgUmlnaHRzIFJlc2VydmVkLiAKLSMgVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSAKLSMgcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuIAotIwotIyAgRElTQ0xBSU1FUiBPRiBXQVJSQU5USUVTLgotIyAgVGhlIGZvbGxvd2luZyBbZW5jbG9zZWRdIGNvZGUgaXMgc2FtcGxlIGNvZGUgY3JlYXRlZCBieSBJQk0KLSMgIENvcnBvcmF0aW9uLiBUaGlzIHNhbXBsZSBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFueSBzdGFuZGFyZCBvciBJQk0KLSMgIHByb2R1Y3QgYW5kIGlzIHByb3ZpZGVkIHRvIHlvdSBzb2xlbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGFzc2lzdGluZwotIyAgeW91IGluIHRoZSBkZXZlbG9wbWVudCBvZiB5b3VyIGFwcGxpY2F0aW9ucy4gIFRoZSBjb2RlIGlzIHByb3ZpZGVkCi0jICAiQVMgSVMiLiBJQk0gTUFLRVMgTk8gV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUCi0jICBOT1QgTElNSVRFRCBUTyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwotIyAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBSRUdBUkRJTkcgVEhFIEZVTkNUSU9OIE9SIFBFUkZPUk1BTkNFIE9GCi0jICBUSElTIENPREUuICBUSElTIENPREUgTUFZIENPTlRBSU4gRVJST1JTLiAgSUJNIHNoYWxsIG5vdCBiZSBsaWFibGUKLSMgIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIG91dCBvZiB5b3VyIHVzZSBvZiB0aGUgc2FtcGxlIGNvZGUsIGV2ZW4KLSMgIGlmIGl0IGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLSMKLQotIyBUaGlzIGZpbGUgaXMgdXNlZCB0byB0ZXN0IHRoZSBQcm9wZXJ0aWVzIFZhbGlkYXRvci4KLSMKLQotTUlTTUFUQ0hFRF9CUkFDRVMgPSBUaGlzIGxpbmUgaGFzICd7MH0nIG1pc21hdGNoaW5nIGJyYWNlcy4KLU1JU01BVENIRURfQlJBQ0VTXzIgPSBUaGlzIGxpbmUgaGFzIHsgYSBtaXNtYXRjaGluZyBicmFjZS4KLU1JU01BVENIRURfQlJBQ0VTXzMgPSBUaGlzIGxpbmUgaGFzIH0gYSBtaXNtYXRjaGluZyBicmFjZS4KLU1JU01BVENIRURfQlJBQ0VTX09LQVkgPSBUaGlzIGxpbmUgaGFzIG5vICd7JyBtaXNtYXRjaGluZyBicmFjZXMgJ30nLgotTUlTTUFUQ0hFRF9CUkFDRVNfT0tBWTIgPSBUaGlzIGxpbmUgYWxzbyBoYXMgbm8gbWlzbWF0Y2hpbmcgYnJhY2VzIHswfSAneycgJ30nLgotCi1UT09fTUFOWV9BUkdVTUVOVFMgPSBNZXNzYWdlRm9ybWF0IGZvcm1hdHMgb25seSAxMCBwYXJhbWV0ZXJzIHswfSB7MX0gezJ9IHszfSB7NH0gezV9IHs2fSB7N30gezh9IHs5fSB7MTB9LgotVE9PX01BTllfQVJHVU1FTlRTXzIgPSBNZXNzYWdlRm9ybWF0IGZvcm1hdHMgb25seSAxMCBwYXJhbWV0ZXJzIHsxMH0uCi0KLU5FR0FUSVZFX0FSR1VNRU5UID0gVGhpcyBsaW5lIHVzZXMgYSBuZWdhdGl2ZSB7LTF9IGFyZ3VtZW50LgotQiA9IG9rYXkKLVJFRFVOREFOVF9BUkdVTUVOVCA9IFRoaXMgbGluZSB1c2VzIGEgcmVkdW5kYW50IHswfSB7MH0gYXJndW1lbnQuCi1NSVNTRURfUEFSTSA9IFRoaXMgbGluZSB1c2VzIHswfSBhbmQgezJ9IGJ1dCBub3QgKDEpLgotTkVFRFNfRE9VQkxFX0FQT1MgPSBUaGlzIGxpbmUgdXNlcyBhIHNpbmdsZSBhcG9zdHJvcGhlICgnKSBidXQgc2hvdWxkIHVzZSB0d28gezB9LgotTkVFRFNfU0lOR0xFX0FQT1MgPSBUaGlzIGxpbmUgdXNlcyBhIGRvdWJsZSBhcG9zdHJvcGhlICgnJykgYnV0IHNob3VsZCB1c2Ugb25lLgotQSA9IG9rYXkKLVNZTQotRFVQTElDQVRFX0lEID0gVGhpcyBsaW5lIHVzZXMgYSBkdXBsaWNhdGUgbWVzc2FnZSBpZC4KLURVUExJQ0FURV9JRCA9IFRoaXMgbGluZSBhbHNvIHVzZXMgYSBkdXBsaWNhdGUgbWVzc2FnZSBpZC4KLURVUExJQ0FURV9QUkVGSVggPSBBQUFBMDAwMFc6IFRoaXMgbGluZSB1c2VzIGEgZHVwbGljYXRlIG1lc3NhZ2UgcHJlZml4LgotPSBqamoKLQotRFVQTElDQVRFX1BSRUZJWDIgPSBBQUFBMDAwMFc6IFRoaXMgbGluZSBhbHNvIHVzZXMgYSBkdXBsaWNhdGUgbWVzc2FnZSBwcmVmaXguCi1aX0RVUExJQ0FURSA9IGpqagotWl9EVVBMSUNBVEUgPSBtbW0KLQotIyBUaGlzIGlzIGEgY29tbWVudAotWl9EVVBMSUNBVEUgPSBubm4KLUMgPSBva2F5Ci1GID0gYSBcCi1iIFwKLWMKLUQgPSBva2F5Ci0KLUNBU0UxID0gQUJDRDAwMDBFOiBCbGFoIEJsYWggQmxhaAotQ0FTRTIgPSBBQkNEMDAwMEUgIEJsYWggQmxhaCBCbGFoCi1DQVNFMyA9IEFCQ0QwMDAwRSA6IEJsYWggQmxhaCBCbGFoCi1DQVNFNCA9IEFCQ0QwMDAwRSAgQmxhaDpCbGFoIEJsYWgKLUNBU0U1ID0gQUJDRDAwMDBFIDoKLUNBU0U2ID0gQmxhaCBCbGFoIEJsYWggKGkuZS4sIG5vIHByZWZpeCkKLUNBU0U3ID0gQUJDRDAwMDBFOiBCbGFoCi1DQVNFOCA9IEFCQ0QwMDAwRSAgQmxhaAotQ0FTRTkgPSBBQkNEMDAwMEUgOiBCbGFoCi1DQVNFMTAgPSBBQkNEMDAwMEUgQmxhaAotQ0FTRTExID0gQUJDRDAwMDBFCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvdGVzdC90ZXN0Mi5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Rlc3QvdGVzdDIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRjMGYzMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvdGVzdC90ZXN0Mi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIwotIyBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTSAKLSMgKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMiwgMjAwMyAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAotIyBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlIAotIyByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4gCi0jCi0jICBESVNDTEFJTUVSIE9GIFdBUlJBTlRJRVMuCi0jICBUaGUgZm9sbG93aW5nIFtlbmNsb3NlZF0gY29kZSBpcyBzYW1wbGUgY29kZSBjcmVhdGVkIGJ5IElCTQotIyAgQ29ycG9yYXRpb24uIFRoaXMgc2FtcGxlIGNvZGUgaXMgbm90IHBhcnQgb2YgYW55IHN0YW5kYXJkIG9yIElCTQotIyAgcHJvZHVjdCBhbmQgaXMgcHJvdmlkZWQgdG8geW91IHNvbGVseSBmb3IgdGhlIHB1cnBvc2Ugb2YgYXNzaXN0aW5nCi0jICB5b3UgaW4gdGhlIGRldmVsb3BtZW50IG9mIHlvdXIgYXBwbGljYXRpb25zLiAgVGhlIGNvZGUgaXMgcHJvdmlkZWQKLSMgICJBUyBJUyIuIElCTSBNQUtFUyBOTyBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQKLSMgIE5PVCBMSU1JVEVEIFRPIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCi0jICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIFJFR0FSRElORyBUSEUgRlVOQ1RJT04gT1IgUEVSRk9STUFOQ0UgT0YKLSMgIFRISVMgQ09ERS4gIFRISVMgQ09ERSBNQVkgQ09OVEFJTiBFUlJPUlMuICBJQk0gc2hhbGwgbm90IGJlIGxpYWJsZQotIyAgZm9yIGFueSBkYW1hZ2VzIGFyaXNpbmcgb3V0IG9mIHlvdXIgdXNlIG9mIHRoZSBzYW1wbGUgY29kZSwgZXZlbgotIyAgaWYgaXQgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotIwotCi0jCi0jIFRoaXMgZmlsZSBpcyB1c2VkIHRvIHRlc3QgdGhlIFByb3BlcnRpZXMgVmFsaWRhdG9yLgotIwotCi1JRDEgPSBUaGlzIGZpbGUgaGFzIG5vIGVycm9ycyBpbiBpdC4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvdHZ0cGx1Z2luLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS90dnRwbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTI1MGEzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS90dnRwbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwbHVnaW4KLSAgIGlkPSJjb20uaWJtLmV0b29scy52YWxpZGF0aW9uLnByb3AiCi0gICBuYW1lPSJQcm9wZXJ0aWVzIFZhbGlkYXRvciIKLSAgIHZlcnNpb249IjUuMS4wIgotICAgY2xhc3M9ImNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24ucHJvcGVydGllcy53b3JrYmVuY2hpbXBsLlByb3BlcnRpZXNWYWxpZGF0b3JQbHVnaW4iPgotCi0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPCEtLSBXaGVuIHRlc3RpbmcgVFZUIGluIEVKQkRlcGxveSwgYmVjYXVzZSBvcmcuZWNsaXBzZS5oZWxwIGlzbid0ICAgLS0+Ci0JPCEtLSBwYWNrYWdlZCB3aXRoIEVKQkRlcGxveSwgdGhpcyBwbHVnaW4gaXMgZGVhY3RpdmF0ZWQuIEhvd2V2ZXIsICAgLS0+Ci0JPCEtLSBiZWNhdXNlIHRoZSBUVlQgcGx1Z2luIGRvZXNuJ3Qgc2hpcCB0aGUgZG9jdW1lbnRhdGlvbiwgYWxsICAgICAgLS0+Ci0JPCEtLSByZWZlcmVuY2VzIHRvIHRoZSBoZWxwIGNhbiBiZSByZW1vdmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JCi0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9InJ1bnRpbWUvcHJvcGVydGllc1ZhbGlkYXRvci5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJydW50aW1lL3Byb3BlcnRpZXNWYWxGUy5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJydW50aW1lL3Byb3BlcnRpZXNWYWxXQi5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJydW50aW1lL2ZpbGVzeXN0ZW1GV0suamFyIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgPC9saWJyYXJ5PgotICAgPC9ydW50aW1lPgotICAgCi0gICAgPHJlcXVpcmVzPgotICAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiIHZlcnNpb249IjIuMSIgbWF0Y2g9ImVxdWl2YWxlbnQiLz4KLSAgICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiIHZlcnNpb249IjIuMSIgbWF0Y2g9ImVxdWl2YWxlbnQiLz4KLSAgICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamR0LmNvcmUiIHZlcnNpb249IjIuMSIgbWF0Y2g9ImVxdWl2YWxlbnQiLz4KLSAgICAgICA8aW1wb3J0IHBsdWdpbj0iY29tLmlibS5ldG9vbHMudmFsaWRhdGlvbiIgZXhwb3J0PSJ0cnVlIiB2ZXJzaW9uPSI1LjEiIG1hdGNoPSJlcXVpdmFsZW50Ii8+Ci0gICAgICAgPGltcG9ydCBwbHVnaW49ImNvbS5pYm0uZXRvb2xzLmxvZ2dpbmcudXRpbCIgdmVyc2lvbj0iNS4xIiBtYXRjaD0iZXF1aXZhbGVudCIvPgotICAgIDwvcmVxdWlyZXM+Ci0KLSAgICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0gICAgPCEtLSBQcm9wZXJ0aWVzIFZhbGlkYXRvciBDb250cmlidXRpb25zICAgIC0tPgotICAgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLSAgICA8ZXh0ZW5zaW9uCi0gICAgICAgaWQ9IlByb3BlcnRpZXNWYWxpZGF0b3IiCi0gICAgICAgbmFtZT0iUHJvcGVydGllcyBWYWxpZGF0b3IiCi0gICAgICAgcG9pbnQ9ImNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24udmFsaWRhdG9yIj4KLSAgICAgICA8dmFsaWRhdG9yPgotICAgICAgICAgICA8cHJvamVjdE5hdHVyZSBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZSIvPgotICAgICAgICAgICA8ZmlsdGVyIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIgbmFtZUZpbHRlcj0iKi5wcm9wZXJ0aWVzIiBhY3Rpb249ImFkZCwgY2hhbmdlIi8+Ci0gICAgICAgICAgIDxydW4gY2xhc3M9ImNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24ucHJvcGVydGllcy5Qcm9wZXJ0aWVzVmFsaWRhdG9yIiBlbmFibGVkPSJmYWxzZSIgYXN5bmM9InRydWUiLz4KLSAgICAgICAgICAgPGhlbHBlciBjbGFzcz0iY29tLmlibS5ldG9vbHMudmFsaWRhdGlvbi5wcm9wZXJ0aWVzLndvcmtiZW5jaGltcGwuUHJvcGVydGllc0hlbHBlciIvPgotICAgICAgIDwvdmFsaWRhdG9yPgotICAgIDwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0Ly5jbGFzc3BhdGggYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0Ly5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwYzc1YTUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJqVW5pdFdyYXBwZXIvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0idGVzdC8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJ0ZXN0RndrLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0Ly5jdnNpZ25vcmUgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0Ly5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ODRjNWQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotdGVtcC5mb2xkZXIKLXZhbGlkYXRpb250ZXN0LmphcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC8ucHJvamVjdCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjYTVjNDAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Q8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk4Njc4Yi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLSNTdW4gRmViIDEyIDAyOjQ4OjU0IEVTVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2Fib3V0Lmh0bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYzU5ODkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+TWF5IDIsIDIwMDY8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC9idWlsZC5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWZmODY5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLXNvdXJjZS52YWxpZGF0aW9udGVzdC5qYXIgPSBqVW5pdFdyYXBwZXIvLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0LyxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdEZ3ay8KLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgdGVzdElucHV0LyxcCi0gICAgICAgICAgICAgICB0ZXN0LnhtbCxcCi0gICAgICAgICAgICAgICB2YWxpZGF0aW9udGVzdC5qYXIsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotb3V0cHV0LnZhbGlkYXRpb250ZXN0LmphciA9IGJpbi8KLWphcnMuY29tcGlsZS5vcmRlciA9IHZhbGlkYXRpb250ZXN0LmphcgotICAgICAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2J1aWxkL2J1aWxkY29udHJvbC5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC9idWlsZC9idWlsZGNvbnRyb2wucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQxNDdkZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2J1aWxkL2J1aWxkY29udHJvbC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1DT05UQUNUPXJ1dGhkYWx5QGNhLmlibS5jb20KLUNvbXBvbmVudFNob3J0TmFtZT1WYWxUZXN0Ci1Db21wb25lbnRGdWxsTmFtZT1WYWxpZGF0aW9uIEJWVCBQbHVnaW4KLUNvbXBvbmVudENvbXBldGVuY3k9QlZUCi1KYXZhQ29tcGlsZS4xPXNyY2phcgotQnVpbGRWZXJpZmljYXRpb24uMT1kaXIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2J1aWxkL3BhY2thZ2UueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC9idWlsZC9wYWNrYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU5MGQ4Yi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2J1aWxkL3BhY2thZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPHByb2plY3QgbmFtZT0iY29tLmlibS5ldG9vbHMudmFsaWRhdGlvbi50ZXN0IiBkZWZhdWx0PSJwYWNrYWdpbmdQbHVnaW4iIGJhc2VkaXI9Ii4vLi4iPgotICAgIDx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwYWNrYWdlRGlyIiB2YWx1ZT0iIi8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4uZGlyZWN0b3J5IiAgdmFsdWU9IiR7YmFzZWRpcn0iLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi5pZCIgdmFsdWU9ImNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24udGVzdCIvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLnZlcnNpb24iICB2YWx1ZT0iIi8+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPHRhcmdldCBuYW1lPSJwYWNrYWdpbmdQbHVnaW4iIGRlcGVuZHM9ImluaXQiPgotICAgICAgICA8ZWNobyBtZXNzYWdlPSIke3BsdWdpbi5pZH0iLz4KLSAgICAgICAgPGNvcHkgdG9kaXI9IiR7cGFja2FnZURpcn0vcGx1Z2lucy8ke3BsdWdpbi5pZH1fJHtwbHVnaW4udmVyc2lvbn0iPgotICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3BsdWdpbi5kaXJlY3Rvcnl9Ij4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJwbHVnaW4ueG1sIi8+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0idGVzdHZhbGlkYXRpb24uYmF0Ii8+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0idGVzdHZhbGlkYXRpb24uc2giLz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJydW50aW1lL3Rlc3QuamFyIi8+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0icnVudGltZS9qVW5pdFdyYXBwZXIuamFyIi8+Ci0gICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDwvY29weT4KLSAgICA8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvYnVpbGQvc291cmNlamFyLnR4dCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvYnVpbGQvc291cmNlamFyLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjliZDQ3My4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2J1aWxkL3NvdXJjZWphci50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXRlc3QKLWpVbml0V3JhcHBlcgotCi0KLQotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2J1aWxkL3dzQnVpbGQueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC9idWlsZC93c0J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGVkYjk1YS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2J1aWxkL3dzQnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IURPQ1RZUEUgcHJvamVjdCBbCi0JPCFFTlRJVFkgYmFzZUJ1aWxkIFNZU1RFTSAiZmlsZTouLi8uLi93c0J1aWxkRGVmLnhtbCI+Ci1dPgotCi08cHJvamVjdCBuYW1lPSJidWlsZFBsdWdpbiIgZGVmYXVsdD0iYnVpbGQiIGJhc2VkaXI9Ii4vLi4iPgotCi08IS0tIGluY2x1ZGUgdGhlIGNvbW1vbiB4bWwgYnVpbGQgZmlsZSAtLT4KLSZiYXNlQnVpbGQ7Ci0KLTwhLS0gY3VzdG9taXplIHRoZSBqYXIgY3JlYXRpb24gaGVyZSBmb3IgbXVsdGktamFyIGJ1aWxkcyAtLT4KLTx0YXJnZXQgbmFtZT0iYnVpbGQiIGRlcGVuZHM9InByZXBhcmUiIGlmPSJwbHVnaW4uaWQiPgotICAgIDxhbnRjYWxsIHRhcmdldD0iYnVpbGRqYXIiPgotICAgICAgICA8cGFyYW0gbmFtZT0iamFybmFtZSIgdmFsdWU9InRlc3QiLz4KLSAgICAgICAgPHBhcmFtIG5hbWU9ImphcmNsYXNzcGF0aCIgdmFsdWU9IiR7cGx1Z2luLmNsYXNzcGF0aH0iLz4KLSAgICA8L2FudGNhbGw+Ci0KLSAgICA8YW50Y2FsbCB0YXJnZXQ9ImJ1aWxkamFyIj4KLSAgICAgICAgPHBhcmFtIG5hbWU9Imphcm5hbWUiIHZhbHVlPSJqVW5pdFdyYXBwZXIiLz4KLSAgICAgICAgPHBhcmFtIG5hbWU9ImphcmNsYXNzcGF0aCIgdmFsdWU9IiR7cGx1Z2luLmNsYXNzcGF0aH07JHtwbHVnaW4uZGlyZWN0b3J5fS8ke3BsdWdpbi5saWJyYXJ5LmRpcmVjdG9yeX0vdGVzdC5qYXIiLz4KLSAgICA8L2FudGNhbGw+Ci0KLTwvdGFyZ2V0PgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2pVbml0V3JhcHBlci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2p1bml0L0F1dG9tYXRlZFZhbGlkYXRpb25CVlQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvalVuaXRXcmFwcGVyL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvanVuaXQvQXV0b21hdGVkVmFsaWRhdGlvbkJWVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2JjMzUwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvalVuaXRXcmFwcGVyL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvanVuaXQvQXV0b21hdGVkVmFsaWRhdGlvbkJWVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gRmViIDksIDIwMDUKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuanVuaXQ7Ci0KLS8qKgotICogQGF1dGhvciBqaWFsaW4KLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbHVnaW5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5hcGkudGVzdC5BcGlUZXN0c1N1aXRlOwotCi0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byAKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQXV0b21hdGVkVmFsaWRhdGlvbkJWVCBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBiYXNlRGlyZWN0b3J5ID0gbnVsbDsKLSAgICAKLSAgICBzdGF0aWMgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgSVBsdWdpbkRlc2NyaXB0b3IgcGx1Z2luRGVzY3JpcHRvciA9IFBsYXRmb3JtLmdldFBsdWdpblJlZ2lzdHJ5KCkuZ2V0UGx1Z2luRGVzY3JpcHRvcigib3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdCIpOwotICAgICAgICAgICAgVVJMIHVybCA9IHBsdWdpbkRlc2NyaXB0b3IuZ2V0SW5zdGFsbFVSTCgpOyAKLSAgICAgICAgCUF1dG9tYXRlZFZhbGlkYXRpb25CVlQuYmFzZURpcmVjdG9yeSA9IFBsYXRmb3JtLmFzTG9jYWxVUkwodXJsKS5nZXRGaWxlKCkgKyAidmFsaWRhdGlvblJlc291cmNlcyIgKyBGaWxlLnNlcGFyYXRvckNoYXI7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7IAotCQkJU3lzdGVtLmVyci5wcmludGxuKCJVc2luZyB3b3JraW5nIGRpcmVjdG9yeSBzaW5jZSBhIHdvcmtzcGFjZSBVUkwgY291bGQgbm90IGJlIGxvY2F0ZWQuIik7Ci0JCX0gCi0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBpbnQgdW5pbXBsZW1lbnRlZE1ldGhvZHM7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIHVuaW1wbGVtZW50ZWRNZXRob2RzID0gMDsKLSAgICAgICAgVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci0gICAgICAgIGlmICh1bmltcGxlbWVudGVkTWV0aG9kcyA+IDApIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5DYWxscyB0byB3YXJuVW5pbXBsOiAiICsgdW5pbXBsZW1lbnRlZE1ldGhvZHMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIEF1dG9tYXRlZFZhbGlkYXRpb25CVlQoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IChUZXN0U3VpdGUpIEF1dG9tYXRlZFZhbGlkYXRpb25CVlQuc3VpdGUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdWl0ZS50ZXN0Q291bnQoKTsgaSsrKSB7Ci0gICAgICAgICAgICBhZGRUZXN0KHN1aXRlLnRlc3RBdChpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoIlRlc3QgZm9yIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QiKTsKLSAgICAgICAgLy9zdWl0ZS5hZGRUZXN0KEJWVFN1aXRlLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEFwaVRlc3RzU3VpdGUuc3VpdGUoKSk7Ci0gICAgICAgIHJldHVybiBzdWl0ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2pVbml0V3JhcHBlci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2p1bml0L0JWVFN1aXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2pVbml0V3JhcHBlci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2p1bml0L0JWVFN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMGM5MGEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC9qVW5pdFdyYXBwZXIvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9qdW5pdC9CVlRTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0Lmp1bml0OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5CVlRWYWxpZGF0aW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwucmVnaXN0cnkuT3BlcmF0aW9uVGVzdGNhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC5yZWdpc3RyeS5WYWxpZGF0b3JUZXN0Y2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnV0aWwuQlZUVmFsaWRhdGlvblV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdG9yTWV0YURhdGE7Ci0KLS8qKgotICogV3JhcHMgdGhlIGV4aXN0aW5nIHZhbGlkYXRpb24gYnZ0IGNvZGUgaW4gYSBKVW5pdCBhcnRpZmFjdAotICogc28gdGhhdCB0aGUgdGVzdHMgY2FuIGJlIHJ1biB3aXRoaW4gSlVuaXQuIEluc3RhbmNlcyBvZiB0aGlzCi0gKiBjbGFzcyB3cmFwIGFsbCBvZiB0aGUgVmFsaWRhdG9yU3VpdGUgaW5zdGFuY2VzIHRoYXQgbXVzdCBiZSBydW4uCi0gKi8KLXB1YmxpYyBjbGFzcyBCVlRTdWl0ZSBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0JcHJpdmF0ZSBNYXAgX3ZhbGlkYXRvclN1aXRlcyA9IG51bGw7Ci0JCi0JcHVibGljIEJWVFN1aXRlKCkgewotCQlfdmFsaWRhdG9yU3VpdGVzID0gbmV3IEhhc2hNYXAoKTsKLQkJbG9hZFZhbGlkYXRvclN1aXRlcygpOwotCQlsb2FkT3BlcmF0aW9uU3VpdGVzKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBsb2FkVmFsaWRhdG9yU3VpdGVzKCkgewotCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQkKLQkJVmFsaWRhdG9yVGVzdGNhc2VbXSB0bWRzID0gQlZUVmFsaWRhdGlvblV0aWxpdHkuZ2V0VmFsaWRhdG9yVGVzdHMobW9uaXRvcik7Ci0JCWZvcihpbnQgaT0wOyBpPHRtZHMubGVuZ3RoOyBpKyspIHsKLQkJCVZhbGlkYXRvclRlc3RjYXNlIHRtZCA9IHRtZHNbaV07Ci0KLQkJCWlmKHRtZC5pc1Zpc2libGUoKSkgewotCQkJCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IHRtZC5nZXRWYWxpZGF0b3JNZXRhRGF0YSgpOwotCQkJCVZhbGlkYXRvclN1aXRlIHZzID0gKFZhbGlkYXRvclN1aXRlKV92YWxpZGF0b3JTdWl0ZXMuZ2V0KHZtZCk7Ci0JCQkJaWYodnMgPT0gbnVsbCkgewotCQkJCQl2cyA9IG5ldyBWYWxpZGF0b3JTdWl0ZSh2bWQpOwotCQkJCX0KLQkJCQlWYWxpZGF0b3JUZXN0IHZ0ID0gbmV3IFZhbGlkYXRvclRlc3QodG1kLCB2cyk7Ci0JCQkJdnMuYWRkVGVzdCh2dCk7Ci0JCQkJX3ZhbGlkYXRvclN1aXRlcy5wdXQodm1kLCB2cyk7Ci0JCQl9Ci0JCX0KLQkJCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gX3ZhbGlkYXRvclN1aXRlcy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVZhbGlkYXRvclN1aXRlIHZzID0gKFZhbGlkYXRvclN1aXRlKWl0ZXJhdG9yLm5leHQoKTsKLQkJCWFkZFRlc3QodnMpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBsb2FkT3BlcmF0aW9uU3VpdGVzKCkgewotCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQkKLQkJT3BlcmF0aW9uVGVzdGNhc2VbXSB0bWRzID0gQlZUVmFsaWRhdGlvblV0aWxpdHkuZ2V0T3BlcmF0aW9uVGVzdHMobW9uaXRvcik7Ci0JCU9wZXJhdGlvblN1aXRlIG9zID0gbmV3IE9wZXJhdGlvblN1aXRlKCk7Ci0JCWZvcihpbnQgaT0wOyBpPHRtZHMubGVuZ3RoOyBpKyspIHsKLQkJCU9wZXJhdGlvblRlc3RjYXNlIHRtZCA9IHRtZHNbaV07Ci0KLQkJCWlmKHRtZC5pc1Zpc2libGUoKSkgewotCQkJCU9wZXJhdGlvblRlc3Qgb3QgPSBuZXcgT3BlcmF0aW9uVGVzdCh0bWQsIG9zKTsKLQkJCQlvcy5hZGRUZXN0KG90KTsKLQkJCX0KLQkJfQotCQkKLQkJYWRkVGVzdChvcyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQkvLyBUdXJuIGxvZ2dpbmcgdG8gU0VWRVJFCi0JCUJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCkuc2V0TGV2ZWwoTGV2ZWwuU0VWRVJFKTsKLQkJcmV0dXJuIG5ldyBCVlRTdWl0ZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiVmFsaWRhdGlvbiBCVlQgU3VpdGUiOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC9qVW5pdFdyYXBwZXIvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9qdW5pdC9CdWlsZEluZm8uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvalVuaXRXcmFwcGVyL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvanVuaXQvQnVpbGRJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZjA2ZDEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC9qVW5pdFdyYXBwZXIvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9qdW5pdC9CdWlsZEluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0Lmp1bml0OwotcHVibGljIGNsYXNzIEJ1aWxkSW5mbyB7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICJMaWNlbnNlZCBNYXRlcmlhbHMgLS0gUHJvcGVydHkgb2YgSUJNXG4oYykgQ29weXJpZ2h0IEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24sIDIwMDEsMjAwM1xuVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBmZ0J1aWxkTGV2ZWwgPSAiMjAwMzExMTJfMTkxNS1XQjIxMi1BRC1WNTExRC1XNSI7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGxldmVsKCkgeyByZXR1cm4gZmdCdWlsZExldmVsOyB9Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFdTQUJ1aWxkTGV2ZWwoKSB7IHJldHVybiBmZ0J1aWxkTGV2ZWw7IH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvalVuaXRXcmFwcGVyL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvanVuaXQvSlVuaXRCdWZmZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvalVuaXRXcmFwcGVyL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvanVuaXQvSlVuaXRCdWZmZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU5ZmU2MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2pVbml0V3JhcHBlci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2p1bml0L0pVbml0QnVmZmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gQXByIDE2LCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0Lmp1bml0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuQlZUVmFsaWRhdGlvblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LkJ1ZmZlcmVkVGFza1N0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklCdWZmZXI7Ci0KLQotLyoqCi0gKiBXaGVuIHRoZSB0ZXN0cyBhcmUgcnVuIGFzIHBhcnQgb2YgSlVuaXQsIHJlZGlyZWN0IHRoZSBvdXRwdXQKLSAqIHRvIHRoZSBKVW5pdCB0ZXN0IGNhc2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBKVW5pdEJ1ZmZlciBpbXBsZW1lbnRzIElCdWZmZXIgewotCXByaXZhdGUgU3RyaW5nIF9sb2dGaWxlTmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBCdWZmZXJlZFRhc2tTdGF0dXMgX3N0YXR1cyA9IG51bGw7Ci0JCi0JSlVuaXRCdWZmZXIoU3RyaW5nIGxvZ0ZpbGVOYW1lKSB7Ci0JCV9zdGF0dXMgPSBuZXcgQnVmZmVyZWRUYXNrU3RhdHVzKGdldExvZ0ZpbGVOYW1lKGxvZ0ZpbGVOYW1lKSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFByb2dyZXNzTW9uaXRvcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJX3N0YXR1cy5zZXRQcm9ncmVzc01vbml0b3IobW9uaXRvcik7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldExvZ0ZpbGVOYW1lKFN0cmluZyBsb2dGaWxlTmFtZSkgewotCQlpZihfbG9nRmlsZU5hbWUgPT0gbnVsbCkgewotCQkJbG9nRmlsZU5hbWUgPSBsb2dGaWxlTmFtZS5yZXBsYWNlKCcgJywgJ18nKTsKLQkJCUlQYXRoIHN0YXRlTG9jYXRpb24gPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldFN0YXRlTG9jYXRpb24oKTsKLQkJCUZpbGUgbG9nID0gbmV3IEZpbGUoc3RhdGVMb2NhdGlvbi50b09TU3RyaW5nKCksIGxvZ0ZpbGVOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJX2xvZ0ZpbGVOYW1lID0gbG9nLmdldEFic29sdXRlUGF0aCgpOwotCQl9Ci0JCXJldHVybiBfbG9nRmlsZU5hbWU7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TG9nRmlsZU5hbWUoKSB7Ci0JCXJldHVybiBfc3RhdHVzLmdldExvZ0ZpbGVOYW1lKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSVRlc3RTdGF0dXMjY2xlYXIoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQlfc3RhdHVzLmNsZWFyKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSUJ1ZmZlciNkZWxpbmVhdGUoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxpbmVhdGUoU3RyaW5nIHRhc2tOYW1lKSB7Ci0JCV9zdGF0dXMuZGVsaW5lYXRlKHRhc2tOYW1lKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklCdWZmZXIjZ2V0UHJvZ3Jlc3NNb25pdG9yKCkKLQkgKi8KLQlwdWJsaWMgSVByb2dyZXNzTW9uaXRvciBnZXRQcm9ncmVzc01vbml0b3IoKSB7Ci0JCXJldHVybiBfc3RhdHVzLmdldFByb2dyZXNzTW9uaXRvcigpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSUJ1ZmZlciNyZXBvcnQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlcG9ydCgpIHsKLQkJX3N0YXR1cy5yZXBvcnQoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JQnVmZmVyI3dyaXRlKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgd3JpdGUoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJX3N0YXR1cy53cml0ZShtZXNzYWdlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklUZXN0U3RhdHVzI2FkZEVsYXBzZWRUaW1lKGphdmEubGFuZy5TdHJpbmcsIGxvbmcpCi0JICovCi0JcHVibGljIHZvaWQgYWRkRWxhcHNlZFRpbWUoU3RyaW5nIHRhc2tOYW1lLCBsb25nIGVsYXBzZWRUaW1lKSB7Ci0JCV9zdGF0dXMuYWRkRWxhcHNlZFRpbWUodGFza05hbWUsIGVsYXBzZWRUaW1lKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklUZXN0U3RhdHVzI2FkZEV4ZWN1dGlvblN0YXR1cyhqYXZhLmxhbmcuU3RyaW5nLCBpbnQsIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSUJ1ZmZlciwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRFeGVjdXRpb25TdGF0dXMoU3RyaW5nIHRlc3RjYXNlTmFtZSwgU3RyaW5nIHN1YlRhc2tOYW1lLCBpbnQgcGFzc09yRmFpbCwgSUJ1ZmZlciBidWZmZXIsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCV9zdGF0dXMuYWRkRXhlY3V0aW9uU3RhdHVzKHRlc3RjYXNlTmFtZSwgc3ViVGFza05hbWUsIHBhc3NPckZhaWwsIGJ1ZmZlciwgbWVzc2FnZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JVGVzdFN0YXR1cyNhZGRHbG9iYWxFeGVjdXRpb25TdGF0dXMoamF2YS5sYW5nLlN0cmluZywgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEV4ZWN1dGlvblN0YXR1cyhTdHJpbmcgdGVzdFBhc3NOYW1lLCBib29sZWFuIHBhc3MpIHsKLQkJX3N0YXR1cy5hZGRFeGVjdXRpb25TdGF0dXModGVzdFBhc3NOYW1lLCBwYXNzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRFeGVjdXRpb25TdGF0dXMoU3RyaW5nIHRlc3RQYXNzTmFtZSwgU3RyaW5nIHN1YlRhc2tOYW1lLCBib29sZWFuIHBhc3MpIHsKLQkJX3N0YXR1cy5hZGRFeGVjdXRpb25TdGF0dXModGVzdFBhc3NOYW1lLCBzdWJUYXNrTmFtZSwgcGFzcyk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JVGVzdFN0YXR1cyNpc1N1Y2Nlc3NmdWwoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3VjY2Vzc2Z1bCgpIHsKLQkJcmV0dXJuIF9zdGF0dXMuaXNTdWNjZXNzZnVsKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JVGVzdFN0YXR1cyNpc1N1Y2Nlc3NmdWwoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3VjY2Vzc2Z1bChTdHJpbmcgdGVzdE5hbWUpIHsKLQkJcmV0dXJuIF9zdGF0dXMuaXNTdWNjZXNzZnVsKHRlc3ROYW1lKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvalVuaXRXcmFwcGVyL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvanVuaXQvT3BlcmF0aW9uU3VpdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvalVuaXRXcmFwcGVyL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvanVuaXQvT3BlcmF0aW9uU3VpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZmN2QwYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2pVbml0V3JhcHBlci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2p1bml0L09wZXJhdGlvblN1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFJlc3VsdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIHdyYXAgYWxsIG9mIHRoZSBvcGVyYXRpb25zLCBpbiBwbHVnaW4ueG1sLAotICogZm9yIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay4KLSAqLwotcHVibGljIGNsYXNzIE9wZXJhdGlvblN1aXRlIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQlwcml2YXRlIEpVbml0QnVmZmVyIF9idWZmZXIgPSBudWxsOwotCi0JcHVibGljIE9wZXJhdGlvblN1aXRlKCkgewotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIlZhbGlkYXRpb24gRnJhbWV3b3JrIFRlc3RzIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBKVW5pdEJ1ZmZlciBnZXRCdWZmZXIoKSB7Ci0JCWlmKF9idWZmZXIgPT0gbnVsbCkgewotCQkJX2J1ZmZlciA9IG5ldyBKVW5pdEJ1ZmZlcih0b1N0cmluZygpICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyAiLmxvZyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlyZXR1cm4gX2J1ZmZlcjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdCNydW4oanVuaXQuZnJhbWV3b3JrLlRlc3RSZXN1bHQpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKFRlc3RSZXN1bHQgcmVzdWx0KSB7Ci0JCXN1cGVyLnJ1bihyZXN1bHQpOwotCQlnZXRCdWZmZXIoKS5yZXBvcnQoKTsgLy8gcmVwb3J0IG9ubHkgYWZ0ZXIgYWxsIG9mIHRoZSB0ZXN0cyBpbiB0aGlzIHN1aXRlIGhhdmUgZmluaXNoZWQKLQkJZ2V0QnVmZmVyKCkuY2xlYXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2pVbml0V3JhcHBlci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2p1bml0L09wZXJhdGlvblRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvalVuaXRXcmFwcGVyL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvanVuaXQvT3BlcmF0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzBiNzZiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvalVuaXRXcmFwcGVyL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvanVuaXQvT3BlcmF0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0Lmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC5yZWdpc3RyeS5PcGVyYXRpb25UZXN0Y2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnJlZ2lzdHJ5LlRlc3RjYXNlVXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnV0aWwuQlZUUnVubmVyOwotCi0KLS8qKgotICogSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgcnVuIGFuIElXb3Jrc3BhY2VSdW5uYWJsZSB0aGF0IHRlc3RzIHRoZQotICogdmFsaWRhdGlvbiBmcmFtZXdvcmsuCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVyYXRpb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgT3BlcmF0aW9uU3VpdGUgX3N1aXRlID0gbnVsbDsKLQlwcml2YXRlIE9wZXJhdGlvblRlc3RjYXNlIF90bWQgPSBudWxsOwotCi0JcHVibGljIE9wZXJhdGlvblRlc3QoT3BlcmF0aW9uVGVzdGNhc2UgdG1kLCBPcGVyYXRpb25TdWl0ZSBzdWl0ZSkgewotCQlzdXBlcih0bWQuZ2V0TmFtZSgpKTsgLy8gdGhlIG1ldGhvZCBuYW1lZCAidGVzdCIgcnVucyB0aGUgdGVzdC4KLQkJX3RtZCA9IHRtZDsKLQkJX3N1aXRlID0gc3VpdGU7Ci0JfQotCQotCXB1YmxpYyBKVW5pdEJ1ZmZlciBnZXRCdWZmZXIoKSB7Ci0JCXJldHVybiBfc3VpdGUuZ2V0QnVmZmVyKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBfdG1kLmdldE5hbWUoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3J1blRlc3QoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdHJ5IHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBUZXN0Y2FzZVV0aWxpdHkuZmluZFByb2plY3QoX3RtZCk7Ci0JCQlpZigocHJvamVjdCA9PSBudWxsKSB8fCAhcHJvamVjdC5leGlzdHMoKSkgewotCQkJCS8vIEZpbGUgbmVlZHMgdG8gYmUgaW1wb3J0ZWQgKGkuZS4sIHNldCB1cCB0aGUgdGVzdCkuCi0JCQkJaWYoIUJWVFJ1bm5lci5zaW5nbGV0b24oKS5zZXR1cFRlc3RzKGdldEJ1ZmZlcigpLCBfdG1kLCBmYWxzZSkpIHsKLQkJCQkJZmFpbCgiQ291bGQgbm90IGltcG9ydCBpbnB1dCBmcm9tIGRpcmVjdG9yeSAiICsgVGVzdGNhc2VVdGlsaXR5LmdldElucHV0RGlyKF90bWQpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCQotCQkJaWYoIXByb2plY3QuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQlmYWlsKCJQcm9qZWN0ICIgKyBwcm9qZWN0LmdldE5hbWUoKSArICIgaXMgbm90IGFjY2Vzc2libGUuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJCi0JCQlfdG1kLnJ1bihnZXRCdWZmZXIoKSwgcHJvamVjdCk7Ci0JCQlpZighZ2V0QnVmZmVyKCkuaXNTdWNjZXNzZnVsKF90bWQuZ2V0TmFtZSgpKSkgewotCQkJCWZhaWwoX3RtZC5nZXROYW1lKCkgKyAiIGZhaWxlZC4gUmVhZCB0aGUgbG9nIGZvciBkZXRhaWxzLiAiICsgZ2V0QnVmZmVyKCkuZ2V0TG9nRmlsZU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCS8vIFdoZXRoZXIgdGhpcyB0ZXN0IGNhc2UgZmFpbHMgb3Igbm90LCBzZW5kIGl0cyByZXN1bHRzIHRvIHRoZSBsb2cuCi0JCQlnZXRCdWZmZXIoKS5kZWxpbmVhdGUoX3RtZC5nZXROYW1lKCkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC9qVW5pdFdyYXBwZXIvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9qdW5pdC9WYWxpZGF0b3JTdWl0ZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC9qVW5pdFdyYXBwZXIvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9qdW5pdC9WYWxpZGF0b3JTdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmZlYTM2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvalVuaXRXcmFwcGVyL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvanVuaXQvVmFsaWRhdG9yU3VpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0UmVzdWx0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0b3JNZXRhRGF0YTsKLQotLyoqCi0gKiBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyB3cmFwIGFsbCBvZiB0aGUgPHRlc3Q+IGluc3RhbmNlcywKLSAqIGNvbnRyaWJ1dGVkIGluIHBsdWdpbi54bWwsIGZvciBvbmUgdmFsaWRhdG9yLgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9yU3VpdGUgZXh0ZW5kcyBUZXN0U3VpdGUgewotCXByaXZhdGUgVmFsaWRhdG9yTWV0YURhdGEgX3ZtZCA9IG51bGw7Ci0JcHJpdmF0ZSBKVW5pdEJ1ZmZlciBfYnVmZmVyID0gbnVsbDsKLQotCXB1YmxpYyBWYWxpZGF0b3JTdWl0ZShWYWxpZGF0b3JNZXRhRGF0YSB2bWQpIHsKLQkJX3ZtZCA9IHZtZDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIF92bWQuZ2V0VmFsaWRhdG9yRGlzcGxheU5hbWUoKTsKLQl9Ci0JCi0JcHVibGljIEpVbml0QnVmZmVyIGdldEJ1ZmZlcigpIHsKLQkJaWYoX2J1ZmZlciA9PSBudWxsKSB7Ci0JCQlfYnVmZmVyID0gbmV3IEpVbml0QnVmZmVyKHRvU3RyaW5nKCkgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArICIubG9nIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCXJldHVybiBfYnVmZmVyOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0I3J1bihqdW5pdC5mcmFtZXdvcmsuVGVzdFJlc3VsdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oVGVzdFJlc3VsdCByZXN1bHQpIHsKLQkJc3VwZXIucnVuKHJlc3VsdCk7Ci0JCWdldEJ1ZmZlcigpLnJlcG9ydCgpOyAvLyByZXBvcnQgb25seSBhZnRlciBhbGwgb2YgdGhlIHRlc3RzIGluIHRoaXMgc3VpdGUgaGF2ZSBmaW5pc2hlZAotCQlnZXRCdWZmZXIoKS5jbGVhcigpOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC9qVW5pdFdyYXBwZXIvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9qdW5pdC9WYWxpZGF0b3JUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2pVbml0V3JhcHBlci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2p1bml0L1ZhbGlkYXRvclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM5YjIyMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2pVbml0V3JhcHBlci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2p1bml0L1ZhbGlkYXRvclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwucmVnaXN0cnkuVGVzdGNhc2VVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwucmVnaXN0cnkuVmFsaWRhdG9yVGVzdGNhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC51dGlsLkJWVFJ1bm5lcjsKLQotCi0vKioKLSAqIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBvbmUgPHRlc3Q+LCBjb250cmlidXRlZCBpbgotICogcGx1Z2luLnhtbCwgZm9yIG9uZSB2YWxpZGF0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0b3JUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgVmFsaWRhdG9yVGVzdGNhc2UgX3RtZCA9IG51bGw7Ci0JcHJpdmF0ZSBWYWxpZGF0b3JTdWl0ZSBfc3VpdGUgPSBudWxsOwotCi0JcHVibGljIFZhbGlkYXRvclRlc3QoVmFsaWRhdG9yVGVzdGNhc2UgdG1kLCBWYWxpZGF0b3JTdWl0ZSBzdWl0ZSkgewotCQlzdXBlcih0bWQuZ2V0TmFtZSgpKTsgLy8gdGhlIG1ldGhvZCBuYW1lZCAidGVzdCIgcnVucyB0aGUgdGVzdC4KLQkJX3RtZCA9IHRtZDsKLQkJX3N1aXRlID0gc3VpdGU7Ci0JfQotCQotCXB1YmxpYyBKVW5pdEJ1ZmZlciBnZXRCdWZmZXIoKSB7Ci0JCXJldHVybiBfc3VpdGUuZ2V0QnVmZmVyKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBfdG1kLmdldFByb2plY3ROYW1lKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3J1blRlc3QoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdHJ5IHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBUZXN0Y2FzZVV0aWxpdHkuZmluZFByb2plY3QoX3RtZCk7Ci0JCQlpZigocHJvamVjdCA9PSBudWxsKSB8fCAhcHJvamVjdC5leGlzdHMoKSkgewotCQkJCS8vIEZpbGUgbmVlZHMgdG8gYmUgaW1wb3J0ZWQgKGkuZS4sIHNldCB1cCB0aGUgdGVzdCkuCi0JCQkJaWYoIUJWVFJ1bm5lci5zaW5nbGV0b24oKS5zZXR1cFRlc3RzKGdldEJ1ZmZlcigpLCBfdG1kLCBmYWxzZSkpIHsKLQkJCQkJZmFpbCgiQ291bGQgbm90IGltcG9ydCBpbnB1dCBmcm9tIGRpcmVjdG9yeSAiICsgVGVzdGNhc2VVdGlsaXR5LmdldElucHV0RGlyKF90bWQpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQotCQkJaWYoIXByb2plY3QuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQlmYWlsKCJQcm9qZWN0ICIgKyBwcm9qZWN0LmdldE5hbWUoKSArICIgaXMgbm90IGFjY2Vzc2libGUuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJCi0JCQlfdG1kLnJ1bihnZXRCdWZmZXIoKSwgcHJvamVjdCk7Ci0JCQlpZighZ2V0QnVmZmVyKCkuaXNTdWNjZXNzZnVsKF90bWQuZ2V0TmFtZSgpKSkgewotCQkJCWZhaWwoX3RtZC5nZXROYW1lKCkgKyAiIGZhaWxlZC4gUmVhZCB0aGUgbG9nIGZvciBkZXRhaWxzLiAiICsgZ2V0QnVmZmVyKCkuZ2V0TG9nRmlsZU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCS8vIFdoZXRoZXIgdGhpcyB0ZXN0IGNhc2UgZmFpbHMgb3Igbm90LCBzZW5kIGl0cyByZXN1bHRzIHRvIHRoZSBsb2cuCi0JCQlnZXRCdWZmZXIoKS5kZWxpbmVhdGUoX3RtZC5nZXROYW1lKCkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC9wbHVnaW4ueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWQxYTA3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QiCi0gICBuYW1lPSJWYWxpZGF0aW9uIFRlc3RpbmcgQ29tcG9uZW50IgotICAgdmVyc2lvbj0iMS4xLjAiCi0gICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5CVlRWYWxpZGF0aW9uUGx1Z2luIj4KLQotICAgPHJ1bnRpbWU+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJ2YWxpZGF0aW9udGVzdC5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5qdW5pdCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2giLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZW0udXRpbCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpkdC5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamVtIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmoyZWUiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLQotPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhLS0gVmFsaWRhdGlvbiBDb250cmlidXRpb25zICAgLS0+Ci08IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCEtLSBWYWxpZGF0aW9uIGV4dGVuc2lvbiBwb2ludHMgLS0+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJ0ZXN0IiBuYW1lPSJ2YWxpZGF0b3IgdGVzdCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0idGVzdFNldHVwIiBuYW1lPSJ0ZXN0U2V0dXAiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9Im9wVGVzdCIgbmFtZT0ib3BlcmF0aW9uIHRlc3QiLz4KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tICAgICAgICAgICBKVW5pdCBCVlQgVGVzdCBTdWl0ZSAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yLnN1aXRlcyI+Ci0gICAgICA8c3VpdGUKLSAgICAgICAgICAgIG5hbWU9IlZhbGlkYXRpb24gQlZUIFN1aXRlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuanVuaXQuQlZUU3VpdGUiPgotICAgICAgPC9zdWl0ZT4KLSAgIDwvZXh0ZW5zaW9uPgotPCEtLSBiYXRjaCBCVlQgLS0+Ci0gIDwhLS0gPGV4dGVuc2lvbgotICAgICAgICAgaWQ9ImJ2dF9iYXRjaCIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYXBwbGljYXRpb25zIj4KLSAgICAgIDxhcHBsaWNhdGlvbj4KLSAgICAgICAgIDxydW4KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LkJWVFZhbGlkYXRpb25CYXRjaCI+Ci0gICAgICAgICA8L3J1bj4KLSAgICAgIDwvYXBwbGljYXRpb24+Ci0gICA8L2V4dGVuc2lvbj4gLS0+Ci0gICAKLTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IS0tIEJ1aWxkZXIgKHVzZWQgb25seSBmb3IgQlZUIHRlc3QgaW5wdXQpIC0tPgotPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJidnRidWlsZGVyIgotICAgICAgICAgbmFtZT0iVmFsaWRhdGlvbiBCVlQgVGVzdCBCdWlsZGVyIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLmJ1aWxkZXJzIj4KLSAgICAgIDxidWlsZGVyPgotICAgICAgICAgPHJ1bgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuZndrLlRlc3RPcENvbnN0ckJ1aWxkZXIiPgotICAgICAgICAgPC9ydW4+Ci0gICAgICA8L2J1aWxkZXI+Ci0gICA8L2V4dGVuc2lvbj4KLTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IS0tICAgICAgICAgICAgICAgICAgIEZXSyBUZXN0IFZhbGlkYXRvcnMgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gVGhlc2UgdmFsaWRhdG9ycyBtdXN0IG5vdCBiZSBlbmFibGVkIGJ5IGRlZmF1bHQgb3Igc29tZSAgICAgLS0+Ci08IS0tIG90aGVyIEJWVCB0ZXN0IGNhc2VzIChlLmcuIGoyZWUpIHdpbGwgZmFpbCBiZWNhdXNlICAgICAgICAgIC0tPgotPCEtLSBtZXNzYWdlcyB3aWxsIGV4aXN0IGluIHRoZSB0YXNrIGxpc3QuICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IS0tIAotICAgICAgIFRoZSBGV0tUZXN0VmFsaWRhdG9yIHN1cHBvcnRzIGZ1bGwgdmFsaWRhdGlvbiwgYW5kIG1hbnVhbCAKLSAgICAgICBpbmNyZW1lbnRhbCBidWlsZCB2YWxpZGF0aW9uLCBidXQgbm90IGF1dG9tYXRpYyBpbmNyZW1lbnRhbCAKLSAgICAgICBidWlsZCB2YWxpZGF0aW9uLiAKLSAgICAtLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJGd2tUZXN0VmFsaWRhdG9yIgotICAgICAgICAgbmFtZT0iVkYgVGVzdCBWYWxpZGF0b3IiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udmFsaWRhdG9yIj4KLSAgICAgIDx2YWxpZGF0b3I+Ci0gICAgICAgICA8cHJvamVjdE5hdHVyZQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmUiPgotICAgICAgICAgPC9wcm9qZWN0TmF0dXJlPgotICAgICAgICAgPGZpbHRlcgotICAgICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotICAgICAgICAgICAgICAgbmFtZUZpbHRlcj0iKi5qYXZhIj4KLSAgICAgICAgIDwvZmlsdGVyPgotICAgICAgICAgPGhlbHBlcgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuZndrLnZhbGlkYXRvci5Gd2tUZXN0SGVscGVyIj4KLSAgICAgICAgIDwvaGVscGVyPgotICAgICAgICAgPHJ1bgotICAgICAgICAgICAgICAgZW5hYmxlZD0iZmFsc2UiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5md2sudmFsaWRhdG9yLkZ3a1Rlc3RWYWxpZGF0b3IiCi0gICAgICAgICAgICAgICBpbmNyZW1lbnRhbD0iZmFsc2UiPgotICAgICAgICAgPC9ydW4+Ci0gICAgICA8L3ZhbGlkYXRvcj4KLSAgIDwvZXh0ZW5zaW9uPgotPCEtLSAKLSAgICAgICBUaGUgRldLTm9CdWlsZFRlc3RWYWxpZGF0b3Igc3VwcG9ydHMgZnVsbCB2YWxpZGF0aW9uLCBhbmQgZG9lcyBub3QKLSAgICAgICBzdXBwb3J0IGFueSBidWlsZCB2YWxpZGF0aW9uLiAKLSAgICAtLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJGd2tOb0J1aWxkVGVzdFZhbGlkYXRvciIKLSAgICAgICAgIG5hbWU9IlZGIE5vQnVpbGQgVGVzdCBWYWxpZGF0b3IiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udmFsaWRhdG9yIj4KLSAgICAgIDx2YWxpZGF0b3I+Ci0gICAgICAgICA8cHJvamVjdE5hdHVyZQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmUiPgotICAgICAgICAgPC9wcm9qZWN0TmF0dXJlPgotICAgICAgICAgPGZpbHRlcgotICAgICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotICAgICAgICAgICAgICAgbmFtZUZpbHRlcj0iKi5qYXZhIj4KLSAgICAgICAgIDwvZmlsdGVyPgotICAgICAgICAgPGhlbHBlcgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuZndrLnZhbGlkYXRvci5Gd2tOb0J1aWxkVGVzdEhlbHBlciI+Ci0gICAgICAgICA8L2hlbHBlcj4KLSAgICAgICAgIDxydW4KLSAgICAgICAgICAgICAgIGZ1bGxCdWlsZD0iZmFsc2UiCi0gICAgICAgICAgICAgICBlbmFibGVkPSJmYWxzZSIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmZ3ay52YWxpZGF0b3IuRndrTm9CdWlsZFRlc3RWYWxpZGF0b3IiCi0gICAgICAgICAgICAgICBpbmNyZW1lbnRhbD0iZmFsc2UiPgotICAgICAgICAgPC9ydW4+Ci0gICAgICA8L3ZhbGlkYXRvcj4KLSAgIDwvZXh0ZW5zaW9uPgotPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhLS0gRndrIFRlc3QgVmFsaWRhdG9yIEJWVCB0ZXN0IHNldHVwICAgLS0+Ci08IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9IkZ3a1Rlc3RWYWxpZGF0b3JCVlRfdGVzdFNldHVwIgotICAgICAgICAgbmFtZT0iRndrIFRlc3QgVmFsaWRhdG9yIEJWVCBUZXN0U2V0dXAiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC50ZXN0U2V0dXAiPgotICAgICAgPGltcG9ydAotICAgICAgICAgICAgaW5wdXQ9IkZXSy9CVlQvb3BDb25zdHIuamFyIgotICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLkpBUkltcG9ydE9wZXJhdGlvbiI+Ci0gICAgICA8L2ltcG9ydD4KLSAgIDwvZXh0ZW5zaW9uPgotPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhLS0gICAgICAgICAgICAgICBWaXNpYmxlIEZyYW1ld29yayBCVlQgdGVzdHMgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9IlRlc3RPcENvbnN0cnVjdG9ycyIKLSAgICAgICAgIG5hbWU9IlRlc3QgT3BlcmF0aW9uIENvbnN0cnVjdG9ycyIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0Lm9wVGVzdCI+Ci0gICAgICA8b3B0ZXN0Ci0gICAgICAgICAgICBpbnB1dD0iRldLL0JWVC9vcENvbnN0ci5qYXIiCi0gICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuZndrLlRlc3RPcENvbnN0ck9wZXJhdGlvbiIKLSAgICAgICAgICAgIHByb2plY3Q9Im9wQ29uc3RyIgotICAgICAgICAgICAgdmlzaWJsZT0iZmFsc2UiPgotICAgICAgPC9vcHRlc3Q+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDwhLS08ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0iVkFMRldLMDIiCi0gICAgICAgICBuYW1lPSJWQUxGV0swMiIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0Lm9wVGVzdCI+Ci0gICAgICA8b3B0ZXN0Ci0gICAgICAgICAgICBpbnB1dD0iRldLL0JWVC9vcENvbnN0ci5qYXIiCi0gICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuZndrLlZBTEZXSzAyT3BlcmF0aW9uIgotICAgICAgICAgICAgcHJvamVjdD0ib3BDb25zdHIiCi0gICAgICAgICAgICB2aXNpYmxlPSJmYWxzZSI+Ci0gICAgICA8L29wdGVzdD4KLSAgIDwvZXh0ZW5zaW9uPi0tPgotPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhLS0gICAgICAgICAgICAgICBGd2sgVGVzdCBWYWxpZGF0b3IgQlZUIHRlc3RzICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tIE5vbmUgb2YgdGhlc2UgdGVzdHMgYXJlIHZpc2libGUgb24gdGhlIFRlc3QgQ29sbGVjdG9yIG1lbnUgIC0tPgotPCEtLSBJbnN0ZWFkLCB0aGVzZSBhcmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSBWQUxGV0swMiBhbmQgICAgICAgICAtLT4KLTwhLS0gVGVzdE9wQ29uc3RyIHRlc3RzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9IkZ3a1Rlc3RWYWxpZGF0b3JCVlQiCi0gICAgICAgICBuYW1lPSJGd2sgVGVzdCBWYWxpZGF0b3IgQlZUIFRlc3RzIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QudGVzdCI+Ci0gICAgICA8dGVzdAotICAgICAgICAgICAgaW5wdXQ9IkZXSy9CVlQvb3BDb25zdHIuamFyIgotICAgICAgICAgICAgdmFsaWRhdG9yPSJvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmZ3ay52YWxpZGF0b3IuRndrVGVzdFZhbGlkYXRvciIKLSAgICAgICAgICAgIHByb2plY3Q9Im9wQ29uc3RyIgotICAgICAgICAgICAgdmlzaWJsZT0iZmFsc2UiPgotICAgICAgICAgPG1lc3NhZ2UKLSAgICAgICAgICAgICAgIGxvY2F0aW9uPSIxIgotICAgICAgICAgICAgICAgcHJlZml4PSIiCi0gICAgICAgICAgICAgICByZXNvdXJjZT0iSVRlc3QuamF2YSIKLSAgICAgICAgICAgICAgIHRleHQ9IlRoaXMgaXMgYSB0ZXN0IG1lc3NhZ2UgZm9yIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yaywgcmVwb3J0ZWQgYnkgVkYgVGVzdCBWYWxpZGF0b3IuIFBsZWFzZSBpZ25vcmUuIj4KLSAgICAgICAgIDwvbWVzc2FnZT4KLSAgICAgICAgIDxtZXNzYWdlCi0gICAgICAgICAgICAgICBsb2NhdGlvbj0iMSIKLSAgICAgICAgICAgICAgIHByZWZpeD0iIgotICAgICAgICAgICAgICAgcmVzb3VyY2U9IlRlc3QxLmphdmEiCi0gICAgICAgICAgICAgICB0ZXh0PSJUaGlzIGlzIGEgdGVzdCBtZXNzYWdlIGZvciB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmssIHJlcG9ydGVkIGJ5IFZGIFRlc3QgVmFsaWRhdG9yLiBQbGVhc2UgaWdub3JlLiI+Ci0gICAgICAgICA8L21lc3NhZ2U+Ci0gICAgICAgICA8bWVzc2FnZQotICAgICAgICAgICAgICAgbG9jYXRpb249IjEiCi0gICAgICAgICAgICAgICBwcmVmaXg9IiIKLSAgICAgICAgICAgICAgIHJlc291cmNlPSJ0ZXN0Mi9JVGVzdDIuamF2YSIKLSAgICAgICAgICAgICAgIHRleHQ9IlRoaXMgaXMgYSB0ZXN0IG1lc3NhZ2UgZm9yIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yaywgcmVwb3J0ZWQgYnkgVkYgVGVzdCBWYWxpZGF0b3IuIFBsZWFzZSBpZ25vcmUuIj4KLSAgICAgICAgIDwvbWVzc2FnZT4KLSAgICAgICAgIDxtZXNzYWdlCi0gICAgICAgICAgICAgICBsb2NhdGlvbj0iMSIKLSAgICAgICAgICAgICAgIHByZWZpeD0iIgotICAgICAgICAgICAgICAgcmVzb3VyY2U9InRlc3QyL1Rlc3QyLmphdmEiCi0gICAgICAgICAgICAgICB0ZXh0PSJUaGlzIGlzIGEgdGVzdCBtZXNzYWdlIGZvciB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmssIHJlcG9ydGVkIGJ5IFZGIFRlc3QgVmFsaWRhdG9yLiBQbGVhc2UgaWdub3JlLiI+Ci0gICAgICAgICA8L21lc3NhZ2U+Ci0gICAgICA8L3Rlc3Q+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJGd2tOb0J1aWxkVGVzdFZhbGlkYXRvckJWVCIKLSAgICAgICAgIG5hbWU9IkZ3ayBOb0J1aWxkIFRlc3QgVmFsaWRhdG9yIEJWVCBUZXN0cyIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnRlc3QiPgotICAgICAgPHRlc3QKLSAgICAgICAgICAgIGlucHV0PSJGV0svQlZUL29wQ29uc3RyLmphciIKLSAgICAgICAgICAgIHZhbGlkYXRvcj0ib3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5md2sudmFsaWRhdG9yLkZ3a05vQnVpbGRUZXN0VmFsaWRhdG9yIgotICAgICAgICAgICAgcHJvamVjdD0ib3BDb25zdHIiCi0gICAgICAgICAgICB2aXNpYmxlPSJmYWxzZSI+Ci0gICAgICAgICA8bWVzc2FnZQotICAgICAgICAgICAgICAgbG9jYXRpb249IjEiCi0gICAgICAgICAgICAgICBwcmVmaXg9IiIKLSAgICAgICAgICAgICAgIHJlc291cmNlPSJJVGVzdC5qYXZhIgotICAgICAgICAgICAgICAgdGV4dD0iVGhpcyBpcyBhIHRlc3QgbWVzc2FnZSBmb3IgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLCByZXBvcnRlZCBieSBWRiBOb0J1aWxkIFRlc3QgVmFsaWRhdG9yLiBQbGVhc2UgaWdub3JlLiI+Ci0gICAgICAgICA8L21lc3NhZ2U+Ci0gICAgICAgICA8bWVzc2FnZQotICAgICAgICAgICAgICAgbG9jYXRpb249IjEiCi0gICAgICAgICAgICAgICBwcmVmaXg9IiIKLSAgICAgICAgICAgICAgIHJlc291cmNlPSJUZXN0MS5qYXZhIgotICAgICAgICAgICAgICAgdGV4dD0iVGhpcyBpcyBhIHRlc3QgbWVzc2FnZSBmb3IgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLCByZXBvcnRlZCBieSBWRiBOb0J1aWxkIFRlc3QgVmFsaWRhdG9yLiBQbGVhc2UgaWdub3JlLiI+Ci0gICAgICAgICA8L21lc3NhZ2U+Ci0gICAgICAgICA8bWVzc2FnZQotICAgICAgICAgICAgICAgbG9jYXRpb249IjEiCi0gICAgICAgICAgICAgICBwcmVmaXg9IiIKLSAgICAgICAgICAgICAgIHJlc291cmNlPSJ0ZXN0Mi9JVGVzdDIuamF2YSIKLSAgICAgICAgICAgICAgIHRleHQ9IlRoaXMgaXMgYSB0ZXN0IG1lc3NhZ2UgZm9yIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yaywgcmVwb3J0ZWQgYnkgVkYgTm9CdWlsZCBUZXN0IFZhbGlkYXRvci4gUGxlYXNlIGlnbm9yZS4iPgotICAgICAgICAgPC9tZXNzYWdlPgotICAgICAgICAgPG1lc3NhZ2UKLSAgICAgICAgICAgICAgIGxvY2F0aW9uPSIxIgotICAgICAgICAgICAgICAgcHJlZml4PSIiCi0gICAgICAgICAgICAgICByZXNvdXJjZT0idGVzdDIvVGVzdDIuamF2YSIKLSAgICAgICAgICAgICAgIHRleHQ9IlRoaXMgaXMgYSB0ZXN0IG1lc3NhZ2UgZm9yIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yaywgcmVwb3J0ZWQgYnkgVkYgTm9CdWlsZCBUZXN0IFZhbGlkYXRvci4gUGxlYXNlIGlnbm9yZS4iPgotICAgICAgICAgPC9tZXNzYWdlPgotICAgICAgPC90ZXN0PgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0iUHJvcGVydGllc1ZhbGlkYXRvckJWVCIKLSAgICAgICAgIG5hbWU9IlByb3BlcnRpZXMgVmFsaWRhdG9yIEJWVCBUZXN0cyIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnRlc3QiPgotICAgICAgPHRlc3QKLSAgICAgICAgICAgIGlucHV0PSJGV0svQlZUL29wQ29uc3RyLmphciIKLSAgICAgICAgICAgIHZhbGlkYXRvcj0ib3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlLlByb3BlcnRpZXNWYWxpZGF0b3IiCi0gICAgICAgICAgICBwcm9qZWN0PSJvcENvbnN0ciIKLSAgICAgICAgICAgIHZpc2libGU9ImZhbHNlIj4KLSAgICAgICAgIDxtZXNzYWdlCi0gICAgICAgICAgICAgICBsb2NhdGlvbj0iMyIKLSAgICAgICAgICAgICAgIHByZWZpeD0iQUJDRDAwMDAiCi0gICAgICAgICAgICAgICByZXNvdXJjZT0icmVzb3VyY2VzL3Rlc3QucHJvcGVydGllcyIKLSAgICAgICAgICAgICAgIHRleHQ9IkFCQ0QwMDAwRTogTWF0Y2ggdGhlIGJyYWNlcyBpbiB0aGUgbWVzc2FnZS4gVGhlcmUgYXJlIDAgeyBhbmQgMSB9LiBNZXNzYWdlRm9ybWF0IHdpbGwgdGhyb3cgYSBOdWxsUG9pbnRlckV4Y2VwdGlvbiB3aGVuIHRoZXJlIGFyZSBtaXNtYXRjaGluZyBicmFjZXMuIj4KLSAgICAgICAgIDwvbWVzc2FnZT4KLSAgICAgICAgIDxtZXNzYWdlCi0gICAgICAgICAgICAgICBsb2NhdGlvbj0iMiIKLSAgICAgICAgICAgICAgIHByZWZpeD0iQUJDRDAwMDAiCi0gICAgICAgICAgICAgICByZXNvdXJjZT0icmVzb3VyY2VzL3Rlc3QucHJvcGVydGllcyIKLSAgICAgICAgICAgICAgIHRleHQ9IkFCQ0QwMDAwRTogTWF0Y2ggdGhlIGJyYWNlcyBpbiB0aGUgbWVzc2FnZS4gVGhlcmUgYXJlIDEgeyBhbmQgMCB9LiBNZXNzYWdlRm9ybWF0IHdpbGwgdGhyb3cgYSBOdWxsUG9pbnRlckV4Y2VwdGlvbiB3aGVuIHRoZXJlIGFyZSBtaXNtYXRjaGluZyBicmFjZXMuIj4KLSAgICAgICAgIDwvbWVzc2FnZT4KLSAgICAgICAgIDxtZXNzYWdlCi0gICAgICAgICAgICAgICBsb2NhdGlvbj0iMSIKLSAgICAgICAgICAgICAgIHByZWZpeD0iQUJDRDAwMDAiCi0gICAgICAgICAgICAgICByZXNvdXJjZT0icmVzb3VyY2VzL3Rlc3QucHJvcGVydGllcyIKLSAgICAgICAgICAgICAgIHRleHQ9IkFCQ0QwMDAwRTogTWF0Y2ggdGhlIGJyYWNlcyBpbiB0aGUgbWVzc2FnZS4gVGhlcmUgYXJlIDAgeyBhbmQgMSB9LiBNZXNzYWdlRm9ybWF0IHdpbGwgdGhyb3cgYSBOdWxsUG9pbnRlckV4Y2VwdGlvbiB3aGVuIHRoZXJlIGFyZSBtaXNtYXRjaGluZyBicmFjZXMuIj4KLSAgICAgICAgIDwvbWVzc2FnZT4KLSAgICAgICAgIDxtZXNzYWdlCi0gICAgICAgICAgICAgICBsb2NhdGlvbj0iMTAiCi0gICAgICAgICAgICAgICBwcmVmaXg9IkFCQ0QwMDEwIgotICAgICAgICAgICAgICAgcmVzb3VyY2U9InJlc291cmNlcy90ZXN0LnByb3BlcnRpZXMiCi0gICAgICAgICAgICAgICB0ZXh0PSJBQkNEMDAxMEU6IENoYW5nZSBhcmd1bWVudCAoey0xfSkgdG8gYW4gaW50ZWdlciBiZXR3ZWVuIDAgYW5kIDkgaW5jbHVzaXZlIGluIHRoZSBtZXNzYWdlLiBNZXNzYWdlRm9ybWF0IGNhbm5vdCBwcm9jZXNzIGFuIGludGVnZXIgcGFyYW1ldGVyIHRoYXQgaXMgbGVzcyB0aGFuIDAuIj4KLSAgICAgICAgIDwvbWVzc2FnZT4KLSAgICAgICAgIDxtZXNzYWdlCi0gICAgICAgICAgICAgICBsb2NhdGlvbj0iOCIKLSAgICAgICAgICAgICAgIHByZWZpeD0iQUJDRDAwMTAiCi0gICAgICAgICAgICAgICByZXNvdXJjZT0icmVzb3VyY2VzL3Rlc3QucHJvcGVydGllcyIKLSAgICAgICAgICAgICAgIHRleHQ9IkFCQ0QwMDEwVzogQ2hhbmdlIGFyZ3VtZW50ICh7MTB9KSB0byBhbiBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgOSBpbmNsdXNpdmUgaW4gdGhlIG1lc3NhZ2UuIE1lc3NhZ2VGb3JtYXQgaWdub3JlcyBhbnkgcGFyYW1ldGVycyBsYXJnZXIgdGhhbiA5LiI+Ci0gICAgICAgICA8L21lc3NhZ2U+Ci0gICAgICAgICA8bWVzc2FnZQotICAgICAgICAgICAgICAgbG9jYXRpb249IjciCi0gICAgICAgICAgICAgICBwcmVmaXg9IkFCQ0QwMDEwIgotICAgICAgICAgICAgICAgcmVzb3VyY2U9InJlc291cmNlcy90ZXN0LnByb3BlcnRpZXMiCi0gICAgICAgICAgICAgICB0ZXh0PSJBQkNEMDAxMFc6IENoYW5nZSBhcmd1bWVudCAoezEwfSkgdG8gYW4gaW50ZWdlciBiZXR3ZWVuIDAgYW5kIDkgaW5jbHVzaXZlIGluIHRoZSBtZXNzYWdlLiBNZXNzYWdlRm9ybWF0IGlnbm9yZXMgYW55IHBhcmFtZXRlcnMgbGFyZ2VyIHRoYW4gOS4iPgotICAgICAgICAgPC9tZXNzYWdlPgotICAgICAgICAgPG1lc3NhZ2UKLSAgICAgICAgICAgICAgIGxvY2F0aW9uPSIxMiIKLSAgICAgICAgICAgICAgIHByZWZpeD0iQUJDRDAwMjAiCi0gICAgICAgICAgICAgICByZXNvdXJjZT0icmVzb3VyY2VzL3Rlc3QucHJvcGVydGllcyIKLSAgICAgICAgICAgICAgIHRleHQ9IkFCQ0QwMDIwSTogUmVtb3ZlIHJlZHVuZGFudCBwYXJhbWV0ZXIgezB9IGZyb20gdGhlIG1lc3NhZ2UuIE1ha2UgbWVzc2FnZXMgc3VjY2luY3QuIj4KLSAgICAgICAgIDwvbWVzc2FnZT4KLSAgICAgICAgIDxtZXNzYWdlCi0gICAgICAgICAgICAgICBsb2NhdGlvbj0iMTMiCi0gICAgICAgICAgICAgICBwcmVmaXg9IkFCQ0QwMDMwIgotICAgICAgICAgICAgICAgcmVzb3VyY2U9InJlc291cmNlcy90ZXN0LnByb3BlcnRpZXMiCi0gICAgICAgICAgICAgICB0ZXh0PSJBQkNEMDAzMEk6IENoZWNrIHRoYXQgYXJndW1lbnQgezF9IHdhcyBvbWl0dGVkIGZyb20gdGhlIG1lc3NhZ2UgZGVsaWJlcmF0ZWx5LiBJZiBpdCB3YXMgb21pdHRlZCBhY2NpZGVudGFsbHksIGFuZCB0aGUgY29kZSBkb2VzIG5vdCBwcm92aWRlIGVub3VnaCBwYXJhbWV0ZXJzLCBNZXNzYWdlRm9ybWF0IHdpbGwgdGhyb3cgYSBOdWxsUG9pbnRlckV4Y2VwdGlvbi4iPgotICAgICAgICAgPC9tZXNzYWdlPgotICAgICAgICAgPG1lc3NhZ2UKLSAgICAgICAgICAgICAgIGxvY2F0aW9uPSI4IgotICAgICAgICAgICAgICAgcHJlZml4PSJBQkNEMDAzMCIKLSAgICAgICAgICAgICAgIHJlc291cmNlPSJyZXNvdXJjZXMvdGVzdC5wcm9wZXJ0aWVzIgotICAgICAgICAgICAgICAgdGV4dD0iQUJDRDAwMzBJOiBDaGVjayB0aGF0IGFyZ3VtZW50IHswfSB3YXMgb21pdHRlZCBmcm9tIHRoZSBtZXNzYWdlIGRlbGliZXJhdGVseS4gSWYgaXQgd2FzIG9taXR0ZWQgYWNjaWRlbnRhbGx5LCBhbmQgdGhlIGNvZGUgZG9lcyBub3QgcHJvdmlkZSBlbm91Z2ggcGFyYW1ldGVycywgTWVzc2FnZUZvcm1hdCB3aWxsIHRocm93IGEgTnVsbFBvaW50ZXJFeGNlcHRpb24uIj4KLSAgICAgICAgIDwvbWVzc2FnZT4KLSAgICAgICAgIDxtZXNzYWdlCi0gICAgICAgICAgICAgICBsb2NhdGlvbj0iMTQiCi0gICAgICAgICAgICAgICBwcmVmaXg9IkFCQ0QwMDQwIgotICAgICAgICAgICAgICAgcmVzb3VyY2U9InJlc291cmNlcy90ZXN0LnByb3BlcnRpZXMiCi0gICAgICAgICAgICAgICB0ZXh0PSJBQkNEMDA0MEk6IFVzZSB0d28gYXBvc3Ryb3BoZXMgaW4gdGhlIG1lc3NhZ2UgYXQgY29sdW1uIDU3LiBNZXNzYWdlRm9ybWF0IHJlbW92ZXMgc2luZ2xlIGFwb3N0cm9waGVzOyBmb3IgdGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBhbiBhcG9zdHJvcGhlLCB0d28gYXBvc3Ryb3BoZXMgbXVzdCBleGlzdCBpbiB0aGUgc3RyaW5nLiAoQW4gYXBvc3Ryb3BoZSBpcyBhIHJlc2VydmVkIGNoYXJhY3RlciBvZiBNZXNzYWdlRm9ybWF0LikiPgotICAgICAgICAgPC9tZXNzYWdlPgotICAgICAgICAgPG1lc3NhZ2UKLSAgICAgICAgICAgICAgIGxvY2F0aW9uPSIxNSIKLSAgICAgICAgICAgICAgIHByZWZpeD0iQUJDRDAwNTAiCi0gICAgICAgICAgICAgICByZXNvdXJjZT0icmVzb3VyY2VzL3Rlc3QucHJvcGVydGllcyIKLSAgICAgICAgICAgICAgIHRleHQ9IkFCQ0QwMDUwSTogVXNlIG9uZSBhcG9zdHJvcGhlIGluIHRoZSBtZXNzYWdlIGF0IGNvbHVtbiA1Ny4gTWVzc2FnZUZvcm1hdCBwcm9jZXNzZXMgb25seSBtZXNzYWdlcyB3aXRoIHBhcmFtZXRlcnM7IHdpdGhvdXQgTWVzc2FnZUZvcm1hdCwgdGhlIGV4dHJhIGFwb3N0cm9waGUgd2lsbCBub3QgYmUgcmVtb3ZlZC4iPgotICAgICAgICAgPC9tZXNzYWdlPgotICAgICAgICAgPG1lc3NhZ2UKLSAgICAgICAgICAgICAgIGxvY2F0aW9uPSIyNSIKLSAgICAgICAgICAgICAgIHByZWZpeD0iQUJDRDAwNjAiCi0gICAgICAgICAgICAgICByZXNvdXJjZT0icmVzb3VyY2VzL3Rlc3QucHJvcGVydGllcyIKLSAgICAgICAgICAgICAgIHRleHQ9IkFCQ0QwMDYwVzogTWFrZSBaX0RVUExJQ0FURSB1bmlxdWUuIFdoZW4gYW4gaWQgaXMgdXNlZCBtb3JlIHRoYW4gb25jZSBpbiBhIGZpbGUsIFJlc291cmNlQnVuZGxlIHdpbGwgdXNlIHRoZSB2YWx1ZSBvZiB0aGUgbGFzdCBtZXNzYWdlIGlkLiI+Ci0gICAgICAgICA8L21lc3NhZ2U+Ci0gICAgICAgICA8bWVzc2FnZQotICAgICAgICAgICAgICAgbG9jYXRpb249IjI0IgotICAgICAgICAgICAgICAgcHJlZml4PSJBQkNEMDA2MCIKLSAgICAgICAgICAgICAgIHJlc291cmNlPSJyZXNvdXJjZXMvdGVzdC5wcm9wZXJ0aWVzIgotICAgICAgICAgICAgICAgdGV4dD0iQUJDRDAwNjBXOiBNYWtlIFpfRFVQTElDQVRFIHVuaXF1ZS4gV2hlbiBhbiBpZCBpcyB1c2VkIG1vcmUgdGhhbiBvbmNlIGluIGEgZmlsZSwgUmVzb3VyY2VCdW5kbGUgd2lsbCB1c2UgdGhlIHZhbHVlIG9mIHRoZSBsYXN0IG1lc3NhZ2UgaWQuIj4KLSAgICAgICAgIDwvbWVzc2FnZT4KLSAgICAgICAgIDxtZXNzYWdlCi0gICAgICAgICAgICAgICBsb2NhdGlvbj0iMTkiCi0gICAgICAgICAgICAgICBwcmVmaXg9IkFCQ0QwMDYwIgotICAgICAgICAgICAgICAgcmVzb3VyY2U9InJlc291cmNlcy90ZXN0LnByb3BlcnRpZXMiCi0gICAgICAgICAgICAgICB0ZXh0PSJBQkNEMDA2MFc6IE1ha2UgRFVQTElDQVRFX0lEIHVuaXF1ZS4gV2hlbiBhbiBpZCBpcyB1c2VkIG1vcmUgdGhhbiBvbmNlIGluIGEgZmlsZSwgUmVzb3VyY2VCdW5kbGUgd2lsbCB1c2UgdGhlIHZhbHVlIG9mIHRoZSBsYXN0IG1lc3NhZ2UgaWQuIj4KLSAgICAgICAgIDwvbWVzc2FnZT4KLSAgICAgICAgIDxtZXNzYWdlCi0gICAgICAgICAgICAgICBsb2NhdGlvbj0iMTgiCi0gICAgICAgICAgICAgICBwcmVmaXg9IkFCQ0QwMDYwIgotICAgICAgICAgICAgICAgcmVzb3VyY2U9InJlc291cmNlcy90ZXN0LnByb3BlcnRpZXMiCi0gICAgICAgICAgICAgICB0ZXh0PSJBQkNEMDA2MFc6IE1ha2UgRFVQTElDQVRFX0lEIHVuaXF1ZS4gV2hlbiBhbiBpZCBpcyB1c2VkIG1vcmUgdGhhbiBvbmNlIGluIGEgZmlsZSwgUmVzb3VyY2VCdW5kbGUgd2lsbCB1c2UgdGhlIHZhbHVlIG9mIHRoZSBsYXN0IG1lc3NhZ2UgaWQuIj4KLSAgICAgICAgIDwvbWVzc2FnZT4KLSAgICAgICAgIDxtZXNzYWdlCi0gICAgICAgICAgICAgICBsb2NhdGlvbj0iMjgiCi0gICAgICAgICAgICAgICBwcmVmaXg9IkFCQ0QwMDYwIgotICAgICAgICAgICAgICAgcmVzb3VyY2U9InJlc291cmNlcy90ZXN0LnByb3BlcnRpZXMiCi0gICAgICAgICAgICAgICB0ZXh0PSJBQkNEMDA2MFc6IE1ha2UgWl9EVVBMSUNBVEUgdW5pcXVlLiBXaGVuIGFuIGlkIGlzIHVzZWQgbW9yZSB0aGFuIG9uY2UgaW4gYSBmaWxlLCBSZXNvdXJjZUJ1bmRsZSB3aWxsIHVzZSB0aGUgdmFsdWUgb2YgdGhlIGxhc3QgbWVzc2FnZSBpZC4iPgotICAgICAgICAgPC9tZXNzYWdlPgotICAgICAgICAgPG1lc3NhZ2UKLSAgICAgICAgICAgICAgIGxvY2F0aW9uPSI0MyIKLSAgICAgICAgICAgICAgIHByZWZpeD0iQUJDRDAwNzAiCi0gICAgICAgICAgICAgICByZXNvdXJjZT0icmVzb3VyY2VzL3Rlc3QucHJvcGVydGllcyIKLSAgICAgICAgICAgICAgIHRleHQ9IkFCQ0QwMDcwVzogQUJDRDAwMDBFIG1heSBuZWVkIHRvIGJlIHVuaXF1ZS4gQ29udmVudGlvbmFsbHksIGEgbWVzc2FnZSBwcmVmaXggYXBwbGllcyB0byBvbmx5IG9uZSBlcnJvciBjb25kaXRpb24uIj4KLSAgICAgICAgIDwvbWVzc2FnZT4KLSAgICAgICAgIDxtZXNzYWdlCi0gICAgICAgICAgICAgICBsb2NhdGlvbj0iNDIiCi0gICAgICAgICAgICAgICBwcmVmaXg9IkFCQ0QwMDcwIgotICAgICAgICAgICAgICAgcmVzb3VyY2U9InJlc291cmNlcy90ZXN0LnByb3BlcnRpZXMiCi0gICAgICAgICAgICAgICB0ZXh0PSJBQkNEMDA3MFc6IEFCQ0QwMDAwRSBtYXkgbmVlZCB0byBiZSB1bmlxdWUuIENvbnZlbnRpb25hbGx5LCBhIG1lc3NhZ2UgcHJlZml4IGFwcGxpZXMgdG8gb25seSBvbmUgZXJyb3IgY29uZGl0aW9uLiI+Ci0gICAgICAgICA8L21lc3NhZ2U+Ci0gICAgICAgICA8bWVzc2FnZQotICAgICAgICAgICAgICAgbG9jYXRpb249IjQxIgotICAgICAgICAgICAgICAgcHJlZml4PSJBQkNEMDA3MCIKLSAgICAgICAgICAgICAgIHJlc291cmNlPSJyZXNvdXJjZXMvdGVzdC5wcm9wZXJ0aWVzIgotICAgICAgICAgICAgICAgdGV4dD0iQUJDRDAwNzBXOiBBQkNEMDAwMEUgbWF5IG5lZWQgdG8gYmUgdW5pcXVlLiBDb252ZW50aW9uYWxseSwgYSBtZXNzYWdlIHByZWZpeCBhcHBsaWVzIHRvIG9ubHkgb25lIGVycm9yIGNvbmRpdGlvbi4iPgotICAgICAgICAgPC9tZXNzYWdlPgotICAgICAgICAgPG1lc3NhZ2UKLSAgICAgICAgICAgICAgIGxvY2F0aW9uPSIzOSIKLSAgICAgICAgICAgICAgIHByZWZpeD0iQUJDRDAwNzAiCi0gICAgICAgICAgICAgICByZXNvdXJjZT0icmVzb3VyY2VzL3Rlc3QucHJvcGVydGllcyIKLSAgICAgICAgICAgICAgIHRleHQ9IkFCQ0QwMDcwVzogQUJDRDAwMDBFIG1heSBuZWVkIHRvIGJlIHVuaXF1ZS4gQ29udmVudGlvbmFsbHksIGEgbWVzc2FnZSBwcmVmaXggYXBwbGllcyB0byBvbmx5IG9uZSBlcnJvciBjb25kaXRpb24uIj4KLSAgICAgICAgIDwvbWVzc2FnZT4KLSAgICAgICAgIDxtZXNzYWdlCi0gICAgICAgICAgICAgICBsb2NhdGlvbj0iMzgiCi0gICAgICAgICAgICAgICBwcmVmaXg9IkFCQ0QwMDcwIgotICAgICAgICAgICAgICAgcmVzb3VyY2U9InJlc291cmNlcy90ZXN0LnByb3BlcnRpZXMiCi0gICAgICAgICAgICAgICB0ZXh0PSJBQkNEMDA3MFc6IEFCQ0QwMDAwRSBtYXkgbmVlZCB0byBiZSB1bmlxdWUuIENvbnZlbnRpb25hbGx5LCBhIG1lc3NhZ2UgcHJlZml4IGFwcGxpZXMgdG8gb25seSBvbmUgZXJyb3IgY29uZGl0aW9uLiI+Ci0gICAgICAgICA8L21lc3NhZ2U+Ci0gICAgICAgICA8bWVzc2FnZQotICAgICAgICAgICAgICAgbG9jYXRpb249IjM3IgotICAgICAgICAgICAgICAgcHJlZml4PSJBQkNEMDA3MCIKLSAgICAgICAgICAgICAgIHJlc291cmNlPSJyZXNvdXJjZXMvdGVzdC5wcm9wZXJ0aWVzIgotICAgICAgICAgICAgICAgdGV4dD0iQUJDRDAwNzBXOiBBQkNEMDAwMEUgbWF5IG5lZWQgdG8gYmUgdW5pcXVlLiBDb252ZW50aW9uYWxseSwgYSBtZXNzYWdlIHByZWZpeCBhcHBsaWVzIHRvIG9ubHkgb25lIGVycm9yIGNvbmRpdGlvbi4iPgotICAgICAgICAgPC9tZXNzYWdlPgotICAgICAgICAgPG1lc3NhZ2UKLSAgICAgICAgICAgICAgIGxvY2F0aW9uPSIzNiIKLSAgICAgICAgICAgICAgIHByZWZpeD0iQUJDRDAwNzAiCi0gICAgICAgICAgICAgICByZXNvdXJjZT0icmVzb3VyY2VzL3Rlc3QucHJvcGVydGllcyIKLSAgICAgICAgICAgICAgIHRleHQ9IkFCQ0QwMDcwVzogQUJDRDAwMDBFIG1heSBuZWVkIHRvIGJlIHVuaXF1ZS4gQ29udmVudGlvbmFsbHksIGEgbWVzc2FnZSBwcmVmaXggYXBwbGllcyB0byBvbmx5IG9uZSBlcnJvciBjb25kaXRpb24uIj4KLSAgICAgICAgIDwvbWVzc2FnZT4KLSAgICAgICAgIDxtZXNzYWdlCi0gICAgICAgICAgICAgICBsb2NhdGlvbj0iNDUiCi0gICAgICAgICAgICAgICBwcmVmaXg9IkFCQ0QwMDcwIgotICAgICAgICAgICAgICAgcmVzb3VyY2U9InJlc291cmNlcy90ZXN0LnByb3BlcnRpZXMiCi0gICAgICAgICAgICAgICB0ZXh0PSJBQkNEMDA3MFc6IEFCQ0QwMDAwRSBtYXkgbmVlZCB0byBiZSB1bmlxdWUuIENvbnZlbnRpb25hbGx5LCBhIG1lc3NhZ2UgcHJlZml4IGFwcGxpZXMgdG8gb25seSBvbmUgZXJyb3IgY29uZGl0aW9uLiI+Ci0gICAgICAgICA8L21lc3NhZ2U+Ci0gICAgICAgICA8bWVzc2FnZQotICAgICAgICAgICAgICAgbG9jYXRpb249IjQ0IgotICAgICAgICAgICAgICAgcHJlZml4PSJBQkNEMDA3MCIKLSAgICAgICAgICAgICAgIHJlc291cmNlPSJyZXNvdXJjZXMvdGVzdC5wcm9wZXJ0aWVzIgotICAgICAgICAgICAgICAgdGV4dD0iQUJDRDAwNzBXOiBBQkNEMDAwMEUgbWF5IG5lZWQgdG8gYmUgdW5pcXVlLiBDb252ZW50aW9uYWxseSwgYSBtZXNzYWdlIHByZWZpeCBhcHBsaWVzIHRvIG9ubHkgb25lIGVycm9yIGNvbmRpdGlvbi4iPgotICAgICAgICAgPC9tZXNzYWdlPgotICAgICAgICAgPG1lc3NhZ2UKLSAgICAgICAgICAgICAgIGxvY2F0aW9uPSIzNSIKLSAgICAgICAgICAgICAgIHByZWZpeD0iQUJDRDAwNzAiCi0gICAgICAgICAgICAgICByZXNvdXJjZT0icmVzb3VyY2VzL3Rlc3QucHJvcGVydGllcyIKLSAgICAgICAgICAgICAgIHRleHQ9IkFCQ0QwMDcwVzogQUJDRDAwMDBFIG1heSBuZWVkIHRvIGJlIHVuaXF1ZS4gQ29udmVudGlvbmFsbHksIGEgbWVzc2FnZSBwcmVmaXggYXBwbGllcyB0byBvbmx5IG9uZSBlcnJvciBjb25kaXRpb24uIj4KLSAgICAgICAgIDwvbWVzc2FnZT4KLSAgICAgICAgIDxtZXNzYWdlCi0gICAgICAgICAgICAgICBsb2NhdGlvbj0iMjMiCi0gICAgICAgICAgICAgICBwcmVmaXg9IkFCQ0QwMDcwIgotICAgICAgICAgICAgICAgcmVzb3VyY2U9InJlc291cmNlcy90ZXN0LnByb3BlcnRpZXMiCi0gICAgICAgICAgICAgICB0ZXh0PSJBQkNEMDA3MFc6IEFBQUEwMDAwVyBtYXkgbmVlZCB0byBiZSB1bmlxdWUuIENvbnZlbnRpb25hbGx5LCBhIG1lc3NhZ2UgcHJlZml4IGFwcGxpZXMgdG8gb25seSBvbmUgZXJyb3IgY29uZGl0aW9uLiI+Ci0gICAgICAgICA8L21lc3NhZ2U+Ci0gICAgICAgICA8bWVzc2FnZQotICAgICAgICAgICAgICAgbG9jYXRpb249IjIwIgotICAgICAgICAgICAgICAgcHJlZml4PSJBQkNEMDA3MCIKLSAgICAgICAgICAgICAgIHJlc291cmNlPSJyZXNvdXJjZXMvdGVzdC5wcm9wZXJ0aWVzIgotICAgICAgICAgICAgICAgdGV4dD0iQUJDRDAwNzBXOiBBQUFBMDAwMFcgbWF5IG5lZWQgdG8gYmUgdW5pcXVlLiBDb252ZW50aW9uYWxseSwgYSBtZXNzYWdlIHByZWZpeCBhcHBsaWVzIHRvIG9ubHkgb25lIGVycm9yIGNvbmRpdGlvbi4iPgotICAgICAgICAgPC9tZXNzYWdlPgotICAgICAgICAgPG1lc3NhZ2UKLSAgICAgICAgICAgICAgIGxvY2F0aW9uPSIyMSIKLSAgICAgICAgICAgICAgIHByZWZpeD0iQUJDRDAwODAiCi0gICAgICAgICAgICAgICByZXNvdXJjZT0icmVzb3VyY2VzL3Rlc3QucHJvcGVydGllcyIKLSAgICAgICAgICAgICAgIHRleHQ9IkFCQ0QwMDgwRTogRml4IHRoZSBzeW50YXggZXJyb3I7IGVhY2ggbGluZSBtdXN0IGZvcm0gTUVTU0FHRV9JRCA9IE1FU1NBR0UuIj4KLSAgICAgICAgIDwvbWVzc2FnZT4KLSAgICAgICAgIDxtZXNzYWdlCi0gICAgICAgICAgICAgICBsb2NhdGlvbj0iMTciCi0gICAgICAgICAgICAgICBwcmVmaXg9IkFCQ0QwMDgwIgotICAgICAgICAgICAgICAgcmVzb3VyY2U9InJlc291cmNlcy90ZXN0LnByb3BlcnRpZXMiCi0gICAgICAgICAgICAgICB0ZXh0PSJBQkNEMDA4MEU6IEZpeCB0aGUgc3ludGF4IGVycm9yOyBlYWNoIGxpbmUgbXVzdCBmb3JtIE1FU1NBR0VfSUQgPSBNRVNTQUdFLiI+Ci0gICAgICAgICA8L21lc3NhZ2U+Ci0gICAgICAgICA8bWVzc2FnZQotICAgICAgICAgICAgICAgbG9jYXRpb249IjEiCi0gICAgICAgICAgICAgICBwcmVmaXg9IkFCQ0QwMTEwIgotICAgICAgICAgICAgICAgcmVzb3VyY2U9InJlc291cmNlcy90ZXN0LnByb3BlcnRpZXMiCi0gICAgICAgICAgICAgICB0ZXh0PSJBQkNEMDExMEk6IEFkZCBhIHRlcm1pbmF0aW5nIGFwb3N0cm9waGUgYXQgY29sdW1uIDM2LiBUaGUgeyBhbmQgfSBjaGFyYWN0ZXJzIG11c3QgYmUgZW5jbG9zZWQgaW4gYXBvc3Ryb3BoZXMuIj4KLSAgICAgICAgIDwvbWVzc2FnZT4KLSAgICAgIDwvdGVzdD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGNhYTdiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPHByb2plY3QgbmFtZT0idGVzdHN1aXRlIiBkZWZhdWx0PSJydW4iIGJhc2VkaXI9Ii4iPgotICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLSAgPCEtLSBUaGUgcHJvcGVydHkgJHtlY2xpcHNlLWhvbWV9IHNob3VsZCBiZSBwYXNzZWQgaW50byB0aGlzIHNjcmlwdC4gLS0+Ci0gIDwhLS0gU2V0IGEgbWVhbmluZ2Z1bCBkZWZhdWx0IHZhbHVlIGZvciB3aGVuIGl0IGlzIG5vdC4gICAgICAgICAgIC0tPgotICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLSAgPCEtLSA8cHJvcGVydHkgbmFtZT0iZWNsaXBzZS1ob21lIiB2YWx1ZT0iJHtiYXNlZGlyfVwuLiIvPiAtLT4KLQotICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLSAgPCEtLSBTZXQgdGhlIGVudmlyb25tZW50IHByb3BlcnRpZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0Ii8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJsaWJyYXJ5LWZpbGUiCi0gICAgICAgICAgICB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3BsdWdpbnMvb3JnLmVjbGlwc2UudGVzdF8zLjEuMC9saWJyYXJ5LnhtbCIvPgotICA8cHJvcGVydHkgbmFtZT0iZXh0cmFWTWFyZ3MiIHZhbHVlPSItRFhteDcwME0iLz4KLQotICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0gIDwhLS0gVGhpcyB0YXJnZXQgaW5pdGlhbGl6ZXMgYWxsIG9mIHRoZSB0ZXN0cyB0aGF0IHdpbGwgcnVuLiAgICAgICAtLT4KLSAgPCEtLSBJbml0aWFsaXphdGlvbiBmb3IgaW5kaXZpZHVhbCB0ZXN0cyBzaG91bGQgYmUgZG9uZSB3aXRoaW4gdGhlIC0tPiAKLSAgPCEtLSBib2R5IG9mIHRoZSBzdWl0ZSB0YXJnZXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0gIDx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0gICAgICA8dHN0YW1wLz4KLSAgICAgIDxkZWxldGU+Ci0gICAgICAgICA8ZmlsZXNldCBkaXI9IiR7ZWNsaXBzZS1ob21lfSIgaW5jbHVkZXM9Im9yZy4qLnhtbCIvPgotICAgICAgPC9kZWxldGU+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotICA8IS0tIFRoaXMgdGFyZ2V0IGRlZmluZXMgdGhlIHRlc3RzIHRoYXQgbmVlZCB0byBydW4uICAgICAgICAgICAgICAtLT4KLSAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0gIDx0YXJnZXQgbmFtZT0ic3VpdGUiPgotICAgICAgPHByb3BlcnR5IG5hbWU9IndvcmtzcGFjZSIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9qc3RfZm9sZGVyIi8+Ci0gICAgICA8ZGVsZXRlIGRpcj0iJHt3b3Jrc3BhY2V9IiBxdWlldD0idHJ1ZSIvPgotICAgICAgPGFudCB0YXJnZXQ9ImNvcmUtdGVzdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iZGF0YS1kaXIiIHZhbHVlPSIke3dvcmtzcGFjZX0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3NuYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5qdW5pdC5BdXRvbWF0ZWRWYWxpZGF0aW9uQlZUIi8+Ci0gICAJICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLXBhdGgiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vcGx1Z2lucy8ke3BsdWdpbi1uYW1lfSIvPgotICAgCSAgPHByb3BlcnR5IG5hbWU9ImV4dHJhVk1hcmdzIiB2YWx1ZT0iJHtleHRyYVZNYXJnc30iLz4KLSAgICA8L2FudD4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotICA8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGNvZGUgdG8gY2xlYW51cCB0aGUgdGVzdGluZyBlbnZpcm9ubWVudCBhZnRlciAgLS0+Ci0gIDwhLS0gYWxsIG9mIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuLiBZb3UgY2FuIHVzZSB0aGlzIHRhcmdldCB0byAgICAgICAtLT4KLSAgPCEtLSBkZWxldGUgdGVtcG9yYXJ5IGZpbGVzIHRoYXQgaGF2ZSBiZWVuIGNyZWF0ZWQuICAgICAgICAgICAgICAgICAgIC0tPgotICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0gIDx0YXJnZXQgbmFtZT0iY2xlYW51cCI+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLSAgPCEtLSBUaGlzIHRhcmdldCBydW5zIHRoZSB0ZXN0IHN1aXRlLiBBbnkgYWN0aW9ucyB0aGF0IG5lZWQgdG8gaGFwcGVuIC0tPgotICA8IS0tIGFmdGVyIGFsbCB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1biBzaG91bGQgZ28gaGVyZS4gICAgICAgICAgICAgICAgLS0+Ci0gIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLSAgPHRhcmdldCBuYW1lPSJydW4iIGRlcGVuZHM9ImluaXQsc3VpdGUsY2xlYW51cCI+Ci0gICAgPGFudCB0YXJnZXQ9ImNvbGxlY3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImluY2x1ZGVzIiB2YWx1ZT0ib3JnLioueG1sIi8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0ib3V0cHV0LWZpbGUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfS54bWwiLz4KLSAgICA8L2FudD4KLSAgPC90YXJnZXQ+Ci0KLTwvcHJvamVjdD4KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL2FwaS90ZXN0L0FwaVRlc3RzU3VpdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9hcGkvdGVzdC9BcGlUZXN0c1N1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MDY3ZTAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL2FwaS90ZXN0L0FwaVRlc3RzU3VpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uYXBpLnRlc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgQXBpVGVzdHNTdWl0ZSBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0JCi0JIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpewotCSAgICAgICAgcmV0dXJuIG5ldyBBcGlUZXN0c1N1aXRlKCk7Ci0JICAgIH0KLQotCXB1YmxpYyBBcGlUZXN0c1N1aXRlKCkgewotCQlzdXBlcigpOwotCQlhZGRUZXN0KFZhbGlkYXRpb25SZWdpc3RyeUFwaVRlc3Quc3VpdGUoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vYXBpL3Rlc3QvVmFsaWRhdGlvblJlZ2lzdHJ5QXBpVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL2FwaS90ZXN0L1ZhbGlkYXRpb25SZWdpc3RyeUFwaVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUxOTdmOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vYXBpL3Rlc3QvVmFsaWRhdGlvblJlZ2lzdHJ5QXBpVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5hcGkudGVzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5WYWxpZGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uUmVnaXN0cnlBcGlUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoVmFsaWRhdGlvblJlZ2lzdHJ5QXBpVGVzdC5jbGFzcyk7Ci0JfSAKLQotCXB1YmxpYyBWYWxpZGF0aW9uUmVnaXN0cnlBcGlUZXN0KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBWYWxpZGF0aW9uUmVnaXN0cnlBcGlUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0X2dldFZhbGlkYXRvcigpIHsKLQl0cnkgewotCQlWYWxpZGF0aW9uRmFjdG9yeSB2YWxGYWN0b3J5ID0gVmFsaWRhdGlvbkZhY3RvcnkuaW5zdGFuY2U7Ci0JCUlWYWxpZGF0b3IgdmFsaWRhdG9yID0gdmFsRmFjdG9yeS5nZXRWYWxpZGF0b3IoIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi53b3JrYmVuY2gudmFsaWRhdGlvbi5VSUVqYlZhbGlkYXRvciIpOwotCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCh2YWxpZGF0b3IpOwotCSB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQllLnByaW50U3RhY2tUcmFjZSgpOwotCSAgfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvQlZUVmFsaWRhdGlvbkJhdGNoLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9CVlRWYWxpZGF0aW9uQmF0Y2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RmYTNlZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9CVlRWYWxpZGF0aW9uQmF0Y2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuYm9vdC5JUGxhdGZvcm1SdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC51dGlsLkJWVFJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnV0aWwuQlZUVmFsaWRhdGlvblV0aWxpdHk7Ci0vKioKLSAqLwotcHVibGljIGNsYXNzIEJWVFZhbGlkYXRpb25CYXRjaCBpbXBsZW1lbnRzIElQbGF0Zm9ybVJ1bm5hYmxlIHsKLQlwcml2YXRlIFN0cmluZyBfZGlyID0gbnVsbDsgLy8gVGhlIHRlc3QgY2FzZXMgKC5lYXIsIC5qYXIpIGFyZSBpZGVudGlmaWVkIHRocm91Z2ggYSByZWxhdGl2ZSBkaXJlY3RvcnksIGFuZCB0aGlzIGlzIHRoZSBwYXJlbnQgb2YgdGhhdCByZWxhdGl2ZSBkaXJlY3RvcnkuCi0JcHJpdmF0ZSBib29sZWFuIF92ZXJib3NlID0gZmFsc2U7Ci0Jc3RhdGljIEJvb2xlYW4gX3Bhc3NlZCA9IG51bGw7Ci0JCi0JYm9vbGVhbiBpc1ZlcmJvc2UoKSB7Ci0JCXJldHVybiBfdmVyYm9zZTsKLQl9Ci0JCi0Jdm9pZCBzZXRWZXJib3NlKGJvb2xlYW4gdikgewotCQlfdmVyYm9zZSA9IHY7Ci0JfQotCQotCVN0cmluZyBnZXREaXIoKSB7Ci0JCXJldHVybiBfZGlyOwotCX0KLQkKLQl2b2lkIHNldERpcihTdHJpbmcgZGlyKSB7Ci0JCV9kaXIgPSBkaXI7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBwYXJzZVVzZXJTZXR0aW5ncyhPYmplY3QgYXJncykgewotCQlpZihhcmdzID09IG51bGwpIHsKLQkJCS8vIG5vdGhpbmcgdG8gc2V0Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmKGFyZ3MgaW5zdGFuY2VvZiBTdHJpbmdbXSkgewotCQkJU3RyaW5nW10gdXNlclNldHRpbmdzID0gKFN0cmluZ1tdKWFyZ3M7Ci0JCQlpZih1c2VyU2V0dGluZ3MubGVuZ3RoID09IDApIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkKLQkJCWZvcihpbnQgaT0wOyBpPHVzZXJTZXR0aW5ncy5sZW5ndGg7IGkrKykgewotCQkJCWlmKHVzZXJTZXR0aW5nc1tpXS5lcXVhbHMoIi1kaXIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCXNldERpcih1c2VyU2V0dGluZ3NbaSsxXSk7Ci0JCQkJfQotCQkJCQotCQkJCWlmKHVzZXJTZXR0aW5nc1tpXS5lcXVhbHMoIi10cmFjZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJc2V0VmVyYm9zZSh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIHR1cm4gb24gZnJhbWV3b3JrIHZhbGlkYXRpb24gbG9nZ2luZwotCQkJaWYoaXNWZXJib3NlKCkpIHsKLQkJCQlCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpLnNldExldmVsKExldmVsLkZJTkVTVCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIFBhcnNlIHRoZSB1c2VyJ3Mgc2V0dGluZ3MsIGltcG9ydCB0aGUgdGVzdCBjYXNlcywgYW5kIHJ1biB0aGUgdGVzdCBjYXNlcy4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHJ1bihPYmplY3QgYXJncykgdGhyb3dzIEJWVFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlwYXJzZVVzZXJTZXR0aW5ncyhhcmdzKTsKLQotCQlJV29ya3NwYWNlUnVubmFibGUgcnVubmFibGUgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewkJCi0JCQkJdHJ5IHsKLQkJCQkJbW9uaXRvci5zdWJUYXNrKCJXb3Jrc3BhY2UgaXMgbG9jYXRlZCBhdDogIiArIEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0U3RhdGVMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJCQlDb25zb2xlQnVmZmVyIGJ1ZmZlciA9IG5ldyBDb25zb2xlQnVmZmVyKCk7Ci0JCQkJCUJWVFJ1bm5lci5zaW5nbGV0b24oKS5zZXR1cFRlc3RzKGJ1ZmZlciwgaXNWZXJib3NlKCkpOwotCQkJCQkKLQkJCQkJaW50IG51bVRlc3RzID0gQlZUVmFsaWRhdGlvblV0aWxpdHkubnVtVmFsaWRhdG9yVGVzdHMobW9uaXRvciwgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpKTsKLQkJCQkJaW50IG51bVBhc3NlZCA9IEJWVFJ1bm5lci5zaW5nbGV0b24oKS50ZXN0KGJ1ZmZlciwgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpKTsKLQkJCQkJX3Bhc3NlZCA9ICgobnVtUGFzc2VkID09IG51bVRlc3RzKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0UpOwotCQkJCX0KLQkJCQljYXRjaChCVlRWYWxpZGF0aW9uRXhjZXB0aW9uIGV4YykgewotCQkJCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yy5nZXRNZXNzYWdlKCkpOwotCQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCQkJCWlmKGV4Yy5nZXRUYXJnZXRFeGNlcHRpb24oKSAhPSBudWxsKSB7Ci0JCQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQkJCi0JCXRyeSB7Ci0JCQlDb25zb2xlUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgPSBuZXcgQ29uc29sZVByb2dyZXNzTW9uaXRvcigpOwotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bihydW5uYWJsZSwgbW9uaXRvcik7Ci0JCX0KLQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCXRocm93IG5ldyBCVlRWYWxpZGF0aW9uRXhjZXB0aW9uKGV4Yyk7Ci0JCX0KLQkJcmV0dXJuIF9wYXNzZWQ7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvQlZUVmFsaWRhdGlvbkV4Y2VwdGlvbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvQlZUVmFsaWRhdGlvbkV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDgwOWQ5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L0JWVFZhbGlkYXRpb25FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdDsKLQotcHVibGljIGNsYXNzIEJWVFZhbGlkYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCXByaXZhdGUgVGhyb3dhYmxlIF90YXJnZXQgPSBudWxsOwotCQotCXB1YmxpYyBCVlRWYWxpZGF0aW9uRXhjZXB0aW9uKFRocm93YWJsZSB0KSB7Ci0JCXNldFRhcmdldEV4Y2VwdGlvbih0KTsKLQl9Ci0JCi0JcHVibGljIEJWVFZhbGlkYXRpb25FeGNlcHRpb24oU3RyaW5nIHMpIHsKLQkJc3VwZXIocyk7Ci0JfQotCQotCXB1YmxpYyBCVlRWYWxpZGF0aW9uRXhjZXB0aW9uKFN0cmluZyBzLCBUaHJvd2FibGUgdGFyZ2V0KSB7Ci0JCXN1cGVyKHMpOwotCQlzZXRUYXJnZXRFeGNlcHRpb24odGFyZ2V0KTsKLQl9Ci0JCi0JcHVibGljIFRocm93YWJsZSBnZXRUYXJnZXRFeGNlcHRpb24oKSB7Ci0JCXJldHVybiBfdGFyZ2V0OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXRFeGNlcHRpb24oVGhyb3dhYmxlIHRhcmdldCkgewotCQlfdGFyZ2V0ID0gdGFyZ2V0OwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L0JWVFZhbGlkYXRpb25QbHVnaW4uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L0JWVFZhbGlkYXRpb25QbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTEwNWY1Ny4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9CVlRWYWxpZGF0aW9uUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGx1Z2luRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5cmVuZGVyLkRlZmF1bHRQbHVnaW5UcmFjZVJlbmRlcmVyOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0KLS8qKgotICogUGx1Z2luIGZvciBUVlQgdGVzdGluZy4KLSAqLwotcHVibGljIGNsYXNzIEJWVFZhbGlkYXRpb25QbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCXByaXZhdGUgc3RhdGljIEJWVFZhbGlkYXRpb25QbHVnaW4gaW5zdCA9IG51bGw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZTsKLQlwcm90ZWN0ZWQgc3RhdGljIExvZ2dlciBsb2dnZXIgPSBudWxsOwotCi0JLyoqCi0JICogVmFsaWRhdGlvblRWVFBsdWdpbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIEBwYXJhbSBkZXNjcmlwdG9yIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGx1Z2luRGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBCVlRWYWxpZGF0aW9uUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlpbnN0ID0gdGhpczsKLQl9Ci0JcHVibGljIHN0YXRpYyBCVlRWYWxpZGF0aW9uUGx1Z2luIGdldFBsdWdpbigpIHsKLQkJcmV0dXJuIGluc3Q7Ci0JfQotCQotCXB1YmxpYyBCVlRWYWxpZGF0aW9uUGx1Z2luKElQbHVnaW5EZXNjcmlwdG9yIHBkKSB7Ci0JCXRoaXMoKTsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRQbHVnaW5JRCgpIHsKLQkgICAgcmV0dXJuIFBMVUdJTl9JRDsKLQl9Ci0JCi0JcHVibGljIExvZ2dlciBnZXRNc2dMb2dnZXIoKSB7Ci0JCWlmIChsb2dnZXIgPT0gbnVsbCkgewotCQkJbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihnZXRQbHVnaW5JRCgpKTsKLQkJCXNldFJlbmRlcmVyKGxvZ2dlcik7Ci0JCX0KLQkJcmV0dXJuIGxvZ2dlcjsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGFMb2dnZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRSZW5kZXJlcihMb2dnZXIgYUxvZ2dlcikgewotCQluZXcgRGVmYXVsdFBsdWdpblRyYWNlUmVuZGVyZXIoYUxvZ2dlcik7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyBmcm9tIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICogb3IgJ2tleScgaWYgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlPSBnZXRQbHVnaW4oKS5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotCQl0cnkgewotCQkJcmV0dXJuIChidW5kbGUhPW51bGwgPyBidW5kbGUuZ2V0U3RyaW5nKGtleSkgOiBrZXkpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICovCi0JcHVibGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQl0cnkgewotCQkJaWYgKHJlc291cmNlQnVuZGxlID09IG51bGwpCi0JCQkJcmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuQlZUVmFsaWRhdGlvblBsdWdpblJlc291cmNlIik7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB4KSB7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlQnVuZGxlOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBwbHVnLWluIGFjdGl2YXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcGx1Zy1pbiBpcyBzdG9wcGVkCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlpbnN0ID0gbnVsbDsKLQkJcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L0J1ZmZlcmVkVGFza1N0YXR1cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvQnVmZmVyZWRUYXNrU3RhdHVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNTQ2ODYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvQnVmZmVyZWRUYXNrU3RhdHVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnJlZ2lzdHJ5LlRlc3RjYXNlVXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklCdWZmZXI7Ci0KLQotcHVibGljIGNsYXNzIEJ1ZmZlcmVkVGFza1N0YXR1cyBleHRlbmRzIFRhc2tTdGF0dXMgaW1wbGVtZW50cyBJQnVmZmVyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdMSU5FID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBJUHJvZ3Jlc3NNb25pdG9yIF9tb25pdG9yID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZ0J1ZmZlciBfYnVmZmVyID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBfbG9nRmlsZU5hbWUgPSBudWxsOwotCQotCXB1YmxpYyBCdWZmZXJlZFRhc2tTdGF0dXMoKSB7Ci0JfQotCQotCXB1YmxpYyBCdWZmZXJlZFRhc2tTdGF0dXMoU3RyaW5nIGxvZ0ZpbGVOYW1lKSB7Ci0JCXRoaXMobG9nRmlsZU5hbWUsIG51bGwpOwotCX0KLQkKLQlwdWJsaWMgQnVmZmVyZWRUYXNrU3RhdHVzKFN0cmluZyBsb2dGaWxlTmFtZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCV9idWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXNldFByb2dyZXNzTW9uaXRvcihtb25pdG9yKTsKLQkJc2V0TG9nRmlsZU5hbWUobG9nRmlsZU5hbWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJc3VwZXIuY2xlYXIoKTsKLQkJX2J1ZmZlciA9IG51bGw7Ci0JCV9idWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCV9tb25pdG9yLmRvbmUoKTsKLQkJX21vbml0b3IgPSBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TG9nRmlsZU5hbWUoKSB7Ci0JCXJldHVybiBfbG9nRmlsZU5hbWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldExvZ0ZpbGVOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCV9sb2dGaWxlTmFtZSA9IG5hbWU7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmdCdWZmZXIgZ2V0QnVmZmVyKCkgewotCQlyZXR1cm4gX2J1ZmZlcjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklCdWZmZXIjZ2V0UHJvZ3Jlc3NNb25pdG9yKCkKLQkgKi8KLQlwdWJsaWMgSVByb2dyZXNzTW9uaXRvciBnZXRQcm9ncmVzc01vbml0b3IoKSB7Ci0JCWlmKF9tb25pdG9yID09IG51bGwpIHsKLQkJCV9tb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJfQotCQlyZXR1cm4gX21vbml0b3I7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFByb2dyZXNzTW9uaXRvcihJUHJvZ3Jlc3NNb25pdG9yIG0pIHsKLQkJX21vbml0b3IgPSBtOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSUJ1ZmZlciNyZXBvcnQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlcG9ydCgpIHsKLQkJX2J1ZmZlci5hcHBlbmQoTkVXTElORSk7Ci0JCV9idWZmZXIuYXBwZW5kKCI+Pj4+Pj4+Pj4+Pj4+Pj4+VEVTVCBTVUlURSBSRVNVTFRTPj4+Pj4+Pj4+Pj4+Pj4+PiIpOyAvLyROT04tTkxTLTEkCi0JCV9idWZmZXIuYXBwZW5kKE5FV0xJTkUpOwotCQlfYnVmZmVyLmFwcGVuZChORVdMSU5FKTsKLQotCQlpZihnZXRFbGFwc2VkVGltZSgpLnNpemUoKSA+IDApIHsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0RWxhcHNlZFRpbWUoKS5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQkJbG9uZyB0b3RhbCA9IDA7Ci0JCQlfYnVmZmVyLmFwcGVuZCgiPj4+Pj4+Pj4+Pj4+Pj4+PkVMQVBTRUQgVElNRT4+Pj4+Pj4+Pj4+Pj4+Pj4iKTsgLy8kTk9OLU5MUy0xJAotCQkJX2J1ZmZlci5hcHBlbmQoTkVXTElORSk7Ci0JCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlTdHJpbmcgdGFza05hbWUgPSAoU3RyaW5nKWl0ZXJhdG9yLm5leHQoKTsKLQkJCQlMb25nIGVsYXBzZWRUaW1lID0gKExvbmcpZ2V0RWxhcHNlZFRpbWUoKS5nZXQodGFza05hbWUpOwotCQkJCXRvdGFsICs9IGVsYXBzZWRUaW1lLmxvbmdWYWx1ZSgpOwotCQkJCV9idWZmZXIuYXBwZW5kKCJUb3RhbCBlbGFwc2VkIHRpbWUgb2YgdGFzayAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCV9idWZmZXIuYXBwZW5kKHRhc2tOYW1lKTsKLQkJCQlfYnVmZmVyLmFwcGVuZCgiIGlzICIpOyAvLyROT04tTkxTLTEkCi0JCQkJX2J1ZmZlci5hcHBlbmQoZWxhcHNlZFRpbWUpOwotCQkJCV9idWZmZXIuYXBwZW5kKE5FV0xJTkUpOwotCQkJfQotCQkJX2J1ZmZlci5hcHBlbmQoIlRvdGFsIHRpbWUgb2YgYWxsIHRhc2tzIGlzICIgKyB0b3RhbCArICIsIHdoaWNoIGlzICIgKyAodG90YWwvMTAwMC82MCkgKyAiIG1pbnV0ZXMuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQlfYnVmZmVyLmFwcGVuZChORVdMSU5FKTsKLQkJfQotCi0JCWludCB0b3ROdW1QYXNzID0gMDsKLQkJTWFwIHRhc2tTdGF0dXMgPSBnZXRUYXNrU3RhdHVzKCk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gdGFza1N0YXR1cy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQlfYnVmZmVyLmFwcGVuZChORVdMSU5FKTsKLQkJX2J1ZmZlci5hcHBlbmQoIj4+Pj4+Pj4+Pj4+Pj4+Pj5QQVNTL0ZBSUwgU1VNTUFSWT4+Pj4+Pj4+Pj4+Pj4+Pj4iKTsgLy8kTk9OLU5MUy0xJAotCQlfYnVmZmVyLmFwcGVuZChORVdMSU5FKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlTdHJpbmcgdGFza05hbWUgPSAoU3RyaW5nKWl0ZXJhdG9yLm5leHQoKTsKLQkJCVRlc3RTdGF0dXMgdHMgPSAoVGVzdFN0YXR1cyl0YXNrU3RhdHVzLmdldCh0YXNrTmFtZSk7Ci0JCQlfYnVmZmVyLmFwcGVuZCh0cyk7Ci0JCQlfYnVmZmVyLmFwcGVuZChORVdMSU5FKTsKLQkJCWlmKHRzLmlzU3VjY2Vzc2Z1bCgpKSB7Ci0JCQkJdG90TnVtUGFzcysrOwotCQkJfQotCQl9Ci0JCQotCQlfYnVmZmVyLmFwcGVuZChORVdMSU5FKTsKLQkJX2J1ZmZlci5hcHBlbmQoTkVXTElORSk7Ci0JCV9idWZmZXIuYXBwZW5kKCJUb3RhbCBOdW1iZXIgT2YgVGVzdHM6ICIpOyAvLyROT04tTkxTLTEkCi0JCV9idWZmZXIuYXBwZW5kKG51bVRlc3RzKCkpOwotCQlfYnVmZmVyLmFwcGVuZChORVdMSU5FKTsKLQkJX2J1ZmZlci5hcHBlbmQoIk51bWJlciBQYXNzZWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCV9idWZmZXIuYXBwZW5kKHRvdE51bVBhc3MpOwotCQlfYnVmZmVyLmFwcGVuZChORVdMSU5FKTsKLQkJCi0JCWlmKGdldExvZ0ZpbGVOYW1lKCkgIT0gbnVsbCkgewotCQkJX2J1ZmZlci5hcHBlbmQoIlRoaXMgcmVwb3J0IGlzIHN0b3JlZCBpbiB0aGUgZm9sbG93aW5nIGxvZyBmaWxlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJX2J1ZmZlci5hcHBlbmQoZ2V0TG9nRmlsZU5hbWUoKSk7Ci0JCi0JCQlUZXN0Y2FzZVV0aWxpdHkuZmx1c2goZ2V0TG9nRmlsZU5hbWUoKSwgX2J1ZmZlci50b1N0cmluZygpLCB0cnVlKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSUJ1ZmZlciNkZWxpbmVhdGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGluZWF0ZShTdHJpbmcgdGVzdGNhc2VOYW1lKSB7Ci0JCVRhc2tTdGF0dXMuIFRlc3RTdGF0dXMgdHMgPSBnZXRUZXN0U3RhdHVzKHRlc3RjYXNlTmFtZSk7Ci0JCWlmKHRzID09IG51bGwpIHsKLQkJCS8vIG5vdGhpbmcgdG8gcmVwb3J0Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nQnVmZmVyIGVycm9yc0J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZXJyb3JzQnVmZmVyLmFwcGVuZCh0cy5udW1GYWlsdXJlKCkpOwotCQllcnJvcnNCdWZmZXIuYXBwZW5kKCIgZXJyb3JzIHdlcmUgcmVwb3J0ZWQgYW5kICIpOyAvLyROT04tTkxTLTEkCi0JCWVycm9yc0J1ZmZlci5hcHBlbmQodHMubnVtV2FybmluZ3MoKSk7Ci0JCWVycm9yc0J1ZmZlci5hcHBlbmQoIiB3YXJuaW5ncyB3ZXJlIHJlcG9ydGVkLiBSZWFkICIpOyAvLyROT04tTkxTLTEkCi0JCWVycm9yc0J1ZmZlci5hcHBlbmQoZ2V0TG9nRmlsZU5hbWUoKSk7Ci0JCWVycm9yc0J1ZmZlci5hcHBlbmQoIiBmb3IgZGV0YWlscy4iKTsgLy8kTk9OLU5MUy0xJAotCQl3cml0ZShlcnJvcnNCdWZmZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JQnVmZmVyI3dyaXRlKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgd3JpdGUoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJLy8gQ2FuJ3Qgd3JpdGUgdG8gdGhlIEpVbml0IGxvZy4gQ2FuIG9ubHkgd3JpdGUgdG8gdGhlIGxvZyBieSBmYWlsaW5nIHRoZQotCQkvLyB0ZXN0IGNhc2Ugd2l0aCBhIG1lc3NhZ2U7IGluc3RlYWQsIHdyaXRlIHRvIHRoZSBidWZmZXIsIGFuZCBzZW5kIHRoaXMKLQkJLy8gaW5mb3JtYXRpb24gdG8gYSBsb2cgaW4gdGhlIHZhbGlkYXRpb24udGVzdCBwbHVnaW4ncyBzdGF0ZSBsb2NhdGlvbi4KLQkJX2J1ZmZlci5hcHBlbmQobWVzc2FnZSk7Ci0JCV9idWZmZXIuYXBwZW5kKE5FV0xJTkUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L0J1aWxkSW5mby5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvQnVpbGRJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMmM2ZWYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvQnVpbGRJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdDsKLXB1YmxpYyBjbGFzcyBCdWlsZEluZm8gewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiTGljZW5zZWQgTWF0ZXJpYWxzIC0tIFByb3BlcnR5IG9mIElCTVxuKGMpIENvcHlyaWdodCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uLCAyMDAxLDIwMDNcblVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUgcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZmdCdWlsZExldmVsID0gIjIwMDMxMTEyXzE5MTUtV0IyMTItQUQtVjUxMUQtVzUiOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBsZXZlbCgpIHsgcmV0dXJuIGZnQnVpbGRMZXZlbDsgfQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRXU0FCdWlsZExldmVsKCkgeyByZXR1cm4gZmdCdWlsZExldmVsOyB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9Db25zb2xlQnVmZmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9Db25zb2xlQnVmZmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiOGJkY2IuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvQ29uc29sZUJ1ZmZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSUJ1ZmZlcjsKLQotCi0vKioKLSAqIFNlbmRzIHRoZSBUZXN0Q2FzZUdlbmVyYXRvck9wZXJhdGlvbiBvdXRwdXQgdG8gU3lzdGVtLm91dC4KLSAqLwotcHVibGljIGNsYXNzIENvbnNvbGVCdWZmZXIgaW1wbGVtZW50cyBJQnVmZmVyIHsKLQlwcml2YXRlIEJ1ZmZlcmVkVGFza1N0YXR1cyBfc3RhdHVzID0gbnVsbDsKLQkKLQlwdWJsaWMgQ29uc29sZUJ1ZmZlcigpIHsKLQkJX3N0YXR1cyA9IG5ldyBCdWZmZXJlZFRhc2tTdGF0dXMoKTsgLy8gbm8gbG9nIGZpbGUKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSUJ1ZmZlciNyZXBvcnQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlcG9ydCgpIHsKLQkJX3N0YXR1cy5yZXBvcnQoKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKF9zdGF0dXMuZ2V0QnVmZmVyKCkudG9TdHJpbmcoKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JVGVzdFN0YXR1cyNjbGVhcigpCi0JICovCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCV9zdGF0dXMuY2xlYXIoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRMb2dGaWxlTmFtZSgpIHsKLQkJcmV0dXJuIF9zdGF0dXMuZ2V0TG9nRmlsZU5hbWUoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklCdWZmZXIjZGVsaW5lYXRlKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgZGVsaW5lYXRlKFN0cmluZyB0YXNrTmFtZSkgewotCQlfc3RhdHVzLmRlbGluZWF0ZSh0YXNrTmFtZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JQnVmZmVyI2dldFByb2dyZXNzTW9uaXRvcigpCi0JICovCi0JcHVibGljIElQcm9ncmVzc01vbml0b3IgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkgewotCQlyZXR1cm4gX3N0YXR1cy5nZXRQcm9ncmVzc01vbml0b3IoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklCdWZmZXIjd3JpdGUoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCB3cml0ZShTdHJpbmcgbWVzc2FnZSkgewotCQlfc3RhdHVzLndyaXRlKG1lc3NhZ2UpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSVRlc3RTdGF0dXMjYWRkRWxhcHNlZFRpbWUoamF2YS5sYW5nLlN0cmluZywgbG9uZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRFbGFwc2VkVGltZShTdHJpbmcgdGFza05hbWUsIGxvbmcgZWxhcHNlZFRpbWUpIHsKLQkJX3N0YXR1cy5hZGRFbGFwc2VkVGltZSh0YXNrTmFtZSwgZWxhcHNlZFRpbWUpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSVRlc3RTdGF0dXMjYWRkRXhlY3V0aW9uU3RhdHVzKGphdmEubGFuZy5TdHJpbmcsIGludCwgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JQnVmZmVyLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEV4ZWN1dGlvblN0YXR1cyhTdHJpbmcgdGVzdGNhc2VOYW1lLCBTdHJpbmcgc3ViVGFza05hbWUsIGludCBwYXNzT3JGYWlsLCBJQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJX3N0YXR1cy5hZGRFeGVjdXRpb25TdGF0dXModGVzdGNhc2VOYW1lLCBzdWJUYXNrTmFtZSwgcGFzc09yRmFpbCwgYnVmZmVyLCBtZXNzYWdlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklUZXN0U3RhdHVzI2FkZEdsb2JhbEV4ZWN1dGlvblN0YXR1cyhqYXZhLmxhbmcuU3RyaW5nLCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgYWRkRXhlY3V0aW9uU3RhdHVzKFN0cmluZyB0ZXN0UGFzc05hbWUsIGJvb2xlYW4gcGFzcykgewotCQlfc3RhdHVzLmFkZEV4ZWN1dGlvblN0YXR1cyh0ZXN0UGFzc05hbWUsIHBhc3MpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEV4ZWN1dGlvblN0YXR1cyhTdHJpbmcgdGVzdFBhc3NOYW1lLCBTdHJpbmcgc3ViVGFza05hbWUsIGJvb2xlYW4gcGFzcykgewotCQlfc3RhdHVzLmFkZEV4ZWN1dGlvblN0YXR1cyh0ZXN0UGFzc05hbWUsIHN1YlRhc2tOYW1lLCBwYXNzKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklUZXN0U3RhdHVzI2lzU3VjY2Vzc2Z1bCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTdWNjZXNzZnVsKCkgewotCQlyZXR1cm4gX3N0YXR1cy5pc1N1Y2Nlc3NmdWwoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklUZXN0U3RhdHVzI2lzU3VjY2Vzc2Z1bCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTdWNjZXNzZnVsKFN0cmluZyB0ZXN0TmFtZSkgewotCQlyZXR1cm4gX3N0YXR1cy5pc1N1Y2Nlc3NmdWwodGVzdE5hbWUpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSUJ1ZmZlciNzZXRQcm9ncmVzc01vbml0b3Iob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvZ3Jlc3NNb25pdG9yKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlfc3RhdHVzLnNldFByb2dyZXNzTW9uaXRvcihtb25pdG9yKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9Db25zb2xlUHJvZ3Jlc3NNb25pdG9yLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9Db25zb2xlUHJvZ3Jlc3NNb25pdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2ZDlmNmYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvQ29uc29sZVByb2dyZXNzTW9uaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci0KLS8qKgotICogVGhpcyBwcm9ncmVzcyBtb25pdG9yIGRpcmVjdHMgYWxsIHRhc2sgaW5mb3JtYXRpb24gdG8gc3RkLm91dC4KLSAqLwotcHVibGljIGNsYXNzIENvbnNvbGVQcm9ncmVzc01vbml0b3IgaW1wbGVtZW50cyBJUHJvZ3Jlc3NNb25pdG9yIHsKLQlwcml2YXRlIGludCBfdG90YWxXb3JrID0gMDsKLQlwcml2YXRlIGludCBfd29ya0RvbmVTb0ZhciA9IDA7Ci0JcHJpdmF0ZSBib29sZWFuIF9jYW5jZWxSZXF1ZXN0ZWQgPSBmYWxzZTsKLQkKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IjYmVnaW5UYXNrKFN0cmluZywgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGJlZ2luVGFzayhTdHJpbmcgbmFtZSwgaW50IHRvdGFsV29yaykgewotCQlfdG90YWxXb3JrID0gdG90YWxXb3JrOwotCQlyZXBvcnQobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciNkb25lKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb25lKCkgewotCQlpbnQgd29ya1JlbWFpbmluZyA9IF90b3RhbFdvcmsgLSBfd29ya0RvbmVTb0ZhcjsKLQkJd29ya2VkKHdvcmtSZW1haW5pbmcpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IjaW50ZXJuYWxXb3JrZWQoZG91YmxlKQotCSAqLwotCXB1YmxpYyB2b2lkIGludGVybmFsV29ya2VkKGRvdWJsZSB3b3JrKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciNpc0NhbmNlbGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NhbmNlbGVkKCkgewotCQlyZXR1cm4gX2NhbmNlbFJlcXVlc3RlZDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yI3NldENhbmNlbGVkKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FuY2VsZWQoYm9vbGVhbiB2YWx1ZSkgewotCQlfY2FuY2VsUmVxdWVzdGVkID0gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciNzZXRUYXNrTmFtZShTdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGFza05hbWUoU3RyaW5nIG5hbWUpIHsKLQkJcmVwb3J0KG5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3Ijc3ViVGFzayhTdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc3ViVGFzayhTdHJpbmcgbmFtZSkgewotCQlyZXBvcnQobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciN3b3JrZWQoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHdvcmtlZChpbnQgd29yaykgewotCQlfd29ya0RvbmVTb0ZhciArPSB3b3JrOwotCX0KLQotCXByaXZhdGUgdm9pZCByZXBvcnQoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKG1lc3NhZ2UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L0lPcGVyYXRpb25SdW5uYWJsZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvSU9wZXJhdGlvblJ1bm5hYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkN2I2NmQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvSU9wZXJhdGlvblJ1bm5hYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JQnVmZmVyOwotCi0KLS8qKgotICogSW5zdGFuY2VzIG9mIHRoaXMgaW50ZXJmYWNlIGFyZSBydW4gYXMgcGFydCBvZiB0aGUgVGVzdCBDb2xsZWN0b3IgQlZULgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElPcGVyYXRpb25SdW5uYWJsZSBleHRlbmRzIElXb3Jrc3BhY2VSdW5uYWJsZSB7Ci0JcHVibGljIHZvaWQgc2V0QnVmZmVyKElCdWZmZXIgYik7Ci0JcHVibGljIHZvaWQgc2V0UHJvamVjdChJUHJvamVjdCBwKTsKLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyB0ZXN0TmFtZSk7Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9UYXNrU3RhdHVzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9UYXNrU3RhdHVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyOTg5ZDYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvVGFza1N0YXR1cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdDsKLQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JQnVmZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSVRlc3RTdGF0dXM7Ci0KLQotLyoqCi0gKiBBbGwgb2YgdGhlIElCdWZmZXIgaW5zdGFuY2VzIG5lZWQgdG8gYmUgYWJsZSB0byB0cmFjayBlbGFwc2VkIHRpbWUKLSAqIGFuZCBleGVjdXRpb24gc3RhdHVzLiBFYWNoIGJ1ZmZlciBjYW4gY3JlYXRlIGFuIGludGVybmFsIGluc3RhbmNlIG9mCi0gKiB0aGlzIGNsYXNzIHRvIHBlcmZvcm0gdGhvc2UgdGFza3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrU3RhdHVzIGltcGxlbWVudHMgSVRlc3RTdGF0dXMgewotCXByaXZhdGUgTWFwIF9lbGFwc2VkVGltZSA9IG51bGw7Ci0JcHJpdmF0ZSBNYXAgX3Rhc2tTdGF0dXMgPSBudWxsOwotCi0JcHVibGljIFRhc2tTdGF0dXMoKSB7Ci0JCV9lbGFwc2VkVGltZSA9IG5ldyBIYXNoTWFwKCk7Ci0JCV90YXNrU3RhdHVzID0gbmV3IEhhc2hNYXAoKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklCdWZmZXIjYWRkRWxhcHNlZFRpbWUoU3RyaW5nLCBsb25nKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEVsYXBzZWRUaW1lKFN0cmluZyB0YXNrTmFtZSwgbG9uZyBlbGFwc2VkVGltZSkgewotCQlMb25nIHRpbWUgPSAoTG9uZylfZWxhcHNlZFRpbWUuZ2V0KHRhc2tOYW1lKTsKLQkJaWYodGltZSA9PSBudWxsKSB7Ci0JCQl0aW1lID0gbmV3IExvbmcoZWxhcHNlZFRpbWUpOwotCQl9Ci0JCWVsc2UgewotCQkJdGltZSA9IG5ldyBMb25nKHRpbWUubG9uZ1ZhbHVlKCkgKyBlbGFwc2VkVGltZSk7Ci0JCX0KLQkJX2VsYXBzZWRUaW1lLnB1dCh0YXNrTmFtZSwgdGltZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZEV4ZWN1dGlvblN0YXR1cyhTdHJpbmcgdGFza05hbWUsIGJvb2xlYW4gcGFzcykgewotCQlhZGRFeGVjdXRpb25TdGF0dXModGFza05hbWUsIG51bGwsIHBhc3MpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRFeGVjdXRpb25TdGF0dXMoU3RyaW5nIHRhc2tOYW1lLCBTdHJpbmcgc3ViVGFza05hbWUsIGJvb2xlYW4gcGFzcykgewotCQlpbnQgc3VjY2VzcyA9IChwYXNzKSA/IElUZXN0U3RhdHVzLlBBU1MgOiBJVGVzdFN0YXR1cy5GQUlMOwotCQlhZGRFeGVjdXRpb25TdGF0dXModGFza05hbWUsIHN1YlRhc2tOYW1lLCBzdWNjZXNzLCBudWxsLCBudWxsKTsKLQl9Ci0JCi0JcHVibGljIGludCBudW1UZXN0cygpIHsKLQkJcmV0dXJuIF90YXNrU3RhdHVzLnNpemUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIE1hcCBnZXRFbGFwc2VkVGltZSgpIHsKLQkJcmV0dXJuIF9lbGFwc2VkVGltZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIE1hcCBnZXRUYXNrU3RhdHVzKCkgewotCQlyZXR1cm4gX3Rhc2tTdGF0dXM7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZEV4ZWN1dGlvblN0YXR1cyhTdHJpbmcgdGVzdGNhc2VOYW1lLCBTdHJpbmcgc3ViVGFza05hbWUsIGludCBzZXZlcml0eSwgSUJ1ZmZlciBidWZmZXIsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCVRlc3RTdGF0dXMgdHMgPSBnZXRUZXN0U3RhdHVzKHRlc3RjYXNlTmFtZSk7Ci0JCWlmKHRzID09IG51bGwpIHsKLQkJCXRzID0gbmV3IFRlc3RTdGF0dXModGVzdGNhc2VOYW1lKTsKLQkJCV90YXNrU3RhdHVzLnB1dCh0ZXN0Y2FzZU5hbWUsIHRzKTsKLQkJfQotCQlpZihzdWJUYXNrTmFtZSA9PSBudWxsKSB7Ci0JCQl0cy5hZGRFeGVjdXRpb25TdGF0dXMoc2V2ZXJpdHkpOwotCQl9Ci0JCWVsc2UgewotCQkJdHMuYWRkRXhlY3V0aW9uU3RhdHVzKHN1YlRhc2tOYW1lLCBzZXZlcml0eSk7Ci0JCX0KLQotCQlpZihtZXNzYWdlICE9IG51bGwpIHsKLQkJCWJ1ZmZlci53cml0ZShtZXNzYWdlKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgVGVzdFN0YXR1cyBnZXRUZXN0U3RhdHVzKFN0cmluZyB0ZXN0Y2FzZU5hbWUpIHsKLQkJcmV0dXJuIChUZXN0U3RhdHVzKV90YXNrU3RhdHVzLmdldCh0ZXN0Y2FzZU5hbWUpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSVRlc3RTdGF0dXMjaXNTdWNjZXNzZnVsKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1N1Y2Nlc3NmdWwoKSB7Ci0JCWlmKF90YXNrU3RhdHVzLnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBfdGFza1N0YXR1cy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyB0c05hbWUgPSAoU3RyaW5nKWl0ZXJhdG9yLm5leHQoKTsKLQkJCVRlc3RTdGF0dXMgdHMgPSAoVGVzdFN0YXR1cylfdGFza1N0YXR1cy5nZXQodHNOYW1lKTsKLQkJCWlmKHRzID09IG51bGwgfHwgIXRzLmlzU3VjY2Vzc2Z1bCgpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNTdWNjZXNzZnVsKFN0cmluZyB0ZXN0TmFtZSkgewotCQlpZihfdGFza1N0YXR1cy5zaXplKCkgPT0gMCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCVRlc3RTdGF0dXMgdHMgPSAoVGVzdFN0YXR1cylfdGFza1N0YXR1cy5nZXQodGVzdE5hbWUpOwotCQlpZih0cyA9PSBudWxsIHx8ICF0cy5pc1N1Y2Nlc3NmdWwoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJX3Rhc2tTdGF0dXMuY2xlYXIoKTsKLQkJX2VsYXBzZWRUaW1lLmNsZWFyKCk7Ci0JfQotCQotCXByb3RlY3RlZCBjbGFzcyBUZXN0Q291bnQgewotCQlwdWJsaWMgaW50IG51bVJhbiA9IDA7Ci0JCXB1YmxpYyBpbnQgbnVtV2FybiA9IDA7IC8vIE51bWJlciBvZiB3YXJuaW5nIG1lc3NhZ2VzIHJlcG9ydGVkIGZvciBhIHRlc3QgY2FzZS4KLQkJcHVibGljIGludCBudW1GYWlsID0gMDsgLy8gTnVtYmVyIG9mIGZhaWx1cmUgbWVzc2FnZXMgcmVwb3J0ZWQgZm9yIGEgdGVzdCBjYXNlLgotCQlwdWJsaWMgaW50IG51bVBhc3MgPSAwOyAvLyBOdW1iZXIgb2YgdGVzdCBjYXNlcyB0aGF0IHBhc3NlZC4KLQl9Ci0KLQkvKioKLQkgKiBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyB0cmFjayB0aGUgbnVtYmVyIG9mIHRlc3QgcnVucyBhbmQgdGhlIAotCSAqIG51bWJlciBvZiB0ZXN0IGNhc2VzIHRoYXQgcGFzcy4KLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgVGVzdFN0YXR1cyBpbXBsZW1lbnRzIENvbXBhcmF0b3IgewotCQlwcml2YXRlIFN0cmluZyBfdGVzdGNhc2VOYW1lID0gbnVsbDsKLQkJcHJpdmF0ZSBNYXAgX3Rlc3RTdGF0dXMgPSBudWxsOwotCQkKLQkJLyoqCi0JCSAqIE5hbWUgbXVzdCBub3QgYmUgbnVsbC4KLQkJICovCi0JCXB1YmxpYyBUZXN0U3RhdHVzKFN0cmluZyBuYW1lKSB7Ci0JCQlfdGVzdGNhc2VOYW1lID0gbmFtZTsKLQkJCV90ZXN0U3RhdHVzID0gbmV3IEhhc2hNYXAoKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgYWRkRXhlY3V0aW9uU3RhdHVzKFN0cmluZyBzdWJUYXNrTmFtZSwgaW50IHNldmVyaXR5KSB7Ci0JCQlUZXN0Q291bnQgc29GYXIgPSAoVGVzdENvdW50KV90ZXN0U3RhdHVzLmdldChzdWJUYXNrTmFtZSk7Ci0JCQlpZihzb0ZhciA9PSBudWxsKSB7Ci0JCQkJc29GYXIgPSBuZXcgVGVzdENvdW50KCk7Ci0JCQl9Ci0JCQlzb0Zhci5udW1SYW4rKzsKLQkJCXN3aXRjaChzZXZlcml0eSkgewotCQkJCWNhc2UoSVRlc3RTdGF0dXMuV0FSTik6IHsKLQkJCQkJc29GYXIubnVtV2FybisrOwotCQkJCQlzb0Zhci5udW1QYXNzKys7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQkKLQkJCQljYXNlKElUZXN0U3RhdHVzLkZBSUwpOiB7Ci0JCQkJCXNvRmFyLm51bUZhaWwrKzsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCQotCQkJCWNhc2UoSVRlc3RTdGF0dXMuUEFTUyk6IHsKLQkJCQkJc29GYXIubnVtUGFzcysrOwotCQkJCX0KLQkJCQkKLQkJCQlkZWZhdWx0OiB7Ci0JCQkJCS8vIGNoYW5nZSBub3RoaW5nCi0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJX3Rlc3RTdGF0dXMucHV0KHN1YlRhc2tOYW1lLCBzb0Zhcik7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGFkZEV4ZWN1dGlvblN0YXR1cyhpbnQgc2V2ZXJpdHkpIHsKLQkJCWFkZEV4ZWN1dGlvblN0YXR1cyhudWxsLCBzZXZlcml0eSk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGVzdGNhc2VOYW1lKCkgewotCQkJcmV0dXJuIF90ZXN0Y2FzZU5hbWU7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgbnVtV2FybmluZ3MoKSB7Ci0JCQlpbnQgbnVtV2FybmluZ3MgPSAwOwotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBfdGVzdFN0YXR1cy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJVGVzdENvdW50IHRjID0gKFRlc3RDb3VudClpdGVyYXRvci5uZXh0KCk7Ci0JCQkJbnVtV2FybmluZ3MgKz0gdGMubnVtV2FybjsKLQkJCX0KLQkJCXJldHVybiBudW1XYXJuaW5nczsKLQkJfQotCQkKLQkJcHVibGljIGludCBudW1GYWlsdXJlKCkgewotCQkJaW50IG51bUZhaWwgPSAwOwotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBfdGVzdFN0YXR1cy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJVGVzdENvdW50IHRjID0gKFRlc3RDb3VudClpdGVyYXRvci5uZXh0KCk7Ci0JCQkJbnVtRmFpbCArPSB0Yy5udW1GYWlsOwotCQkJfQotCQkJcmV0dXJuIG51bUZhaWw7Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIGlzU3VjY2Vzc2Z1bCgpIHsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gX3Rlc3RTdGF0dXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCVRlc3RDb3VudCB0YyA9IChUZXN0Q291bnQpaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmKHRjLm51bUZhaWwgIT0gMCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlpbnQgdG90YWwgPSAwOwotCQkJaW50IHBhc3MgPSAwOwotCQkJaW50IGZhaWwgPSAwOwotCQkJaW50IHdhcm4gPSAwOwotCQkJCi0JCQlJdGVyYXRvciBpdGVyYXRvciA9IF90ZXN0U3RhdHVzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlUZXN0Q291bnQgdGMgPSAoVGVzdENvdW50KWl0ZXJhdG9yLm5leHQoKTsKLQkJCQl0b3RhbCsrOwotCQkJCWZhaWwgKz0gdGMubnVtRmFpbDsKLQkJCQl3YXJuICs9IHRjLm51bVdhcm47Ci0JCQkJcGFzcyArPSB0Yy5udW1QYXNzOwotCQkJfQotCQkJCi0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihnZXRUZXN0Y2FzZU5hbWUoKSk7Ci0JCQlidWZmZXIuYXBwZW5kKCIgVG90YWw6Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWJ1ZmZlci5hcHBlbmQodG90YWwpOwotCQkJYnVmZmVyLmFwcGVuZCgiIFtQYXNzOiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJYnVmZmVyLmFwcGVuZChwYXNzKTsKLQkJCWJ1ZmZlci5hcHBlbmQoIiBGYWlsOiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJYnVmZmVyLmFwcGVuZChmYWlsKTsKLQkJCWJ1ZmZlci5hcHBlbmQoIiBXYXJuOiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJYnVmZmVyLmFwcGVuZCh3YXJuKTsKLQkJCWJ1ZmZlci5hcHBlbmQoIl0iKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJCWlmKG8gaW5zdGFuY2VvZiBUZXN0U3RhdHVzKSB7Ci0JCQkJVGVzdFN0YXR1cyBzID0gKFRlc3RTdGF0dXMpbzsKLQkJCQlyZXR1cm4oX3Rlc3RjYXNlTmFtZS5lcXVhbHMocy5nZXRUZXN0Y2FzZU5hbWUoKSkpOwotCQkJfQotCQkJCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCQlyZXR1cm4gZ2V0VGVzdGNhc2VOYW1lKCkuaGFzaENvZGUoKTsKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIGphdmEudXRpbC5Db21wYXJhdG9yI2NvbXBhcmUoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQkJaWYoIShvMSBpbnN0YW5jZW9mIFRlc3RTdGF0dXMpICYmIChvMiBpbnN0YW5jZW9mIFRlc3RTdGF0dXMpKSB7Ci0JCQkJLy8gU2hvdWxkIG5ldmVyIGhhcHBlbiwgYnV0IGlmIGl0IGRvZXMsIHNheSB0aGF0IHRoZXNlIG5vbi1UZXN0U3RhdHVzIG9iamVjdHMgYXJlIGVxdWFsLgotCQkJCXJldHVybiAwOwotCQkJfQotCi0JCQlUZXN0U3RhdHVzIGEgPSAoVGVzdFN0YXR1cylvMTsKLQkJCVRlc3RTdGF0dXMgYiA9IChUZXN0U3RhdHVzKW8yOwotCQkJcmV0dXJuIGEuZ2V0VGVzdGNhc2VOYW1lKCkuY29tcGFyZVRvKGIuZ2V0VGVzdGNhc2VOYW1lKCkpOwkJCQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvVmFsaWRhdGlvblR5cGVFbnVtLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9WYWxpZGF0aW9uVHlwZUVudW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZlMTBjMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9WYWxpZGF0aW9uVHlwZUVudW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXI7Ci0KLS8qKgotICogRW51bWVyYXRpb24gb2YgdGhlIHR5cGVzIG9mIHZhbGlkYXRpb25zIHRoYXQgY2FuIGJlIHJ1bi4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFZhbGlkYXRpb25UeXBlRW51bSB7Ci0JcHJpdmF0ZSBWYWxpZGF0aW9uVHlwZUVudW0oKSB7Ci0JCS8vIERvIG5vdCBwZXJtaXQgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgdG8gYmUgY3JlYXRlZC4KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVOX1ZBTElEQVRJT04gPSAwOyAvLyBNYW51YWwgZnVsbCBpbnZvY2F0aW9uIG9mIGEgdmFsaWRhdGlvbiBieSBhIHVzZXIuIEFsbCB2YWxpZGF0b3JzIG11c3Qgc3VwcG9ydCB0aGlzIHR5cGUgb2YgdmFsaWRhdGlvbi4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGVUxMX1ZBTElEQVRJT04gPSBJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkZVTExfQlVJTEQ7IC8vIE1hbnVhbCBpbnZvY2F0aW9uIG9mIGEgZnVsbCBidWlsZCBieSBhIHVzZXIgdGhhdCB0cmlnZ2VycyBhIGZ1bGwgdmFsaWRhdGlvbi4gVmFsaWRhdG9ycyBjYW4sIGJ1dCBhcmUgbm90IHJlcXVpcmVkIHRvLCBzdXBwb3J0IHRoaXMgdHlwZSBvZiB2YWxpZGF0aW9uLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOQ1JFTUVOVEFMX1ZBTElEQVRJT04gPSBJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLklOQ1JFTUVOVEFMX0JVSUxEOyAvLyBNYW51YWwgaW52b2NhdGlvbiBvZiBhbiBpbmNyZW1lbnRhbCBidWlsZCBieSBhIHVzZXIgdGhhdCB0cmlnZ2VycyBhbiBpbmNyZW1lbnRhbCB2YWxpZGF0aW9uLiBWYWxpZGF0b3JzIGNhbiwgYnV0IGFyZSBub3QgcmVxdWlyZWQgdG8sIHN1cHBvcnQgdGhpcyB0eXBlIG9mIHZhbGlkYXRpb24uCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVVUT19WQUxJREFUSU9OID0gSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5BVVRPX0JVSUxEOyAvLyBBdXRvbWF0aWMgaW52b2NhdGlvbiBvZiBhbiBpbmNyZW1lbnRhbCBidWlsZCB0aGF0IHRyaWdnZXJzIGFuIGluY3JlbWVudGFsIHZhbGlkYXRpb24uIFZhbGlkYXRvcnMgY2FuLCBidXQgYXJlIG5vdCByZXF1aXJlZCB0bywgc3VwcG9ydCB0aGlzIHR5cGUgb2YgdmFsaWRhdGlvbi4KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSVU5fVkFMSURBVElPTl9OQU1FID0gIlJVTl9WQUxJREFUSU9OIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFTWU5DX05BTUUgPSAiQVNZTkMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5DUkVNRU5UQUxfVkFMSURBVElPTl9OQU1FID0gIklOQ1JFTUVOVEFMX0JVSUxEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZVTExfVkFMSURBVElPTl9OQU1FID0gIkZVTExfQlVJTEQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUT19WQUxJREFUSU9OX05BTUUgPSAiQVVUT19CVUlMRCI7IC8vJE5PTi1OTFMtMSQKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9pbnRlcm5hbC9yZWdpc3RyeS9CVlRWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3JlZ2lzdHJ5L0JWVFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGUyZTNmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3JlZ2lzdHJ5L0JWVFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODk0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC5yZWdpc3RyeTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbHVnaW5SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LkJWVFZhbGlkYXRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5JT3BlcmF0aW9uUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JQnVmZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSUltcG9ydE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdG9yTWV0YURhdGE7Ci0KLS8qKgotICogQlZUVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyIGlzIGEgc2luZ2xldG9uIHdobyByZWFkcyB0aGUgcGx1Z2luIHJlZ2lzdHJ5Ci0gKiBmb3IgVmFsaWRhdG9yIGV4dGVuc2lvbnMuIFRoZSByZWFkIGlzIGRvbmUgb25jZSAoaW4gdGhlIGNvbnN0cnVjdG9yKS4gCi0gKiAKLSAqIAotICogPGV4dGVuc2lvbgotICoJCXBvaW50ID0gImNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24uZnZ0LnRlc3QiCi0gKgkJaWQgPSAiVmFsaWRhdG9yRlZUIgotICoJCW5hbWUgPSAiVmFsaWRhdG9yIEZWVCBUZXN0Ij4KLSAqCQkJPHRlc3QgcHJvamVjdD0icHJvamVjdE5hbWUiIAotICogCQkJCSAgdmFsaWRhdG9yPSJjb20uaWJtLmV0b29scy52YWxpZGF0aW9uLmVqYi5FSkJWYWxpZGF0b3IiCi0gKiAJCQkJICB2ZXJzaW9uPSIxLjEiPgotICoJCQkJPG1lc3NhZ2UgaWQ9IkNIS0oyODE2IiByZXNvdXJjZT0iZWpiLWphci54bWwiIGxvY2F0aW9uPSIyMTYiLz4KLSAqCQkJCTxtZXNzYWdlIGlkPSJDSEtKMjgxNiIgcmVzb3VyY2U9ImVqYi1qYXIueG1sIiBsb2NhdGlvbj0iMjM3Ii8+Ci0gKgkJCQk8bWVzc2FnZSBpZD0iQ0hLSjI4MTYiIHJlc291cmNlPSJlamItamFyLnhtbCIgbG9jYXRpb249IjI1OCIvPgotICoJCQkJPG1lc3NhZ2UgaWQ9IkNIS0oyODE2IiByZXNvdXJjZT0iZWpiLWphci54bWwiIGxvY2F0aW9uPSIyNzkiLz4KLSAqCQkJCTxtZXNzYWdlIGlkPSJDSEtKMjgxNiIgcmVzb3VyY2U9ImVqYi1qYXIueG1sIiBsb2NhdGlvbj0iMzAwIi8+Ci0gKgkJCTwvdGVzdD4KLSAqIAkJCS4uLiBhcyBtYW55IDx0ZXN0PiBhcyBuZWVkZWQKLSAqIDwvZXh0ZW5zaW9uPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQlZUVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyIGltcGxlbWVudHMgUmVnaXN0cnlDb25zdGFudHMgewotCXByaXZhdGUgc3RhdGljIEJWVFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlciBpbnN0ID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBPcGVyYXRpb25UZXN0UmVhZGVyIF9vcFJlYWRlciA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgVGVzdFNldHVwUmVhZGVyIF9zZXR1cFJlYWRlciA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgVmFsaWRhdGlvblRlc3RSZWFkZXIgX3ZhbFJlYWRlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgcmVnaXN0cnkgaXMgcmVhZCBvbmNlIC0gd2hlbiB0aGlzIGNsYXNzIGlzIGluc3RhbnRpYXRlZC4KLQkgKi8KLQlwcml2YXRlIEJWVFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYWxsIHZpc2libGUgdGVzdCBjYXNlcyBmb3IgYWxsIHByb2plY3RzLgotCSAqLwotCXB1YmxpYyBJVGVzdGNhc2VNZXRhRGF0YVtdIGdldFRlc3RzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlTZXQgdGVzdHMgPSBuZXcgSGFzaFNldCgpOwotCQlWYWxpZGF0b3JUZXN0Y2FzZVtdIHZ0cyA9IGdldFZhbGlkYXRvclRlc3RzKG1vbml0b3IsIChTdHJpbmcpbnVsbCk7Ci0JCWZvcihpbnQgaj0wOyBqPHZ0cy5sZW5ndGg7IGorKykgewotCQkJdGVzdHMuYWRkKHZ0c1tqXSk7Ci0JCX0KLQkJCi0JCU9wZXJhdGlvblRlc3RjYXNlW10gb3RzID0gZ2V0T3BlcmF0aW9uVGVzdHMobW9uaXRvciwgKFN0cmluZyludWxsKTsKLQkJZm9yKGludCBrPTA7IGs8b3RzLmxlbmd0aDsgaysrKSB7Ci0JCQl0ZXN0cy5hZGQob3RzW2tdKTsKLQkJfQotCi0JCUlUZXN0Y2FzZU1ldGFEYXRhW10gcmVzdWx0ID0gbmV3IElUZXN0Y2FzZU1ldGFEYXRhW3Rlc3RzLnNpemUoKV07Ci0JCXRlc3RzLnRvQXJyYXkocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGFsbCB2aXNpYmxlIHRlc3QgY2FzZXMgZm9yIGEgcHJvamVjdC4KLQkgKi8KLQlwdWJsaWMgSVRlc3RjYXNlTWV0YURhdGFbXSBnZXRUZXN0cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElQcm9qZWN0W10gcHJvamVjdHMpIHsKLQkJU2V0IHRlc3RzID0gbmV3IEhhc2hTZXQoKTsKLQkJZm9yKGludCBpPTA7IGk8cHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBwcm9qZWN0c1tpXTsKLQkJCVZhbGlkYXRvclRlc3RjYXNlW10gdnRzID0gZ2V0VmFsaWRhdG9yVGVzdHMobW9uaXRvciwgcHJvamVjdCk7Ci0JCQlmb3IoaW50IGo9MDsgajx2dHMubGVuZ3RoOyBqKyspIHsKLQkJCQl0ZXN0cy5hZGQodnRzW2pdKTsKLQkJCX0KLQkJCQotCQkJT3BlcmF0aW9uVGVzdGNhc2VbXSBvdHMgPSBnZXRPcGVyYXRpb25UZXN0cyhtb25pdG9yLCBwcm9qZWN0KTsKLQkJCWZvcihpbnQgaz0wOyBrPG90cy5sZW5ndGg7IGsrKykgewotCQkJCXRlc3RzLmFkZChvdHNba10pOwotCQkJfQotCQl9Ci0JCQotCQlJVGVzdGNhc2VNZXRhRGF0YVtdIHJlc3VsdCA9IG5ldyBJVGVzdGNhc2VNZXRhRGF0YVt0ZXN0cy5zaXplKCldOwotCQl0ZXN0cy50b0FycmF5KHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCi0JLyoqCi0JICogUmV0dXJuIGFsbCB2YWxpZGF0b3IgdGVzdHMgZm9yIGEgcHJvamVjdC4KLQkgKi8KLQlwdWJsaWMgVmFsaWRhdG9yVGVzdGNhc2VbXSBnZXRBbGxWYWxpZGF0b3JUZXN0cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElQcm9qZWN0IHByb2plY3QpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQlWYWxpZGF0aW9uVGVzdFJlYWRlciByZWFkZXIgPSBnZXRWYWxpZGF0aW9uVGVzdFJlYWRlcigpOwotCQlyZXR1cm4gcmVhZGVyLmdldFZhbGlkYXRvclRlc3RzKG1vbml0b3IsIHByb2plY3QuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYWxsIHRlc3QgY2FzZXMgb2YgdGhlIG5hbWVkIHZhbGlkYXRvcnMgb24gdGhlIGdpdmVuIHByb2plY3QuCi0JICovCQotCXB1YmxpYyBWYWxpZGF0b3JUZXN0Y2FzZVtdIGdldEFsbFZhbGlkYXRvclRlc3RzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSVByb2plY3QgcHJvamVjdCwgU3RyaW5nW10gdmFsaWRhdG9yTmFtZXMpIHsKLQkJU2V0IHRlc3RTZXQgPSBuZXcgSGFzaFNldCgpOwkJCi0JCVZhbGlkYXRvclRlc3RjYXNlW10gdGVzdHMgPSBnZXRBbGxWYWxpZGF0b3JUZXN0cyhtb25pdG9yLCBwcm9qZWN0KTsKLQkJZm9yKGludCBpPTA7IGk8dmFsaWRhdG9yTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyB2YWxpZGF0b3IgPSB2YWxpZGF0b3JOYW1lc1tpXTsKLQkJCWZvcihpbnQgaj0wOyBqPHRlc3RzLmxlbmd0aDsgaisrKSB7Ci0JCQkJVmFsaWRhdG9yVGVzdGNhc2UgdG1kID0gdGVzdHNbal07Ci0JCQkJaWYodG1kLmdldFZhbGlkYXRvckNsYXNzKCkuZXF1YWxzKHZhbGlkYXRvcikpIHsKLQkJCQkJdGVzdFNldC5hZGQodG1kKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlWYWxpZGF0b3JUZXN0Y2FzZVtdIHJlc3VsdCA9IG5ldyBWYWxpZGF0b3JUZXN0Y2FzZVt0ZXN0U2V0LnNpemUoKV07Ci0JCXRlc3RTZXQudG9BcnJheShyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYWxsIG9mIHRoZSB2aXNpYmxlIHRlc3QgY2FzZXMgdGhhdCByZWdpc3RlciBtZXNzYWdlcyBhZ2FpbnN0IHRoaXMgcHJvamVjdC4KLQkgKi8KLQlwdWJsaWMgVmFsaWRhdG9yVGVzdGNhc2VbXSBnZXRWYWxpZGF0b3JUZXN0cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElQcm9qZWN0IHByb2plY3QpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0VmFsaWRhdG9yVGVzdHMobW9uaXRvciwgcHJvamVjdC5nZXROYW1lKCkpOwotCX0KLQotCXByaXZhdGUgVmFsaWRhdGlvblRlc3RSZWFkZXIgZ2V0VmFsaWRhdGlvblRlc3RSZWFkZXIoKSB7Ci0JCWlmKF92YWxSZWFkZXIgPT0gbnVsbCkgewotCQkJX3ZhbFJlYWRlciA9IG5ldyBWYWxpZGF0aW9uVGVzdFJlYWRlcigpOwotCQl9Ci0JCXJldHVybiBfdmFsUmVhZGVyOwotCX0KLQkKLQlwcml2YXRlIE9wZXJhdGlvblRlc3RSZWFkZXIgZ2V0T3BlcmF0aW9uVGVzdFJlYWRlcigpIHsKLQkJaWYoX29wUmVhZGVyID09IG51bGwpIHsKLQkJCV9vcFJlYWRlciA9IG5ldyBPcGVyYXRpb25UZXN0UmVhZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIF9vcFJlYWRlcjsKLQl9Ci0JCi0JcHJpdmF0ZSBUZXN0U2V0dXBSZWFkZXIgZ2V0VGVzdFNldHVwUmVhZGVyKCkgewotCQlpZiAoX3NldHVwUmVhZGVyID09IG51bGwpIHsKLQkJCV9zZXR1cFJlYWRlciA9IG5ldyBUZXN0U2V0dXBSZWFkZXIoKTsKLQkJfQotCQlyZXR1cm4gX3NldHVwUmVhZGVyOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRlc3QgY2FzZXMgbmFtZWQgdGVzdE5hbWUsIG9yIGlmIHRlc3ROYW1lIGlzIG51bGwsIHJldHVybiBhbGwgdGVzdCBjYXNlcy4KLQkgKi8KLQlwdWJsaWMgVmFsaWRhdG9yVGVzdGNhc2VbXSBnZXRWYWxpZGF0b3JUZXN0cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIFN0cmluZyB0ZXN0TmFtZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRWYWxpZGF0aW9uVGVzdFJlYWRlcigpLmdldFZpc2libGVWYWxpZGF0b3JUZXN0cyhtb25pdG9yLCB0ZXN0TmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgdGVzdCBjYXNlcyB0aGF0IHJlZ2lzdGVyIG1lc3NhZ2VzIGFnYWluc3QgdGhpcyBwcm9qZWN0LgotCSAqLwotCXB1YmxpYyBPcGVyYXRpb25UZXN0Y2FzZVtdIGdldE9wZXJhdGlvblRlc3RzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRPcGVyYXRpb25UZXN0cyhtb25pdG9yLCBwcm9qZWN0LmdldE5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0ZXN0IGNhc2VzIG5hbWVkIHRlc3ROYW1lLCBvciBpZiB0ZXN0TmFtZSBpcyBudWxsLCByZXR1cm4gYWxsIHRlc3QgY2FzZXMuCi0JICovCi0JcHVibGljIE9wZXJhdGlvblRlc3RjYXNlW10gZ2V0T3BlcmF0aW9uVGVzdHMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBTdHJpbmcgdGVzdE5hbWUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0T3BlcmF0aW9uVGVzdFJlYWRlcigpLmdldE9wZXJhdGlvblRlc3RzKG1vbml0b3IsIHRlc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBJZiBmaWxlcyBuZWVkIHRvIGJlIGltcG9ydGVkLCBpbXBvcnQgdGhlbSBub3cgKGludG8gcHJvamVjdHMgdGhhdCBhcmUgbmFtZWQKLQkgKiB0aGUgc2FtZSBhcyB0aGUgZmlsZXMuKQotCSAqIAotCSAqIElmIElUZXN0Y2FzZU1ldGFEYXRhIGlzIG5vdCBudWxsLCByZXR1cm4gdGhlIFRlc3RTZXR1cEltcG9ydCBmb3IgdGhhdCBwYXJ0aWN1bGFyIHRlc3QuCi0JICogSWYgSVRlc3RjYXNlTWV0YURhdGEgaXMgbnVsbCwgcmV0dXJuIGFsbCBUZXN0U2V0dXBJbXBvcnQuCi0JICovCi0JcHVibGljIFRlc3RTZXR1cEltcG9ydFtdIGdldFRlc3RTZXR1cChJQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIGRpciwgSVRlc3RjYXNlTWV0YURhdGEgdG1kLCBib29sZWFuIHZlcmJvc2UpIHsKLQkJcmV0dXJuIGdldFRlc3RTZXR1cFJlYWRlcigpLmdldFRlc3RTZXR1cChidWZmZXIsIGRpciwgdG1kLCB2ZXJib3NlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gVmFsaWRhdGlvblRWVFJlZ2lzdHJ5UmVhZGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQlZUVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyIGdldFJlYWRlcigpIHsKLQkJaWYgKGluc3QgPT0gbnVsbCkgewotCQkJaW5zdCA9IG5ldyBCVlRWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIoKTsKLQkJfQotCQlyZXR1cm4gaW5zdDsKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFZhbGlkYXRpb25UZXN0UmVhZGVyIHsKLQkJcHJpdmF0ZSBNYXAgX3ZhbGlkYXRvclRlc3RzID0gbnVsbDsKLQkJCi0JCVZhbGlkYXRpb25UZXN0UmVhZGVyKCkgewotCQl9Ci0JCQotCQlwdWJsaWMgVmFsaWRhdG9yVGVzdGNhc2VbXSBnZXRWaXNpYmxlVmFsaWRhdG9yVGVzdHMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBTdHJpbmcgdGVzdE5hbWUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQkJVmFsaWRhdG9yVGVzdGNhc2VbXSB2dHMgPSBnZXRWYWxpZGF0b3JUZXN0cyhtb25pdG9yLCB0ZXN0TmFtZSk7Ci0JCQlWYWxpZGF0b3JUZXN0Y2FzZVtdIHRlbXAgPSBuZXcgVmFsaWRhdG9yVGVzdGNhc2VbdnRzLmxlbmd0aF07Ci0JCQlpbnQgY291bnQgPSAwOwotCQkJZm9yKGludCBpPTA7IGk8dnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJVmFsaWRhdG9yVGVzdGNhc2UgdnQgPSB2dHNbaV07Ci0JCQkJaWYodnQuaXNWaXNpYmxlKCkpIHsKLQkJCQkJdGVtcFtjb3VudCsrXSA9IHZ0OwotCQkJCX0KLQkJCX0KLQkJCVZhbGlkYXRvclRlc3RjYXNlW10gcmVzdWx0ID0gbmV3IFZhbGlkYXRvclRlc3RjYXNlW2NvdW50XTsKLQkJCVN5c3RlbS5hcnJheWNvcHkodGVtcCwgMCwgcmVzdWx0LCAwLCBjb3VudCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCQotCQlwdWJsaWMgVmFsaWRhdG9yVGVzdGNhc2VbXSBnZXRWYWxpZGF0b3JUZXN0cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIFN0cmluZyB0ZXN0TmFtZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCQlpZiAoX3ZhbGlkYXRvclRlc3RzID09IG51bGwpIHsKLQkJCQlfdmFsaWRhdG9yVGVzdHMgPSBuZXcgSGFzaE1hcCgpOwotCQkJCXJlYWRUZXN0Y2FzZVJlZ2lzdHJ5KG1vbml0b3IpOwotCQkJfQotCQotCQkJQ29sbGVjdGlvbiB0bWRzID0gbnVsbDsKLQkJCWlmICh0ZXN0TmFtZSA9PSBudWxsKSB7Ci0JCQkJdG1kcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBfdmFsaWRhdG9yVGVzdHMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCXRtZHMuYWRkQWxsKChDb2xsZWN0aW9uKSBpdGVyYXRvci5uZXh0KCkpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCXRtZHMgPSAoQ29sbGVjdGlvbikgX3ZhbGlkYXRvclRlc3RzLmdldCh0ZXN0TmFtZSk7Ci0JCQl9Ci0JCQlpZiAoKHRtZHMgPT0gbnVsbCkgfHwgKHRtZHMuc2l6ZSgpID09IDApKSB7Ci0JCQkJcmV0dXJuIG5ldyBWYWxpZGF0b3JUZXN0Y2FzZVswXTsKLQkJCX0KLQkJCVZhbGlkYXRvclRlc3RjYXNlW10gcmVzdWx0ID0gbmV3IFZhbGlkYXRvclRlc3RjYXNlW3RtZHMuc2l6ZSgpXTsKLQkJCXRtZHMudG9BcnJheShyZXN1bHQpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHRlc3QgY2FzZSBpZiBpdCBleGlzdHMuIE90aGVyd2lzZSwgcmV0dXJuIG51bGwuCi0JCSAqLwotCQlwcml2YXRlIFN0cmluZyBnZXRQcm9qZWN0KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfUFJPSkVDVCk7Ci0JCX0KLQotCQlwcml2YXRlIE1lc3NhZ2VNZXRhRGF0YVtdIGdldE1lc3NhZ2VzKFZhbGlkYXRvclRlc3RjYXNlIHRtZCwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IHRlc3RFbGVtZW50KSB7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBtZXNzYWdlcyA9IHRlc3RFbGVtZW50LmdldENoaWxkcmVuKFRBR19NRVNTQUdFKTsKLQkJCWlmICgobWVzc2FnZXMgPT0gbnVsbCkgfHwgKG1lc3NhZ2VzLmxlbmd0aCA9PSAwKSkgewotCQkJCS8vIE5vIG1lc3NhZ2VzIGFyZSBleHBlY3RlZC4KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJTWVzc2FnZU1ldGFEYXRhW10gbW1kTGlzdCA9IG5ldyBNZXNzYWdlTWV0YURhdGFbbWVzc2FnZXMubGVuZ3RoXTsKLQkJCWludCBjb3VudCA9IDA7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IG1lc3NhZ2UgPSBtZXNzYWdlc1tpXTsKLQkJCQlTdHJpbmcgcHJlZml4ID0gbWVzc2FnZS5nZXRBdHRyaWJ1dGUoQVRUX1BSRUZJWCk7Ci0JCQkJaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0JCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsICJFdmVyeSA8bWVzc2FnZT4gbXVzdCBoYXZlIGEgcHJlZml4LiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJLy8gVGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGFyZSBvcHRpb25hbC4JCQkKLQkJCQlTdHJpbmcgcmVzb3VyY2VOYW1lID0gbWVzc2FnZS5nZXRBdHRyaWJ1dGUoQVRUX1JFU09VUkNFKTsKLQkJCQlTdHJpbmcgbG9jYXRpb24gPSBtZXNzYWdlLmdldEF0dHJpYnV0ZShBVFRfTE9DQVRJT04pOwotCQkJCVN0cmluZyB0ZXh0ID0gbWVzc2FnZS5nZXRBdHRyaWJ1dGUoQVRUX1RFWFQpOwotCQkJCWludCBsaW5lTnVtYmVyID0gLTE7Ci0JCQkJTWVzc2FnZU1ldGFEYXRhIG1tZCA9IG51bGw7Ci0JCQkJaWYgKChsb2NhdGlvbiAhPSBudWxsKSkgewotCQkJCQl0cnkgewotCQkJCQkJbGluZU51bWJlciA9IEludGVnZXIucGFyc2VJbnQobG9jYXRpb24pOwotCQkJCQkJbW1kID0gbmV3IE1lc3NhZ2VNZXRhRGF0YSh0bWQsIHByZWZpeCwgcmVzb3VyY2VOYW1lLCBsaW5lTnVtYmVyLCB0ZXh0KTsKLQkJCQkJfQotCQkJCQljYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4YykgewotCQkJCQkJLy8gRG9uJ3QgbmVlZCB0byBsb2cgLSB0aGUgbG9jYXRpb24ganVzdCBpc24ndCBhIG51bWJlci4KLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChtbWQgPT0gbnVsbCkgewotCQkJCQltbWQgPSBuZXcgTWVzc2FnZU1ldGFEYXRhKHRtZCwgcHJlZml4LCByZXNvdXJjZU5hbWUsIGxvY2F0aW9uLCB0ZXh0KTsKLQkJCQl9Ci0KLQkJCQltbWRMaXN0W2NvdW50KytdID0gbW1kOwotCQkJfQotCi0JCQlpZiAoY291bnQgPT0gbW1kTGlzdC5sZW5ndGgpIHsKLQkJCQlyZXR1cm4gbW1kTGlzdDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCU1lc3NhZ2VNZXRhRGF0YVtdIHJlc3VsdCA9IG5ldyBNZXNzYWdlTWV0YURhdGFbY291bnRdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkobW1kTGlzdCwgMCwgcmVzdWx0LCAwLCBjb3VudCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCBhZGRUZXN0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUV4dGVuc2lvbiBleHRlbnNpb24sIElDb25maWd1cmF0aW9uRWxlbWVudFtdIHRlc3RFbGVtZW50cykgewotCQkJbW9uaXRvci5zdWJUYXNrKCJSZWFkaW5nIHRlc3QgY2FzZXM7IHBsZWFzZSB3YWl0Li4uIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBwbHVnaW5JZCA9IGV4dGVuc2lvbi5nZXROYW1lc3BhY2UoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGVzdEVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJbW9uaXRvci5zdWJUYXNrKCJSZWFkaW5nIHRlc3QgY2FzZSAiICsgKGkgKyAxKSArICIgb2YgIiArIHRlc3RFbGVtZW50cy5sZW5ndGgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgdGVzdCA9IHRlc3RFbGVtZW50c1tpXTsKLQotCQkJCVN0cmluZyBwcm9qZWN0TmFtZSA9IGdldFByb2plY3QodGVzdCk7Ci0JCQkJaWYgKHByb2plY3ROYW1lID09IG51bGwpIHsKLQkJCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgIkV2ZXJ5IHRlc3QgbXVzdCBuYW1lIHRoZSBwcm9qZWN0IHRoYXQgaXQgdmVyaWZpZXMuICIgKyB0ZXN0LnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gZ2V0VmFsaWRhdG9yTWV0YURhdGEodGVzdCk7Ci0JCQkJaWYgKHZtZCA9PSBudWxsKSB7Ci0JCQkJCS8vIGFscmVhZHkgbG9nZ2VkLCBzbyBqdXN0IHJlYWQgdGhlIG5leHQgdGVzdCBjYXNlLgotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlTdHJpbmcgaW5wdXRGaWxlTmFtZSA9IGdldElucHV0RmlsZU5hbWUodGVzdCk7Ci0JCQkJaWYgKGlucHV0RmlsZU5hbWUgPT0gbnVsbCkgewotCQkJCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCAiRXZlcnkgdGVzdCBtdXN0IG5hbWUgdGhlIGZpbGUgdG8gYmUgaW1wb3J0ZWQgYW5kIHRoZW4gdGVzdGVkLiIgKyB0ZXN0LnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJYm9vbGVhbiB2aXNpYmxlID0gZ2V0VmlzaWJsZSh0ZXN0KTsKLQotCQkJCVZhbGlkYXRvclRlc3RjYXNlIHRtZCA9IG5ldyBWYWxpZGF0b3JUZXN0Y2FzZShwbHVnaW5JZCwgcHJvamVjdE5hbWUsIHZtZCwgaW5wdXRGaWxlTmFtZSwgdmlzaWJsZSk7Ci0JCQkJdG1kLnNldE1lc3NhZ2VzKGdldE1lc3NhZ2VzKHRtZCwgdGVzdCkpOwotCi0JCQkJLy8gTm93IGFkZCB0aGUgdGVzdCBjYXNlIHRvIHRoZSBNYXAsIHdpdGggdGhlIHByb2plY3QgbmFtZSBhcyB0aGUga2V5IGludG8gCi0JCQkJLy8gdGhlIG1hcC4KLQkJCQlTZXQgcHJqVG1kID0gKFNldCkgX3ZhbGlkYXRvclRlc3RzLmdldChwcm9qZWN0TmFtZSk7Ci0JCQkJaWYgKHByalRtZCA9PSBudWxsKSB7Ci0JCQkJCXByalRtZCA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJfQotCQkJCXByalRtZC5hZGQodG1kKTsKLQkJCQlfdmFsaWRhdG9yVGVzdHMucHV0KHByb2plY3ROYW1lLCBwcmpUbWQpOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHJpZXZlIGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcyB3aXRoIHRoZSBnaXZlbiBmdWxseS1xdWFsaWZpZWQgbmFtZS4KLQkJICogSWYgbm8gc3VjaCBjbGFzcyBjYW4gYmUgZm91bmQsIHJldHVybiBudWxsLgotCQkgKi8KLQkJcHJpdmF0ZSBWYWxpZGF0b3JNZXRhRGF0YSBnZXRWYWxpZGF0b3JNZXRhRGF0YShJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCAiSUNvbmZpZ3VyYXRpb25FbGVtZW50IGlzIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJU3RyaW5nIHZhbGlkYXRvckNsYXNzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1ZBTElEQVRPUik7Ci0JCQl0cnkgewotCQkJCWlmICh2YWxpZGF0b3JDbGFzcyA9PSBudWxsKSB7Ci0JCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsICJDYW5ub3QgbG9jYXRlIHZhbGlkYXRvciBhdHRyaWJ1dGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5nZXRWYWxpZGF0b3JNZXRhRGF0YSh2YWxpZGF0b3JDbGFzcyk7Ci0JCQkJaWYgKHZtZCA9PSBudWxsKSB7Ci0JCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsICJDb3VsZCBub3QgZmluZCB2YWxpZGF0b3IgIiArIHZhbGlkYXRvckNsYXNzKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiB2bWQ7Ci0JCQl9Ci0JCQljYXRjaCAoVGhyb3dhYmxlIGV4YykgewotCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCAiVGhyb3dhYmxlIGNhdWdodCB3aGlsZSByZXRyaWV2aW5nIElWYWxpZGF0b3IgIiArIHZhbGlkYXRvckNsYXNzKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBSZWFkcyB0aGUgcmVnaXN0cnkgdG8gZmluZCB0aGUgdGVzdCBjYXNlcyB0aGF0IGhhdmUgYmVlbiBpbXBsZW1lbnRlZC4KLQkJICovCi0JCXByaXZhdGUgdm9pZCByZWFkVGVzdGNhc2VSZWdpc3RyeShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCS8vIEdldCB0aGUgZXh0ZW5zaW9ucyB0aGF0IGhhdmUgYmVlbiByZWdpc3RlcmVkLgotCQkJSUV4dGVuc2lvblBvaW50IHZhbGlkYXRvckVQID0gZ2V0VGVzdGNhc2VFeHRlbnNpb25Qb2ludCgpOwotCQkJaWYgKHZhbGlkYXRvckVQID09IG51bGwpIHsKLQkJCQkvLyBlcnJvciBsb2dnZWQgaW4gZ2V0VmFsaWRhdG9yVFZURXh0ZW5zaW9uUG9pbnQKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IHZhbGlkYXRvckVQLmdldEV4dGVuc2lvbnMoKTsKLQotCQkJLy8gZmluZCBhbGwgcnVudGltZSBpbXBsZW1lbnRhdGlvbnMKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCXJlYWRUZXN0Y2FzZUV4dGVuc2lvbihtb25pdG9yLCBleHRlbnNpb25zW2ldKTsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBSZWFkcyBvbmUgZXh0ZW5zaW9uIGJ5IGxvb3BpbmcgdGhyb3VnaCBpdHMgY29uZmlndXJhdGlvbiBlbGVtZW50cy4KLQkJICovCi0JCXByaXZhdGUgdm9pZCByZWFkVGVzdGNhc2VFeHRlbnNpb24oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJRXh0ZW5zaW9uIGV4dGVuc2lvbikgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBleHRlbnNpb24uZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQlpZiAoKGVsZW1lbnRzID09IG51bGwpIHx8IChlbGVtZW50cy5sZW5ndGggPT0gMCkpIHsKLQkJCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgIk5vIHRlc3RzIGZvdW5kIGZvciAiICsgZXh0ZW5zaW9uLmdldExhYmVsKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0KLQkJCWFkZFRlc3QobW9uaXRvciwgZXh0ZW5zaW9uLCBlbGVtZW50cyk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJucyB0aGUgb3BlcmF0aW9uIGV4dGVuc2lvbiBwb2ludAotCQkgKi8KLQkJcHJpdmF0ZSBJRXh0ZW5zaW9uUG9pbnQgZ2V0VGVzdGNhc2VFeHRlbnNpb25Qb2ludCgpIHsKLQkJCUlQbHVnaW5SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldFBsdWdpblJlZ2lzdHJ5KCk7Ci0JCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSByZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChQTFVHSU5fSUQsIFZBTElEQVRPUl9URVNUQ0FTRV9FWFRfUFRfSUQpOwotCQkJaWYgKGV4dGVuc2lvblBvaW50ID09IG51bGwpIHsKLQkJCQkvLyBJZiB0aGlzIGhhcHBlbnMgaXQgbWVhbnMgdGhhdCBzb21lb25lIHJlbW92ZWQgdGhlICJ2YWxpZGF0b3IiIGV4dGVuc2lvbiBwb2ludCBkZWNsYXJhdGlvbiAKLQkJCQkvLyBmcm9tIG91ciBwbHVnaW4ueG1sIGZpbGUuCi0JCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIFBMVUdJTl9JRCArICIuIiArIFZBTElEQVRPUl9URVNUQ0FTRV9FWFRfUFRfSUQgKyAiIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgdmFsaWRhdGlvbiBUVlQgcGx1Z2luLnhtbCBmaWxlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBleHRlbnNpb25Qb2ludDsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXRyaWV2ZSB0aGUgbmFtZSBvZiB0aGUgaW5wdXQgd2hpY2ggbXVzdCBiZSBpbXBvcnRlZCBiZWZvcmUgdGhlIHRlc3QgY2FzZSBjYW4gYmUgcnVuLgotCQkgKiBSZXR1cm4gbnVsbCBpZiBubyBpbnB1dCBuYW1lIGlzIHNldC4KLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBnZXRWaXNpYmxlKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsICJnZXRWaXNpYmxlOjpJQ29uZmlndXJhdGlvbkVsZW1lbnQgaXMgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJU3RyaW5nIGF0dHJpYiA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9WSVNJQkxFKTsKLQkJCWlmIChhdHRyaWIgPT0gbnVsbCkgewotCQkJCS8vIGRlZmF1bHQgaXMgdmlzaWJsZQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKGF0dHJpYikuYm9vbGVhblZhbHVlKCk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0cmlldmUgdGhlIG5hbWUgb2YgdGhlIGlucHV0IHdoaWNoIG11c3QgYmUgaW1wb3J0ZWQgYmVmb3JlIHRoZSB0ZXN0IGNhc2UgY2FuIGJlIHJ1bi4KLQkJICogUmV0dXJuIG51bGwgaWYgbm8gaW5wdXQgbmFtZSBpcyBzZXQuCi0JCSAqLwotCQlwcml2YXRlIFN0cmluZyBnZXRJbnB1dEZpbGVOYW1lKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsICJnZXRJbnB1dEZpbGVOYW1lOjpJQ29uZmlndXJhdGlvbkVsZW1lbnQgaXMgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0lOUFVUKTsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBjbGFzcyBPcGVyYXRpb25UZXN0UmVhZGVyIHsKLQkJcHJpdmF0ZSBNYXAgX29wZXJhdGlvblRlc3RzID0gbnVsbDsKLQotCQlPcGVyYXRpb25UZXN0UmVhZGVyKCkgewotCQl9Ci0JCQotCQkvKioKLQkJICogUmV0dXJuIHRoZSB0ZXN0IGNhc2VzIG5hbWVkIHRlc3ROYW1lLCBvciBpZiB0ZXN0TmFtZSBpcyBudWxsLCByZXR1cm4gYWxsIHRlc3QgY2FzZXMuCi0JCSAqLwotCQlwdWJsaWMgT3BlcmF0aW9uVGVzdGNhc2VbXSBnZXRPcGVyYXRpb25UZXN0cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIFN0cmluZyB0ZXN0TmFtZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCQlpZiAoX29wZXJhdGlvblRlc3RzID09IG51bGwpIHsKLQkJCQlfb3BlcmF0aW9uVGVzdHMgPSBuZXcgSGFzaE1hcCgpOwotCQkJCXJlYWRPcGVyYXRpb25UZXN0Y2FzZVJlZ2lzdHJ5KG1vbml0b3IpOwotCQkJfQotCi0JCQlDb2xsZWN0aW9uIHRtZHMgPSBudWxsOwotCQkJaWYgKHRlc3ROYW1lID09IG51bGwpIHsKLQkJCQl0bWRzID0gbmV3IEhhc2hTZXQoKTsKLQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IF9vcGVyYXRpb25UZXN0cy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJdG1kcy5hZGRBbGwoKENvbGxlY3Rpb24pIGl0ZXJhdG9yLm5leHQoKSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdG1kcyA9IChDb2xsZWN0aW9uKSBfb3BlcmF0aW9uVGVzdHMuZ2V0KHRlc3ROYW1lKTsKLQkJCX0KLQkJCWlmICgodG1kcyA9PSBudWxsKSB8fCAodG1kcy5zaXplKCkgPT0gMCkpIHsKLQkJCQlyZXR1cm4gbmV3IE9wZXJhdGlvblRlc3RjYXNlWzBdOwotCQkJfQotCQkJT3BlcmF0aW9uVGVzdGNhc2VbXSByZXN1bHQgPSBuZXcgT3BlcmF0aW9uVGVzdGNhc2VbdG1kcy5zaXplKCldOwotCQkJdG1kcy50b0FycmF5KHJlc3VsdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHJpZXZlIHRoZSBuYW1lIG9mIHRoZSBpbnB1dCB3aGljaCBtdXN0IGJlIGltcG9ydGVkIGJlZm9yZSB0aGUgdGVzdCBjYXNlIGNhbiBiZSBydW4uCi0JCSAqIFJldHVybiBudWxsIGlmIG5vIGlucHV0IG5hbWUgaXMgc2V0LgotCQkgKi8KLQkJcHJpdmF0ZSBTdHJpbmcgZ2V0SW5wdXRGaWxlTmFtZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCAiZ2V0SW5wdXRGaWxlTmFtZTo6SUNvbmZpZ3VyYXRpb25FbGVtZW50IGlzIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9JTlBVVCk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgYWRkT3BlcmF0aW9uVGVzdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElFeHRlbnNpb24gZXh0ZW5zaW9uLCBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSB0ZXN0RWxlbWVudHMpIHsKLQkJCW1vbml0b3Iuc3ViVGFzaygiUmVhZGluZyB0ZXN0IGNhc2VzOyBwbGVhc2Ugd2FpdC4uLiIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgcGx1Z2luSWQgPSBleHRlbnNpb24uZ2V0TmFtZXNwYWNlKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHRlc3RFbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCW1vbml0b3Iuc3ViVGFzaygiUmVhZGluZyB0ZXN0IGNhc2UgIiArIChpICsgMSkgKyAiIG9mICIgKyB0ZXN0RWxlbWVudHMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IHRlc3QgPSB0ZXN0RWxlbWVudHNbaV07Ci0KLQkJCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBnZXRQcm9qZWN0KHRlc3QpOwotCQkJCWlmIChwcm9qZWN0TmFtZSA9PSBudWxsKSB7Ci0JCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsICJFdmVyeSB0ZXN0IG11c3QgbmFtZSB0aGUgcHJvamVjdCB0aGF0IGl0IHZlcmlmaWVzLiAiICsgdGVzdC50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCUlPcGVyYXRpb25SdW5uYWJsZSBvcCA9IGdldE9wZXJhdGlvbih0ZXN0KTsKLQkJCQlpZiAob3AgPT0gbnVsbCkgewotCQkJCQkvLyBhbHJlYWR5IGxvZ2dlZCwgc28ganVzdCByZWFkIHRoZSBuZXh0IHRlc3QgY2FzZS4KLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJU3RyaW5nIGlucHV0RmlsZU5hbWUgPSBnZXRJbnB1dEZpbGVOYW1lKHRlc3QpOwotCQkJCWlmIChpbnB1dEZpbGVOYW1lID09IG51bGwpIHsKLQkJCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgIkV2ZXJ5IHRlc3QgbXVzdCBuYW1lIHRoZSBmaWxlIHRvIGJlIGltcG9ydGVkIGFuZCB0aGVuIHRlc3RlZC4iICsgdGVzdC50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCVN0cmluZyBpZCA9IGV4dGVuc2lvbi5nZXRMYWJlbCgpOwotCi0JCQkJT3BlcmF0aW9uVGVzdGNhc2UgdG1kID0gbmV3IE9wZXJhdGlvblRlc3RjYXNlKHBsdWdpbklkLCBwcm9qZWN0TmFtZSwgaWQsIGlucHV0RmlsZU5hbWUsIG9wKTsKLQotCQkJCS8vIE5vdyBhZGQgdGhlIHRlc3QgY2FzZSB0byB0aGUgTWFwLCB3aXRoIHRoZSBwcm9qZWN0IG5hbWUgYXMgdGhlIGtleSBpbnRvIAotCQkJCS8vIHRoZSBtYXAuCi0JCQkJU2V0IHByalRtZCA9IChTZXQpIF9vcGVyYXRpb25UZXN0cy5nZXQocHJvamVjdE5hbWUpOwotCQkJCWlmIChwcmpUbWQgPT0gbnVsbCkgewotCQkJCQlwcmpUbWQgPSBuZXcgSGFzaFNldCgpOwotCQkJCX0KLQkJCQlwcmpUbWQuYWRkKHRtZCk7Ci0JCQkJX29wZXJhdGlvblRlc3RzLnB1dChwcm9qZWN0TmFtZSwgcHJqVG1kKTsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBSZWFkcyBvbmUgZXh0ZW5zaW9uIGJ5IGxvb3BpbmcgdGhyb3VnaCBpdHMgY29uZmlndXJhdGlvbiBlbGVtZW50cy4KLQkJICovCi0JCXByaXZhdGUgdm9pZCByZWFkT3BlcmF0aW9uVGVzdGNhc2VFeHRlbnNpb24oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJRXh0ZW5zaW9uIGV4dGVuc2lvbikgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBleHRlbnNpb24uZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQlpZiAoKGVsZW1lbnRzID09IG51bGwpIHx8IChlbGVtZW50cy5sZW5ndGggPT0gMCkpIHsKLQkJCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgIk5vIHRlc3RzIGZvdW5kIGZvciAiICsgZXh0ZW5zaW9uLmdldExhYmVsKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0KLQkJCWFkZE9wZXJhdGlvblRlc3QobW9uaXRvciwgZXh0ZW5zaW9uLCBlbGVtZW50cyk7Ci0JCX0KLQotCQkvKioKLQkJICogUmVhZHMgdGhlIHJlZ2lzdHJ5IHRvIGZpbmQgdGhlIHRlc3QgY2FzZXMgdGhhdCBoYXZlIGJlZW4gaW1wbGVtZW50ZWQuCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgcmVhZE9wZXJhdGlvblRlc3RjYXNlUmVnaXN0cnkoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkvLyBHZXQgdGhlIGV4dGVuc2lvbnMgdGhhdCBoYXZlIGJlZW4gcmVnaXN0ZXJlZC4KLQkJCUlFeHRlbnNpb25Qb2ludCBvcEVQID0gZ2V0T3BlcmF0aW9uVGVzdGNhc2VFeHRlbnNpb25Qb2ludCgpOwotCQkJaWYgKG9wRVAgPT0gbnVsbCkgewotCQkJCS8vIGVycm9yIGxvZ2dlZCBpbiBnZXRWYWxpZGF0b3JUVlRFeHRlbnNpb25Qb2ludAotCQkJCXJldHVybjsKLQkJCX0KLQkJCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gb3BFUC5nZXRFeHRlbnNpb25zKCk7Ci0KLQkJCS8vIGZpbmQgYWxsIHJ1bnRpbWUgaW1wbGVtZW50YXRpb25zCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlyZWFkT3BlcmF0aW9uVGVzdGNhc2VFeHRlbnNpb24obW9uaXRvciwgZXh0ZW5zaW9uc1tpXSk7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UgaWYgaXQgZXhpc3RzLiBPdGhlcndpc2UsIHJldHVybiBudWxsLgotCQkgKi8KLQkJcHJpdmF0ZSBTdHJpbmcgZ2V0UHJvamVjdChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1BST0pFQ1QpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybnMgdGhlIFRlc3RDYXNlIGV4dGVuc2lvbiBwb2ludAotCQkgKi8KLQkJcHJpdmF0ZSBJRXh0ZW5zaW9uUG9pbnQgZ2V0T3BlcmF0aW9uVGVzdGNhc2VFeHRlbnNpb25Qb2ludCgpIHsKLQkJCUlQbHVnaW5SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldFBsdWdpblJlZ2lzdHJ5KCk7Ci0JCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSByZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChQTFVHSU5fSUQsIFZBTElEQVRPUl9PUEVSQVRJT05fVEVTVENBU0VfRVhUX1BUX0lEKTsKLQkJCWlmIChleHRlbnNpb25Qb2ludCA9PSBudWxsKSB7Ci0JCQkJLy8gSWYgdGhpcyBoYXBwZW5zIGl0IG1lYW5zIHRoYXQgc29tZW9uZSByZW1vdmVkIHRoZSAib3B0ZXN0IiBleHRlbnNpb24gcG9pbnQgZGVjbGFyYXRpb24gCi0JCQkJLy8gZnJvbSBvdXIgcGx1Z2luLnhtbCBmaWxlLgotCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBQTFVHSU5fSUQgKyAiLiIgKyBWQUxJREFUT1JfT1BFUkFUSU9OX1RFU1RDQVNFX0VYVF9QVF9JRCArICIgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSB2YWxpZGF0aW9uIFRWVCBwbHVnaW4ueG1sIGZpbGUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGV4dGVuc2lvblBvaW50OwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHJpZXZlIGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcyB3aXRoIHRoZSBnaXZlbiBmdWxseS1xdWFsaWZpZWQgbmFtZS4KLQkJICogSWYgbm8gc3VjaCBjbGFzcyBjYW4gYmUgZm91bmQsIHJldHVybiBudWxsLgotCQkgKi8KLQkJcHJpdmF0ZSBJT3BlcmF0aW9uUnVubmFibGUgZ2V0T3BlcmF0aW9uKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsICJJQ29uZmlndXJhdGlvbkVsZW1lbnQgaXMgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlTdHJpbmcgb3BDbGFzcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9PUEVSQVRJT04pOwotCQkJdHJ5IHsKLQkJCQlpZiAob3BDbGFzcyA9PSBudWxsKSB7Ci0JCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsICJDYW5ub3QgbG9jYXRlIG9wZXJhdGlvbiBhdHRyaWJ1dGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCi0JCQkJSU9wZXJhdGlvblJ1bm5hYmxlIG9wID0gKElPcGVyYXRpb25SdW5uYWJsZSkgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKEFUVF9PUEVSQVRJT04pOwotCQkJCWlmIChvcCA9PSBudWxsKSB7Ci0JCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsICJDb3VsZCBub3QgZmluZCBvcGVyYXRpb24gIiArIG9wQ2xhc3MpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIG9wOwotCQkJfQotCQkJY2F0Y2ggKFRocm93YWJsZSBleGMpIHsKLQkJCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgIlRocm93YWJsZSBjYXVnaHQgd2hpbGUgcmV0cmlldmluZyBJVmFsaWRhdG9yICIgKyBvcENsYXNzKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBjbGFzcyBUZXN0U2V0dXBSZWFkZXIgewotCQlwcml2YXRlIFRlc3RTZXR1cEltcG9ydFtdIF90ZXN0U2V0dXAgPSBudWxsOwotCi0JCVRlc3RTZXR1cFJlYWRlcigpIHsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIFJldHJpZXZlIHRoZSBuYW1lIG9mIHRoZSBpbnB1dCB3aGljaCBtdXN0IGJlIGltcG9ydGVkIGJlZm9yZSB0aGUgdGVzdCBjYXNlIGNhbiBiZSBydW4uCi0JCSAqIFJldHVybiBudWxsIGlmIG5vIGlucHV0IG5hbWUgaXMgc2V0LgotCQkgKi8KLQkJcHJpdmF0ZSBTdHJpbmcgZ2V0SW5wdXRGaWxlTmFtZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCAiZ2V0SW5wdXRGaWxlTmFtZTo6SUNvbmZpZ3VyYXRpb25FbGVtZW50IGlzIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9JTlBVVCk7Ci0JCX0KLQotCQkvKioKLQkJICogSWYgZmlsZXMgbmVlZCB0byBiZSBpbXBvcnRlZCwgaW1wb3J0IHRoZW0gbm93IChpbnRvIHByb2plY3RzIHRoYXQgYXJlIG5hbWVkCi0JCSAqIHRoZSBzYW1lIGFzIHRoZSBmaWxlcy4pCi0JCSAqIAotCQkgKiBJZiBJVGVzdGNhc2VNZXRhRGF0YSBpcyBub3QgbnVsbCwgcmV0dXJuIHRoZSBUZXN0U2V0dXBJbXBvcnQgZm9yIHRoYXQgcGFydGljdWxhciB0ZXN0LgotCQkgKiBJZiBJVGVzdGNhc2VNZXRhRGF0YSBpcyBudWxsLCByZXR1cm4gYWxsIFRlc3RTZXR1cEltcG9ydC4KLQkJICovCi0JCXB1YmxpYyBUZXN0U2V0dXBJbXBvcnRbXSBnZXRUZXN0U2V0dXAoSUJ1ZmZlciBidWZmZXIsIFN0cmluZyBkaXIsIElUZXN0Y2FzZU1ldGFEYXRhIHRtZCwgYm9vbGVhbiB2ZXJib3NlKSB7Ci0JCQlpZiAoX3Rlc3RTZXR1cCA9PSBudWxsKSB7Ci0JCQkJcmVhZFNldHVwUmVnaXN0cnkoYnVmZmVyLCB2ZXJib3NlKTsKLQkJCX0KLQkJCWlmICh0bWQgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgX3Rlc3RTZXR1cC5sZW5ndGg7IGorKykgewotCQkJCQlUZXN0U2V0dXBJbXBvcnQgdHNpID0gX3Rlc3RTZXR1cFtqXTsKLQkJCQkJaWYgKHRzaS5nZXRGaWxlTmFtZSgpLmVuZHNXaXRoKHRtZC5nZXRJbnB1dEZpbGVOYW1lKCkpKSB7Ci0JCQkJCQlyZXR1cm4gbmV3IFRlc3RTZXR1cEltcG9ydFtdIHsgdHNpIH07Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIG5ldyBUZXN0U2V0dXBJbXBvcnRbMF07Ci0JCQl9Ci0JCQlyZXR1cm4gX3Rlc3RTZXR1cDsKLQkJfQotCQotCQlwcml2YXRlIHZvaWQgYWRkU2V0dXAoSUJ1ZmZlciBidWZmZXIsIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGltcG9ydEVsZW1lbnRzLCBib29sZWFuIHZlcmJvc2UpIHsKLQkJCWlmICgoaW1wb3J0RWxlbWVudHMgPT0gbnVsbCkgfHwgKGltcG9ydEVsZW1lbnRzLmxlbmd0aCA9PSAwKSkgewotCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQlTdHJpbmcgbWVzc2FnZSA9ICJObyB0ZXN0IHNldHVwIGZvdW5kIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBtZXNzYWdlKTsKLQkJCQkJYnVmZmVyLndyaXRlKG1lc3NhZ2UpOwotCQkJCX0KLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCVRlc3RTZXR1cEltcG9ydFtdIHRlbXAgPSBuZXcgVGVzdFNldHVwSW1wb3J0W2ltcG9ydEVsZW1lbnRzLmxlbmd0aF07Ci0JCQlpbnQgY291bnQgPSAwOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbXBvcnRFbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBpbXBvcnRFbGVtZW50ID0gaW1wb3J0RWxlbWVudHNbaV07Ci0JCQkJU3RyaW5nIGlucHV0RmlsZU5hbWUgPSBnZXRJbnB1dEZpbGVOYW1lKGltcG9ydEVsZW1lbnQpOwotCQkJCWlmIChpbnB1dEZpbGVOYW1lID09IG51bGwpIHsKLQkJCQkJLy8gQWxyZWFkeSBsb2dnZWQgaW4gZ2V0SW5wdXRGaWxlTmFtZQotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlJSW1wb3J0T3BlcmF0aW9uIG9wID0gZ2V0SW1wb3J0T3BlcmF0aW9uKGJ1ZmZlciwgaW1wb3J0RWxlbWVudCk7Ci0JCQkJaWYgKG9wID09IG51bGwpIHsKLQkJCQkJYnVmZmVyLndyaXRlKCJJbXBvcnQgb3BlcmF0aW9uIGNhbm5vdCBiZSBmb3VuZC4gSWdub3JpbmcgaW1wb3J0LiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlUZXN0U2V0dXBJbXBvcnQgdHMgPSBuZXcgVGVzdFNldHVwSW1wb3J0KG9wLCBpbnB1dEZpbGVOYW1lKTsKLQkJCQl0ZW1wW2NvdW50KytdID0gdHM7Ci0JCQl9Ci0KLQkJCWlmIChfdGVzdFNldHVwID09IG51bGwpIHsKLQkJCQlpZiAoY291bnQgPT0gdGVtcC5sZW5ndGgpIHsKLQkJCQkJX3Rlc3RTZXR1cCA9IHRlbXA7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlfdGVzdFNldHVwID0gbmV3IFRlc3RTZXR1cEltcG9ydFtjb3VudF07Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkodGVtcCwgMCwgX3Rlc3RTZXR1cCwgMCwgY291bnQpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCVRlc3RTZXR1cEltcG9ydFtdIG5ld1Rlc3RTZXR1cCA9IG5ldyBUZXN0U2V0dXBJbXBvcnRbX3Rlc3RTZXR1cC5sZW5ndGggKyBjb3VudF07Ci0JCQkJU3lzdGVtLmFycmF5Y29weShfdGVzdFNldHVwLCAwLCBuZXdUZXN0U2V0dXAsIDAsIF90ZXN0U2V0dXAubGVuZ3RoKTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KHRlbXAsIDAsIG5ld1Rlc3RTZXR1cCwgX3Rlc3RTZXR1cC5sZW5ndGgsIGNvdW50KTsKLQkJCQlfdGVzdFNldHVwID0gbmV3VGVzdFNldHVwOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIFJlYWRzIG9uZSBleHRlbnNpb24gYnkgbG9vcGluZyB0aHJvdWdoIGl0cyBjb25maWd1cmF0aW9uIGVsZW1lbnRzLgotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHJlYWRTZXR1cEV4dGVuc2lvbihJQnVmZmVyIGJ1ZmZlciwgSUV4dGVuc2lvbiBleHRlbnNpb24sIGJvb2xlYW4gdmVyYm9zZSkgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBleHRlbnNpb24uZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQlhZGRTZXR1cChidWZmZXIsIGVsZW1lbnRzLCB2ZXJib3NlKTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm5zIHRoZSBUZXN0Q2FzZVNldHVwIGV4dGVuc2lvbiBwb2ludAotCQkgKi8KLQkJcHJpdmF0ZSBJRXh0ZW5zaW9uUG9pbnQgZ2V0U2V0dXBFeHRlbnNpb25Qb2ludCgpIHsKLQkJCUlQbHVnaW5SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldFBsdWdpblJlZ2lzdHJ5KCk7Ci0JCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSByZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChQTFVHSU5fSUQsIFZBTElEQVRPUl9TRVRVUF9FWFRfUFRfSUQpOwotCQkJaWYgKGV4dGVuc2lvblBvaW50ID09IG51bGwpIHsKLQkJCQkvLyBJZiB0aGlzIGhhcHBlbnMgaXQgbWVhbnMgdGhhdCBzb21lb25lIHJlbW92ZWQgdGhlICJ2YWxpZGF0b3IiIGV4dGVuc2lvbiBwb2ludCBkZWNsYXJhdGlvbiAKLQkJCQkvLyBmcm9tIG91ciBwbHVnaW4ueG1sIGZpbGUuCi0JCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIFBMVUdJTl9JRCArICIuIiArIFZBTElEQVRPUl9TRVRVUF9FWFRfUFRfSUQgKyAiIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgdmFsaWRhdGlvbiBUVlQgcGx1Z2luLnhtbCBmaWxlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBleHRlbnNpb25Qb2ludDsKLQkJfQotCi0JCS8qKgotCQkgKiBSZWFkcyB0aGUgcmVnaXN0cnkgdG8gZmluZCB0aGUgdGVzdCBzZXR1cCB0aGF0IG11c3QgYmUgcGVyZm9ybWVkLgotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHJlYWRTZXR1cFJlZ2lzdHJ5KElCdWZmZXIgYnVmZmVyLCBib29sZWFuIHZlcmJvc2UpIHsKLQkJCS8vIEdldCB0aGUgZXh0ZW5zaW9ucyB0aGF0IGhhdmUgYmVlbiByZWdpc3RlcmVkLgotCQkJSUV4dGVuc2lvblBvaW50IHZhbGlkYXRvckVQID0gZ2V0U2V0dXBFeHRlbnNpb25Qb2ludCgpOwotCQkJaWYgKHZhbGlkYXRvckVQID09IG51bGwpIHsKLQkJCQkvLyBlcnJvciBsb2dnZWQgaW4gZ2V0VmFsaWRhdG9yVFZURXh0ZW5zaW9uUG9pbnQKLQkJCQlidWZmZXIud3JpdGUoIkV4dGVuc2lvbiBwb2ludCBpcyBtaXNzaW5nLiBDYW5ub3QgaW1wb3J0IHRlc3QgY2FzZXMuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IHZhbGlkYXRvckVQLmdldEV4dGVuc2lvbnMoKTsKLQkJCWlmIChleHRlbnNpb25zLmxlbmd0aCA9PSAwKSB7Ci0JCQkJYnVmZmVyLndyaXRlKCJObyBleHRlbnNpb25zIGZvdW5kLiBDYW5ub3QgaW1wb3J0IHRlc3QgY2FzZXMuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCS8vIGZpbmQgYWxsIHJ1bnRpbWUgaW1wbGVtZW50YXRpb25zCi0JCQlidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuc3ViVGFzaygiUmVhZGluZyBzZXR1cCA8aW1wb3J0PiBleHRlbnNpb25zOyBwbGVhc2Ugd2FpdC4uLiIpOyAvLyROT04tTkxTLTEkCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuc3ViVGFzaygiUmVhZGluZyBzZXR1cCA8aW1wb3J0PiAiICsgKGkgKyAxKSArICIgb2YgIiArIGV4dGVuc2lvbnMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJcmVhZFNldHVwRXh0ZW5zaW9uKGJ1ZmZlciwgZXh0ZW5zaW9uc1tpXSwgdmVyYm9zZSk7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIGFuIGluc3RhbmNlIG9mIHRoZSBvcGVyYXRpb24gd2hpY2ggaXMgdXNlZCB0byBpbXBvcnQgdGhlIGlucHV0LgotCQkgKi8KLQkJcHJpdmF0ZSBJSW1wb3J0T3BlcmF0aW9uIGdldEltcG9ydE9wZXJhdGlvbihJQnVmZmVyIGJ1ZmZlciwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSAiSUNvbmZpZ3VyYXRpb25FbGVtZW50IGlzIG51bGwiOyAvLyROT04tTkxTLTEkCi0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIG1lc3NhZ2UpOwotCQkJCQlidWZmZXIud3JpdGUobWVzc2FnZSk7Ci0JCQkJfQotCQkJfQotCi0JCQlTdHJpbmcgb3BDbGFzcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9PUEVSQVRJT04pOwotCQkJdHJ5IHsKLQkJCQlpZiAob3BDbGFzcyA9PSBudWxsKSB7Ci0JCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJCVN0cmluZyBtZXNzYWdlID0gIkJlY2F1c2UgdGhlcmUgaXMgbm8gb3BlcmF0aW9uIGF0dHJpYnV0ZSwgYXNzdW1pbmcgdGhhdCB0aGUgaW5wdXQgaXMgYSB3b3Jrc3BhY2UuIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgbWVzc2FnZSk7Ci0JCQkJCQlidWZmZXIud3JpdGUobWVzc2FnZSk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQkJT2JqZWN0IHRlbXAgPSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQVRUX09QRVJBVElPTik7Ci0JCQkJaWYgKHRlbXAgPT0gbnVsbCkgewotCQkJCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCQlTdHJpbmcgbWVzc2FnZSA9ICJvcGVyYXRpb24gIiArIG9wQ2xhc3MgKyAiIGNhbm5vdCBiZSBjcmVhdGVkLiBJZ25vcmluZyB0aGUgdGVzdCBjYXNlLiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgbWVzc2FnZSk7Ci0JCQkJCQlidWZmZXIud3JpdGUobWVzc2FnZSk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHRlbXAgaW5zdGFuY2VvZiBJSW1wb3J0T3BlcmF0aW9uKSB7Ci0JCQkJCXJldHVybiAoSUltcG9ydE9wZXJhdGlvbikgdGVtcDsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJCVN0cmluZyBtZXNzYWdlID0gIm9wZXJhdGlvbiBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIElJbXBvcnRPcGVyYXRpb24uIElnbm9yaW5nIHRoZSB0ZXN0IGNhc2UuIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgbWVzc2FnZSk7Ci0JCQkJCQlidWZmZXIud3JpdGUobWVzc2FnZSk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKFRocm93YWJsZSBleGMpIHsKLQkJCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSAiVGhyb3dhYmxlIGNhdWdodCB3aGlsZSByZXRyaWV2aW5nIElJbXBvcnRPcGVyYXRpb24gIiArIG9wQ2xhc3MgKyAiIElnbm9yaW5nIHRoZSB0ZXN0IGNhc2UuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIG1lc3NhZ2UpOwotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJCQlidWZmZXIud3JpdGUobWVzc2FnZSk7Ci0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvaW50ZXJuYWwvcmVnaXN0cnkvQnVpbGRJbmZvLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9pbnRlcm5hbC9yZWdpc3RyeS9CdWlsZEluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE0YTdhNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9pbnRlcm5hbC9yZWdpc3RyeS9CdWlsZEluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnJlZ2lzdHJ5OwotcHVibGljIGNsYXNzIEJ1aWxkSW5mbyB7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICJMaWNlbnNlZCBNYXRlcmlhbHMgLS0gUHJvcGVydHkgb2YgSUJNXG4oYykgQ29weXJpZ2h0IEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24sIDIwMDEsMjAwM1xuVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBmZ0J1aWxkTGV2ZWwgPSAiMjAwMzExMTJfMTkxNS1XQjIxMi1BRC1WNTExRC1XNSI7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGxldmVsKCkgeyByZXR1cm4gZmdCdWlsZExldmVsOyB9Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFdTQUJ1aWxkTGV2ZWwoKSB7IHJldHVybiBmZ0J1aWxkTGV2ZWw7IH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3JlZ2lzdHJ5L0lUZXN0Y2FzZU1ldGFEYXRhLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9pbnRlcm5hbC9yZWdpc3RyeS9JVGVzdGNhc2VNZXRhRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDU4NDYyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3JlZ2lzdHJ5L0lUZXN0Y2FzZU1ldGFEYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwucmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklCdWZmZXI7Ci0KLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSByZXByZXNlbnRzIGEgdGVzdCBjYXNlIHRoYXQgZWl0aGVyIHNob3VsZCBiZSBydW4KLSAqIGFzIHBhcnQgb2YgdGhlIFZhbGlkYXRpb24gQlZUIFN1aXRlLCBvciB0aGF0IGlzIHBhcnQgb2YgYSB0ZXN0Ci0gKiBjYXNlIHRoYXQgaXMgcnVuIGJ5IHRoZSBWYWxpZGF0aW9uIEJWVCBTdWl0ZS4KLSAqLwotcHVibGljIGludGVyZmFjZSBJVGVzdGNhc2VNZXRhRGF0YSB7Ci0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhpcyB0ZXN0IGNhc2Ugc2hvdWxkIGJlIHNob3duIGFzIGEgdGVzdCBvbiAKLQkgKiB0aGUgdGVzdCBjb2xsZWN0b3IgbWVudS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHByb2plY3QgdGhhdCB0aGlzIHRlc3QgY2FzZSBpcyBkZXNpZ25lZCB0byBydW4gb24uCi0JICovCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHByb2plY3QgdGhhdCB0aGlzIHRlc3QgY2FzZSBpcyBkZXNpZ25lZCAKLQkgKiB0byBydW4gb24uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9qZWN0TmFtZSgpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgaWQgb2YgdGhlIHBsdWdpbiB0aGF0IGRlY2xhcmVkIHRoaXMgdGVzdCBjYXNlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVjbGFyaW5nUGx1Z2luSWQoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyB0ZXN0IGNhc2UuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRoYXQgbXVzdCBiZSBpbXBvcnRlZCBmb3IgdGhpcyB0ZXN0IGNhc2UKLQkgKiB0byBydW4gb24uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJbnB1dEZpbGVOYW1lKCk7Ci0JCi0JLyoqCi0JICogSW1wb3J0IHRoZSBmaWxlLCBpZiBuZWNlc3NhcnksIGFuZCBydW4gdGhpcyB0ZXN0LiBUaGUgdGVzdCBjYXNlCi0JICogcmVwb3J0cyB3aGV0aGVyIG9yIG5vdCB0aGUgdGVzdCBwYXNzZXMgdG8gdGhlIElUZXN0QnVmZmVyLgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQnVmZmVyIGJ1ZmZlciwgSVByb2plY3QgcHJvamVjdCk7Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9pbnRlcm5hbC9yZWdpc3RyeS9NZXNzYWdlTWV0YURhdGEuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3JlZ2lzdHJ5L01lc3NhZ2VNZXRhRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjNiYmFlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3JlZ2lzdHJ5L01lc3NhZ2VNZXRhRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdG9yTWV0YURhdGE7Ci0KLQotCi1wdWJsaWMgY2xhc3MgTWVzc2FnZU1ldGFEYXRhIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMSU5FTk9fVU5TRVQgPSAtMTsKLQlwcml2YXRlIFN0cmluZyBfbWVzc2FnZVByZWZpeCA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgX3Jlc291cmNlID0gbnVsbDsKLQlwcml2YXRlIGludCBfbGluZU51bWJlciA9IExJTkVOT19VTlNFVDsKLQlwcml2YXRlIFN0cmluZyBfbG9jYXRpb24gPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIF90ZXh0ID0gbnVsbDsgLy8gV2hlbiB0aGlzIHRlc3QgY2FzZSB3YXMgZ2VuZXJhdGVkLCB3aGF0IHdhcyB0aGUgdGV4dCBvZiB0aGUgbWFya2VyPyBUaGlzIGluZm9ybWF0aW9uIGlzIG5lZWRlZCB3aGVuIG1lc3NhZ2UgcHJlZml4ZXMgY2hhbmdlOyB0aGUgdGVzdCBjYXNlIHdpbGwgZmFpbCBiZWNhdXNlIHRoZSBwcmVmaXggZG9lc24ndCBtYXRjaCwgYnV0IGl0J3MgZWFzeSB0byBzZWUgdGhhdCB0aGUgb2xkIHByZWZpeCB0ZXN0ZWQgdGhlIHNhbWUgdGhpbmcgYXMgdGhlIG5ldyBwcmVmaXguCi0JcHJpdmF0ZSBWYWxpZGF0b3JUZXN0Y2FzZSBfdG1kID0gbnVsbDsgLy8gcG9pbnRlciBiYWNrIHRvIHRoZSB0ZXN0Y2FzZSBwYXJlbnQKLQkKLQlwdWJsaWMgTWVzc2FnZU1ldGFEYXRhKFZhbGlkYXRvclRlc3RjYXNlIHRtZCwgU3RyaW5nIHByZWZpeCwgU3RyaW5nIHJlc291cmNlLCBpbnQgbGluZU51bWJlciwgU3RyaW5nIHRleHQpIHsKLQkJdGhpcyh0bWQsIHByZWZpeCwgcmVzb3VyY2UsIHRleHQpOwotCQlfbGluZU51bWJlciA9IGxpbmVOdW1iZXI7Ci0JfQotCQotCXB1YmxpYyBNZXNzYWdlTWV0YURhdGEoVmFsaWRhdG9yVGVzdGNhc2UgdG1kLCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgcmVzb3VyY2UsIFN0cmluZyBsb2NhdGlvbiwgU3RyaW5nIHRleHQpIHsKLQkJdGhpcyh0bWQsIHByZWZpeCwgcmVzb3VyY2UsIHRleHQpOwotCQlfbG9jYXRpb24gPSBsb2NhdGlvbjsKLQl9Ci0JCi0JcHVibGljIE1lc3NhZ2VNZXRhRGF0YShWYWxpZGF0b3JUZXN0Y2FzZSB0bWQsIFN0cmluZyBwcmVmaXgsIFN0cmluZyByZXNvdXJjZSwgU3RyaW5nIHRleHQpIHsKLQkJX3RtZCA9IHRtZDsKLQkJX21lc3NhZ2VQcmVmaXggPSBwcmVmaXg7Ci0JCV9yZXNvdXJjZSA9IHJlc291cmNlOwotCQlfdGV4dCA9ICh0ZXh0ID09IG51bGwpID8gIiIgOiB0ZXh0OyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyBWYWxpZGF0b3JUZXN0Y2FzZSBnZXRWYWxpZGF0b3JUZXN0Y2FzZSgpIHsKLQkJcmV0dXJuIF90bWQ7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZVByZWZpeCgpIHsKLQkJcmV0dXJuIF9tZXNzYWdlUHJlZml4OwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlKCkgewotCQlyZXR1cm4gX3Jlc291cmNlOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldExpbmVOdW1iZXIoKSB7Ci0JCXJldHVybiBfbGluZU51bWJlcjsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbigpIHsKLQkJcmV0dXJuIF9sb2NhdGlvbjsKLQl9Ci0JCi0JcHVibGljIFZhbGlkYXRvck1ldGFEYXRhIGdldFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIGdldFZhbGlkYXRvclRlc3RjYXNlKCkuZ2V0VmFsaWRhdG9yTWV0YURhdGEoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gX3RleHQ7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzU2V0TGluZU51bWJlcigpIHsKLQkJcmV0dXJuIChfbGluZU51bWJlciAhPSBMSU5FTk9fVU5TRVQpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1NldExvY2F0aW9uKCkgewotCQlyZXR1cm4gaXNTZXQoX2xvY2F0aW9uKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNTZXRSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIGlzU2V0KF9yZXNvdXJjZSk7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBpc1NldChTdHJpbmcgdmFsdWUpIHsKLQkJaWYodmFsdWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZih2YWx1ZS50cmltKCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBNZXNzYWdlVXRpbGl0eS50b1N0cmluZyh0aGlzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9pbnRlcm5hbC9yZWdpc3RyeS9NZXNzYWdlVXRpbGl0eS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvaW50ZXJuYWwvcmVnaXN0cnkvTWVzc2FnZVV0aWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJlYWVlYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9pbnRlcm5hbC9yZWdpc3RyeS9NZXNzYWdlVXRpbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC5yZWdpc3RyeTsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlLnBhcnNlci5Qcm9wZXJ0eUxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5CVlRWYWxpZGF0aW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSUJ1ZmZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5Db25maWd1cmF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRpb25SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0b3JNZXRhRGF0YTsKLQotcHVibGljIGNsYXNzIE1lc3NhZ2VVdGlsaXR5IHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgX1RFU1RDQVNFX01FU1NBR0VfVEVNUExBVEVfID0gIjxtZXNzYWdlIHByZWZpeD1cInswfVwiIHJlc291cmNlPVwiezF9XCIgbG9jYXRpb249XCJ7Mn1cIiB0ZXh0PVwiezN9XCIvPiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgX1RFU1RDQVNFX01BUktFUl9URU1QTEFURV8gPSAgIjxtYXJrZXIgcHJlZml4PVwiezB9XCIgcmVzb3VyY2U9XCJ7MX1cIiBsb2NhdGlvbj1cInsyfVwiIHRleHQ9XCJ7M31cIi8+IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIE1lc3NhZ2VDb21wYXJhdG9yIF9tZXNzYWdlQ29tcGFyYXRvciA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgTWVzc2FnZUlkQ29tcGFyYXRvciBfbWVzc2FnZUlkQ29tcGFyYXRvciA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgTWVzc2FnZVByZWZpeENvbXBhcmF0b3IgX21lc3NhZ2VQcmVmaXhDb21wYXJhdG9yID0gbnVsbDsKLQkKLQlwcml2YXRlIE1lc3NhZ2VVdGlsaXR5KCkgewotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZyhNZXNzYWdlTWV0YURhdGEgbW1kKSB7Ci0JCVN0cmluZyBsb2NhdGlvbiA9IChtbWQuaXNTZXRMaW5lTnVtYmVyKCkpID8gU3RyaW5nLnZhbHVlT2YobW1kLmdldExpbmVOdW1iZXIoKSkgOiBtbWQuZ2V0TG9jYXRpb24oKTsKLQkJcmV0dXJuIHRvU3RyaW5nKG1tZC5nZXRNZXNzYWdlUHJlZml4KCksIG1tZC5nZXRSZXNvdXJjZSgpLCBsb2NhdGlvbiwgbW1kLmdldFRleHQoKSwgX1RFU1RDQVNFX01FU1NBR0VfVEVNUExBVEVfKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoSU1hcmtlciBtYXJrZXIpIHsKLQkJSW50ZWdlciBsaW5lTnVtYmVyID0gTWVzc2FnZVV0aWxpdHkuZ2V0TGluZU51bWJlcihtYXJrZXIpOwotCQlTdHJpbmcgbG9jYXRpb24gPSAobGluZU51bWJlciA9PSBudWxsKSA/IChsb2NhdGlvbiA9IE1lc3NhZ2VVdGlsaXR5LmdldExvY2F0aW9uKG1hcmtlcikpIDogKGxvY2F0aW9uID0gbGluZU51bWJlci50b1N0cmluZygpKTsKLQkJcmV0dXJuIHRvU3RyaW5nKGdldE1lc3NhZ2VQcmVmaXgobWFya2VyKSwgZ2V0UmVzb3VyY2UobWFya2VyKSwgbG9jYXRpb24sIGdldE1lc3NhZ2UobWFya2VyKSwgX1RFU1RDQVNFX01BUktFUl9URU1QTEFURV8pOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoU3RyaW5nIGZtc3NnUHJlZml4LCBTdHJpbmcgZnJlc291cmNlLCBTdHJpbmcgZmxvY2F0aW9uLCBTdHJpbmcgZnRleHQsIFN0cmluZyB0ZW1wbGF0ZSkgewotCQlTdHJpbmcgbXNzZ1ByZWZpeCA9IChmbXNzZ1ByZWZpeCA9PSBudWxsKSA/ICIiIDogZm1zc2dQcmVmaXg7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHJlc291cmNlID0gKGZyZXNvdXJjZSA9PSBudWxsKSA/ICIiIDogZnJlc291cmNlOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBsb2NhdGlvbiA9IChmbG9jYXRpb24gPT0gbnVsbCkgPyAiIiA6IGZsb2NhdGlvbjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgdGV4dCA9IChmdGV4dCA9PSBudWxsKSA/ICIiIDogZnRleHQ7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KHRlbXBsYXRlLCBuZXcgU3RyaW5nW117bXNzZ1ByZWZpeCwgcmVzb3VyY2UsIGxvY2F0aW9uLCB0ZXh0fSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFByb2plY3QoSU1hcmtlciBtYXJrZXIpIHsKLQkJcmV0dXJuIG1hcmtlci5nZXRSZXNvdXJjZSgpLmdldFByb2plY3QoKS5nZXROYW1lKCk7Ci0JfQotCQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2UoSU1hcmtlciBtYXJrZXIpIHsKLQkJcmV0dXJuIG1hcmtlci5nZXRSZXNvdXJjZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpOwotCX0KLQkKLQotCS8vIEJhc2VkIG9uIHRoZSBsYXN0IGxldHRlciBvZiB0aGUgbWVzc2FnZSBwcmVmaXgsIHdoYXQgc2V2ZXJpdHkKLQkvLyBzaG91bGQgdGhpcyBtYXJrZXIgYmU/Ci0JcHVibGljIHN0YXRpYyBJbnRlZ2VyIGdldFNldmVyaXR5KElNYXJrZXIgbWFya2VyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBtZXNzYWdlID0gKFN0cmluZyltYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSk7Ci0JCWlmKG1lc3NhZ2UgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCVN0cmluZ1tdIHRva2VucyA9IHBhcnNlKG1lc3NhZ2UpOwotCQlTdHJpbmcgc2V2ZXJpdHkgPSB0b2tlbnNbMV07Ci0JCUludGVnZXIgcmVzdWx0OwotCQlpZihzZXZlcml0eS5lcXVhbHMoIkUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXN1bHQgPSBuZXcgSW50ZWdlcihJTWFya2VyLlNFVkVSSVRZX0VSUk9SKTsKLQkJfQotCQllbHNlIGlmKHNldmVyaXR5LmVxdWFscygiVyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJlc3VsdCA9IG5ldyBJbnRlZ2VyKElNYXJrZXIuU0VWRVJJVFlfV0FSTklORyk7Ci0JCX0KLQkJZWxzZSBpZihzZXZlcml0eS5lcXVhbHMoIkkiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXN1bHQgPSBuZXcgSW50ZWdlcihJTWFya2VyLlNFVkVSSVRZX0lORk8pOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzdWx0ID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlKElNYXJrZXIgbWFya2VyKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKFN0cmluZyltYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSk7Ci0JCX0KLQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlUHJlZml4KElNYXJrZXIgbWFya2VyKSB7Ci0JCVN0cmluZyBtZXNzYWdlID0gZ2V0TWVzc2FnZShtYXJrZXIpOwotCQlpZihtZXNzYWdlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlTdHJpbmdbXSB0b2tlbnMgPSBwYXJzZShtZXNzYWdlKTsKLQkJcmV0dXJuIHRva2Vuc1swXTsKLQl9Ci0JCi0JLy8gVGhpcyBtZXRob2QgaXMgbmVlZGVkIGZvciB0aGUgZnV6enkgY29tcGFyZS4gTmVlZCB0byAKLQkvLyBzdHJpcCB0aGUgIi5qYXZhIiBvciAiLmNsYXNzIiBleHRlbnNpb24gb2ZmIG9mIHRoZSByZXNvdXJjZQotCS8vIG5hbWUgc28gdGhhdCB0aGUgY2xhc3MgbmFtZSBjYW4gYmUgc2VhcmNoZWQgZm9yIGluIHRoZSBtYXJrZXIncwotCS8vIGxvY2F0aW9uIHRleHQuCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2UoTWVzc2FnZU1ldGFEYXRhIG1tZCkgewotCQlTdHJpbmcgcmVzb3VyY2UgPSBtbWQuZ2V0UmVzb3VyY2UoKTsKLQkJaW50IGluZGV4ID0gcmVzb3VyY2UuaW5kZXhPZigiLmphdmEiKTsgLy8kTk9OLU5MUy0xJAotCQlpZihpbmRleCA+IC0xKSB7Ci0JCQlyZXR1cm4gcmVzb3VyY2Uuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJfQotCQkKLQkJaW5kZXggPSByZXNvdXJjZS5pbmRleE9mKCIuY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQlpZihpbmRleCA+IC0xKSB7Ci0JCQlyZXR1cm4gcmVzb3VyY2Uuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJfQotCQkKLQkJcmV0dXJuIHJlc291cmNlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFZhbGlkYXRvck1ldGFEYXRhIGdldFZhbGlkYXRvcihJTWFya2VyIG1hcmtlcikgewotCQlTdHJpbmcgdmFsaWRhdG9yQ2xhc3MgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0VmFsaWRhdG9yKG1hcmtlcik7Ci0JCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5nZXRWYWxpZGF0b3JNZXRhRGF0YSh2YWxpZGF0b3JDbGFzcyk7Ci0JCXJldHVybiB2bWQ7Ci0JfQotCQotCS8qKgotCSAqIFBhcnNlIHRoZSBtZXNzYWdlIHZhbHVlLCB0byBleHRyYWN0IHRoZSB1bmlxdWUgZXJyb3IgaWQsIGlmIGFueS4KLQkgKiBTdHJpbmdbMF0gaXMgdGhlIG1lc3NhZ2UgcHJlZml4LCBTdHJpbmcgWzFdIGlzIHRoZSBlcnJvciBjaGFyLCBTdHJpbmdbMl0gaXMgdGhlIHJlc3Qgb2YgdGhlIHN0cmluZyBhZnRlciB0aGUgJzonCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBwYXJzZShTdHJpbmcgbWVzc2FnZSkgewotCQlpZiAobWVzc2FnZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IFN0cmluZ1tdeyIiLCAiIiwgIiJ9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9Ci0KLQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobWVzc2FnZSk7Ci0JCWludCBudW1Ub2tlbnMgPSB0b2tlbml6ZXIuY291bnRUb2tlbnMoKTsKLQkJaWYgKG51bVRva2VucyA9PSAwKSB7Ci0JCQlyZXR1cm4gbmV3IFN0cmluZ1tdeyIiLCAiIiwgbWVzc2FnZX07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWVsc2UgewotCQkJU3RyaW5nIGVycm9ySWQgPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCQlib29sZWFuIGlzRXJyb3JJbmRleCA9IGZhbHNlOwotCi0JCQlpbnQgZXJyb3JJZEluZGV4ID0gZXJyb3JJZC5pbmRleE9mKCc6Jyk7Ci0JCQlpZiAoZXJyb3JJZEluZGV4ID4gMCkgewotCQkJCVN0cmluZyB0ZW1wU3RyaW5nID0gZXJyb3JJZC5zdWJzdHJpbmcoMCwgZXJyb3JJZEluZGV4KTsKLQkJCQljaGFyW10gdGVtcCA9IHRlbXBTdHJpbmcudG9DaGFyQXJyYXkoKTsKLQkJCQlpZiAodGVtcC5sZW5ndGggPT0gOSkgeyAvLyBNdXN0IGJlIG9mIHRoZSBmb3JtIEFCQ0QxMjM0RSwgd2hpY2ggaXMgOSBjaGFyIGxvbmcKLQotCQkJCQlpc0Vycm9ySW5kZXggPSBDaGFyYWN0ZXIuaXNMZXR0ZXIodGVtcFswXSk7Ci0JCQkJCWlzRXJyb3JJbmRleCA9IGlzRXJyb3JJbmRleCAmJiBDaGFyYWN0ZXIuaXNMZXR0ZXIodGVtcFsxXSk7Ci0JCQkJCWlzRXJyb3JJbmRleCA9IGlzRXJyb3JJbmRleCAmJiBDaGFyYWN0ZXIuaXNMZXR0ZXIodGVtcFsyXSk7Ci0JCQkJCWlzRXJyb3JJbmRleCA9IGlzRXJyb3JJbmRleCAmJiBDaGFyYWN0ZXIuaXNMZXR0ZXIodGVtcFszXSk7Ci0JCQkJCWlzRXJyb3JJbmRleCA9IGlzRXJyb3JJbmRleCAmJiBDaGFyYWN0ZXIuaXNEaWdpdCh0ZW1wWzRdKTsKLQkJCQkJaXNFcnJvckluZGV4ID0gaXNFcnJvckluZGV4ICYmIENoYXJhY3Rlci5pc0RpZ2l0KHRlbXBbNV0pOwotCQkJCQlpc0Vycm9ySW5kZXggPSBpc0Vycm9ySW5kZXggJiYgQ2hhcmFjdGVyLmlzRGlnaXQodGVtcFs2XSk7Ci0JCQkJCWlzRXJyb3JJbmRleCA9IGlzRXJyb3JJbmRleCAmJiBDaGFyYWN0ZXIuaXNEaWdpdCh0ZW1wWzddKTsKLQkJCQkJaXNFcnJvckluZGV4ID0gaXNFcnJvckluZGV4ICYmIENoYXJhY3Rlci5pc0xldHRlcih0ZW1wWzhdKTsKLQotCQkJCQlpZiAoaXNFcnJvckluZGV4KSB7Ci0JCQkJCQlTdHJpbmcgc2hvcnRNZXNzYWdlOwotCQkJCQkJaWYgKG51bVRva2VucyA+IDEpIHsKLQkJCQkJCQlzaG9ydE1lc3NhZ2UgPSBtZXNzYWdlLnN1YnN0cmluZyhlcnJvcklkSW5kZXggKyAxLCBtZXNzYWdlLmxlbmd0aCgpKS5pbnRlcm4oKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCXNob3J0TWVzc2FnZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gbmV3IFN0cmluZ1tde3RlbXBTdHJpbmcuc3Vic3RyaW5nKDAsIDgpLCBuZXcgU3RyaW5nKG5ldyBjaGFyW117dGVtcFs4XX0pLCBzaG9ydE1lc3NhZ2V9OwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoIWlzRXJyb3JJbmRleCkgewotCQkJCXJldHVybiBuZXcgU3RyaW5nW117IiIsICIiLCBtZXNzYWdlfTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBuZXcgU3RyaW5nW117IiIsICIiLCBtZXNzYWdlfTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHVibGljIHN0YXRpYyBJbnRlZ2VyIGdldExpbmVOdW1iZXIoSU1hcmtlciBtYXJrZXIpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAoSW50ZWdlciltYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTElORV9OVU1CRVIpOwotCQl9Ci0JCWNhdGNoKENvcmVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VGFyZ2V0T2JqZWN0KElNYXJrZXIgbWFya2VyKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgdGFyZ2V0T2JqZWN0ID0gKFN0cmluZyltYXJrZXIuZ2V0QXR0cmlidXRlKENvbmZpZ3VyYXRpb25Db25zdGFudHMuVkFMSURBVElPTl9NQVJLRVJfVEFSR0VUT0JKRUNUKTsKLQkJCWlmKCh0YXJnZXRPYmplY3QgIT0gbnVsbCkgJiYgKHRhcmdldE9iamVjdC5lcXVhbHMoIiIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJLy8gRW1wdHkgc3RyaW5nIG1lYW5zIHRoYXQgdGhlcmUgd2FzIG5vIHRhcmdldCBvYmplY3QuCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlyZXR1cm4gdGFyZ2V0T2JqZWN0OwotCQl9Ci0JCWNhdGNoKENvcmVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogU29ydCBmaXJzdCBvbiB2YWxpZGF0b3IsIAotCSAqIHRoZW4gcHJvamVjdCwgCi0JICogdGhlbiBtZXNzYWdlIHByZWZpeCwKLQkgKiB0aGVuIGxvY2F0aW9uLAotCSAqIHRoZW4gcmVzb3VyY2UuIChUaGUgcmVzb3VyY2UgbWF5IGJlIGRpZmZlcmVudCBpbiBiYXRjaCBhbmQgVUksIHNvIGNvbXBhcmUgbG9jYXRpb24gJiByZXNvdXJjZSBhdCB0aGUgc2FtZSB0aW1lLikKLQkgKiAKLQkgKiBAcGFyYW0gdmVyYm9zZSBJZiB0cnVlLCB2ZXJib3NlIG91dHB1dCB3aGlsZSBjb21wYXJpbmcgbGlzdHMuCi0JICovCQotCXB1YmxpYyBzdGF0aWMgQ29tcGFyYXRvciBnZXRNZXNzYWdlQ29tcGFyYXRvcihmaW5hbCBJQnVmZmVyIGJ1ZmZlciwgZmluYWwgYm9vbGVhbiB2ZXJib3NlKSB7Ci0JCWlmKF9tZXNzYWdlQ29tcGFyYXRvciA9PSBudWxsKSB7Ci0JCQlfbWVzc2FnZUNvbXBhcmF0b3IgPSBuZXcgTWVzc2FnZVV0aWxpdHkoKS4gbmV3IE1lc3NhZ2VDb21wYXJhdG9yKCk7Ci0JCX0KLQkJX21lc3NhZ2VDb21wYXJhdG9yLnNldFZlcmJvc2UodmVyYm9zZSk7Ci0JCV9tZXNzYWdlQ29tcGFyYXRvci5zZXRCdWZmZXIoYnVmZmVyKTsKLQkJcmV0dXJuIF9tZXNzYWdlQ29tcGFyYXRvcjsKLQl9Ci0JCi0JLyoqCi0JICogU29ydCBmaXJzdCBvbiB0aGUgdmVyc2lvbiwgdGhlbiBvbiB0aGUgbWVzc2FnZSBwcmVmaXguCi0JICovCQotCXB1YmxpYyBzdGF0aWMgQ29tcGFyYXRvciBnZXRNZXNzYWdlSWRDb21wYXJhdG9yKGZpbmFsIElCdWZmZXIgYnVmZmVyLCBmaW5hbCBib29sZWFuIHZlcmJvc2UpIHsKLQkJaWYoX21lc3NhZ2VJZENvbXBhcmF0b3IgPT0gbnVsbCkgewotCQkJX21lc3NhZ2VJZENvbXBhcmF0b3IgPSBuZXcgTWVzc2FnZVV0aWxpdHkoKS4gbmV3IE1lc3NhZ2VJZENvbXBhcmF0b3IoKTsKLQkJfQotCQlfbWVzc2FnZUlkQ29tcGFyYXRvci5zZXRWZXJib3NlKHZlcmJvc2UpOwotCQlfbWVzc2FnZUlkQ29tcGFyYXRvci5zZXRCdWZmZXIoYnVmZmVyKTsKLQkJcmV0dXJuIF9tZXNzYWdlSWRDb21wYXJhdG9yOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExvY2F0aW9uKElNYXJrZXIgbWFya2VyKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKFN0cmluZyltYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTE9DQVRJT04pOwotCQl9Ci0JCWNhdGNoKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGUpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIE1lc3NhZ2VDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvciB7Ci0JCXByaXZhdGUgYm9vbGVhbiBfdmVyYm9zZSA9IGZhbHNlOwotCQlwcml2YXRlIElCdWZmZXIgX2J1ZmZlciA9IG51bGw7Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBpc1ZlcmJvc2UoKSB7Ci0JCQlyZXR1cm4gX3ZlcmJvc2U7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldFZlcmJvc2UoYm9vbGVhbiB2KSB7Ci0JCQlfdmVyYm9zZSA9IHY7Ci0JCX0KLQkJCi0JCXB1YmxpYyBJQnVmZmVyIGdldEJ1ZmZlcigpIHsKLQkJCXJldHVybiBfYnVmZmVyOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRCdWZmZXIoSUJ1ZmZlciBiKSB7Ci0JCQlfYnVmZmVyID0gYjsKLQkJfQotCQkKLQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBhLCBPYmplY3QgYikgewotCQkJaWYoKGEgPT0gbnVsbCkgJiYgKGIgPT0gbnVsbCkpIHsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCWVsc2UgaWYoYSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCQllbHNlIGlmKGIgPT0gbnVsbCkgewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCQotCQkJCi0JCQkvLyBTb3J0IGZpcnN0IG9uIHRoZSBtZXNzYWdlIHByZWZpeCwgdGhlbiBvbiB0aGUgbG9jYXRpb24sIHRoZW4gcHJvamVjdCwgdGhlbiByZXNvdXJjZQotCQkJaWYoKGEgaW5zdGFuY2VvZiBTdHJpbmcpICYmIChiIGluc3RhbmNlb2YgU3RyaW5nKSkgewotCQkJCXJldHVybiBjb21wYXJlKChTdHJpbmcpYSwgKFN0cmluZyliKTsKLQkJCX0KLQkJCWVsc2UgaWYgKChhIGluc3RhbmNlb2YgSU1hcmtlcikgJiYgKGIgaW5zdGFuY2VvZiBJTWFya2VyKSkgewotCQkJCUlNYXJrZXIgYU0gPSAoSU1hcmtlcilhOwotCQkJCUlNYXJrZXIgYk0gPSAoSU1hcmtlciliOwotCQkJCWludCByZXN1bHQgPSBjb21wYXJlKGFNLCBiTSk7Ci0JCQkJaWYoaXNWZXJib3NlKCkpIHsKLQkJCQkJZ2V0QnVmZmVyKCkud3JpdGUoImNvbXBhcmUoIiArIE1lc3NhZ2VVdGlsaXR5LnRvU3RyaW5nKGFNKSArICIsICIgKyBNZXNzYWdlVXRpbGl0eS50b1N0cmluZyhiTSkgKyAiID0gIiArIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQllbHNlIGlmICgoYSBpbnN0YW5jZW9mIElNYXJrZXIpICYmIChiIGluc3RhbmNlb2YgTWVzc2FnZU1ldGFEYXRhKSkgewotCQkJCUlNYXJrZXIgYU0gPSAoSU1hcmtlcilhOwotCQkJCU1lc3NhZ2VNZXRhRGF0YSBtbWQgPSAoTWVzc2FnZU1ldGFEYXRhKWI7Ci0JCQkJaW50IHJlc3VsdCA9IGNvbXBhcmUoYU0sIG1tZCk7Ci0JCQkJaWYoaXNWZXJib3NlKCkpIHsKLQkJCQkJZ2V0QnVmZmVyKCkud3JpdGUoImNvbXBhcmUoIiArIE1lc3NhZ2VVdGlsaXR5LnRvU3RyaW5nKGFNKSArICIsICIgKyBNZXNzYWdlVXRpbGl0eS50b1N0cmluZyhtbWQpICsgIiA9ICIgKyByZXN1bHQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJZWxzZSBpZigoYSBpbnN0YW5jZW9mIE1lc3NhZ2VNZXRhRGF0YSkgJiYgKGIgaW5zdGFuY2VvZiBJTWFya2VyKSkgewotCQkJCU1lc3NhZ2VNZXRhRGF0YSBtbWQgPSAoTWVzc2FnZU1ldGFEYXRhKWE7Ci0JCQkJSU1hcmtlciBiTSA9IChJTWFya2VyKWI7Ci0JCQkJaW50IHJlc3VsdCA9IGNvbXBhcmUobW1kLCBiTSk7Ci0JCQkJaWYoaXNWZXJib3NlKCkpIHsKLQkJCQkJZ2V0QnVmZmVyKCkud3JpdGUoImNvbXBhcmUoIiArIE1lc3NhZ2VVdGlsaXR5LnRvU3RyaW5nKG1tZCkgKyAiLCAiICsgTWVzc2FnZVV0aWxpdHkudG9TdHJpbmcoYk0pICsgIiA9ICIgKyByZXN1bHQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCX0JCQkJCQkKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJZWxzZSBpZigoYSBpbnN0YW5jZW9mIE1lc3NhZ2VNZXRhRGF0YSkgJiYgKGIgaW5zdGFuY2VvZiBNZXNzYWdlTWV0YURhdGEpKSB7Ci0JCQkJTWVzc2FnZU1ldGFEYXRhIGFNTUQgPSAoTWVzc2FnZU1ldGFEYXRhKWE7Ci0JCQkJTWVzc2FnZU1ldGFEYXRhIGJNTUQgPSAoTWVzc2FnZU1ldGFEYXRhKWI7Ci0JCQkJaW50IHJlc3VsdCA9IGNvbXBhcmUoYU1NRCwgYk1NRCk7Ci0JCQkJaWYoaXNWZXJib3NlKCkpIHsKLQkJCQkJZ2V0QnVmZmVyKCkud3JpdGUoImNvbXBhcmUoIiArIE1lc3NhZ2VVdGlsaXR5LnRvU3RyaW5nKGFNTUQpICsgIiwgIiArIE1lc3NhZ2VVdGlsaXR5LnRvU3RyaW5nKGJNTUQpICsgIiA9ICIgKyByZXN1bHQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJCi0JCQkvLyBlbHNlIHB1dCBpdCBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0Ci0JCQlyZXR1cm4gMTsKLQkJfQotCQkKLQkJcHVibGljIGludCBjb21wYXJlKFN0cmluZyBhU3RyLCBTdHJpbmcgYlN0cikgewotCQkJaWYoKGFTdHIgPT0gbnVsbCkgJiYgKGJTdHIgPT0gbnVsbCkpIHsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCWVsc2UgaWYoYVN0ciA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCQllbHNlIGlmKGJTdHIgPT0gbnVsbCkgewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCXJldHVybiBhU3RyLmNvbXBhcmVUbyhiU3RyKTsKLQkJfQotCQkKLQkJcHVibGljIGludCBjb21wYXJlKGludCBhSW50LCBpbnQgYkludCkgewotCQkJcmV0dXJuIGFJbnQgLSBiSW50OwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGNvbXBhcmUoVmFsaWRhdG9yTWV0YURhdGEgYVZNRCwgVmFsaWRhdG9yTWV0YURhdGEgYlZNRCkgewotCQkJaWYoKGFWTUQgPT0gbnVsbCkgJiYgKGJWTUQgPT0gbnVsbCkpIHsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCWVsc2UgaWYoYVZNRCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCQllbHNlIGlmKGJWTUQgPT0gbnVsbCkgewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCXJldHVybiBjb21wYXJlKGFWTUQuZ2V0VmFsaWRhdG9yVW5pcXVlTmFtZSgpLCBiVk1ELmdldFZhbGlkYXRvclVuaXF1ZU5hbWUoKSk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGNvbXBhcmUoSU1hcmtlciBhTWFya2VyLCBJTWFya2VyIGJNYXJrZXIpIHsKLQkJCWlmKChhTWFya2VyID09IG51bGwpICYmIChiTWFya2VyID09IG51bGwpKSB7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQllbHNlIGlmKGFNYXJrZXIgPT0gbnVsbCkgewotCQkJCXJldHVybiAxOwotCQkJfQotCQkJZWxzZSBpZihiTWFya2VyID09IG51bGwpIHsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCQkKLQkJCWludCB2YWxDbXAgPSBjb21wYXJlKGdldFZhbGlkYXRvcihhTWFya2VyKSwgZ2V0VmFsaWRhdG9yKGJNYXJrZXIpKTsKLQkJCWlmKHZhbENtcCAhPSAwKSB7Ci0JCQkJcmV0dXJuIHZhbENtcDsKLQkJCX0KLQotCQkJaW50IHByakNtcCA9IGNvbXBhcmUoZ2V0UHJvamVjdChhTWFya2VyKSwgZ2V0UHJvamVjdChiTWFya2VyKSk7Ci0JCQlpZihwcmpDbXAgIT0gMCkgewotCQkJCXJldHVybiBwcmpDbXA7Ci0JCQl9Ci0JCQkKLQkJCWludCBpZENtcCA9IGNvbXBhcmUoZ2V0TWVzc2FnZVByZWZpeChhTWFya2VyKSwgZ2V0TWVzc2FnZVByZWZpeChiTWFya2VyKSk7Ci0JCQlpZihpZENtcCAhPSAwKSB7Ci0JCQkJcmV0dXJuIGlkQ21wOwotCQkJfQotCi0JCQlpbnQgY21wID0gY29tcGFyZVJlc291cmNlQW5kTG9jYXRpb24oYU1hcmtlciwgYk1hcmtlcik7Ci0JCQlyZXR1cm4gY21wOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGNvbXBhcmUoSU1hcmtlciBtYXJrZXIsIE1lc3NhZ2VNZXRhRGF0YSBtbWQpIHsKLQkJCWlmKChtYXJrZXIgPT0gbnVsbCkgJiYgKG1tZCA9PSBudWxsKSkgewotCQkJCXJldHVybiAwOwotCQkJfQotCQkJZWxzZSBpZihtYXJrZXIgPT0gbnVsbCkgewotCQkJCXJldHVybiAxOwotCQkJfQotCQkJZWxzZSBpZihtbWQgPT0gbnVsbCkgewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQotCQkJaW50IHZhbENtcCA9IGNvbXBhcmUoZ2V0VmFsaWRhdG9yKG1hcmtlciksIG1tZC5nZXRWYWxpZGF0b3IoKSk7Ci0JCQlpZih2YWxDbXAgIT0gMCkgewotCQkJCXJldHVybiB2YWxDbXA7Ci0JCQl9Ci0KLQkJCWludCBwcmpDbXAgPSBjb21wYXJlKGdldFByb2plY3QobWFya2VyKSwgbW1kLmdldFZhbGlkYXRvclRlc3RjYXNlKCkuZ2V0UHJvamVjdE5hbWUoKSk7Ci0JCQlpZihwcmpDbXAgIT0gMCkgewotCQkJCXJldHVybiBwcmpDbXA7Ci0JCQl9Ci0JCQkKLQkJCWludCBpZENtcCA9IGNvbXBhcmUoZ2V0TWVzc2FnZVByZWZpeChtYXJrZXIpLCBtbWQuZ2V0TWVzc2FnZVByZWZpeCgpKTsKLQkJCWlmKGlkQ21wICE9IDApIHsKLQkJCQlyZXR1cm4gaWRDbXA7Ci0JCQl9Ci0KLQkJCWludCBjbXAgPSBjb21wYXJlUmVzb3VyY2VBbmRMb2NhdGlvbihtYXJrZXIsIG1tZCk7Ci0JCQlyZXR1cm4gY21wOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGNvbXBhcmUoTWVzc2FnZU1ldGFEYXRhIG1tZCwgSU1hcmtlciBtYXJrZXIpIHsKLQkJCWlmKChtbWQgPT0gbnVsbCkgJiYgKG1hcmtlciA9PSBudWxsKSkgewotCQkJCXJldHVybiAwOwotCQkJfQotCQkJZWxzZSBpZihtbWQgPT0gbnVsbCkgewotCQkJCXJldHVybiAxOwotCQkJfQotCQkJZWxzZSBpZihtYXJrZXIgPT0gbnVsbCkgewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQotCQkJaW50IHZhbENtcCA9IGNvbXBhcmUobW1kLmdldFZhbGlkYXRvcigpLCBnZXRWYWxpZGF0b3IobWFya2VyKSk7Ci0JCQlpZih2YWxDbXAgIT0gMCkgewotCQkJCXJldHVybiB2YWxDbXA7Ci0JCQl9Ci0KLQkJCWludCBwcmpDbXAgPSBjb21wYXJlKG1tZC5nZXRWYWxpZGF0b3JUZXN0Y2FzZSgpLmdldFByb2plY3ROYW1lKCksIGdldFByb2plY3QobWFya2VyKSk7Ci0JCQlpZihwcmpDbXAgIT0gMCkgewotCQkJCXJldHVybiBwcmpDbXA7Ci0JCQl9Ci0KLQkJCWludCBpZENtcCA9IGNvbXBhcmUobW1kLmdldE1lc3NhZ2VQcmVmaXgoKSwgZ2V0TWVzc2FnZVByZWZpeChtYXJrZXIpKTsKLQkJCWlmKGlkQ21wICE9IDApIHsKLQkJCQlyZXR1cm4gaWRDbXA7Ci0JCQl9Ci0KLQkJCWludCBjbXAgPSBjb21wYXJlUmVzb3VyY2VBbmRMb2NhdGlvbihtbWQsIG1hcmtlcik7Ci0JCQlyZXR1cm4gY21wOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGNvbXBhcmUoTWVzc2FnZU1ldGFEYXRhIGFNTUQsIE1lc3NhZ2VNZXRhRGF0YSBiTU1EKSB7Ci0JCQlpZigoYU1NRCA9PSBudWxsKSAmJiAoYk1NRCA9PSBudWxsKSkgewotCQkJCXJldHVybiAwOwotCQkJfQotCQkJZWxzZSBpZihhTU1EID09IG51bGwpIHsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJCWVsc2UgaWYoYk1NRCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJCi0JCQlpbnQgdmFsQ21wID0gY29tcGFyZShhTU1ELmdldFZhbGlkYXRvcigpLCBiTU1ELmdldFZhbGlkYXRvcigpKTsKLQkJCWlmKHZhbENtcCAhPSAwKSB7Ci0JCQkJcmV0dXJuIHZhbENtcDsKLQkJCX0KLQotCQkJaW50IHByakNtcCA9IGNvbXBhcmUoYU1NRC5nZXRWYWxpZGF0b3JUZXN0Y2FzZSgpLmdldFByb2plY3ROYW1lKCksIGJNTUQuZ2V0VmFsaWRhdG9yVGVzdGNhc2UoKS5nZXRQcm9qZWN0TmFtZSgpKTsKLQkJCWlmKHByakNtcCAhPSAwKSB7Ci0JCQkJcmV0dXJuIHByakNtcDsKLQkJCX0KLQkJCQotCQkJaW50IGlkQ21wID0gY29tcGFyZShhTU1ELmdldE1lc3NhZ2VQcmVmaXgoKSwgYk1NRC5nZXRNZXNzYWdlUHJlZml4KCkpOwotCQkJaWYoaWRDbXAgIT0gMCkgewotCQkJCXJldHVybiBpZENtcDsKLQkJCX0KLQotCQkJaW50IGNtcCA9IGNvbXBhcmVSZXNvdXJjZUFuZExvY2F0aW9uKGFNTUQsIGJNTUQpOwotCQkJcmV0dXJuIGNtcDsKLQkJfQotCQkKLQkJcHVibGljIGludCBjb21wYXJlUmVzb3VyY2VBbmRMb2NhdGlvbihJTWFya2VyIGFNYXJrZXIsIElNYXJrZXIgYk1hcmtlcikgewotCQkJaW50IHJlc0NtcCA9IGNvbXBhcmUoZ2V0UmVzb3VyY2UoYU1hcmtlciksIGdldFJlc291cmNlKGJNYXJrZXIpKTsKLQkJCWlmKHJlc0NtcCAhPSAwKSB7Ci0JCQkJcmV0dXJuIHJlc0NtcDsKLQkJCX0KLQkJCQotCQkJSW50ZWdlciBhTGluZU5vID0gZ2V0TGluZU51bWJlcihhTWFya2VyKTsKLQkJCUludGVnZXIgYkxpbmVObyA9IGdldExpbmVOdW1iZXIoYk1hcmtlcik7Ci0JCQlpZigoYUxpbmVObyAhPSBudWxsKSAmJiAoYkxpbmVObyE9IG51bGwpKSB7Ci0JCQkJcmV0dXJuIGNvbXBhcmUoYUxpbmVObywgYkxpbmVObyk7Ci0JCQl9Ci0JCQkKLQkJCVN0cmluZyBhTG9jYXRpb24gPSBnZXRMb2NhdGlvbihhTWFya2VyKTsKLQkJCVN0cmluZyBiTG9jYXRpb24gPSBnZXRMb2NhdGlvbihiTWFya2VyKTsKLQkJCWlmKChhTG9jYXRpb24gIT0gbnVsbCkgJiYgKGJMb2NhdGlvbiAhPSBudWxsKSkgewotCQkJCXJldHVybiBjb21wYXJlKGFMb2NhdGlvbiwgYkxvY2F0aW9uKTsKLQkJCX0KLQkJCQotCQkJLy8gSWYgb25lIGhhcyBhIGxpbmUgbnVtYmVyIGFuZCB0aGUgb3RoZXIgaGFzIGEgdGV4dCBsb2NhdGlvbiwgY2FuJ3QgY29tcGFyZQotCQkJLy8gdGhlIGxvY2F0aW9uLCBzbyBqdXN0IGFzc3VtZSB0aGF0IHRoZXkncmUgZXF1YWwuCi0JCQlyZXR1cm4gcmVzQ21wOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGNvbXBhcmVSZXNvdXJjZUFuZExvY2F0aW9uKElNYXJrZXIgbWFya2VyLCBNZXNzYWdlTWV0YURhdGEgbW1kKSB7Ci0JCQlpbnQgcmVzQ21wID0gY29tcGFyZShnZXRSZXNvdXJjZShtYXJrZXIpLCBtbWQuZ2V0UmVzb3VyY2UoKSk7Ci0JCQlpZihyZXNDbXAgIT0gMCkgewotCQkJCXJldHVybiByZXNDbXA7Ci0JCQl9Ci0JCQkKLQkJCWlmKG1tZC5pc1NldExpbmVOdW1iZXIoKSkgewotCQkJCUludGVnZXIgYUxpbmVObyA9IGdldExpbmVOdW1iZXIobWFya2VyKTsKLQkJCQlpbnQgYkxpbmVObyA9IG1tZC5nZXRMaW5lTnVtYmVyKCk7Ci0JCQkJaWYoYUxpbmVObyAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBjb21wYXJlKGFMaW5lTm8uaW50VmFsdWUoKSwgYkxpbmVObyk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZihtbWQuaXNTZXRMb2NhdGlvbigpKSB7Ci0JCQkJU3RyaW5nIGFMb2NhdGlvbiA9IGdldExvY2F0aW9uKG1hcmtlcik7Ci0JCQkJU3RyaW5nIGJMb2NhdGlvbiA9IG1tZC5nZXRMb2NhdGlvbigpOwotCQkJCWlmKChhTG9jYXRpb24gIT0gbnVsbCkgJiYgKGJMb2NhdGlvbiAhPSBudWxsKSkgewotCQkJCQlyZXR1cm4gY29tcGFyZShhTG9jYXRpb24sIGJMb2NhdGlvbik7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQkvLyBJZiBvbmUgaGFzIGEgbGluZSBudW1iZXIgYW5kIHRoZSBvdGhlciBoYXMgYSB0ZXh0IGxvY2F0aW9uLCBjYW4ndCBjb21wYXJlCi0JCQkvLyB0aGUgbG9jYXRpb24sIHNvIGp1c3QgYXNzdW1lIHRoYXQgdGhleSdyZSBlcXVhbC4KLQkJCXJldHVybiByZXNDbXA7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgY29tcGFyZVJlc291cmNlQW5kTG9jYXRpb24oTWVzc2FnZU1ldGFEYXRhIG1tZCwgSU1hcmtlciBtYXJrZXIpIHsKLQkJCWludCByZXNDbXAgPSBjb21wYXJlKG1tZC5nZXRSZXNvdXJjZSgpLCBnZXRSZXNvdXJjZShtYXJrZXIpKTsKLQkJCWlmKHJlc0NtcCAhPSAwKSB7Ci0JCQkJcmV0dXJuIHJlc0NtcDsKLQkJCX0KLQotCQkJaWYobW1kLmlzU2V0TGluZU51bWJlcigpKSB7Ci0JCQkJaW50IGFMaW5lTm8gPSBtbWQuZ2V0TGluZU51bWJlcigpOwotCQkJCUludGVnZXIgYkxpbmVObyA9IGdldExpbmVOdW1iZXIobWFya2VyKTsKLQkJCQlpZihiTGluZU5vIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gY29tcGFyZShhTGluZU5vLCBiTGluZU5vLmludFZhbHVlKCkpOwotCQkJCX0KLQkJCX0KLQotCQkJaWYobW1kLmlzU2V0TG9jYXRpb24oKSkgewotCQkJCVN0cmluZyBhTG9jYXRpb24gPSBtbWQuZ2V0TG9jYXRpb24oKTsKLQkJCQlTdHJpbmcgYkxvY2F0aW9uID0gZ2V0TG9jYXRpb24obWFya2VyKTsKLQkJCQlpZigoYUxvY2F0aW9uICE9IG51bGwpICYmIChiTG9jYXRpb24gIT0gbnVsbCkpIHsKLQkJCQkJcmV0dXJuIGNvbXBhcmUoYUxvY2F0aW9uLCBiTG9jYXRpb24pOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJLy8gSWYgb25lIGhhcyBhIGxpbmUgbnVtYmVyIGFuZCB0aGUgb3RoZXIgaGFzIGEgdGV4dCBsb2NhdGlvbiwgY2FuJ3QgY29tcGFyZQotCQkJLy8gdGhlIGxvY2F0aW9uLCBzbyBqdXN0IGFzc3VtZSB0aGF0IHRoZXkncmUgZXF1YWwuCi0JCQlyZXR1cm4gcmVzQ21wOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGNvbXBhcmVSZXNvdXJjZUFuZExvY2F0aW9uKE1lc3NhZ2VNZXRhRGF0YSBhTU1ELCBNZXNzYWdlTWV0YURhdGEgYk1NRCkgewotCQkJaW50IHJlc0NtcCA9IGNvbXBhcmUoYU1NRC5nZXRSZXNvdXJjZSgpLCBiTU1ELmdldFJlc291cmNlKCkpOwotCQkJaWYocmVzQ21wICE9IDApIHsKLQkJCQlyZXR1cm4gcmVzQ21wOwotCQkJfQotCi0JCQlpZihhTU1ELmlzU2V0TGluZU51bWJlcigpICYmIGJNTUQuaXNTZXRMaW5lTnVtYmVyKCkpIHsKLQkJCQlpbnQgYUxpbmVObyA9IGFNTUQuZ2V0TGluZU51bWJlcigpOwotCQkJCWludCBiTGluZU5vID0gYk1NRC5nZXRMaW5lTnVtYmVyKCk7Ci0JCQkJcmV0dXJuIGNvbXBhcmUoYUxpbmVObywgYkxpbmVObyk7Ci0JCQl9Ci0KLQkJCWlmKGFNTUQuaXNTZXRMb2NhdGlvbigpICYmIGJNTUQuaXNTZXRMb2NhdGlvbigpKSB7Ci0JCQkJU3RyaW5nIGFMb2NhdGlvbiA9IGFNTUQuZ2V0TG9jYXRpb24oKTsKLQkJCQlTdHJpbmcgYkxvY2F0aW9uID0gYk1NRC5nZXRMb2NhdGlvbigpOwotCQkJCWlmKChhTG9jYXRpb24gIT0gbnVsbCkgJiYgKGJMb2NhdGlvbiAhPSBudWxsKSkgewotCQkJCQlyZXR1cm4gY29tcGFyZShhTG9jYXRpb24sIGJMb2NhdGlvbik7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQkvLyBJZiBvbmUgaGFzIGEgbGluZSBudW1iZXIgYW5kIHRoZSBvdGhlciBoYXMgYSB0ZXh0IGxvY2F0aW9uLCBjYW4ndCBjb21wYXJlCi0JCQkvLyB0aGUgbG9jYXRpb24sIHNvIGp1c3QgYXNzdW1lIHRoYXQgdGhleSdyZSBlcXVhbC4KLQkJCXJldHVybiByZXNDbXA7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBNZXNzYWdlUHJlZml4Q29tcGFyYXRvciBnZXRNZXNzYWdlUHJlZml4Q29tcGFyYXRvcigpIHsKLQkJaWYoX21lc3NhZ2VQcmVmaXhDb21wYXJhdG9yID09IG51bGwpIHsKLQkJCV9tZXNzYWdlUHJlZml4Q29tcGFyYXRvciA9IG5ldyBNZXNzYWdlUHJlZml4Q29tcGFyYXRvcigpOwotCQl9Ci0JCXJldHVybiBfbWVzc2FnZVByZWZpeENvbXBhcmF0b3I7Ci0JfQotCQotCXN0YXRpYyBjbGFzcyBNZXNzYWdlUHJlZml4Q29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3IgewotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGEsIE9iamVjdCBiKSB7Ci0JCQlTdHJpbmcgYVByZWZpeCA9IG51bGw7Ci0JCQlTdHJpbmcgYlByZWZpeCA9IG51bGw7Ci0JCQlpZihhIGluc3RhbmNlb2YgUHJvcGVydHlMaW5lKSB7Ci0JCQkJYVByZWZpeCA9ICgoUHJvcGVydHlMaW5lKWEpLmdldE1lc3NhZ2VQcmVmaXgoKTsKLQkJCX0KLQkJCWVsc2UgaWYoYSBpbnN0YW5jZW9mIE1lc3NhZ2VNZXRhRGF0YSkgewotCQkJCWFQcmVmaXggPSAoKE1lc3NhZ2VNZXRhRGF0YSlhKS5nZXRNZXNzYWdlUHJlZml4KCk7Ci0JCQl9Ci0JCQkKLQkJCWlmKGIgaW5zdGFuY2VvZiBQcm9wZXJ0eUxpbmUpIHsKLQkJCQliUHJlZml4ID0gKChQcm9wZXJ0eUxpbmUpYikuZ2V0TWVzc2FnZVByZWZpeCgpOwotCQkJfQotCQkJZWxzZSBpZihiIGluc3RhbmNlb2YgTWVzc2FnZU1ldGFEYXRhKSB7Ci0JCQkJYlByZWZpeCA9ICgoTWVzc2FnZU1ldGFEYXRhKWIpLmdldE1lc3NhZ2VQcmVmaXgoKTsKLQkJCX0KLQotCQkJaWYoYVByZWZpeC5sZW5ndGgoKSA9PSA5KSB7Ci0JCQkJYVByZWZpeCA9IGFQcmVmaXguc3Vic3RyaW5nKDAsIDkpOwotCQkJfQotCQkJCi0JCQlpZihiUHJlZml4Lmxlbmd0aCgpID09IDkpIHsKLQkJCQliUHJlZml4ID0gYlByZWZpeC5zdWJzdHJpbmcoMCwgOSk7Ci0JCQl9Ci0JCQkKLQkJCXJldHVybiBhUHJlZml4LmNvbXBhcmVUbyhiUHJlZml4KTsKLQkJfQotCX0KLQkJCi0JY2xhc3MgTWVzc2FnZUlkQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3IgewotCQlwcml2YXRlIGJvb2xlYW4gX3ZlcmJvc2UgPSBmYWxzZTsKLQkJcHJpdmF0ZSBJQnVmZmVyIF9idWZmZXIgPSBudWxsOwotCQkKLQkJcHVibGljIGJvb2xlYW4gaXNWZXJib3NlKCkgewotCQkJcmV0dXJuIF92ZXJib3NlOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRWZXJib3NlKGJvb2xlYW4gdikgewotCQkJX3ZlcmJvc2UgPSB2OwotCQl9Ci0JCQotCQlwdWJsaWMgSUJ1ZmZlciBnZXRCdWZmZXIoKSB7Ci0JCQlyZXR1cm4gX2J1ZmZlcjsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0QnVmZmVyKElCdWZmZXIgYikgewotCQkJX2J1ZmZlciA9IGI7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkKElNYXJrZXIgbWFya2VyKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiAoU3RyaW5nKW1hcmtlci5nZXRBdHRyaWJ1dGUoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5WQUxJREFUSU9OX01BUktFUl9NRVNTQUdFSUQpOwotCQkJfQotCQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJCX0KLQkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQkKLQkJcHVibGljIGludCBjb21wYXJlKFN0cmluZyBhU3RyLCBTdHJpbmcgYlN0cikgewotCQkJaWYoKGFTdHIgPT0gbnVsbCkgJiYgKGJTdHIgPT0gbnVsbCkpIHsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCWVsc2UgaWYoYVN0ciA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCQllbHNlIGlmKGJTdHIgPT0gbnVsbCkgewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCXJldHVybiBhU3RyLmNvbXBhcmVUbyhiU3RyKTsKLQkJfQotCQkKLQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBhLCBPYmplY3QgYikgewotCQkJaWYoKGEgPT0gbnVsbCkgJiYgKGIgPT0gbnVsbCkpIHsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCWVsc2UgaWYoYSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCQllbHNlIGlmKGIgPT0gbnVsbCkgewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCQotCQkJCi0JCQkvLyBTb3J0IGZpcnN0IG9uIHRoZSB2ZXJzaW9uLCB0aGVuIG9uIHRoZSBtZXNzYWdlIHByZWZpeAotCQkJaWYoKGEgaW5zdGFuY2VvZiBTdHJpbmcpICYmIChiIGluc3RhbmNlb2YgU3RyaW5nKSkgewotCQkJCVN0cmluZyBhU3RyID0gKFN0cmluZylhOwotCQkJCVN0cmluZyBiU3RyID0gKFN0cmluZyliOwotCQkJCXJldHVybiBjb21wYXJlKGFTdHIsIGJTdHIpOwotCQkJfQotCQkJZWxzZSBpZiAoKGEgaW5zdGFuY2VvZiBQcm9wZXJ0eUxpbmUpICYmIChiIGluc3RhbmNlb2YgUHJvcGVydHlMaW5lKSkgewotCQkJCVByb3BlcnR5TGluZSBhTSA9IChQcm9wZXJ0eUxpbmUpYTsKLQkJCQlQcm9wZXJ0eUxpbmUgYk0gPSAoUHJvcGVydHlMaW5lKWI7Ci0JCQkJCi0JCQkJcmV0dXJuIGNvbXBhcmUoYU0uZ2V0TWVzc2FnZUlkKCksIGJNLmdldE1lc3NhZ2VJZCgpKTsKLQkJCX0KLQkJCWVsc2UgaWYgKChhIGluc3RhbmNlb2YgUHJvcGVydHlMaW5lKSAmJiAoYiBpbnN0YW5jZW9mIElNYXJrZXIpKSB7Ci0JCQkJUHJvcGVydHlMaW5lIGFNID0gKFByb3BlcnR5TGluZSlhOwotCQkJCUlNYXJrZXIgYk0gPSAoSU1hcmtlciliOwotCQkJCQotCQkJCXJldHVybiBjb21wYXJlKGFNLmdldE1lc3NhZ2VJZCgpLCBnZXRNZXNzYWdlSWQoYk0pKTsKLQkJCX0KLQkJCWVsc2UgaWYoKGEgaW5zdGFuY2VvZiBJTWFya2VyKSAmJiAoYiBpbnN0YW5jZW9mIFByb3BlcnR5TGluZSkpIHsKLQkJCQlJTWFya2VyIGFNID0gKElNYXJrZXIpYTsKLQkJCQlQcm9wZXJ0eUxpbmUgYk0gPSAoUHJvcGVydHlMaW5lKWI7Ci0JCQkJCi0JCQkJcmV0dXJuIGNvbXBhcmUoZ2V0TWVzc2FnZUlkKGFNKSwgYk0uZ2V0TWVzc2FnZUlkKCkpOwotCQkJfQotCQkJZWxzZSBpZigoYSBpbnN0YW5jZW9mIElNYXJrZXIpICYmIChiIGluc3RhbmNlb2YgSU1hcmtlcikpIHsKLQkJCQlJTWFya2VyIGFNID0gKElNYXJrZXIpYTsKLQkJCQlJTWFya2VyIGJNID0gKElNYXJrZXIpYjsKLQotCQkJCXJldHVybiBjb21wYXJlKGdldE1lc3NhZ2VJZChhTSksIGdldE1lc3NhZ2VJZChiTSkpOwotCQkJfQotCQkJCi0JCQkvLyBlbHNlIHB1dCBpdCBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0Ci0JCQlyZXR1cm4gMTsKLQkJfQotCX07Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9pbnRlcm5hbC9yZWdpc3RyeS9PcGVyYXRpb25UZXN0Y2FzZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvaW50ZXJuYWwvcmVnaXN0cnkvT3BlcmF0aW9uVGVzdGNhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVjYzQ0YS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9pbnRlcm5hbC9yZWdpc3RyeS9PcGVyYXRpb25UZXN0Y2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnJlZ2lzdHJ5OwotCi1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LkJWVFZhbGlkYXRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5JT3BlcmF0aW9uUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JQnVmZmVyOwotCi0vKioKLSAqIEluc3RlYWQgb2YgdGVzdGluZyBhIHZhbGlkYXRvciwgYW4gb3BlcmF0aW9uIHRlc3QgY2FzZSB0ZXN0cyB0aGUgCi0gKiB2YWxpZGF0aW9uIGZyYW1ld29yay4KLSAqLwotcHVibGljIGNsYXNzIE9wZXJhdGlvblRlc3RjYXNlIGltcGxlbWVudHMgSVRlc3RjYXNlTWV0YURhdGEgewotCXByaXZhdGUgU3RyaW5nIF9wbHVnaW5JZCA9IG51bGw7IC8vIFRoZSBwbHVnaW4gaWQgdGhhdCBoYXMgY29udHJpYnV0ZWQgdGhpcyB0ZXN0IGNhc2UuCi0JcHJpdmF0ZSBTdHJpbmcgX3Byb2plY3ROYW1lID0gbnVsbDsgLy8gdGhlIG5hbWUgb2YgdGhlIHByb2plY3QgdGhhdCB0aGlzIHRlc3QgY2FzZSB0ZXN0cwotCXByaXZhdGUgU3RyaW5nIF9pbnB1dEZpbGVOYW1lID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBfb3BOYW1lID0gbnVsbDsgLy8gdGhlIG5hbWUgb2YgdGhlIHRlc3QgY2FzZQotCXByaXZhdGUgSU9wZXJhdGlvblJ1bm5hYmxlIF9ydW5uYWJsZSA9IG51bGw7Ci0KLQlwdWJsaWMgT3BlcmF0aW9uVGVzdGNhc2UoU3RyaW5nIHBsdWdpbklkLCBTdHJpbmcgcHJvamVjdE5hbWUsIFN0cmluZyBvcE5hbWUsIFN0cmluZyBpbnB1dEZpbGVOYW1lLCBJT3BlcmF0aW9uUnVubmFibGUgcnVubmFibGUpIHsKLQkJX3BsdWdpbklkID0gcGx1Z2luSWQ7Ci0JCV9wcm9qZWN0TmFtZSA9IHByb2plY3ROYW1lOwotCQlfaW5wdXRGaWxlTmFtZSA9IGlucHV0RmlsZU5hbWU7Ci0JCV9vcE5hbWUgPSBvcE5hbWU7Ci0JCV9ydW5uYWJsZSA9IHJ1bm5hYmxlOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBfb3BOYW1lOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoKSB7Ci0JCXJldHVybiB0cnVlOyAvLyBmcmFtZXdvcmsgdGVzdCBjYXNlcyBhcmUgYWx3YXlzIHZpc2libGUgb24gdGhlIHRlc3QgY29sbGVjdG9yIG1lbnUKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXREZWNsYXJpbmdQbHVnaW5JZCgpIHsKLQkJcmV0dXJuIF9wbHVnaW5JZDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRQcm9qZWN0TmFtZSgpIHsKLQkJcmV0dXJuIF9wcm9qZWN0TmFtZTsKLQl9Ci0JCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCXJldHVybiBUZXN0Y2FzZVV0aWxpdHkuZmluZFByb2plY3QodGhpcyk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5wdXRGaWxlTmFtZSgpIHsKLQkJcmV0dXJuIF9pbnB1dEZpbGVOYW1lOwotCX0KLQkKLQlwdWJsaWMgSU9wZXJhdGlvblJ1bm5hYmxlIGdldFJ1bm5hYmxlKCkgewotCQlyZXR1cm4gX3J1bm5hYmxlOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnJlZ2lzdHJ5LklUZXN0Y2FzZU1ldGFEYXRhI3J1bihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JQnVmZmVyLCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUJ1ZmZlciBidWZmZXIsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJdHJ5IHsKLQkJCWdldFJ1bm5hYmxlKCkuc2V0QnVmZmVyKGJ1ZmZlcik7Ci0JCQlnZXRSdW5uYWJsZSgpLnNldFByb2plY3QocHJvamVjdCk7Ci0JCQlnZXRSdW5uYWJsZSgpLnNldE5hbWUoZ2V0TmFtZSgpKTsKLQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5ydW4oZ2V0UnVubmFibGUoKSwgYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfQotCQljYXRjaChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBnZXROYW1lKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvaW50ZXJuYWwvcmVnaXN0cnkvUmVnaXN0cnlDb25zdGFudHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3JlZ2lzdHJ5L1JlZ2lzdHJ5Q29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNDAzMmUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvaW50ZXJuYWwvcmVnaXN0cnkvUmVnaXN0cnlDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC5yZWdpc3RyeTsKLQotLyoqCi0gKiBWYWxpZGF0aW9uIGNvbnN0YW50cyBuZWVkZWQgdG8gZGVjbGFyZSBhbiBleHRlbnNpb24gcG9pbnQsIGFuZAotICogdG8gaW1wbGVtZW50IGFuIGV4dGVuc2lvbi4KLSAqLwotcHVibGljIGludGVyZmFjZSBSZWdpc3RyeUNvbnN0YW50cyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5CVlRWYWxpZGF0aW9uUGx1Z2luLlBMVUdJTl9JRDsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUT1JfVEVTVENBU0VfRVhUX1BUX0lEID0gInRlc3QiOyAvLyBleHRlbnNpb24gcG9pbnQgZGVjbGFyYXRpb24gb2YgdGhlIHZhbGlkYXRvciB0ZXN0IGNhc2UgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRPUl9TRVRVUF9FWFRfUFRfSUQgPSAidGVzdFNldHVwIjsgLy8gZXh0ZW5zaW9uIHBvaW50IGRlY2xhcmF0aW9uIG9mIHRoZSB0ZXN0IGNhc2Ugc2V0dXAgbWVjaGFuaXNtIChpLmUuLCBpbXBvcnQgdGhlIEVBUiBvciBKQVIpIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUT1JfT1BFUkFUSU9OX1RFU1RDQVNFX0VYVF9QVF9JRCA9ICJvcFRlc3QiOyAvLyBleHRlbnNpb24gcG9pbnQgZGVjbGFyYXRpb24gb2YgdGhlIG9wZXJhdGlvbiB0ZXN0IGNhc2UgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRG91YmxlIEVKQjIwID0gbmV3IERvdWJsZSgyLjApOyAvLyBFSkIgMi4wIGlucHV0IG9yIDEuMyBFQVIKLQlwdWJsaWMgc3RhdGljIGZpbmFsIERvdWJsZSBFSkIxMSA9IG5ldyBEb3VibGUoMS4xKTsgLy8gRUpCIDEuMSBpbnB1dCBvciAxLjIgRUFSCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEb3VibGUgRUpCID0gbnVsbDsgLy8gY29tbW9uIEVKQiBsZXZlbCwgc3VjaCBhcyByZWZsZWN0aW9uIGVycm9ycwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQjIwX01TU0cgPSAiZWpiMjAiOyAvLyBpbiBhIC5wcm9wZXJ0aWVzIGxpbmUsIGlmIHRoZSBtZXNzYWdlIGlkIGNvbnRhaW5zIHRoaXMgc3RyaW5nLCBpdCdzIGFuIEVKQiAyLjAgcnVsZSAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCMTFfTVNTRyA9ICJlamIxMSI7IC8vIGluIGEgLnByb3BlcnRpZXMgbGluZSwgaWYgdGhlIG1lc3NhZ2UgaWQgY29udGFpbnMgdGhpcyBzdHJpbmcsIGl0J3MgYW4gRUpCIDEuMSBydWxlIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfTVNTRyA9IG51bGw7IC8vIGluIGEgLnByb3BlcnRpZXMgZmlsZSwgaWYgdGhlIG1lc3NhZ2UgaXMgbmVpdGhlciBFSkIyMCBub3IgRUpCMTEsIHRoZSBydWxlIGlzIGNyb3NzLXNwZWNzLiAoZS5nLiByZWZsZWN0aW9uIGVycm9ycykgLy8kTk9OLU5MUy0xJAotCQotCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfVkFMSURBVE9SID0gInZhbGlkYXRvciI7IC8vIHRoZSB2YWxpZGF0b3IgIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9QTFVHSU4gPSAicGx1Z2luIjsgLy8gaWRlbnRpZmllcyB0aGUgcGx1Z2luIHdoaWNoIGhhcyB0aGUgY2xhc3MgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1RFU1QgPSAidGVzdCI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19JTVBPUlQgPSAiaW1wb3J0IjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX09QRVJBVElPTiA9ICJvcGVyYXRpb24iOyAvLyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIElJbXBvcnRPcGVyYXRpb24gd2hpY2ggaXMgdXNlZCB0byBpbXBvcnQgdGhlIGlucHV0IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9JTlBVVCA9ICJpbnB1dCI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9WRVJTSU9OID0gInZlcnNpb24iOyAvLyB0aGUgdmVyc2lvbiBvZiB0aGUgaW5wdXQsIGUuZy4gRUpCIDEuMSB2cy4gRUpCIDIuMCAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfTUVTU0FHRSA9ICJtZXNzYWdlIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1BSRUZJWCA9ICJwcmVmaXgiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfU0VWRVJJVFkgPSAic2V2ZXJpdHkiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfUFJPSkVDVCA9ICJwcm9qZWN0IjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1JFU09VUkNFID0gInJlc291cmNlIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0xPQ0FUSU9OID0gImxvY2F0aW9uIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1RFWFQgPSAidGV4dCI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9WSVNJQkxFID0gInZpc2libGUiOyAvLyBJcyB0aGlzIHRlc3QgdmlzaWJsZSBvbiB0aGUgVGVzdCBDb2xsZWN0b3IgbWVudT8gLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvaW50ZXJuYWwvcmVnaXN0cnkvVGVzdFNldHVwSW1wb3J0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9pbnRlcm5hbC9yZWdpc3RyeS9UZXN0U2V0dXBJbXBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIwNWE5ZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9pbnRlcm5hbC9yZWdpc3RyeS9UZXN0U2V0dXBJbXBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwucmVnaXN0cnk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5Mb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuQlZUVmFsaWRhdGlvblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklJbXBvcnRPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucGx1Z2luLlZhbGlkYXRpb25QbHVnaW47Ci0KLS8qKgotICogVGhpcyBjbGFzcyBob2xkcyB0aGUgbWV0YWRhdGEgbmVlZGVkIHRvIGltcG9ydCBhbiAuZWFyIG9yCi0gKiBhIC5qYXIgZmlsZSB0byBzZXQgdXAgYSB0ZXN0IGNhc2UgaW4gYmF0Y2ggbW9kZS4KLSAqLwotcHVibGljIGNsYXNzIFRlc3RTZXR1cEltcG9ydCB7Ci0JcHJpdmF0ZSBTdHJpbmcgX2ZpbGVOYW1lID0gbnVsbDsKLQlwcml2YXRlIElJbXBvcnRPcGVyYXRpb24gX2ltcG9ydE9wZXJhdGlvbiA9IG51bGw7Ci0KLQlwdWJsaWMgVGVzdFNldHVwSW1wb3J0KElJbXBvcnRPcGVyYXRpb24gb3AsIFN0cmluZyBmaWxlTmFtZSkgewotCQlfaW1wb3J0T3BlcmF0aW9uID0gb3A7Ci0JCV9maWxlTmFtZSA9IGZpbGVOYW1lOwotCX0KLQotCXB1YmxpYyBGaWxlIGdldElucHV0RmlsZShTdHJpbmcgZGlyKSB7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGRpciwgZ2V0RmlsZU5hbWUoKSk7Ci0JCWlmKCFmaWxlLmV4aXN0cygpKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgIkZpbGUgIiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiIG11c3QgZXhpc3QgYW5kIGhhdmUgcmVhZCBhY2Nlc3MuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXJldHVybiBmaWxlOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEZpbGVOYW1lKCkgewotCQlyZXR1cm4gX2ZpbGVOYW1lOwotCX0KLQkKLQlwdWJsaWMgSUltcG9ydE9wZXJhdGlvbiBnZXRPcGVyYXRpb24oKSB7Ci0JCXJldHVybiBfaW1wb3J0T3BlcmF0aW9uOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZmlsZSB3YXMgZm91bmQgYW5kIGltcG9ydGVkIHN1Y2Nlc3NmdWxseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpbXBvcnRGaWxlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgU3RyaW5nIGRpcikgewotCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJaW50IGV4ZWN1dGlvbk1hcCA9IDB4MDsKLQkJYm9vbGVhbiBpbXBvcnRlZCA9IHRydWU7Ci0JCXRyeSB7Ci0JCQlGaWxlIGZpbGUgPSBnZXRJbnB1dEZpbGUoZGlyKTsKLQkJCWV4ZWN1dGlvbk1hcCB8PSAweDE7Ci0JCQl0cnkgewotCQkJCUlJbXBvcnRPcGVyYXRpb24gb3AgPSBnZXRPcGVyYXRpb24oKTsKLQkJCQlleGVjdXRpb25NYXAgfD0gMHgyOwotCQkJCWltcG9ydGVkID0gb3AucnVuKG1vbml0b3IsIGZpbGUpOwotCQkJCWV4ZWN1dGlvbk1hcCB8PSAweDQ7Ci0JCQl9Ci0JCQljYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXhjKSB7Ci0JCQkJZXhlY3V0aW9uTWFwIHw9IDB4ODsKLQkJCQlpbXBvcnRlZCA9IGZhbHNlOwotCQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCUxvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4YykgewotCQkJCWV4ZWN1dGlvbk1hcCB8PSAweDEwOwotCQkJCWltcG9ydGVkID0gZmFsc2U7Ci0JCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0JCQkJCWlmKGV4Yy5nZXRUYXJnZXRFeGNlcHRpb24oKSAhPSBudWxsKSB7Ci0JCQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQkJCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChUaHJvd2FibGUgZXhjKSB7Ci0JCQkJZXhlY3V0aW9uTWFwIHw9IDB4MjA7Ci0JCQkJaW1wb3J0ZWQgPSBmYWxzZTsKLQkJCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQlMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZighaW1wb3J0ZWQpIHsKLQkJCQlMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCQllbnRyeS5zZXRFeGVjdXRpb25NYXAoZXhlY3V0aW9uTWFwKTsKLQkJCQllbnRyeS5zZXRUZXh0KCJUZXN0U2V0dXAgZm9yICIgKyBkaXIgKyAiIHdhcyB1bnN1Y2Nlc3NmdWwuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCX0KLQkJCQotCQl9Ci0JCXJldHVybiBpbXBvcnRlZDsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9pbnRlcm5hbC9yZWdpc3RyeS9UZXN0Y2FzZU1ldGFEYXRhLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9pbnRlcm5hbC9yZWdpc3RyeS9UZXN0Y2FzZU1ldGFEYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0ZjJjNTYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvaW50ZXJuYWwvcmVnaXN0cnkvVGVzdGNhc2VNZXRhRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC5yZWdpc3RyeTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbHVnaW5SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LkJWVFZhbGlkYXRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdG9yTWV0YURhdGE7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0Y2FzZU1ldGFEYXRhIHsKLQlwcml2YXRlIFN0cmluZyBfcGx1Z2luSWQgPSBudWxsOyAvLyBUaGUgcGx1Z2luIGlkIHRoYXQgaGFzIGNvbnRyaWJ1dGVkIHRoaXMgdGVzdCBjYXNlLgotCXByaXZhdGUgVmFsaWRhdG9yTWV0YURhdGEgX3ZtZCA9IG51bGw7Ci0JcHJpdmF0ZSBNZXNzYWdlTWV0YURhdGFbXSBfbWVzc2FnZXMgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIF9wcm9qZWN0ID0gbnVsbDsgLy8gdGhlIG5hbWUgb2YgdGhlIHByb2plY3QgdGhhdCB0aGlzIHRlc3QgY2FzZSB0ZXN0cwotCXByaXZhdGUgU3RyaW5nW10gX3Jlc291cmNlTmFtZXMgPSBudWxsOyAvLyB0aGUgcmVzb3VyY2VzIGxpc3RlZCBpbiB0aGUgTWVzc2FnZU1ldGFEYXRhIG9mIHRoaXMgdGVzdCBjYXNlLgotCXByaXZhdGUgU3RyaW5nIF9pbnB1dEZpbGVOYW1lID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBfbmFtZSA9IG51bGw7IC8vIHRoZSBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UKLQkKLQlwdWJsaWMgVGVzdGNhc2VNZXRhRGF0YShTdHJpbmcgcGx1Z2luTmFtZSwgU3RyaW5nIHByb2plY3QsIFZhbGlkYXRvck1ldGFEYXRhIHZtZCwgU3RyaW5nIGlucHV0RmlsZU5hbWUpIHsKLQkJX3BsdWdpbklkID0gcGx1Z2luTmFtZTsKLQkJX3Byb2plY3QgPSBwcm9qZWN0OwotCQlfdm1kID0gdm1kOwotCQlfaW5wdXRGaWxlTmFtZSA9IGlucHV0RmlsZU5hbWU7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVjbGFyaW5nUGx1Z2luSWQoKSB7Ci0JCXJldHVybiBfcGx1Z2luSWQ7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIF9wcm9qZWN0OwotCX0KLQkKLQlwdWJsaWMgSVByb2plY3QgZmluZFByb2plY3QoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoX3Byb2plY3QpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldElucHV0RmlsZU5hbWUoKSB7Ci0JCXJldHVybiBfaW5wdXRGaWxlTmFtZTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXROdW1NZXNzYWdlcygpIHsKLQkJcmV0dXJuIGdldE1lc3NhZ2VzKCkuc2l6ZSgpOwotCX0KLQkKLQkvLyBUaGUgbWVzc2FnZXMgbmVlZCB0byBiZSBzdG9yZWQgaW4gYSBsaXN0IGluc3RlYWQgb2YgYW4gYXJyYXkgYmVjYXVzZQotCS8vIHRoZSBsaXN0IGlzIHNvcnRlZCBiZWZvcmUgc2VhcmNoaW5nICYgZGlzcGxheWluZy4KLQlwdWJsaWMgTGlzdCBnZXRNZXNzYWdlcygpIHsKLQkJTGlzdCBjb3B5ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IoaW50IGk9MDsgaTxfbWVzc2FnZXMubGVuZ3RoOyBpKyspIHsKLQkJCWNvcHkuYWRkKF9tZXNzYWdlc1tpXSk7Ci0JCX0KLQkJCi0JCXJldHVybiBjb3B5OwotCX0KLQkKLQkvLyBSZXR1cm4gdGhlIHJlc291cmNlcyBpbiB0aGlzIHByb2plY3QgZm9yIHdoaWNoIHRoZXJlIGlzIGEgbWVzc2FnZSBpbiB0aGlzIHRlc3QgY2FzZS4KLQkvLyBObyByZXNvdXJjZSBpbnN0YW5jZSB3aWxsIGJlIGluIHRoZSByZXNvdXJjZSBtb3JlIHRoYW4gb25jZS4KLQlwdWJsaWMgSVJlc291cmNlW10gZ2V0UmVzb3VyY2VzKElQcm9qZWN0IHByb2plY3QpIHsKLQkJU2V0IHRlbXAgPSBuZXcgSGFzaFNldCgpOyAvLyB1c2UgYSBzZXQgaW4gY2FzZSB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIG1lc3NhZ2UgcmVnaXN0ZXJlZCBhZ2FpbnN0IGEgcmVzb3VyY2UgKGRvbid0IHdhbnQgZHVwbGljYXRlcyBpbiB0aGUgbGlzdCkuCi0JCVN0cmluZ1tdIHJlc291cmNlTmFtZXMgPSBnZXRSZXNvdXJjZU5hbWVzKCk7Ci0JCWZvcihpbnQgaT0wOyBpPHJlc291cmNlTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyByZXNvdXJjZU5hbWUgPSByZXNvdXJjZU5hbWVzW2ldOwotCQkJSVJlc291cmNlIHJlc291cmNlID0gcHJvamVjdC5maW5kTWVtYmVyKHJlc291cmNlTmFtZSk7Ci0JCQlpZihyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJLy8gcmVzb3VyY2UgZXhpc3RzCi0JCQkJdGVtcC5hZGQocmVzb3VyY2UpOwotCQkJfQotCQl9Ci0JCQotCQlJUmVzb3VyY2VbXSByZXN1bHQgPSBuZXcgSVJlc291cmNlW3RlbXAuc2l6ZSgpXTsKLQkJdGVtcC50b0FycmF5KHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmdbXSBnZXRSZXNvdXJjZU5hbWVzKCkgewotCQlpZihfcmVzb3VyY2VOYW1lcyA9PSBudWxsKSB7Ci0JCQlfcmVzb3VyY2VOYW1lcyA9IG5ldyBTdHJpbmdbX21lc3NhZ2VzLmxlbmd0aF07Ci0JCQlmb3IoaW50IGk9MDsgaTxfbWVzc2FnZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlfcmVzb3VyY2VOYW1lc1tpXSA9IF9tZXNzYWdlc1tpXS5nZXRSZXNvdXJjZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBfcmVzb3VyY2VOYW1lczsKLQl9Ci0JCi0JLyoqCi0JICogV2hlbiBhbiBlbXB0eSBUTUQgaXMgdXNlZCB0byB0ZXN0IGFuIG9wZXJhdGlvbiwgYW5kIHRoZSBvcGVyYXRpb24gbmVlZHMgdGhlIElSZXNvdXJjZVtdCi0JICogYWZmZWN0ZWQgYnkgdGhlIFRNRCB0byBrbm93IHdoZXRoZXIgb3Igbm90IHRoZSBvcGVyYXRpb24gcGFzc2VzIChpLmUuLCBvbmUgb2YgdGhlIFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbgotCSAqIGNvbnN0cnVjdG9ycyB0YWtlcyBhbiBJUmVzb3VyY2VbXSwgYW5kIHRoZSBJUmVzb3VyY2VbXSBtdXN0IG5vdCBiZSBlbXB0eSBvciBudWxsKSwgdGhlbgotCSAqIHRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gc2V0IHRoZSAicmVzb3VyY2VzIiBhZmZlY3RlZCBieSB0aGUgdGVzdCBjYXNlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlc291cmNlTmFtZXMoU3RyaW5nW10gcmVzb3VyY2VOYW1lcykgewotCQlfcmVzb3VyY2VOYW1lcyA9IHJlc291cmNlTmFtZXM7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2VzKE1lc3NhZ2VNZXRhRGF0YVtdIG1lc3NhZ2VzKSB7Ci0JCS8vIElmIG1lc3NhZ2VzIGFyZSBudWxsLCB0aGF0IG1lYW5zIHRoYXQgdGhlIHRlc3QgY2FzZSBleHBlY3RzIG5vIHZhbGlkYXRpb24gZXJyb3JzLgotCQlfbWVzc2FnZXMgPSAoKG1lc3NhZ2VzID09IG51bGwpID8gbmV3IE1lc3NhZ2VNZXRhRGF0YVswXSA6IG1lc3NhZ2VzKTsKLQl9Ci0JCi0JcHVibGljIFZhbGlkYXRvck1ldGFEYXRhIGdldFZhbGlkYXRvck1ldGFEYXRhKCkgewotCQlyZXR1cm4gX3ZtZDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRWYWxpZGF0b3JDbGFzcygpIHsKLQkJcmV0dXJuIGdldFZhbGlkYXRvck1ldGFEYXRhKCkuZ2V0VmFsaWRhdG9yVW5pcXVlTmFtZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJaWYoX25hbWUgPT0gbnVsbCkgewotCQkJX25hbWUgPSBfdm1kLmdldFZhbGlkYXRvckRpc3BsYXlOYW1lKCkgKyAiOjoiICsgZ2V0UHJvamVjdCgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIF9uYW1lOwotCX0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRJbnB1dERpcigpIHsKLQkJLy8gSWYgdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgdGVzdGNhc2UgaW5wdXQgaXNuJ3Qgc3BlY2lmaWVkLCAKLQkJLy8gYXNzdW1lIHRoYXQgdGhlIGlucHV0IGlzIGluIGEgc3ViZGlyZWN0b3J5LCBuYW1lZCAidGVzdElucHV0IiwKLQkJLy8gb2YgdGhlIHRlc3RjYXNlJ3MgcGx1Z2luLgotCQlJUGx1Z2luUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRQbHVnaW5SZWdpc3RyeSgpOwotCQlJUGx1Z2luRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gcmVnaXN0cnkuZ2V0UGx1Z2luRGVzY3JpcHRvcihnZXREZWNsYXJpbmdQbHVnaW5JZCgpKTsKLQkJaWYoZGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQkvLyBCZWNhdXNlIFBsYXRmb3JtLmFzTG9jYWxVUkwgdGhyb3dzIGFuIElPRXhjZXB0aW9uIGlmIHRoZSBVUkwgcmVzb2x2ZXMKLQkJCS8vIHRvIGEgZGlyZWN0b3J5LCBmaW5kIHRoZSBwbHVnaW4ueG1sIGZpbGUgYW5kIHRoZW4gc3RyaXAgb2ZmIHRoZSBmaWxlIG5hbWUgCi0JCQkvLyB0byBmaW5kIHRoZSB0ZXN0SW5wdXQgZGlyZWN0b3J5LgotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgcGx1Z2luWG1sUGF0aCA9IFBsYXRmb3JtLmFzTG9jYWxVUkwobmV3IFVSTChkZXNjcmlwdG9yLmdldEluc3RhbGxVUkwoKSwgInBsdWdpbi54bWwiKSkuZ2V0UGF0aCgpOyAvLyROT04tTkxTLTEkCi0JCQkJRmlsZSBwbHVnaW5YbWwgPSBuZXcgRmlsZShwbHVnaW5YbWxQYXRoKTsKLQkJCQlpZihwbHVnaW5YbWwuZXhpc3RzKCkpIHsKLQkJCQkJRmlsZSBpbnB1dERpciA9IG5ldyBGaWxlKHBsdWdpblhtbC5nZXRQYXJlbnQoKSwgInRlc3RJbnB1dCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChpbnB1dERpci5leGlzdHMoKSAmJiBpbnB1dERpci5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJCQlyZXR1cm4gaW5wdXREaXIuZ2V0UGF0aCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBleGMpIHsKLQkJCSAgICBMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZihsb2dnZXIuZ2V0TGV2ZWwoKSA9PSBMZXZlbC5TRVZFUkUpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIFNob3VsZCBuZXZlciBnZXQgaGVyZSwgYnV0IGlmIHdlIGRvLCBhc3N1bWUgdGhhdCB0aGUgaW5wdXQgCi0JCS8vIGRpcmVjdG9yeSBpcyB0aGUgY3VycmVudCBkaXJlY3RvcnkuCi0JCXJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3JlZ2lzdHJ5L1Rlc3RjYXNlVXRpbGl0eS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvaW50ZXJuYWwvcmVnaXN0cnkvVGVzdGNhc2VVdGlsaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyZDU4ZTMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvaW50ZXJuYWwvcmVnaXN0cnkvVGVzdGNhc2VVdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwucmVnaXN0cnk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGx1Z2luRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuQlZUVmFsaWRhdGlvblBsdWdpbjsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHRoYXQgY29udGFpbnMgY29udmVuaWVuY2UgbWV0aG9kcyBmb3IgdGVzdCBjYXNlcy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFRlc3RjYXNlVXRpbGl0eSB7Ci0JLyoqCi0JICogTG9hZCB0aGUgcHJvamVjdCB0aGF0IHRoaXMgdGVzdCBjYXNlIGlzIHN1cHBvc2VkIHRvIHJ1biBvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0IGZpbmRQcm9qZWN0KElUZXN0Y2FzZU1ldGFEYXRhIHRtZCkgewotCQlpZih0bWQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QodG1kLmdldFByb2plY3ROYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBpbnB1dCBmb3IgdGhpcyB0ZXN0IGNhc2UgY2FuIGJlIGxvY2F0ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SW5wdXREaXIoSVRlc3RjYXNlTWV0YURhdGEgdG1kKSB7Ci0JCS8vIElmIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIHRlc3RjYXNlIGlucHV0IGlzbid0IHNwZWNpZmllZCwgCi0JCS8vIGFzc3VtZSB0aGF0IHRoZSBpbnB1dCBpcyBpbiBhIHN1YmRpcmVjdG9yeSwgbmFtZWQgInRlc3RJbnB1dCIsCi0JCS8vIG9mIHRoZSB0ZXN0Y2FzZSdzIHBsdWdpbi4KLQkJSVBsdWdpblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0UGx1Z2luUmVnaXN0cnkoKTsKLQkJSVBsdWdpbkRlc2NyaXB0b3IgZGVzY3JpcHRvciA9IHJlZ2lzdHJ5LmdldFBsdWdpbkRlc2NyaXB0b3IodG1kLmdldERlY2xhcmluZ1BsdWdpbklkKCkpOwotCQlpZihkZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCS8vIEJlY2F1c2UgUGxhdGZvcm0uYXNMb2NhbFVSTCB0aHJvd3MgYW4gSU9FeGNlcHRpb24gaWYgdGhlIFVSTCByZXNvbHZlcwotCQkJLy8gdG8gYSBkaXJlY3RvcnksIGZpbmQgdGhlIHBsdWdpbi54bWwgZmlsZSBhbmQgdGhlbiBzdHJpcCBvZmYgdGhlIGZpbGUgbmFtZSAKLQkJCS8vIHRvIGZpbmQgdGhlIHRlc3RJbnB1dCBkaXJlY3RvcnkuCi0JCQl0cnkgewotCQkJCVN0cmluZyBwbHVnaW5YbWxQYXRoID0gUGxhdGZvcm0uYXNMb2NhbFVSTChuZXcgVVJMKGRlc2NyaXB0b3IuZ2V0SW5zdGFsbFVSTCgpLCAicGx1Z2luLnhtbCIpKS5nZXRQYXRoKCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlGaWxlIHBsdWdpblhtbCA9IG5ldyBGaWxlKHBsdWdpblhtbFBhdGgpOwotCQkJCWlmKHBsdWdpblhtbC5leGlzdHMoKSkgewotCQkJCQlGaWxlIGlucHV0RGlyID0gbmV3IEZpbGUocGx1Z2luWG1sLmdldFBhcmVudCgpLCAidGVzdElucHV0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGlucHV0RGlyLmV4aXN0cygpICYmIGlucHV0RGlyLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJCXJldHVybiBpbnB1dERpci5nZXRQYXRoKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGV4YykgewotCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkvLyBTaG91bGQgbmV2ZXIgZ2V0IGhlcmUsIGJ1dCBpZiB3ZSBkbywgYXNzdW1lIHRoYXQgdGhlIGlucHV0IAotCQkvLyBkaXJlY3RvcnkgaXMgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgotCQlyZXR1cm4gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogbG9nRmlsZU5hbWUgbXVzdCBwb2ludCB0byBhIGZ1bGx5LXF1YWxpZmllZCBmaWxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBmbHVzaChTdHJpbmcgbG9nRmlsZU5hbWUsIFN0cmluZyBidWZmZXIsIGJvb2xlYW4gYXBwZW5kKSB7Ci0JCXRyeSB7Ci0JCQlGaWxlV3JpdGVyIHdyaXRlciA9IG5ldyBGaWxlV3JpdGVyKGxvZ0ZpbGVOYW1lLCBhcHBlbmQpOwotCQkJd3JpdGVyLndyaXRlKGJ1ZmZlcik7IC8vIFdyaXRlIHRoZSBlbnRpcmUgcmVwb3J0IHRvIHRoZSBzdGF0ZSBsb2cuCi0JCQl3cml0ZXIuY2xvc2UoKTsKLQkJfQotCQljYXRjaChJT0V4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvaW50ZXJuYWwvcmVnaXN0cnkvVmFsaWRhdG9yVGVzdGNhc2UuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3JlZ2lzdHJ5L1ZhbGlkYXRvclRlc3RjYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MmFjMTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvaW50ZXJuYWwvcmVnaXN0cnkvVmFsaWRhdG9yVGVzdGNhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4MiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwucmVnaXN0cnk7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LkJWVFZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5CVlRWYWxpZGF0aW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuVmFsaWRhdGlvblR5cGVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwudXRpbC5CVlRSdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JQnVmZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkdsb2JhbENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVGFza0xpc3RVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZUaHJlYWRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRvck1ldGFEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuSUZpbGVEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLlZhbGlkYXRvclN1YnNldE9wZXJhdGlvbjsKLQotcHVibGljIGNsYXNzIFZhbGlkYXRvclRlc3RjYXNlIGltcGxlbWVudHMgSVRlc3RjYXNlTWV0YURhdGEgewotCXByaXZhdGUgU3RyaW5nIF9wbHVnaW5JZCA9IG51bGw7IC8vIFRoZSBwbHVnaW4gaWQgdGhhdCBoYXMgY29udHJpYnV0ZWQgdGhpcyB0ZXN0IGNhc2UuCi0JcHJpdmF0ZSBWYWxpZGF0b3JNZXRhRGF0YSBfdm1kID0gbnVsbDsKLQlwcml2YXRlIE1lc3NhZ2VNZXRhRGF0YVtdIF9tZXNzYWdlcyA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgX3Byb2plY3ROYW1lID0gbnVsbDsgLy8gdGhlIG5hbWUgb2YgdGhlIHByb2plY3QgdGhhdCB0aGlzIHRlc3QgY2FzZSB0ZXN0cwotCXByaXZhdGUgU3RyaW5nW10gX3Jlc291cmNlTmFtZXMgPSBudWxsOyAvLyB0aGUgcmVzb3VyY2VzIGxpc3RlZCBpbiB0aGUgTWVzc2FnZU1ldGFEYXRhIG9mIHRoaXMgdGVzdCBjYXNlLgotCXByaXZhdGUgU3RyaW5nIF9pbnB1dEZpbGVOYW1lID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBfbmFtZSA9IG51bGw7IC8vIHRoZSBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UKLQlwcml2YXRlIGJvb2xlYW4gX3Zpc2libGUgPSB0cnVlOyAvLyBJcyB0aGlzIHRlc3QgY2FzZSB2aXNpYmxlIG9uIHRoZSBUZXN0IENvbGxlY3RvciBtZW51Ci0JCi0JcHVibGljIFZhbGlkYXRvclRlc3RjYXNlKFN0cmluZyBwbHVnaW5OYW1lLCBTdHJpbmcgcHJvamVjdCwgVmFsaWRhdG9yTWV0YURhdGEgdm1kLCBTdHJpbmcgaW5wdXRGaWxlTmFtZSwgYm9vbGVhbiB2aXNpYmxlKSB7Ci0JCV9wbHVnaW5JZCA9IHBsdWdpbk5hbWU7Ci0JCV9wcm9qZWN0TmFtZSA9IHByb2plY3Q7Ci0JCV92bWQgPSB2bWQ7Ci0JCV9pbnB1dEZpbGVOYW1lID0gaW5wdXRGaWxlTmFtZTsKLQkJX3Zpc2libGUgPSB2aXNpYmxlOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoKSB7Ci0JCXJldHVybiBfdmlzaWJsZTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXREZWNsYXJpbmdQbHVnaW5JZCgpIHsKLQkJcmV0dXJuIF9wbHVnaW5JZDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRQcm9qZWN0TmFtZSgpIHsKLQkJcmV0dXJuIF9wcm9qZWN0TmFtZTsKLQl9Ci0JCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCXJldHVybiBUZXN0Y2FzZVV0aWxpdHkuZmluZFByb2plY3QodGhpcyk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5wdXRGaWxlTmFtZSgpIHsKLQkJcmV0dXJuIF9pbnB1dEZpbGVOYW1lOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBtZXNzYWdlcwotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TnVtTWVzc2FnZXMoKSB7Ci0JCXJldHVybiBnZXRNZXNzYWdlcyhWYWxpZGF0aW9uVHlwZUVudW0uUlVOX1ZBTElEQVRJT04pLnNpemUoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsaXN0IG9mIG1lc3NhZ2VzIHRoYXQgc2hvdWxkIGJlIHJlcG9ydGVkIGZvciB0aGUgZ2l2ZW4gYnVpbGQKLQkgKiB0eXBlLiAoZS5nLiBpZiB0aGUgdmFsaWRhdG9yIGRvZXMgbm90IHN1cHBvcnQgaW5jcmVtZW50YWwgdmFsaWRhdGlvbiwKLQkgKiB0aGVuIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBsaXN0IG9mIGV4cGVjdGVkIG1lc3NhZ2VzLCByZXR1cm4gYW4gZW1wdHkgCi0JICogbGlzdC4pCi0JICovCi0JcHVibGljIExpc3QgZ2V0TWVzc2FnZXMoaW50IGJ1aWxkVHlwZSkgewotCQkvLyBUaGUgbWVzc2FnZXMgbmVlZCB0byBiZSBzdG9yZWQgaW4gYSBsaXN0IGluc3RlYWQgb2YgYW4gYXJyYXkgYmVjYXVzZQotCQkvLyB0aGUgbGlzdCBpcyBzb3J0ZWQgYmVmb3JlIHNlYXJjaGluZyAmIGRpc3BsYXlpbmcuCi0JCXN3aXRjaChidWlsZFR5cGUpIHsKLQkJCWNhc2UoVmFsaWRhdGlvblR5cGVFbnVtLkFVVE9fVkFMSURBVElPTik6Ci0JCQljYXNlKFZhbGlkYXRpb25UeXBlRW51bS5JTkNSRU1FTlRBTF9WQUxJREFUSU9OKTogewotCQkJCWlmKCFnZXRWYWxpZGF0b3JNZXRhRGF0YSgpLmlzSW5jcmVtZW50YWwoKSkgewotCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJCQl9Ci0JCQkJLy8gT3RoZXJ3aXNlLCByZXR1cm4gdGhlIGRlZmF1bHQgY29weSBiZWxvdy4KLQkJCQlicmVhazsKLQkJCX0KLQotCQkJY2FzZShWYWxpZGF0aW9uVHlwZUVudW0uRlVMTF9WQUxJREFUSU9OKTogewotCQkJCWlmKCFnZXRWYWxpZGF0b3JNZXRhRGF0YSgpLmlzRnVsbEJ1aWxkKCkpIHsKLQkJCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCQkJfQotCQkJCS8vIE90aGVyd2lzZSwgcmV0dXJuIHRoZSBkZWZhdWx0IGNvcHkgYmVsb3cuCi0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWNhc2UoVmFsaWRhdGlvblR5cGVFbnVtLlJVTl9WQUxJREFUSU9OKToKLQkJCWRlZmF1bHQ6IHsKLQkJCQkvLyBSZXR1cm4gdGhlIGRlZmF1bHQgY29weSBiZWxvdy4KLQkJCX0KLQkJCQotCQl9Ci0JCQotCQlMaXN0IGNvcHkgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvcihpbnQgaT0wOyBpPF9tZXNzYWdlcy5sZW5ndGg7IGkrKykgewotCQkJY29weS5hZGQoX21lc3NhZ2VzW2ldKTsKLQkJfQotCQkKLQkJcmV0dXJuIGNvcHk7Ci0JfQotCQotCS8vIFJldHVybiB0aGUgcmVzb3VyY2VzIGluIHRoaXMgcHJvamVjdCBmb3Igd2hpY2ggdGhlcmUgaXMgYSBtZXNzYWdlIGluIHRoaXMgdGVzdCBjYXNlLgotCS8vIE5vIHJlc291cmNlIGluc3RhbmNlIHdpbGwgYmUgaW4gdGhlIHJlc291cmNlIG1vcmUgdGhhbiBvbmNlLgotCXB1YmxpYyBJUmVzb3VyY2VbXSBnZXRSZXNvdXJjZXMoSVByb2plY3QgcHJvamVjdCkgewotCQlTZXQgdGVtcCA9IG5ldyBIYXNoU2V0KCk7IC8vIHVzZSBhIHNldCBpbiBjYXNlIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgbWVzc2FnZSByZWdpc3RlcmVkIGFnYWluc3QgYSByZXNvdXJjZSAoZG9uJ3Qgd2FudCBkdXBsaWNhdGVzIGluIHRoZSBsaXN0KS4KLQkJU3RyaW5nW10gcmVzb3VyY2VOYW1lcyA9IGdldFJlc291cmNlTmFtZXMoKTsKLQkJZm9yKGludCBpPTA7IGk8cmVzb3VyY2VOYW1lcy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIHJlc291cmNlTmFtZSA9IHJlc291cmNlTmFtZXNbaV07Ci0JCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBwcm9qZWN0LmZpbmRNZW1iZXIocmVzb3VyY2VOYW1lKTsKLQkJCWlmKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkvLyByZXNvdXJjZSBleGlzdHMKLQkJCQl0ZW1wLmFkZChyZXNvdXJjZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCUlSZXNvdXJjZVtdIHJlc3VsdCA9IG5ldyBJUmVzb3VyY2VbdGVtcC5zaXplKCldOwotCQl0ZW1wLnRvQXJyYXkocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZ1tdIGdldFJlc291cmNlTmFtZXMoKSB7Ci0JCWlmKF9yZXNvdXJjZU5hbWVzID09IG51bGwpIHsKLQkJCV9yZXNvdXJjZU5hbWVzID0gbmV3IFN0cmluZ1tfbWVzc2FnZXMubGVuZ3RoXTsKLQkJCWZvcihpbnQgaT0wOyBpPF9tZXNzYWdlcy5sZW5ndGg7IGkrKykgewotCQkJCV9yZXNvdXJjZU5hbWVzW2ldID0gX21lc3NhZ2VzW2ldLmdldFJlc291cmNlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIF9yZXNvdXJjZU5hbWVzOwotCX0KLQkKLQkvKioKLQkgKiBXaGVuIGFuIGVtcHR5IFRNRCBpcyB1c2VkIHRvIHRlc3QgYW4gb3BlcmF0aW9uLCBhbmQgdGhlIG9wZXJhdGlvbiBuZWVkcyB0aGUgSVJlc291cmNlW10KLQkgKiBhZmZlY3RlZCBieSB0aGUgVE1EIHRvIGtub3cgd2hldGhlciBvciBub3QgdGhlIG9wZXJhdGlvbiBwYXNzZXMgKGkuZS4sIG9uZSBvZiB0aGUgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uCi0JICogY29uc3RydWN0b3JzIHRha2VzIGFuIElSZXNvdXJjZVtdLCBhbmQgdGhlIElSZXNvdXJjZVtdIG11c3Qgbm90IGJlIGVtcHR5IG9yIG51bGwpLCB0aGVuCi0JICogdGhpcyBtZXRob2QgaXMgdXNlZCB0byBzZXQgdGhlICJyZXNvdXJjZXMiIGFmZmVjdGVkIGJ5IHRoZSB0ZXN0IGNhc2UuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzb3VyY2VOYW1lcyhTdHJpbmdbXSByZXNvdXJjZU5hbWVzKSB7Ci0JCV9yZXNvdXJjZU5hbWVzID0gcmVzb3VyY2VOYW1lczsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TWVzc2FnZXMoTWVzc2FnZU1ldGFEYXRhW10gbWVzc2FnZXMpIHsKLQkJLy8gSWYgbWVzc2FnZXMgYXJlIG51bGwsIHRoYXQgbWVhbnMgdGhhdCB0aGUgdGVzdCBjYXNlIGV4cGVjdHMgbm8gdmFsaWRhdGlvbiBlcnJvcnMuCi0JCV9tZXNzYWdlcyA9ICgobWVzc2FnZXMgPT0gbnVsbCkgPyBuZXcgTWVzc2FnZU1ldGFEYXRhWzBdIDogbWVzc2FnZXMpOwotCX0KLQkKLQlwdWJsaWMgVmFsaWRhdG9yTWV0YURhdGEgZ2V0VmFsaWRhdG9yTWV0YURhdGEoKSB7Ci0JCXJldHVybiBfdm1kOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFZhbGlkYXRvckNsYXNzKCkgewotCQlyZXR1cm4gZ2V0VmFsaWRhdG9yTWV0YURhdGEoKS5nZXRWYWxpZGF0b3JVbmlxdWVOYW1lKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlpZihfbmFtZSA9PSBudWxsKSB7Ci0JCQlfbmFtZSA9IF92bWQuZ2V0VmFsaWRhdG9yRGlzcGxheU5hbWUoKSArICI6OiIgKyBnZXRQcm9qZWN0TmFtZSgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIF9uYW1lOwotCX0JCi0JCi0JcHVibGljIHZvaWQgcnVuKElCdWZmZXIgYnVmZmVyLCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCVN0cmluZyBzdGF0dXMgPSAiPj4+Pj5SVU4gVkFMSURBVElPTiBURVNUIFBBU1MgWyIgKyBwcm9qZWN0LmdldE5hbWUoKSArICJdPj4+Pj4iOwkvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQJCQkKLQkJYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpLnN1YlRhc2soc3RhdHVzKTsKLQkJYnVmZmVyLndyaXRlKHN0YXR1cyk7Ci0JCWJ1ZmZlci5hZGRFeGVjdXRpb25TdGF0dXMoZ2V0TmFtZSgpLCBWYWxpZGF0aW9uVHlwZUVudW0uUlVOX1ZBTElEQVRJT05fTkFNRSwgdmFsaWRhdGUoYnVmZmVyLCBwcm9qZWN0LCBWYWxpZGF0aW9uVHlwZUVudW0uUlVOX1ZBTElEQVRJT04sIFZhbGlkYXRpb25UeXBlRW51bS5SVU5fVkFMSURBVElPTl9OQU1FKSk7Ci0JCXN0YXR1cyA9ICI+Pj4+PkVORCBSVU4gVkFMSURBVElPTiBURVNUIFBBU1MgWyIgKyBwcm9qZWN0LmdldE5hbWUoKSArICJdPj4+Pj4iOwkvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpLnN1YlRhc2soc3RhdHVzKTsKLQkJYnVmZmVyLndyaXRlKHN0YXR1cyk7Ci0JCQotCQlzdGF0dXMgPSAiPj4+Pj5GVUxMIEJVSUxEIFRFU1QgUEFTUyBbIiArIHByb2plY3QuZ2V0TmFtZSgpICsgIl0+Pj4+PiI7CQkJLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCQkKLQkJYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpLnN1YlRhc2soc3RhdHVzKTsKLQkJYnVmZmVyLndyaXRlKHN0YXR1cyk7Ci0JCWJ1ZmZlci5hZGRFeGVjdXRpb25TdGF0dXMoZ2V0TmFtZSgpLCBWYWxpZGF0aW9uVHlwZUVudW0uRlVMTF9WQUxJREFUSU9OX05BTUUsIHZhbGlkYXRlKGJ1ZmZlciwgcHJvamVjdCwgVmFsaWRhdGlvblR5cGVFbnVtLkZVTExfVkFMSURBVElPTiwgVmFsaWRhdGlvblR5cGVFbnVtLkZVTExfVkFMSURBVElPTl9OQU1FKSk7Ci0JCXN0YXR1cyA9ICI+Pj4+PkVORCBGVUxMIEJVSUxEIFRFU1QgUEFTUyBbIiArIHByb2plY3QuZ2V0TmFtZSgpICsgIl0+Pj4+PiI7CS8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuc3ViVGFzayhzdGF0dXMpOwotCQlidWZmZXIud3JpdGUoc3RhdHVzKTsKLQkJCi0JCXN0YXR1cyA9ICI+Pj4+PklOQ1JFTUVOVEFMIEJVSUxEIFRFU1QgUEFTUyBbIiArIHByb2plY3QuZ2V0TmFtZSgpICsgIl0+Pj4+PiI7CS8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuc3ViVGFzayhzdGF0dXMpOwotCQlidWZmZXIud3JpdGUoc3RhdHVzKTsKLQkJYnVmZmVyLmFkZEV4ZWN1dGlvblN0YXR1cyhnZXROYW1lKCksIFZhbGlkYXRpb25UeXBlRW51bS5JTkNSRU1FTlRBTF9WQUxJREFUSU9OX05BTUUsIHZhbGlkYXRlKGJ1ZmZlciwgcHJvamVjdCwgVmFsaWRhdGlvblR5cGVFbnVtLklOQ1JFTUVOVEFMX1ZBTElEQVRJT04sIFZhbGlkYXRpb25UeXBlRW51bS5JTkNSRU1FTlRBTF9WQUxJREFUSU9OX05BTUUpKTsKLQkJc3RhdHVzID0gIj4+Pj4+RU5EIElOQ1JFTUVOVEFMIEJVSUxEIFRFU1QgUEFTUyBbIiArIHByb2plY3QuZ2V0TmFtZSgpICsgIl0+Pj4+PiI7CS8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuc3ViVGFzayhzdGF0dXMpOwotCQlidWZmZXIud3JpdGUoc3RhdHVzKTsKLQkJCi0JCXN0YXR1cyA9ICI+Pj4+PkFVVE8gQlVJTEQgVEVTVCBQQVNTIFsiICsgcHJvamVjdC5nZXROYW1lKCkgKyAiXT4+Pj4+IjsJLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKS5zdWJUYXNrKHN0YXR1cyk7Ci0JCWJ1ZmZlci53cml0ZShzdGF0dXMpOwotCQlidWZmZXIuYWRkRXhlY3V0aW9uU3RhdHVzKGdldE5hbWUoKSwgVmFsaWRhdGlvblR5cGVFbnVtLkFVVE9fVkFMSURBVElPTl9OQU1FLCB2YWxpZGF0ZShidWZmZXIsIHByb2plY3QsIFZhbGlkYXRpb25UeXBlRW51bS5BVVRPX1ZBTElEQVRJT04sIFZhbGlkYXRpb25UeXBlRW51bS5BVVRPX1ZBTElEQVRJT05fTkFNRSkpOwotCQlzdGF0dXMgPSAiPj4+Pj5FTkQgQVVUTyBCVUlMRCBURVNUIFBBU1MgWyIgKyBwcm9qZWN0LmdldE5hbWUoKSArICJdPj4+Pj4iOwkvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpLnN1YlRhc2soc3RhdHVzKTsKLQkJYnVmZmVyLndyaXRlKHN0YXR1cyk7Ci0JCQotCQlpZihnZXRWYWxpZGF0b3JNZXRhRGF0YSgpLmlzQXN5bmMoKSkgewotCQkJc3RhdHVzID0gIj4+Pj4+QVNZTkNIUk9OT1VTIFZBTElEQVRJT04gVEVTVCBQQVNTIFsiICsgcHJvamVjdC5nZXROYW1lKCkgKyAiXT4+Pj4+IjsJLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuc3ViVGFzayhzdGF0dXMpOwotCQkJYnVmZmVyLndyaXRlKHN0YXR1cyk7Ci0JCQlidWZmZXIuYWRkRXhlY3V0aW9uU3RhdHVzKGdldE5hbWUoKSwgVmFsaWRhdGlvblR5cGVFbnVtLkFTWU5DX05BTUUsIGFzeW5jVmFsaWRhdGUoYnVmZmVyLCBwcm9qZWN0LCBWYWxpZGF0aW9uVHlwZUVudW0uQVNZTkNfTkFNRSkpOwotCQkJc3RhdHVzID0gIj4+Pj4+RU5EIEFTWU5DSFJPTk9VUyBWQUxJREFUSU9OIFRFU1QgUEFTUyBbIiArIHByb2plY3QuZ2V0TmFtZSgpICsgIl0+Pj4+PiI7CS8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpLnN1YlRhc2soc3RhdHVzKTsKLQkJCWJ1ZmZlci53cml0ZShzdGF0dXMpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gQnkgZGVmYXVsdCwgInBhc3MiIHRoZSBhc3luY2hyb3VzIHRlc3RzIG9mIGFueSB2YWxpZGF0b3IgdGhhdCBjYW5ub3QgcnVuIGFzeW5jaHJvbm91cyB0ZXN0cy4KLQkJCWJ1ZmZlci5hZGRFeGVjdXRpb25TdGF0dXMoZ2V0TmFtZSgpLCBWYWxpZGF0aW9uVHlwZUVudW0uQVNZTkNfTkFNRSwgdHJ1ZSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlKElCdWZmZXIgYnVmZmVyLCBJUHJvamVjdCBwcm9qZWN0LCBpbnQgdmFsaWRhdGlvblR5cGVFbnVtLCBTdHJpbmcgdGFza05hbWUpIHsKLQkJbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQlib29sZWFuIHBhc3NlZCA9IHRydWU7Ci0JCXRyeSB7Ci0JCQlwYXNzZWQgPSBCVlRSdW5uZXIuc2luZ2xldG9uKCkudGVzdChidWZmZXIsIHByb2plY3QsIHRoaXMsIHZhbGlkYXRpb25UeXBlRW51bSk7Ci0JCX0KLQkJY2F0Y2goQlZUVmFsaWRhdGlvbkV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJCWlmKGV4Yy5nZXRUYXJnZXRFeGNlcHRpb24oKSAhPSBudWxsKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yy5nZXRUYXJnZXRFeGNlcHRpb24oKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCWJ1ZmZlci5hZGRFbGFwc2VkVGltZSh0YXNrTmFtZSwgKGVuZCAtIHN0YXJ0KSk7Ci0JCQlidWZmZXIud3JpdGUoIlRvdGFsIHRpbWUgZm9yIHZhbGlkYXRvciAiICsgZ2V0VmFsaWRhdG9yTWV0YURhdGEoKS5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpICsgIiBvZiBwcm9qZWN0ICIgKyBwcm9qZWN0LmdldE5hbWUoKSArICIgaW4gIiArIHRhc2tOYW1lICsgIiBtb2RlIHdhcyAiICsgKGVuZCAtIHN0YXJ0KSArICIgbWlsbGlzZWNvbmRzLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKLQkJfQotCQlyZXR1cm4gcGFzc2VkOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gYXN5bmNWYWxpZGF0ZShJQnVmZmVyIGJ1ZmZlciwgSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHN1YlRhc2tOYW1lKSB7Ci0JCWJvb2xlYW4gcGFzc2VkID0gdHJ1ZTsKLQkJbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQlsb25nIGVuZCA9IDA7Ci0JCXRyeSB7Ci0JCQlHbG9iYWxDb25maWd1cmF0aW9uIGdjb25mID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldEdsb2JhbENvbmZpZ3VyYXRpb24oKTsKLQkJCS8vYm9vbGVhbiBkaXNhYmxlVmFsaWRhdGlvbiA9IGdjb25mLm51bWJlck9mRW5hYmxlZFZhbGlkYXRvcnMoKT09MDsKLQkJCS8vYm9vbGVhbiBhdXRvVmFsaWRhdGUgPSBnY29uZi5pc0F1dG9WYWxpZGF0ZSgpOwotCQkJLy9ib29sZWFuIGJ1aWxkVmFsaWRhdGUgPSBnY29uZi5pc0J1aWxkVmFsaWRhdGUoKTsKLQkJCXRyeSB7Ci0JCQkJLy9nY29uZi5zZXRBdXRvVmFsaWRhdGUoZmFsc2UpOwotCQkJCS8vIFR1cm4gb2ZmIGF1dG8tdmFsaWRhdGUgc28gdGhhdCB0aGUgcHJvamVjdCBpc24ndCB2YWxpZGF0ZWQgYXV0b21hdGljYWxseS4KLQkJCQkvL2djb25mLnNldEF1dG9WYWxpZGF0ZShmYWxzZSk7Ci0JCQkJLy9nY29uZi5zZXRCdWlsZFZhbGlkYXRlKGZhbHNlKTsKLQkJCQlnY29uZi5wYXNzaXZhdGUoKTsKLQkJCQkKLQkJCQkvLyBUd28gdGVzdHM6IAotCQkJCS8vICAgMS4gUnVuIHZhbGlkYXRpb24gb24gY29waWVzIG9mIHRoZSBvcmlnaW5hbCBwcm9qZWN0OiAicHJvamVjdE5hbWUuZm9yayIgYW5kICJwcm9qZWN0TmFtZS5ub0ZvcmsiCi0JCQkJLy8gICAgICBDb21wYXJlIHRoZSBtYXJrZXJzIG9mIHRoZSBjb3BpZXMgdG8gdGhlIEZWVCBUZXN0Y2FzZU1ldGFEYXRhLCBhbmQgdGhlIHZhbGlkYXRvciBwYXNzZXMgaWYgdGhlIAotCQkJCS8vCQlyZXN1bHRzIG9mIGVhY2ggY29weSBtYXRjaGVzIHRoZSBUZXN0Y2FzZU1ldGFEYXRhLgotCQkJCS8vICAgMi4gUnVuIHZhbGlkYXRpb24gb24gY29waWVzLCBidXQgdGhpcyB0aW1lIGludHJvZHVjZSBjaGFuZ2VzIGR1cmluZyB0aGUgdmFsaWRhdGlvbi4KLQkJCQkvLwkJRXh0cmFjdCB0aGUgbmFtZXMgb2YgcmVzb3VyY2VzIGZyb20gdGhlIHRlc3RjYXNlIG1ldGFkYXRhLCBmaW5kIHRob3NlIHJlc291cmNlcywgYW5kCi0JCQkJLy8JCWFkZC9kZWxldGUvcmVuYW1lL21vdmUvY2xvc2UvY2hhbmdlIHRoZW0uCi0JCQkJCi0JCQkJYm9vbGVhbiBwYXNzMSA9IHZhbGlkYXRlQW5kQ29tcGFyZShidWZmZXIsIHByb2plY3QsIHN1YlRhc2tOYW1lKTsKLQkJCQlib29sZWFuIHBhc3MyID0gdmFsaWRhdGVDaGFuZ2VBbmRDb21wYXJlKGJ1ZmZlciwgcHJvamVjdCwgSUZpbGVEZWx0YS5DSEFOR0VELCBzdWJUYXNrTmFtZSk7Ci0JCQkJYm9vbGVhbiBwYXNzMyA9IHZhbGlkYXRlQ2hhbmdlQW5kQ29tcGFyZShidWZmZXIsIHByb2plY3QsIElGaWxlRGVsdGEuREVMRVRFRCwgc3ViVGFza05hbWUpOwotCQkJCXBhc3NlZCA9IChwYXNzMSAmJiBwYXNzMiAmJiBwYXNzMyk7Ci0JCQl9Ci0JCQljYXRjaChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJCS8vIENvdWxkbid0IGNyZWF0ZSBjb3B5Lkp1c3QgY29udGludWUgd2l0aCB0aGUgbmV4dCB0ZXN0LgotCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2goQlZUVmFsaWRhdGlvbkV4Y2VwdGlvbiBleGMpIHsKLQkJCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJCQlpZihleGMuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCkgewotCQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoKFRocm93YWJsZSBleGMpIHsKLQkJCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCS8vZ2NvbmYuc2V0QXV0b1ZhbGlkYXRlKGF1dG9WYWxpZGF0ZSk7Ci0JCQkJLy9nY29uZi5zZXRCdWlsZFZhbGlkYXRlKGJ1aWxkVmFsaWRhdGUpOwotCQkJCWdjb25mLnBhc3NpdmF0ZSgpOwotCQkJfQotCQl9Ci0JCWNhdGNoKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCQlpZihleGMuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJYnVmZmVyLmFkZEVsYXBzZWRUaW1lKFZhbGlkYXRpb25UeXBlRW51bS5BU1lOQ19OQU1FLCAoZW5kIC0gc3RhcnQpKTsKLQkJCWJ1ZmZlci53cml0ZSgiVG90YWwgdGltZSBmb3IgdmFsaWRhdG9yICIgKyBnZXRWYWxpZGF0b3JNZXRhRGF0YSgpLmdldFZhbGlkYXRvckRpc3BsYXlOYW1lKCkgKyAiIG9mIHByb2plY3QgIiArIHByb2plY3QuZ2V0TmFtZSgpICsgIiBpbiBhc3luY2hyb25vdXMgbW9kZSB3YXMgIiArIChlbmQgLSBzdGFydCkgKyAiIG1pbGxpc2Vjb25kcy4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQkJCi0JCX0KLQkJcmV0dXJuIHBhc3NlZDsKLQl9Ci0KLQkvKioKLQkgKiBSdW4gdmFsaWRhdGlvbiwgdXNpbmcgc2V2ZXJhbCBvcGVyYXRpb25zIChib3RoIGZvcmtlZCBhbmQgbm90IGZvcmtlZCksIG9uIHRoZSBJUHJvamVjdC4KLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgcmVzdWx0LCBhZnRlciB0aGUgbGFzdCBvcGVyYXRpb24gaXMgY29tcGxldGUsIGlzIHRoZSBleHBlY3RlZCByZXN1bHQuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlQW5kQ29tcGFyZShJQnVmZmVyIGJ1ZmZlciwgSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHN1YlRhc2tOYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgQlZUVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCS8vIE5vdyBjb21wYXJlIHRoZSBJUHJvamVjdCdzIHJlc3VsdCB0byB0aGUgZXhwZWN0ZWQgVGVzdGNhc2VNZXRhRGF0YSByZXN1bHQuCi0JCS8vIFZhbGlkYXRlCi0JCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBub0ZvcmtPcCA9IG5ldyBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24ocHJvamVjdCwgdHJ1ZSwgZmFsc2UpOwotCQlub0ZvcmtPcC5zZXRWYWxpZGF0b3JzKGdldFZhbGlkYXRvck1ldGFEYXRhKCkuZ2V0VmFsaWRhdG9yTmFtZXMoKSk7Ci0JCW5vRm9ya09wLnJ1bihidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkKLQkJaWYoYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIGZvcmtPcCA9IG5ldyBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24ocHJvamVjdCwgdHJ1ZSwgdHJ1ZSk7Ci0JCWZvcmtPcC5zZXRWYWxpZGF0b3JzKGdldFZhbGlkYXRvck1ldGFEYXRhKCkuZ2V0VmFsaWRhdG9yTmFtZXMoKSk7Ci0JCWZvcmtPcC5ydW4oYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCi0JCWlmKGJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKS5pc0NhbmNlbGVkKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBub0ZvcmtPcDIgPSBuZXcgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKHByb2plY3QsIHRydWUsIGZhbHNlKTsKLQkJbm9Gb3JrT3AyLnNldFZhbGlkYXRvcnMoZ2V0VmFsaWRhdG9yTWV0YURhdGEoKS5nZXRWYWxpZGF0b3JOYW1lcygpKTsKLQkJbm9Gb3JrT3AyLnJ1bihidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCi0JCWlmKGJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKS5pc0NhbmNlbGVkKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBmb3JrT3AyID0gbmV3IFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbihwcm9qZWN0LCB0cnVlLCB0cnVlKTsKLQkJZm9ya09wMi5zZXRWYWxpZGF0b3JzKGdldFZhbGlkYXRvck1ldGFEYXRhKCkuZ2V0VmFsaWRhdG9yTmFtZXMoKSk7Ci0JCWZvcmtPcDIucnVuKGJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQotCQlpZihidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gZm9ya09wMyA9IG5ldyBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24ocHJvamVjdCwgdHJ1ZSwgdHJ1ZSk7Ci0JCWZvcmtPcDMuc2V0VmFsaWRhdG9ycyhnZXRWYWxpZGF0b3JNZXRhRGF0YSgpLmdldFZhbGlkYXRvck5hbWVzKCkpOwotCQlmb3JrT3AzLnJ1bihidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkKLQkJLy8gV2FpdCB1bnRpbCBhbGwgb2YgdGhlIHRocmVhZHMgaGF2ZSBjb21wbGV0ZS4KLQkJYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpLnN1YlRhc2soIldhaXRpbmcgZm9yIGFsbCBmb3JrZWQgdGhyZWFkcyB0byBmaW5pc2guLi4iKTsgLy8kTk9OLU5MUy0xJAotCQl3aGlsZSghVlRocmVhZE1hbmFnZXIuZ2V0TWFuYWdlcigpLmlzRG9uZSgpICYmICFidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuaXNDYW5jZWxlZCgpKSB7fQotCQlidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuc3ViVGFzaygiQWxsIHRocmVhZHMgYXJlIGNvbXBsZXRlLiBCZWdpbm5pbmcgdGhlIGNvbXBhcmlzb24uIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWlmKGJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKS5pc0NhbmNlbGVkKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIENvbXBhcmUKLQkJSU1hcmtlcltdIG1hcmtlcnMgPSBUYXNrTGlzdFV0aWxpdHkuZ2V0VmFsaWRhdGlvblRhc2tzKHByb2plY3QsIGdldFZhbGlkYXRvck1ldGFEYXRhKCkuZ2V0VmFsaWRhdG9yTmFtZXMoKSk7Ci0KLQkJaWYoYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIEJWVFJ1bm5lci5zaW5nbGV0b24oKS52ZXJpZnkoYnVmZmVyLCBnZXROYW1lKCksIHN1YlRhc2tOYW1lLCBwcm9qZWN0LCBnZXRNZXNzYWdlcyhWYWxpZGF0aW9uVHlwZUVudW0uUlVOX1ZBTElEQVRJT04pLCBtYXJrZXJzKTsgCi0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlQ2hhbmdlQW5kQ29tcGFyZShJQnVmZmVyIGJ1ZmZlciwgSVByb2plY3QgcHJvamVjdCwgaW50IGlmaWxlRGVsdGFUeXBlLCBTdHJpbmcgc3ViVGFza05hbWUpIHRocm93cyBCVlRWYWxpZGF0aW9uRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBwYXNzZWQgPSB0cnVlOwotCQkKLQkJVmFsaWRhdG9yTWV0YURhdGFbXSB2bWRzID0gbmV3IFZhbGlkYXRvck1ldGFEYXRhW117Z2V0VmFsaWRhdG9yTWV0YURhdGEoKX07Ci0JCQotCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gbm9Gb3JrT3BPcmlnID0gbmV3IFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbihwcm9qZWN0LCB0cnVlLCBmYWxzZSk7Ci0JCW5vRm9ya09wT3JpZy5zZXRWYWxpZGF0b3JzKGdldFZhbGlkYXRvck1ldGFEYXRhKCkuZ2V0VmFsaWRhdG9yTmFtZXMoKSk7Ci0JCW5vRm9ya09wT3JpZy5ydW4oYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpKTsKLQotCQlpZihidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gbm9Gb3JrT3BDaGFuZ2VkID0gbmV3IFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbihwcm9qZWN0LCB2bWRzLCBnZXRSZXNvdXJjZXMocHJvamVjdCksIGlmaWxlRGVsdGFUeXBlLCBmYWxzZSwgZmFsc2UpOyAvLyBmYWxzZSA9IGRvIG5vdCBmb3JjZSBpZiB0aGVyZSdzIG5vIGRlbHRhcyB0byB2YWxpZGF0ZQotCQlub0ZvcmtPcENoYW5nZWQucnVuKGJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0KLQkJaWYoYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIGZvcmtPcE9yaWcgPSBuZXcgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKHByb2plY3QsIHRydWUsIHRydWUpOwotCQlmb3JrT3BPcmlnLnNldFZhbGlkYXRvcnMoZ2V0VmFsaWRhdG9yTWV0YURhdGEoKS5nZXRWYWxpZGF0b3JOYW1lcygpKTsKLQkJZm9ya09wT3JpZy5ydW4oYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpKTsKLQotCQlpZihidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gZm9ya09wQ2hhbmdlZCA9IG5ldyBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24ocHJvamVjdCwgdm1kcywgIGdldFJlc291cmNlcyhwcm9qZWN0KSwgaWZpbGVEZWx0YVR5cGUsIGZhbHNlLCB0cnVlKTsgLy8gZmFsc2UgPSBkbyBub3QgZm9yY2UgaWYgdGhlcmUncyBubyBkZWx0YXMgdG8gdmFsaWRhdGUKLQkJZm9ya09wQ2hhbmdlZC5ydW4oYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCi0JCWlmKGJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKS5pc0NhbmNlbGVkKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBub0ZvcmtPcDJPcmlnID0gbmV3IFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbihwcm9qZWN0LCB0cnVlLCBmYWxzZSk7Ci0JCW5vRm9ya09wMk9yaWcuc2V0VmFsaWRhdG9ycyhnZXRWYWxpZGF0b3JNZXRhRGF0YSgpLmdldFZhbGlkYXRvck5hbWVzKCkpOwotCQlub0ZvcmtPcDJPcmlnLnJ1bihidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCi0JCWlmKGJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKS5pc0NhbmNlbGVkKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBub0ZvcmtPcDJDaGFuZ2VkID0gbmV3IFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbihwcm9qZWN0LCB2bWRzLCAgZ2V0UmVzb3VyY2VzKHByb2plY3QpLCBpZmlsZURlbHRhVHlwZSwgZmFsc2UsIGZhbHNlKTsgLy8gZmFsc2UgPSBkbyBub3QgZm9yY2UgaWYgdGhlcmUncyBubyBkZWx0YXMgdG8gdmFsaWRhdGUKLQkJbm9Gb3JrT3AyQ2hhbmdlZC5ydW4oYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpKTsKLQotCQlpZihidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gZm9ya09wMk9yaWcgPSBuZXcgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKHByb2plY3QsIHRydWUsIHRydWUpOwotCQlmb3JrT3AyT3JpZy5zZXRWYWxpZGF0b3JzKGdldFZhbGlkYXRvck1ldGFEYXRhKCkuZ2V0VmFsaWRhdG9yTmFtZXMoKSk7Ci0JCWZvcmtPcDJPcmlnLnJ1bihidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkKLQkJaWYoYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIGZvcmtPcDJDaGFuZ2VkID0gbmV3IFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbihwcm9qZWN0LCB2bWRzLCAgZ2V0UmVzb3VyY2VzKHByb2plY3QpLCBpZmlsZURlbHRhVHlwZSwgZmFsc2UsIHRydWUpOyAvLyBmYWxzZSA9IGRvIG5vdCBmb3JjZSBpZiB0aGVyZSdzIG5vIGRlbHRhcyB0byB2YWxpZGF0ZQotCQlmb3JrT3AyQ2hhbmdlZC5ydW4oYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpKTsKLQotCQlpZihidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gZm9ya09wM09yaWcgPSBuZXcgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKHByb2plY3QsIHRydWUsIHRydWUpOwotCQlmb3JrT3AzT3JpZy5zZXRWYWxpZGF0b3JzKGdldFZhbGlkYXRvck1ldGFEYXRhKCkuZ2V0VmFsaWRhdG9yTmFtZXMoKSk7Ci0JCWZvcmtPcDNPcmlnLnJ1bihidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkKLQkJaWYoYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIGZvcmtPcDNDaGFuZ2VkID0gbmV3IFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbihwcm9qZWN0LCB2bWRzLCBnZXRSZXNvdXJjZXMocHJvamVjdCksIGlmaWxlRGVsdGFUeXBlLCBmYWxzZSwgdHJ1ZSk7IC8vIGZhbHNlID0gZG8gbm90IGZvcmNlIGlmIHRoZXJlJ3Mgbm8gZGVsdGFzIHRvIHZhbGlkYXRlCi0JCWZvcmtPcDNDaGFuZ2VkLnJ1bihidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkKLQkJLy8gV2FpdCB1bnRpbCBhbGwgb2YgdGhlIHRocmVhZHMgaGF2ZSBjb21wbGV0ZS4KLQkJYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpLnN1YlRhc2soIldhaXRpbmcgZm9yIGFsbCBmb3JrZWQgdGhyZWFkcyB0byBmaW5pc2guLi4iKTsgLy8kTk9OLU5MUy0xJAotCQl3aGlsZSghVlRocmVhZE1hbmFnZXIuZ2V0TWFuYWdlcigpLmlzRG9uZSgpICYmICFidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuaXNDYW5jZWxlZCgpKSB7fQotCQlpZihidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuaXNDYW5jZWxlZCgpKSB7Ci0JCQlidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuc3ViVGFzaygiQ29tcGFyaXNvbiBjYW5jZWxsZWQuIFBlcmZvcm1pbmcgY2xlYW51cC4iKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKS5zdWJUYXNrKCJBbGwgdGhyZWFkcyBhcmUgY29tcGxldGUuIEJlZ2lubmluZyB0aGUgY29tcGFyaXNvbi4iKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJLy8gQ29tcGFyZQotCQlJTWFya2VyW10gbWFya2VycyA9IFRhc2tMaXN0VXRpbGl0eS5nZXRWYWxpZGF0aW9uVGFza3MocHJvamVjdCwgZ2V0VmFsaWRhdG9yTWV0YURhdGEoKS5nZXRWYWxpZGF0b3JOYW1lcygpKTsKLQotCQkvLyBOb3cgY29tcGFyZSB0aGUgSVByb2plY3QncyByZXN1bHQgdG8gdGhlIGV4cGVjdGVkIFRlc3RjYXNlTWV0YURhdGEgcmVzdWx0LgotCQkvLyBEb24ndCB3cml0ZSBfcGFzc2VkID0gX3Bhc3NlZCAmJiBnZXQuLi4KLQkJLy8gV2hlbiB0aGUgX3Bhc3NlZCA9PSBmYWxzZSwgdGhlbiBqYXZhIGRpZG4ndCBib3RoZXIgcnVubmluZyB0aGUgdGVzdC4KLQkJcGFzc2VkID0gQlZUUnVubmVyLnNpbmdsZXRvbigpLnZlcmlmeShidWZmZXIsIGdldE5hbWUoKSwgc3ViVGFza05hbWUsIHByb2plY3QsIGdldE1lc3NhZ2VzKFZhbGlkYXRpb25UeXBlRW51bS5SVU5fVkFMSURBVElPTiksIG1hcmtlcnMpOwotCQkKLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmRlbGV0ZU1hcmtlcnMobWFya2Vycyk7Ci0JCi0JCXJldHVybiBwYXNzZWQ7Ci0JCQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3V0aWwvQlZUUnVubmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9pbnRlcm5hbC91dGlsL0JWVFJ1bm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTM5NjNkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3V0aWwvQlZUUnVubmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ODcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5Mb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuQlZUVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LkJWVFZhbGlkYXRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5WYWxpZGF0aW9uVHlwZUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC5yZWdpc3RyeS5CVlRWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC5yZWdpc3RyeS5JVGVzdGNhc2VNZXRhRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnJlZ2lzdHJ5Lk1lc3NhZ2VNZXRhRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnJlZ2lzdHJ5Lk1lc3NhZ2VVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwucmVnaXN0cnkuT3BlcmF0aW9uVGVzdGNhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC5yZWdpc3RyeS5UZXN0U2V0dXBJbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC5yZWdpc3RyeS5UZXN0Y2FzZVV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC5yZWdpc3RyeS5WYWxpZGF0b3JUZXN0Y2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JVGVzdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5JbnRlcm5hbFZhbGlkYXRvck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVGFza0xpc3RVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZUaHJlYWRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRvck1ldGFEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuT25lVmFsaWRhdG9yT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuVmFsaWRhdGlvbk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wbHVnaW4uVmFsaWRhdGlvblBsdWdpbjsKLQotLyoqCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCVlRSdW5uZXIgewotCXByaXZhdGUgc3RhdGljIEJWVFJ1bm5lciBfaW5zdCA9IG51bGw7Ci0JcHJpdmF0ZSBMaXN0IF9leHRyYSA9IG51bGw7IC8vIFRoZSBleHRyYSBtYXJrZXJzIHJlcG9ydGVkIChzdG9yZWQgaW4gYSBsaXN0IHRvIG1ha2UgcmVhZGluZyBlYXNpZXIpLgotCXByaXZhdGUgTGlzdCBfbWlzc2luZyA9IG51bGw7IC8vIFRoZSBtaXNzaW5nIE1NRCB0aGF0IHdlcmUgc3VwcG9zZWQgdG8gYmUgcmVwb3J0ZWQgKHN0b3JlZCBpbiBhIGxpc3QgdG8gbWFrZSByZWFkaW5nIGVhc2llcikuCi0KLQlwdWJsaWMgc3RhdGljIEJWVFJ1bm5lciBzaW5nbGV0b24oKSB7Ci0JCWlmKF9pbnN0ID09IG51bGwpIHsKLQkJCV9pbnN0ID0gbmV3IEJWVFJ1bm5lcigpOwotCQl9Ci0JCXJldHVybiBfaW5zdDsKLQl9Ci0JCi0JcHJpdmF0ZSBCVlRSdW5uZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCV9leHRyYSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJX21pc3NpbmcgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBpc1ZlcmJvc2UoKSB7Ci0JCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORVNUKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgY2hhciBnZXRTZXZlcml0eUNoYXIoSW50ZWdlciBzZXZlcml0eSkgewotCQlpZihzZXZlcml0eSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gJz8nOwotCQl9Ci0JCQotCQlzd2l0Y2goc2V2ZXJpdHkuaW50VmFsdWUoKSkgewotCQkJY2FzZShJTWFya2VyLlNFVkVSSVRZX0VSUk9SKTogewotCQkJCXJldHVybiAnRSc7Ci0JCQl9Ci0JCQkKLQkJCWNhc2UoSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HKTogewotCQkJCXJldHVybiAnVyc7Ci0JCQl9Ci0JCQkKLQkJCWNhc2UoSU1hcmtlci5TRVZFUklUWV9JTkZPKTogewotCQkJCXJldHVybiAnSSc7Ci0JCQl9Ci0JCQkKLQkJCWRlZmF1bHQ6IHsKLQkJCQlyZXR1cm4gJz8nOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nW10gZ2V0TmFtZXMoSVByb2plY3RbXSBwcm9qZWN0cykgewotCQlpZihwcm9qZWN0cyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IFN0cmluZ1swXTsKLQkJfQotCQlTdHJpbmdbXSBuYW1lcyA9IG5ldyBTdHJpbmdbcHJvamVjdHMubGVuZ3RoXTsKLQkJZm9yKGludCBpPTA7IGk8cHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBwcm9qZWN0c1tpXTsKLQkJCW5hbWVzW2ldID0gcHJvamVjdC5nZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIG5hbWVzOwotCX0KLQotCXByaXZhdGUgdm9pZCBkZWJ1ZyhJQnVmZmVyIGJ1ZmZlciwgSU1hcmtlcltdIG1lc3NhZ2VzKSB7Ci0JCWlmKG1lc3NhZ2VzID09IG51bGwpIHsKLQkJCWJ1ZmZlci53cml0ZSgiTm90aGluZyB0byBkZWJ1ZyBiZWNhdXNlIG5vdGhpbmcgd2FzIHJlcG9ydGVkIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJZm9yKGludCBpPTA7IGk8bWVzc2FnZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlNYXJrZXIgbWFya2VyID0gbWVzc2FnZXNbaV07Ci0JCQlidWZmZXIud3JpdGUoTWVzc2FnZVV0aWxpdHkudG9TdHJpbmcobWFya2VyKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSVByb2dyZXNzTW9uaXRvciBnZXREZWJ1Z01vbml0b3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmKGlzVmVyYm9zZSgpKSB7Ci0JCQlyZXR1cm4gbW9uaXRvcjsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOyAvLyBpZiB2ZXJib3NlIGlzIHRydWUsIHNob3cgcHJvZ3Jlc3MgbWVzc2FnZXMgZm9yIHRoZSBjcmVhdGlvbiAmIHZhbGlkYXRpb24gb2YgdGhlIHByb2plY3QuIE90aGVyd2lzZSBzaG93IG9ubHkgdGhlIEJWVCBzdGF0dXMuCi0JCX0KLQl9Ci0JCi0JLyoqCi0JICogV2hlbiBpbnZva2luZyB0aGUgdGVzdCBmcm9tIHRoZSBVSSwgdGhlIGlucHV0IGhhcyBhbHJlYWR5IGJlZW4gaW1wb3J0ZWQsIHNvIGp1c3QgdGVzdCBpdC4KLQkgKiBUaGUgbmFtZSBvZiB0aGUgdGVzdCBpcyBkZXJpdmVkIGZyb20gdGhlIG5hbWUgb2YgdGhlIHByb2plY3QuCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgdGVzdHMgdGhhdCBwYXNzZWQuCi0JICovCQotCXB1YmxpYyBpbnQgdGVzdChJQnVmZmVyIGJ1ZmZlciwgSVByb2plY3RbXSBwcm9qZWN0cykgdGhyb3dzIEJWVFZhbGlkYXRpb25FeGNlcHRpb24gewkKLQkJU3RyaW5nW10gdGVzdE5hbWVzID0gZ2V0TmFtZXMocHJvamVjdHMpOwotCQlCVlRWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIgcmVhZGVyID0gQlZUVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpOwotCQkKLQkJYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpLmJlZ2luVGFzaygiUnVubmluZyBCVlQgdGVzdHMiLCBwcm9qZWN0cy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWludCB0b3RhbFRlc3RzID0gMDsKLQkJaW50IHRvdGFsUGFzc2VkID0gMDsKLQkJZm9yKGludCBpPTA7IGk8cHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCWJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKS5zdWJUYXNrKCJUZXN0aW5nIHByb2plY3QgIiArIChpKzEpICsgIiBvZiAiICsgcHJvamVjdHMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlJUHJvamVjdCBwcm9qZWN0ID0gcHJvamVjdHNbaV07Ci0JCQlWYWxpZGF0b3JUZXN0Y2FzZVtdIHRlc3RzID0gcmVhZGVyLmdldFZhbGlkYXRvclRlc3RzKGJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKSwgdGVzdE5hbWVzW2ldKTsKLQkJCWlmKCh0ZXN0cyA9PSBudWxsKSB8fCAodGVzdHMubGVuZ3RoID09IDApKSB7Ci0JCQkJYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpLnN1YlRhc2soIlRoZXJlIGFyZSBubyB0ZXN0cyB0byBydW4uIik7IC8vJE5PTi1OTFMtMSQKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCQotCQkJaW50IG51bVRlc3RzUGFzc2VkID0gMDsKLQkJCWZvcihpbnQgaj0wOyBqPHRlc3RzLmxlbmd0aDsgaisrKSB7Ci0JCQkJVmFsaWRhdG9yVGVzdGNhc2UgdG1kID0gdGVzdHNbal07Ci0JCQkJaWYodGVzdChidWZmZXIsIHByb2plY3QsIHRtZCwgVmFsaWRhdGlvblR5cGVFbnVtLlJVTl9WQUxJREFUSU9OKSkgewotCQkJCQludW1UZXN0c1Bhc3NlZCsrOwotCQkJCQlidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuc3ViVGFzaygiVGVzdCAiICsgKGorMSkgKyAiIG9mICIgKyB0ZXN0cy5sZW5ndGggKyAiIHBhc3NlZC4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKS5zdWJUYXNrKCJUZXN0ICIgKyAoaisxKSArICIgb2YgIiArIHRlc3RzLmxlbmd0aCArICIgZmFpbGVkLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCX0KLQkJCQlidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkud29ya2VkKDEpOwotCQkJfQotCQkJCi0JCQl0b3RhbFRlc3RzICs9IHRlc3RzLmxlbmd0aDsKLQkJCXRvdGFsUGFzc2VkICs9IG51bVRlc3RzUGFzc2VkOwotCQkJCi0JCQlidWZmZXIud3JpdGUobnVtVGVzdHNQYXNzZWQgKyAiIG9mICIgKyB0ZXN0cy5sZW5ndGggKyAiIHRlc3RzIHBhc3NlZC4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJYnVmZmVyLndyaXRlKCJcbj4+Pj4+Pj4+Pj5URVNUIFJFU1VMVFM+Pj4+Pj4+Pj4+Iik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLndyaXRlKHRvdGFsUGFzc2VkICsgIiBvZiAiICsgdG90YWxUZXN0cyArICIgdGVzdHMgcGFzc2VkLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpLmRvbmUoKTsKLQkJCi0JCXJldHVybiB0b3RhbFBhc3NlZDsKLQl9Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0IGEgVmFsaWRhdGlvbk9wZXJhdGlvbiBvbiB0aGUgSVByb2plY3QsIGludm9rZSB0aGUgb3BlcmF0aW9uLCBhbmQgdmVyaWZ5IHRoYXQgdGhlCi0JICogcmVzdWx0aW5nIElNYXJrZXJzIG1hdGNoIHRoZSBleHBlY3RlZCBtZXNzYWdlcyBpbiB0aGUgdG1kLgotCSAqLwkKLQlwdWJsaWMgYm9vbGVhbiB0ZXN0KElCdWZmZXIgYnVmZmVyLCBJUHJvamVjdCBwcm9qZWN0LCBWYWxpZGF0b3JUZXN0Y2FzZSB0bWQsIGludCB2YWxpZGF0aW9uRW51bVR5cGUpIHRocm93cyBCVlRWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJc3dpdGNoKHZhbGlkYXRpb25FbnVtVHlwZSkgewotCQkJY2FzZShWYWxpZGF0aW9uVHlwZUVudW0uUlVOX1ZBTElEQVRJT04pOiB7Ci0JCQkJcmV0dXJuIHRlc3QoYnVmZmVyLCB0bWQuZ2V0TmFtZSgpLCBWYWxpZGF0aW9uVHlwZUVudW0uUlVOX1ZBTElEQVRJT05fTkFNRSwgdG1kLmdldE1lc3NhZ2VzKHZhbGlkYXRpb25FbnVtVHlwZSksIG5ldyBPbmVWYWxpZGF0b3JPcGVyYXRpb24ocHJvamVjdCwgdG1kLmdldFZhbGlkYXRvckNsYXNzKCksIHRydWUsIGZhbHNlKSwgSW50ZXJuYWxWYWxpZGF0b3JNYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRWYWxpZGF0b3JOYW1lcyhuZXcgVmFsaWRhdG9yTWV0YURhdGFbXXt0bWQuZ2V0VmFsaWRhdG9yTWV0YURhdGEoKX0pKTsgLy8gdHJ1ZT1mb3JjZSwgZmFsc2U9bm8gZm9yCi0JCQl9Ci0JCQkKLQkJCWNhc2UoVmFsaWRhdGlvblR5cGVFbnVtLkZVTExfVkFMSURBVElPTik6IHsKLQkJCQlyZXR1cm4gYnVpbGQoYnVmZmVyLCBwcm9qZWN0LCB0bWQsIHZhbGlkYXRpb25FbnVtVHlwZSwgVmFsaWRhdGlvblR5cGVFbnVtLkZVTExfVkFMSURBVElPTl9OQU1FKTsKLQkJCX0KLQkJCQotCQkJY2FzZShWYWxpZGF0aW9uVHlwZUVudW0uSU5DUkVNRU5UQUxfVkFMSURBVElPTik6IHsKLQkJCQlyZXR1cm4gYnVpbGQoYnVmZmVyLCBwcm9qZWN0LCB0bWQsIHZhbGlkYXRpb25FbnVtVHlwZSwgVmFsaWRhdGlvblR5cGVFbnVtLklOQ1JFTUVOVEFMX1ZBTElEQVRJT05fTkFNRSk7Ci0JCQl9Ci0JCQkKLQkJCWNhc2UoVmFsaWRhdGlvblR5cGVFbnVtLkFVVE9fVkFMSURBVElPTik6IHsKLQkJCQlyZXR1cm4gYnVpbGQoYnVmZmVyLCBwcm9qZWN0LCB0bWQsIHZhbGlkYXRpb25FbnVtVHlwZSwgVmFsaWRhdGlvblR5cGVFbnVtLkFVVE9fVkFMSURBVElPTl9OQU1FKTsKLQkJCX0KLQkJCQotCQkJZGVmYXVsdDogewotCQkJCWJ1ZmZlci5hZGRFeGVjdXRpb25TdGF0dXModG1kLmdldE5hbWUoKSwgbnVsbCwgSVRlc3RTdGF0dXMuRkFJTCwgYnVmZmVyLCAiVW5yZWNvZ25pemVkIHZhbGlkYXRpb24gb3B0aW9uOiIgKyB2YWxpZGF0aW9uRW51bVR5cGUpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBidWlsZChJQnVmZmVyIGJ1ZmZlciwgZmluYWwgSVByb2plY3QgcHJvamVjdCwgZmluYWwgVmFsaWRhdG9yVGVzdGNhc2UgdG1kLCBmaW5hbCBpbnQgdmFsaWRhdGlvbkVudW1UeXBlLCBTdHJpbmcgc3ViVGFza05hbWUpIHRocm93cyBCVlRWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCUlQcm9ncmVzc01vbml0b3IgbnVsbE1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bigKLQkJCW5ldyBJV29ya3NwYWNlUnVubmFibGUoKXsKLQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJUmVzb3VyY2VbXSByZXNvdXJjZXMgPSB0bWQuZ2V0UmVzb3VyY2VzKHByb2plY3QpOwotCQkJCQkJZm9yKGludCBpPTA7IGk8cmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJSVJlc291cmNlIHJlcyA9IHJlc291cmNlc1tpXTsKLQkJCQkJCQlyZXMudG91Y2gobW9uaXRvcik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJCQlsb2dnZXIud3JpdGUoZXhjKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0sIG51bGxNb25pdG9yKTsKLQkJfQotCQljYXRjaChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShleGMpOwotCQkJfQotCQkJYnVmZmVyLmFkZEV4ZWN1dGlvblN0YXR1cyh0bWQuZ2V0TmFtZSgpLCBzdWJUYXNrTmFtZSwgSVRlc3RTdGF0dXMuRkFJTCwgYnVmZmVyLCAiQ29yZUV4Y2VwdGlvbiBjYXVnaHQ7IHN0YWNrIHRyYWNlIGluIExvZ2dpbmdVdGlsLmxvZyIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQl0cnkgewotCQkJLy8gRG8gbm90IGJ1aWxkIHVzaW5nIG9ubHkgdGhlIHZhbGlkYXRpb24gYnVpbGRlciBiZWNhdXNlIHNvbWUgdmFsaWRhdG9ycwotCQkJLy8gKGkuZS4sIHRoZSBFSkIgVmFsaWRhdG9yKSBkZXBlbmQgb24gdGhlIG91dHB1dCBvZiBvdGhlciBidWlsZGVycyAKLQkJCS8vIChpLmUuLCB0aGUgSmF2YSBCdWlsZGVyKS4KLQkJCXByb2plY3QuYnVpbGQodmFsaWRhdGlvbkVudW1UeXBlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfQotCQljYXRjaChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShleGMpOwotCQkJfQotCQkJYnVmZmVyLndyaXRlKCJDb3JlRXhjZXB0aW9uIGNhdWdodDsgc3RhY2sgdHJhY2UgaW4gTG9nZ2luZ1V0aWwubG9nIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCUlNYXJrZXJbXSBtZXNzYWdlcyA9IFRhc2tMaXN0VXRpbGl0eS5nZXRWYWxpZGF0aW9uVGFza3MocHJvamVjdCwgSW50ZXJuYWxWYWxpZGF0b3JNYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRWYWxpZGF0b3JOYW1lcyhuZXcgVmFsaWRhdG9yTWV0YURhdGFbXXt0bWQuZ2V0VmFsaWRhdG9yTWV0YURhdGEoKX0pKTsKLQkJcmV0dXJuIHZlcmlmeShidWZmZXIsIHRtZC5nZXROYW1lKCksIHN1YlRhc2tOYW1lLCBwcm9qZWN0LCB0bWQuZ2V0TWVzc2FnZXModmFsaWRhdGlvbkVudW1UeXBlKSwgbWVzc2FnZXMpOwotCX0KLQkKLQkvKioKLQkgKiBSdW4gdGhlIGdpdmVuIFZhbGlkYXRpb25PcGVyYXRpb24gYW5kIGVuc3VyZSB0aGF0IHRoZSByZXN1bHRzIG1hdGNoIHRoZSByZXN1bHRzIG9mIHRoZSBnaXZlbiB0ZXN0IGNhc2UuCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIHJlc3VsdHMgbWF0Y2ggYW5kIGZhbHNlIGlmIHRoZXkgZG9uJ3QuCi0JICogCi0JICogVGhpcyBtZXRob2QgaXMgcHVibGljIGJlY2F1c2UgaXQncyBuZWVkZWQgZm9yIHRoZSBUZXN0T3BDb25zdHIgb3BlcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHRlc3QoSUJ1ZmZlciBidWZmZXIsIFN0cmluZyB0ZXN0TmFtZSwgU3RyaW5nIHN1YlRhc2tOYW1lLCBMaXN0IGV4cGVjdGVkTWVzc2FnZXMsIFZhbGlkYXRpb25PcGVyYXRpb24gb3AsIFN0cmluZ1tdIHZhbGlkYXRvck5hbWVzKSB0aHJvd3MgQlZUVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCUlQcm9ncmVzc01vbml0b3IgZGVidWdNb25pdG9yID0gZ2V0RGVidWdNb25pdG9yKGJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0JCWJvb2xlYW4gcGFzc2VkID0gdHJ1ZTsKLQkJdHJ5IHsKLQkJCQotCQkJaWYob3AgPT0gbnVsbCkgewotCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5XQVJOSU5HKSkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuV0FSTklORywgIkNhbm5vdCBydW4gdGVzdHMgYmVjYXVzZSB0aGUgT3BlcmF0aW9uIGlzIG51bGwuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJcGFzc2VkID0gZmFsc2U7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0cnkgewotCQkJCQkJLy9WYWxpZGF0b3JNYW5hZ2VyLmdldE1hbmFnZXIoKS5zZXROb01lc3NhZ2VMaW1pdChvcC5nZXRQcm9qZWN0KCkpOwotCQkJCQkKLQkJCQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5ydW4ob3AsIGRlYnVnTW9uaXRvcik7IAotCQkJCQkJCi0JCQkJCQlpZihvcC5pc0ZvcmsoKSkgewotCQkJCQkJCS8vIFdhaXQgdW50aWwgYWxsIGZvcmtlZCB0aHJlYWRzIGFyZSBjb21wbGV0ZQotCQkJCQkJCXdoaWxlKCFWVGhyZWFkTWFuYWdlci5nZXRNYW5hZ2VyKCkuaXNEb25lKCkpe307Ci0JCQkJCQl9Ci0JCQkKLQkJCQkJCS8vIExvYWQgdGhlIGVuYWJsZWQgdmFsaWRhdG9ycyBmcm9tIHRoZSB0ZXN0LCBub3QgdGhlIG9wZXJhdGlvbiwKLQkJCQkJCS8vIGJlY2F1c2UgdGhlIHRlc3QgaGFzIHRoZSBtZXNzYWdlcyBmb3IgYSBzaW5nbGUgdmFsaWRhdG9yLCBhbmQKLQkJCQkJCS8vIGlmIHRoZSBtZXNzYWdlcyBmcm9tIGFsbCBlbmFibGVkIHZhbGlkYXRvcnMgYXJlIHJldHJpZXZlZCwKLQkJCQkJCS8vIHRoZW4gImV4dHJhIiBtZXNzYWdlcywgcmVwb3J0ZWQgYnkgdmFsaWRhdG9ycyB3aG9zZSBtZXNzYWdlcwotCQkJCQkJLy8gYXJlbid0IGV4cGVjdGVkIGJ5IHRoZSB0ZXN0LCBmYWlsIHRoZSB0ZXN0IGNhc2UuIAotCQkJCQkJSU1hcmtlcltdIG1lc3NhZ2VzID0gVGFza0xpc3RVdGlsaXR5LmdldFZhbGlkYXRpb25UYXNrcyhvcC5nZXRQcm9qZWN0KCksIHZhbGlkYXRvck5hbWVzKTsKLQkJCQkJCXBhc3NlZCA9IHZlcmlmeShidWZmZXIsIHRlc3ROYW1lLCBzdWJUYXNrTmFtZSwgb3AuZ2V0UHJvamVjdCgpLCBleHBlY3RlZE1lc3NhZ2VzLCBtZXNzYWdlcyk7Ci0JCQkJfQotCQkJCWNhdGNoKFRocm93YWJsZSBleGMpIHsKLQkJCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJCQl9Ci0JCQkJCXBhc3NlZCA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaChUaHJvd2FibGUgZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCX0KLQkJCXBhc3NlZCA9IGZhbHNlOwotCQl9Ci0JCXJldHVybiBwYXNzZWQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2V0dXBUZXN0cyhJQnVmZmVyIGJ1ZmZlciwgYm9vbGVhbiB2ZXJib3NlKSB7Ci0JCVZhbGlkYXRvclRlc3RjYXNlW10gdnRzID0gQlZUVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmdldFZhbGlkYXRvclRlc3RzKGJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKSwgKFN0cmluZyludWxsKTsKLQkJT3BlcmF0aW9uVGVzdGNhc2VbXSBvdHMgPSBCVlRWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkuZ2V0T3BlcmF0aW9uVGVzdHMoYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpLCAoU3RyaW5nKW51bGwpOwotCQlib29sZWFuIHN1Y2Nlc3NmdWwgPSB0cnVlOwotCQlmb3IoaW50IGk9MDsgaTx2dHMubGVuZ3RoOyBpKyspIHsKLQkJCVZhbGlkYXRvclRlc3RjYXNlIHZ0ZXN0ID0gdnRzW2ldOwotCQkJc3VjY2Vzc2Z1bCA9IHNldHVwVGVzdHMoYnVmZmVyLCB2dGVzdCwgZmFsc2UpICYmIHN1Y2Nlc3NmdWw7Ci0JCX0KLQkJCi0JCWZvcihpbnQgaj0wOyBqPG90cy5sZW5ndGg7IGorKykgewotCQkJT3BlcmF0aW9uVGVzdGNhc2Ugb3Rlc3QgPSBvdHNbal07Ci0JCQlzdWNjZXNzZnVsID0gc2V0dXBUZXN0cyhidWZmZXIsIG90ZXN0LCBmYWxzZSkgJiYgc3VjY2Vzc2Z1bDsKLQkJfQotCQkKLQkJcmV0dXJuIHN1Y2Nlc3NmdWw7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIGFsbCBvZiB0aGUgdGVzdCBjYXNlcycgaW5wdXQgd2VyZSBmb3VuZCBhbmQgaW1wb3J0ZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2V0dXBUZXN0cyhJQnVmZmVyIGJ1ZmZlciwgSVRlc3RjYXNlTWV0YURhdGEgdG1kLCBib29sZWFuIHZlcmJvc2UpIHsKLQkJaW50IGV4ZWN1dGlvbk1hcCA9IDB4MDsKLQkJYm9vbGVhbiBpbXBvcnRlZCA9IHRydWU7Ci0JCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQl0cnkgewotCQkJQlZUVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyIHJlYWRlciA9IEJWVFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKTsKLQkKLQkJCS8vIEVhY2ggaW1wb3J0IG9wZXJhdGlvbiBkZWxldGVzIGFueSBwcm9qZWN0IGJlZm9yZSBpdCByZS1pbXBvcnRzIGl0LgotCQkJU3RyaW5nIGRpciA9IFRlc3RjYXNlVXRpbGl0eS5nZXRJbnB1dERpcih0bWQpOwotCQkJVGVzdFNldHVwSW1wb3J0W10gc2V0dXAgPSByZWFkZXIuZ2V0VGVzdFNldHVwKGJ1ZmZlciwgZGlyLCB0bWQsIHZlcmJvc2UpOwotCQkJaWYoKHNldHVwID09IG51bGwpIHx8IChzZXR1cC5sZW5ndGggPT0gMCkpIHsKLQkJCQlTdHJpbmcgbWVzc2FnZSA9ICJDYW5ub3QgaW1wb3J0IGlucHV0IHRoYXQgZG9lcyBub3QgZXhpc3QuIENoZWNrIHRoYXQgZGlyZWN0b3J5ICIgKyBkaXIgKyAiIGV4aXN0cy4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JCQkJYnVmZmVyLndyaXRlKG1lc3NhZ2UpOwotCQkJCWV4ZWN1dGlvbk1hcCB8PSAweDE7Ci0JCQkJaW1wb3J0ZWQgPSBmYWxzZTsKLQkJCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQlMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCQkJZW50cnkuc2V0RXhlY3V0aW9uTWFwKGV4ZWN1dGlvbk1hcCk7Ci0JCQkJCWVudHJ5LnNldFRleHQobWVzc2FnZSk7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuYmVnaW5UYXNrKCJJbXBvcnRpbmcgZmlsZXM7IHBsZWFzZSB3YWl0Li4uIiwgc2V0dXAubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQkJCWZvcihpbnQgaT0wOyBpPHNldHVwLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKS5zdWJUYXNrKCJJbXBvcnRpbmcgZmlsZSAiICsgKGkrMSkgKyAiIG9mICIgKyBzZXR1cC5sZW5ndGgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJaWYoIXNldHVwW2ldLmltcG9ydEZpbGUoYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpLCBkaXIpKSB7Ci0JCQkJCQkvLyBPbmUgb2YgdGhlIGlucHV0IGZpbGVzIGNvdWxkbid0IGJlIGltcG9ydGVkLgotCQkJCQkJZXhlY3V0aW9uTWFwIHw9IDB4MjsKLQkJCQkJCWltcG9ydGVkID0gZmFsc2U7Ci0JCQkJCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQkJCUxvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJCQkJCWVudHJ5LnNldEV4ZWN1dGlvbk1hcChleGVjdXRpb25NYXApOwotCQkJCQkJCWVudHJ5LnNldFRleHQoIkltcG9ydCBmYWlsZWQgZm9yIGRpciAiICsgZGlyKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCQkJCX0KLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKS53b3JrZWQoMSk7Ci0JCQkJfQotCQkJCWJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKS5kb25lKCk7Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZighaW1wb3J0ZWQpIHsKLQkJCQlTdHJpbmcgdG1kTmFtZSA9ICh0bWQgPT0gbnVsbCkgPyAiPyIgOiB0bWQuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkCi0JCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJZW50cnkuc2V0RXhlY3V0aW9uTWFwKGV4ZWN1dGlvbk1hcCk7Ci0JCQkJZW50cnkuc2V0VGV4dCgiVGVzdCBzZXR1cCBmb3IgIiArIHRtZE5hbWUgKyAiIHdhcyB1bnN1Y2Nlc3NmdWwuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW1wb3J0ZWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIGV4cGVjdGVkIG1lc3NhZ2VzICh0bWRNbWRMaXN0KSBtYXRjaGVzIHRoZSByZXBvcnRlZCBtZXNzYWdlcyAobWwyKS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb21wYXJlKElCdWZmZXIgYnVmZmVyLCBTdHJpbmcgdGVzdE5hbWUsIFN0cmluZyBzdWJUYXNrTmFtZSwgTGlzdCB0bWRNbWRMaXN0LCBJTWFya2VyW10gbWwyKSB7Ci0JCS8vIENvbnZlcnQgb25lIG9mIHRoZSBhcnJheXMgaW50byBhIGxpc3Qgc28gdGhhdCBpdCBjYW4gYmUgc29ydGVkLgotCQlpbnQgbnVtTWF0Y2hlZCA9IDA7Ci0JCUxpc3QgbW1kTGlzdCA9IG5ldyBBcnJheUxpc3QodG1kTW1kTGlzdCk7IC8vIGNyZWF0ZSBhIGNvcHkgb2YgdGhlIHRtZCdzIGV4cGVjdGVkIG91dHB1dCBzbyB0aGF0IHRoZSB0bWQncyBvdXRwdXQgcmVtYWlucyBpbnRhY3QKLQkJaW50IG51bUV4cGVjdGVkID0gbW1kTGlzdC5zaXplKCk7Ci0JCWludCBudW1SZXBvcnRlZCA9IG1sMi5sZW5ndGg7Ci0JCWJvb2xlYW4gcGFzc2VkID0gdHJ1ZTsKLQkKLQotCQl0cnkgewkJCi0JCQlDb2xsZWN0aW9ucy5zb3J0KG1tZExpc3QsIE1lc3NhZ2VVdGlsaXR5LmdldE1lc3NhZ2VDb21wYXJhdG9yKGJ1ZmZlciwgaXNWZXJib3NlKCkpKTsKLQkKLQkJCXRyeSB7Ci0JCQkJZm9yKGludCBpPTA7IGk8bWwyLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlNYXJrZXIgbWFya2VyID0gbWwyW2ldOwotCQkJCQlNZXNzYWdlTWV0YURhdGEgbWF0Y2hpbmcgPSBnZXRNYXRjaGluZ01ldGFEYXRhKGJ1ZmZlciwgbW1kTGlzdCwgbWFya2VyKTsKLQkJCQkJaWYobWF0Y2hpbmcgPT0gbnVsbCkgewotCQkJCQkJX2V4dHJhLmFkZChtYXJrZXIpOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyBFdmVyeSB0aW1lIGEgbW1kIGlzIG1hdGNoZWQgdG8gYSBtYXJrZXIsIHJlbW92ZSB0aGUgbW1kCi0JCQkJCQkvLyBmcm9tIHRoZSBsaXN0IHNvIHRoYXQgbW1kcyB3aXRob3V0IGEgbWFya2VyIGNhbiBiZSBmbGFnZ2VkLgotCQkJCQkJbW1kTGlzdC5yZW1vdmUobWF0Y2hpbmcpOwotCQkJCQkJbnVtTWF0Y2hlZCsrOwotCQkJCQl9Ci0JCQkJfQotCQotCQkJCWlmKG1tZExpc3Quc2l6ZSgpICE9IDApIHsKLQkJCQkJX21pc3NpbmcuYWRkQWxsKG1tZExpc3QpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoKFRocm93YWJsZSBleGMpIHsKLQkJCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJCX0KLQkJCQlwYXNzZWQgPSBmYWxzZTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCXBhc3NlZCA9IHBhc3NlZCAmJiAoKF9taXNzaW5nLnNpemUoKSA9PSAwKSAmJiAoX2V4dHJhLnNpemUoKSA9PSAwKSk7Ci0JCQkJCi0JCQkJLy8gUmVwb3J0IHRoZSBtaXNzaW5nIG1hcmtlcnMgYWZ0ZXIgdGhlIE1NRCBsaXN0IGlzIHNvcnRlZAotCQkJCUNvbGxlY3Rpb25zLnNvcnQoX21pc3NpbmcsIE1lc3NhZ2VVdGlsaXR5LmdldE1lc3NhZ2VDb21wYXJhdG9yKGJ1ZmZlciwgaXNWZXJib3NlKCkpKTsKLQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IF9taXNzaW5nLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCU1lc3NhZ2VNZXRhRGF0YSBtbWQgPSAoTWVzc2FnZU1ldGFEYXRhKWl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJYnVmZmVyLmFkZEV4ZWN1dGlvblN0YXR1cyh0ZXN0TmFtZSwgc3ViVGFza05hbWUsIElUZXN0U3RhdHVzLkZBSUwsIGJ1ZmZlciwgIkVSUk9SW21pc3NpbmcgbWVzc2FnZV06ICIgKyBNZXNzYWdlVXRpbGl0eS50b1N0cmluZyhtbWQpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQkKLQkJCQkvLyBSZXBvcnQgdGhlIGV4dHJhIG1hcmtlcnMgYWZ0ZXIgdGhleSdyZSBzb3J0ZWQuCi0JCQkJQ29sbGVjdGlvbnMuc29ydChfZXh0cmEsIE1lc3NhZ2VVdGlsaXR5LmdldE1lc3NhZ2VDb21wYXJhdG9yKGJ1ZmZlciwgaXNWZXJib3NlKCkpKTsKLQkJCQlpdGVyYXRvciA9IF9leHRyYS5pdGVyYXRvcigpOwotCQkJCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQlJTWFya2VyIG1hcmtlciA9IChJTWFya2VyKWl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJYnVmZmVyLmFkZEV4ZWN1dGlvblN0YXR1cyh0ZXN0TmFtZSwgc3ViVGFza05hbWUsIElUZXN0U3RhdHVzLkZBSUwsIGJ1ZmZlciwgIkVSUk9SW2V4dHJhIG1lc3NhZ2VdOiAiICsgTWVzc2FnZVV0aWxpdHkudG9TdHJpbmcobWFya2VyKSArICIsIFRleHQgaXM6IFwiIiArIE1lc3NhZ2VVdGlsaXR5LmdldE1lc3NhZ2UobWFya2VyKSArICJcIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCX0KLQkJCi0JCQkJaWYobnVtRXhwZWN0ZWQgIT0gbnVtUmVwb3J0ZWQpIHsKLQkJCQkJYnVmZmVyLndyaXRlKCJXcm9uZyBudW1iZXIgb2YgbWVzc2FnZXMgcmVwb3J0ZWQuIEV4cGVjdGVkICIgKyBudW1FeHBlY3RlZCArICIgYW5kIGdvdCAiICsgbnVtUmVwb3J0ZWQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCi0JCQkJYnVmZmVyLndyaXRlKCJOdW1iZXIgb2YgZXh0cmEgbWVzc2FnZXM6ICIgKyBfZXh0cmEuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJ1ZmZlci53cml0ZSgiTnVtYmVyIG9mIG1pc3NpbmcgbWVzc2FnZXM6ICIgKyBfbWlzc2luZy5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJYnVmZmVyLndyaXRlKCJOdW1iZXIgb2YgbWF0Y2hlZCBtZXNzYWdlczogIiArIG51bU1hdGNoZWQpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQltbWRMaXN0LmNsZWFyKCk7Ci0JCQlfZXh0cmEuY2xlYXIoKTsgLy8gQ2xlYXIgdGhlIGxpc3Qgb2YgZXh0cmEgbWFya2VycyAoc3RvcmVkIGluIGEgbGlzdCB0byBtYWtlIHJlYWRpbmcgZWFzaWVyKS4KLQkJCV9taXNzaW5nLmNsZWFyKCk7IC8vIENsZWFyIHRoZSBsaXN0IG9mIG1pc3NpbmcgbWFya2VycyAoc3RvcmVkIGluIGEgbGlzdCB0byBtYWtlIHJlYWRpbmcgZWFzaWVyKS4KLQkJfQotCQlyZXR1cm4gcGFzc2VkOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiB2ZXJpZnkoSUJ1ZmZlciBidWZmZXIsIFN0cmluZyB0ZXN0TmFtZSwgU3RyaW5nIHN1YlRhc2tOYW1lLCBJUHJvamVjdCBwcm9qZWN0LCBMaXN0IG1tZExpc3RPcmlnLCBJTWFya2VyW10gbWVzc2FnZXMpIHsKLQkJYnVmZmVyLndyaXRlKCJUZXN0IGNhc2U6ICIgKyB0ZXN0TmFtZSk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbnQgbnVtTWF0Y2hlZCA9IDA7Ci0JCWludCBudW1FeHBlY3RlZCA9IDA7Ci0JCWludCBudW1SZXBvcnRlZCA9IDA7Ci0JCWJvb2xlYW4gcGFzc2VkID0gdHJ1ZTsKLQkJTGlzdCBtbWRMaXN0ID0gbmV3IEFycmF5TGlzdChtbWRMaXN0T3JpZyk7IC8vIE5lZWQgdG8gbW9kaWZ5IHRoZSBsaXN0LCBidXQgZG8gbm90IHdhbnQgdG8gbW9kaWZ5IHRoZSBvcmlnaW5hbCwgc28gY3JlYXRlIGEgY29weS4KLQkJdHJ5IHsKLQkJCS8vIEZpcnN0LCBjaGVjayB0aGF0IHRoZSBudW1iZXIgb2YgbWVzc2FnZXMgbWF0Y2guCi0JCQlpZihtZXNzYWdlcyA9PSBudWxsKSB7Ci0JCQkJcGFzc2VkID0gZmFsc2U7Ci0JCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLklORk8pKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5JTkZPLCAiTm8gbWVzc2FnZXMgd2VyZSByZXBvcnRlZC4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlyZXR1cm4gcGFzc2VkOwotCQkJfQotCQkJCi0JCQludW1FeHBlY3RlZCA9IG1tZExpc3Quc2l6ZSgpOwotCQkJbnVtUmVwb3J0ZWQgPSBtZXNzYWdlcy5sZW5ndGg7Ci0JCQkKLQkJCUNvbGxlY3Rpb25zLnNvcnQobW1kTGlzdCwgTWVzc2FnZVV0aWxpdHkuZ2V0TWVzc2FnZUNvbXBhcmF0b3IoYnVmZmVyLCBpc1ZlcmJvc2UoKSkpOwotCi0JCQlmb3IoaW50IGk9MDsgaTxtZXNzYWdlcy5sZW5ndGg7IGkrKykgewotCQkJCUlNYXJrZXIgbWFya2VyID0gbWVzc2FnZXNbaV07Ci0JCQkJTWVzc2FnZU1ldGFEYXRhIG1tZCA9IGdldE1hdGNoaW5nTWV0YURhdGEoYnVmZmVyLCBtbWRMaXN0LCBtYXJrZXIpOwotCQotCQkJCWlmKG1tZCA9PSBudWxsKSB7Ci0JCQkJCV9leHRyYS5hZGQobWFya2VyKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBFdmVyeSB0aW1lIGEgbW1kIGlzIG1hdGNoZWQgdG8gYSBtYXJrZXIsIHJlbW92ZSB0aGUgbW1kCi0JCQkJCS8vIGZyb20gdGhlIGxpc3Qgc28gdGhhdCBtbWRzIHdpdGhvdXQgYSBtYXJrZXIgY2FuIGJlIGZsYWdnZWQuCi0JCQkJCW1tZExpc3QucmVtb3ZlKG1tZCk7Ci0JCQkJCWlmKGlzVmVyYm9zZSgpKSB7Ci0JCQkJCQlidWZmZXIud3JpdGUoIm1hdGNoZWQgIiArIE1lc3NhZ2VVdGlsaXR5LnRvU3RyaW5nKG1hcmtlcikgKyAiIHRvICIgKyBNZXNzYWdlVXRpbGl0eS50b1N0cmluZyhtbWQpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCX0KLQkJCQkJbnVtTWF0Y2hlZCsrOwotCQkJCX0KLQkJCQkKLQkJCQkvLyBDaGVjayBzZXZlcml0eQotCQkJCXRyeSB7Ci0JCQkJCS8vIEZhaWwgYSB0ZXN0IGNhc2UgYmFzZWQgb24gc2V2ZXJpdHkgbWlzbWF0Y2ggYmVjYXVzZSBFSkIgZGVwbG95Ci0JCQkJCS8vIHJlbGllcyBvbiB0aGUgc2V2ZXJpdHkgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IGRlcGxveW1lbnQKLQkJCQkJLy8gY2FuIGNvbnRpbnVlPwotCQkJCQl2ZXJpZnlTZXZlcml0eShidWZmZXIsIHRlc3ROYW1lLCBzdWJUYXNrTmFtZSwgbW1kLCBtYXJrZXIpOwotCQkJCX0KLQkJCQljYXRjaChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJcGFzc2VkID0gZmFsc2U7Ci0JCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZSk7Ci0JCQkJCX0KLQkJCQkJYnVmZmVyLndyaXRlKCJFUlJPUltUZXN0Y2FzZTo6IiArIHRlc3ROYW1lICsgIl0uIENvcmVFeGNlcHRpb24gY2F1Z2h0IHdoaWxlIHZlcmlmeWluZyBzZXZlcml0eSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCQotCQkJCS8vIENoZWNrIHJlc291cmNlCi0JCQkJdHJ5IHsKLQkJCQkJLy8gRG9uJ3QgZmFpbCBhIHRlc3QgY2FzZSBiYXNlZCBvbiByZXNvdXJjZSwgYmVjYXVzZSB0aGUgImxvY2F0aW9uIiBjb2x1bW4gd2lsbAotCQkJCQkvLyB1bmlxdWVseSBpZGVudGlmeSB0aGUgbG9jYXRpb24gb2YgdGhlIG1lc3NhZ2UsIGFueXdheS4gU2hvdWxkIHN0aWxsIGxldCB0aGUgCi0JCQkJCS8vIHVzZXIga25vdywgdGhvdWdoLgotCQkJCQl2ZXJpZnlSZXNvdXJjZShidWZmZXIsIHRlc3ROYW1lLCBzdWJUYXNrTmFtZSwgbW1kLCBtYXJrZXIpOwotCQkJCX0KLQkJCQljYXRjaChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJcGFzc2VkID0gZmFsc2U7Ci0JCQkJCWJ1ZmZlci53cml0ZSgiRVJST1JbVGVzdGNhc2U6OiIgKyB0ZXN0TmFtZSArICJdLiBDb3JlRXhjZXB0aW9uIGNhdWdodCB3aGlsZSB2ZXJpZnlpbmcgcmVzb3VyY2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZSk7Ci0JCQkJCX0KLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCQotCQkJCS8vIENoZWNrIGxvY2F0aW9uCi0JCQkJdHJ5IHsKLQkJCQkJLy8gRG9uJ3QgZmFpbCBhIHRlc3QgY2FzZSBiYXNlZCBvbiBsb2NhdGlvbiwgYmVjYXVzZSB0aGUgbGluZSBudW1iZXIgY2FsY3VsYXRpb24KLQkJCQkJLy8gaXMgZGlmZmVyZW50IGluIFVJICYgYmF0Y2gsIGFuZCB0aGUgdGVzdCBjYXNlcyBhcmUgYmFzZWQgb24gVUkgdGVzdCByZXN1bHRzLgotCQkJCQkvLyBTaG91bGQgc3RpbGwgYWxlcnQgdGhlIHVzZXIsIHRob3VnaC4KLQkJCQkJdmVyaWZ5TG9jYXRpb24oYnVmZmVyLCB0ZXN0TmFtZSwgc3ViVGFza05hbWUsICBtbWQsIG1hcmtlcik7Ci0JCQkJfQotCQkJCWNhdGNoKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlwYXNzZWQgPSBmYWxzZTsKLQkJCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlKTsKLQkJCQkJfQotCQkJCQlidWZmZXIud3JpdGUoIkVSUk9SW1Rlc3RjYXNlOjoiICsgdGVzdE5hbWUgKyAiXS4gQ29yZUV4Y2VwdGlvbiBjYXVnaHQgd2hpbGUgdmVyaWZ5aW5nIGxpbmUgbnVtYmVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmKG1tZExpc3Quc2l6ZSgpICE9IDApIHsKLQkJCQlfbWlzc2luZy5hZGRBbGwobW1kTGlzdCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2goVGhyb3dhYmxlIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQl9Ci0JCQlwYXNzZWQgPSBmYWxzZTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmKCEoKF9taXNzaW5nLnNpemUoKSA9PSAwKSAmJiAoX2V4dHJhLnNpemUoKSA9PSAwKSkpIHsKLQkJCQlwYXNzZWQgPSBmYWxzZTsKLQkJCX0KLQkJCQotCQkJaWYocGFzc2VkKSB7Ci0JCQkJYnVmZmVyLndyaXRlKCJQQVNTW1Rlc3RjYXNlOjoiICsgdGVzdE5hbWUgKyAiXSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlidWZmZXIuYWRkRXhlY3V0aW9uU3RhdHVzKHRlc3ROYW1lLCBzdWJUYXNrTmFtZSwgdHJ1ZSk7IC8vIElmIGZhaWwsIHdpbGwgYmUgcmVwb3J0ZWQgaW4gdGhlIGV4dHJhICYgbWlzc2luZyBiZWxvdy4KLQkJCX0KLQkJCWVsc2UgewotCQkJCWJ1ZmZlci53cml0ZSgiRkFJTFtUZXN0Y2FzZTo6IiArIHRlc3ROYW1lICsgIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCQkvLyBObyBwb2ludCBpbiBsaXN0aW5nIHRoZSBtbWRMaXN0IGJlY2F1c2UgaXQncyBlbXB0eSBieSB0aGUgdGltZSB0aGUgZmluYWxseSBibG9jayBpcyByZWFjaGVkCi0JCQkJaWYoaXNWZXJib3NlKCkpIHsKLQkJCQkJYnVmZmVyLndyaXRlKCJMaXN0IG9mIG1hcmtlcnMgcmVwb3J0ZWQ6Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZGVidWcoYnVmZmVyLCBtZXNzYWdlcyk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQkvLyBSZXBvcnQgdGhlIG1pc3NpbmcgbWFya2VycyBhZnRlciB0aGUgTU1EIGxpc3QgaXMgc29ydGVkCi0JCQlDb2xsZWN0aW9ucy5zb3J0KF9taXNzaW5nLCBNZXNzYWdlVXRpbGl0eS5nZXRNZXNzYWdlQ29tcGFyYXRvcihidWZmZXIsIGlzVmVyYm9zZSgpKSk7Ci0JCQlJdGVyYXRvciBpdGVyYXRvciA9IF9taXNzaW5nLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlNZXNzYWdlTWV0YURhdGEgbW1kID0gKE1lc3NhZ2VNZXRhRGF0YSlpdGVyYXRvci5uZXh0KCk7Ci0JCQkJYnVmZmVyLmFkZEV4ZWN1dGlvblN0YXR1cyh0ZXN0TmFtZSwgc3ViVGFza05hbWUsIElUZXN0U3RhdHVzLkZBSUwsIGJ1ZmZlciwgIkVSUk9SW21pc3NpbmcgbWVzc2FnZV06ICIgKyBNZXNzYWdlVXRpbGl0eS50b1N0cmluZyhtbWQpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQkvLyBSZXBvcnQgdGhlIGV4dHJhIG1hcmtlcnMgYWZ0ZXIgdGhleSdyZSBzb3J0ZWQuCi0JCQlDb2xsZWN0aW9ucy5zb3J0KF9leHRyYSwgTWVzc2FnZVV0aWxpdHkuZ2V0TWVzc2FnZUNvbXBhcmF0b3IoYnVmZmVyLCBpc1ZlcmJvc2UoKSkpOwotCQkJaXRlcmF0b3IgPSBfZXh0cmEuaXRlcmF0b3IoKTsKLQkJCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCUlNYXJrZXIgbWFya2VyID0gKElNYXJrZXIpaXRlcmF0b3IubmV4dCgpOwotCQkJCWJ1ZmZlci5hZGRFeGVjdXRpb25TdGF0dXModGVzdE5hbWUsIHN1YlRhc2tOYW1lLCBJVGVzdFN0YXR1cy5GQUlMLCBidWZmZXIsICJFUlJPUltleHRyYSBtZXNzYWdlXTogIiArIE1lc3NhZ2VVdGlsaXR5LnRvU3RyaW5nKG1hcmtlcikgKyAiLCBUZXh0IGlzOiBcIiIgKyBNZXNzYWdlVXRpbGl0eS5nZXRNZXNzYWdlKG1hcmtlcikgKyAiXCIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCX0KLQkKLQkJCWlmKG51bUV4cGVjdGVkICE9IG51bVJlcG9ydGVkKSB7Ci0JCQkJYnVmZmVyLndyaXRlKCJXcm9uZyBudW1iZXIgb2YgbWVzc2FnZXMgcmVwb3J0ZWQuIEV4cGVjdGVkICIgKyBudW1FeHBlY3RlZCArICIgYW5kIGdvdCAiICsgbnVtUmVwb3J0ZWQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQotCQkJYnVmZmVyLndyaXRlKCJOdW1iZXIgb2YgZXh0cmEgbWVzc2FnZXM6ICIgKyBfZXh0cmEuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJYnVmZmVyLndyaXRlKCJOdW1iZXIgb2YgbWlzc2luZyBtZXNzYWdlczogIiArIF9taXNzaW5nLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWJ1ZmZlci53cml0ZSgiTnVtYmVyIG9mIG1hdGNoZWQgbWVzc2FnZXM6ICIgKyBudW1NYXRjaGVkKTsgLy8kTk9OLU5MUy0xJAotCQkJYnVmZmVyLndyaXRlKCJFbmQgb2YgdGVzdCBjYXNlOiAiICsgdGVzdE5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQlfZXh0cmEuY2xlYXIoKTsgLy8gQ2xlYXIgdGhlIGxpc3Qgb2YgZXh0cmEgbWFya2VycyAoc3RvcmVkIGluIGEgbGlzdCB0byBtYWtlIHJlYWRpbmcgZWFzaWVyKS4KLQkJCV9taXNzaW5nLmNsZWFyKCk7IC8vIENsZWFyIHRoZSBsaXN0IG9mIG1pc3NpbmcgbWFya2VycyAoc3RvcmVkIGluIGEgbGlzdCB0byBtYWtlIHJlYWRpbmcgZWFzaWVyKS4KLQkJfQotCQlyZXR1cm4gcGFzc2VkOwotCX0KLQkKLQlwcml2YXRlIGludCB2ZXJpZnlTZXZlcml0eShJQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIHRlc3ROYW1lLCBTdHJpbmcgc3ViVGFza05hbWUsIE1lc3NhZ2VNZXRhRGF0YSBtbWQsIElNYXJrZXIgbWFya2VyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIElmIHByZWZpeFNldmVyaXR5IGlzIG51bGwsIG1hcmtlciBoYXMgbm8gcHJlZml4LCB0aGVyZWZvcmUgaXQgaGFzIG5vIHNldmVyaXR5Ci0JCUludGVnZXIgcHJlZml4U2V2ZXJpdHkgPSBNZXNzYWdlVXRpbGl0eS5nZXRTZXZlcml0eShtYXJrZXIpOwotCQlpZihwcmVmaXhTZXZlcml0eSAhPSBudWxsKSB7Ci0JCQlJbnRlZ2VyIHNldmVyaXR5ID0gKEludGVnZXIpbWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZKTsgLy8gSU1hcmtlci5TRVZFUklUWV9FUlJPUiwgSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HLCBJTWFya2VyLlNFVkVSSVRZX0lORk8KLQkJCWJvb2xlYW4gc2V2ZXJpdHlFcXVhbCA9IHRydWU7Ci0JCQlpZigoc2V2ZXJpdHkgPT0gbnVsbCkgJiYgKHByZWZpeFNldmVyaXR5ID09IG51bGwpKSB7Ci0JCQkJc2V2ZXJpdHlFcXVhbCA9IHRydWU7Ci0JCQl9Ci0JCQllbHNlIGlmKHNldmVyaXR5ID09IG51bGwpIHsKLQkJCQlzZXZlcml0eUVxdWFsID0gZmFsc2U7Ci0JCQl9Ci0JCQllbHNlIGlmKHByZWZpeFNldmVyaXR5ID09IG51bGwpIHsKLQkJCQlzZXZlcml0eUVxdWFsID0gZmFsc2U7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzZXZlcml0eUVxdWFsID0gc2V2ZXJpdHkuZXF1YWxzKHByZWZpeFNldmVyaXR5KTsKLQkJCX0KLQkJCQotCQkJaWYoIXNldmVyaXR5RXF1YWwpIHsKLQkJCQlidWZmZXIuYWRkRXhlY3V0aW9uU3RhdHVzKHRlc3ROYW1lLCBzdWJUYXNrTmFtZSwgSVRlc3RTdGF0dXMuV0FSTiwgYnVmZmVyLCAiV0FSTklOR1ttaXNtYXRjaGluZyBzZXZlcml0eV06IGV4cGVjdGVkICIgKyBnZXRTZXZlcml0eUNoYXIocHJlZml4U2V2ZXJpdHkpICsgIiwgZ290ICIgKyBnZXRTZXZlcml0eUNoYXIoc2V2ZXJpdHkpICsgIiBvbiBtYXJrZXIgIiArIE1lc3NhZ2VVdGlsaXR5LnRvU3RyaW5nKG1hcmtlcikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCXJldHVybiBJVGVzdFN0YXR1cy5XQVJOOwotCQkJfQotCQl9Ci0JCQkKLQkJcmV0dXJuIElUZXN0U3RhdHVzLlBBU1M7Ci0JfQotCQotCXByaXZhdGUgaW50IHZlcmlmeVJlc291cmNlKElCdWZmZXIgYnVmZmVyLCBTdHJpbmcgdGVzdE5hbWUsIFN0cmluZyBzdWJUYXNrTmFtZSwgTWVzc2FnZU1ldGFEYXRhIG1tZCwgSU1hcmtlciBtYXJrZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHJlc291cmNlID0gTWVzc2FnZVV0aWxpdHkuZ2V0UmVzb3VyY2UobWFya2VyKTsKLQkJaWYoIXJlc291cmNlLmVxdWFscyhtbWQuZ2V0UmVzb3VyY2UoKSkpIHsKLQkJCWJ1ZmZlci5hZGRFeGVjdXRpb25TdGF0dXModGVzdE5hbWUsIHN1YlRhc2tOYW1lLCBJVGVzdFN0YXR1cy5XQVJOLCBidWZmZXIsICJJTkZPW3dyb25nIHJlc291cmNlXTogZXhwZWN0ZWQgIiArIG1tZC5nZXRSZXNvdXJjZSgpICsgIiwgZ290ICIgKyByZXNvdXJjZSArICIgb24gbWFya2VyICIgKyBNZXNzYWdlVXRpbGl0eS50b1N0cmluZyhtYXJrZXIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCXJldHVybiBJVGVzdFN0YXR1cy5XQVJOOwotCQl9Ci0JCXJldHVybiBJVGVzdFN0YXR1cy5QQVNTOwotCX0KLQkKLQlwcml2YXRlIGludCB2ZXJpZnlMb2NhdGlvbihJQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIHRlc3ROYW1lLCBTdHJpbmcgc3ViVGFza05hbWUsIE1lc3NhZ2VNZXRhRGF0YSBtbWQsIElNYXJrZXIgbWFya2VyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIEVpdGhlciBjb21wYXJlIHR3byBsaW5lIG51bWJlcnMgb3IgdHdvIHRleHQgbG9jYXRpb25zLCBidXQgbm90IGEgbGluZSBudW1iZXIgdG8gYSB0ZXh0IGxvY2F0aW9uLgotCQlpZihtbWQuaXNTZXRMaW5lTnVtYmVyKCkpIHsKLQkJCUludGVnZXIgbGluZU51bWJlciA9IE1lc3NhZ2VVdGlsaXR5LmdldExpbmVOdW1iZXIobWFya2VyKTsKLQkJCWlmKGxpbmVOdW1iZXIgPT0gbnVsbCkgewotCQkJCS8vIE1hcmtlciBoYXMgYSB0ZXh0IGxvY2F0aW9uLCBub3QgYSBsaW5lIG51bWJlci4KLQkJCQlyZXR1cm4gSVRlc3RTdGF0dXMuUEFTUzsKLQkJCX0KLQkJCQotCQkJaWYobGluZU51bWJlci5pbnRWYWx1ZSgpICE9IG1tZC5nZXRMaW5lTnVtYmVyKCkpIHsKLQkJCQlidWZmZXIuYWRkRXhlY3V0aW9uU3RhdHVzKHRlc3ROYW1lLCBzdWJUYXNrTmFtZSwgSVRlc3RTdGF0dXMuV0FSTiwgYnVmZmVyLCAiSU5GT1t3cm9uZyBsb2NhdGlvbl06IGV4cGVjdGVkICIgKyBtbWQuZ2V0TGluZU51bWJlcigpICsgIiwgZ290ICIgKyBsaW5lTnVtYmVyICsgIiBvbiBtYXJrZXIgIiArIE1lc3NhZ2VVdGlsaXR5LnRvU3RyaW5nKG1hcmtlcikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCXJldHVybiBJVGVzdFN0YXR1cy5XQVJOOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYobW1kLmlzU2V0TG9jYXRpb24oKSkgewotCQkJU3RyaW5nIGxvY2F0aW9uID0gTWVzc2FnZVV0aWxpdHkuZ2V0TG9jYXRpb24obWFya2VyKTsKLQkJCWlmKGxvY2F0aW9uID09IG51bGwpIHsKLQkJCQkvLyBtYXJrZXIgaGFzIGEgbGluZSBudW1iZXIsIG5vdCBhIHRleHQgbG9jYXRpb24KLQkJCQlyZXR1cm4gSVRlc3RTdGF0dXMuUEFTUzsKLQkJCX0KLQkJCQotCQkJaWYoIShtbWQuZ2V0TG9jYXRpb24oKS5lcXVhbHMobG9jYXRpb24pKSkgewotCQkJCWJ1ZmZlci5hZGRFeGVjdXRpb25TdGF0dXModGVzdE5hbWUsIHN1YlRhc2tOYW1lLCBJVGVzdFN0YXR1cy5XQVJOLCBidWZmZXIsICJJTkZPW3dyb25nIGxvY2F0aW9uXTogZXhwZWN0ZWQgIiArIG1tZC5nZXRMb2NhdGlvbigpICsgIiwgZ290ICIgKyBsb2NhdGlvbiArICIgb24gbWFya2VyICIgKyBNZXNzYWdlVXRpbGl0eS50b1N0cmluZyhtYXJrZXIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQlyZXR1cm4gSVRlc3RTdGF0dXMuV0FSTjsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIElUZXN0U3RhdHVzLlBBU1M7Ci0JfQotCQotCQotCXByaXZhdGUgTWVzc2FnZU1ldGFEYXRhIGdldE1hdGNoaW5nTWV0YURhdGEoSUJ1ZmZlciBidWZmZXIsIExpc3QgbW1kTGlzdCwgSU1hcmtlciBtYXJrZXIpIHsKLQkJaW50IHJlc3VsdCA9IENvbGxlY3Rpb25zLmJpbmFyeVNlYXJjaChtbWRMaXN0LCBtYXJrZXIsIE1lc3NhZ2VVdGlsaXR5LmdldE1lc3NhZ2VDb21wYXJhdG9yKGJ1ZmZlciwgaXNWZXJib3NlKCkpKTsKLQkJaWYocmVzdWx0IDwgMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIChNZXNzYWdlTWV0YURhdGEpbW1kTGlzdC5nZXQocmVzdWx0KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvaW50ZXJuYWwvdXRpbC9CVlRWYWxpZGF0aW9uVXRpbGl0eS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvaW50ZXJuYWwvdXRpbC9CVlRWYWxpZGF0aW9uVXRpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWZmMGVkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3V0aWwvQlZUVmFsaWRhdGlvblV0aWxpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MyArMCwwIEBACi0vKgotICogKGMpIENvcHlyaWdodCAyMDAxIE15Q29ycG9yYXRpb24uCi0gKiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5CVlRWYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuQlZUVmFsaWRhdGlvblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnJlZ2lzdHJ5LkJWVFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnJlZ2lzdHJ5LklUZXN0Y2FzZU1ldGFEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwucmVnaXN0cnkuT3BlcmF0aW9uVGVzdGNhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC5yZWdpc3RyeS5UZXN0Y2FzZVV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC5yZWdpc3RyeS5WYWxpZGF0b3JUZXN0Y2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5Db25maWd1cmF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRpb25SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0b3JNZXRhRGF0YTsKLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCVlRWYWxpZGF0aW9uVXRpbGl0eSB7Ci0JcHJpdmF0ZSBCVlRWYWxpZGF0aW9uVXRpbGl0eSgpIHsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBWYWxpZGF0b3JNZXRhRGF0YSBnZXRWYWxpZGF0b3JNZXRhRGF0YShJTWFya2VyIG1hcmtlcikgewotCQlTdHJpbmcgdmFsaWRhdG9yQ2xhc3NOYW1lID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXZhbGlkYXRvckNsYXNzTmFtZSA9IG1hcmtlci5nZXRBdHRyaWJ1dGUoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5WQUxJREFUSU9OX01BUktFUl9PV05FUikudG9TdHJpbmcoKTsKLQkJCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5nZXRWYWxpZGF0b3JNZXRhRGF0YSh2YWxpZGF0b3JDbGFzc05hbWUpOwotCQkJcmV0dXJuIHZtZDsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJfQotCQlyZXR1cm4gbnVsbDsJCQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBJTWFya2VyW10gZ2V0VmFsaWRhdGlvblRhc2tzKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQl0cnkgewotCQkJSU1hcmtlcltdIGFsbE1hcmtlcnMgPSByZXNvdXJjZS5maW5kTWFya2VycyhDb25maWd1cmF0aW9uQ29uc3RhbnRzLlZBTElEQVRJT05fTUFSS0VSLCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsgLy8gZmFsc2UgbWVhbnMgb25seSBjb25zaWRlciBQUk9CTEVNX01BUktFUiwgbm90IHZhcmlhbnRzIG9mIFBST0JMRU1fTUFSS0VSLiBTaW5jZSBhZGRUYXNrIG9ubHkgYWRkcyBQUk9CTEVNX01BUktFUiwgd2UgZG9uJ3QgbmVlZCB0byBjb25zaWRlciBpdHMgc3VidHlwZXMuCi0JCQlyZXR1cm4gYWxsTWFya2VyczsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxWYWxpZGF0aW9uTWFya2VycygpIHsKLQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCUlXb3Jrc3BhY2VSb290IHJvb3QgPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpOwotCQlJTWFya2VyW10gbWFya2VycyA9IGdldFZhbGlkYXRpb25UYXNrcyhyb290KTsKLQkJaWYobWFya2VycyAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXdvcmtzcGFjZS5kZWxldGVNYXJrZXJzKG1hcmtlcnMpOwotCQkJfQotCQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQcm9qZWN0TmFtZShGaWxlIGZpbGUpIHsKLQkJU3RyaW5nIGZpbGVOYW1lID0gZmlsZS5nZXROYW1lKCk7Ci0JCWludCBleHRJbmRleCA9IGZpbGVOYW1lLmluZGV4T2YoJy4nKTsKLQkJaWYoZXh0SW5kZXggPiAwKSB7Ci0JCQlyZXR1cm4gZmlsZU5hbWUuc3Vic3RyaW5nKDAsIGV4dEluZGV4KTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBmaWxlTmFtZTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFF1YWxpZmllZExvZ05hbWUoU3RyaW5nIGxvZ0ZpbGVOYW1lKSB7Ci0JCVN0cmluZyBkaXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldFN0YXRlTG9jYXRpb24oKS50b09TU3RyaW5nKCk7Ci0JCUZpbGUgZGlyV2l0aEZpbGUgPSBuZXcgRmlsZShkaXIsIGxvZ0ZpbGVOYW1lKTsKLQkJcmV0dXJuIGRpcldpdGhGaWxlLnRvU3RyaW5nKCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSVByb2plY3RbXSBnZXRQcm9qZWN0cyhJVGVzdGNhc2VNZXRhRGF0YVtdIHRtZHMpIHsKLQkJTGlzdCBzb3J0ZWRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IoaW50IGk9MDsgaTx0bWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJUHJvamVjdCBwID0gVGVzdGNhc2VVdGlsaXR5LmZpbmRQcm9qZWN0KHRtZHNbaV0pOwotCQkJaWYoKHAgIT0gbnVsbCkgJiYgKHAuZXhpc3RzKCkpICYmIChwLmlzT3BlbigpKSAmJiAhc29ydGVkTGlzdC5jb250YWlucyhwKSkgewotCQkJCXNvcnRlZExpc3QuYWRkKHApOwotCQkJfQotCQl9Ci0JCUNvbGxlY3Rpb25zLnNvcnQoc29ydGVkTGlzdCwgbmV3IENvbXBhcmF0b3IoKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGEsIE9iamVjdCBiKXsKLQkJCQlpZigoYSA9PSBudWxsKSAmJiAoYiA9PSBudWxsKSkgewotCQkJCQlyZXR1cm4gMDsKLQkJCQl9Ci0JCQkJZWxzZSBpZihhID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIDE7Ci0JCQkJfQotCQkJCWVsc2UgaWYoYiA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiAtMTsKLQkJCQl9Ci0JCQkKLQkJCQlpZigoYSBpbnN0YW5jZW9mIElQcm9qZWN0KSAmJiAoYiBpbnN0YW5jZW9mIElQcm9qZWN0KSkgewotCQkJCQlyZXR1cm4gKChJUHJvamVjdClhKS5nZXROYW1lKCkuY29tcGFyZVRvKCgoSVByb2plY3QpYikuZ2V0TmFtZSgpKTsKLQkJCQl9Ci0JCQkJCi0JCQkJcmV0dXJuIC0xOyAvLyBzaG91bGQgbmV2ZXIgcmVhY2ggaGVyZS4uLmJvdGggT2JqZWN0cyBzaG91bGQgYWx3YXlzIGJlIElQcm9qZWN0cwotCQkJfQotCQl9KTsKLQkJSVByb2plY3RbXSByZXN1bHQgPSBuZXcgSVByb2plY3Rbc29ydGVkTGlzdC5zaXplKCldOwotCQlzb3J0ZWRMaXN0LnRvQXJyYXkocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElUZXN0Y2FzZU1ldGFEYXRhW10gZ2V0VGVzdHMoSVRlc3RjYXNlTWV0YURhdGFbXSB0bWRzLCBJUHJvamVjdCBwKSB7Ci0JCUlUZXN0Y2FzZU1ldGFEYXRhW10gdGVtcCA9IG5ldyBJVGVzdGNhc2VNZXRhRGF0YVt0bWRzLmxlbmd0aF07Ci0JCWludCBjb3VudCA9IDA7Ci0JCWZvcihpbnQgaT0wOyBpPHRtZHMubGVuZ3RoOyBpKyspIHsKLQkJCUlUZXN0Y2FzZU1ldGFEYXRhIHRtZCA9IHRtZHNbaV07Ci0JCQlpZih0bWQuZ2V0UHJvamVjdE5hbWUoKS5lcXVhbHMocC5nZXROYW1lKCkpKSB7Ci0JCQkJdGVtcFtjb3VudCsrXSA9IHRtZDsKLQkJCX0KLQkJfQotCQkKLQkJSVRlc3RjYXNlTWV0YURhdGFbXSByZXN1bHQgPSBuZXcgSVRlc3RjYXNlTWV0YURhdGFbY291bnRdOwotCQlTeXN0ZW0uYXJyYXljb3B5KHRlbXAsIDAsIHJlc3VsdCwgMCwgY291bnQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgdG90YWwgbnVtYmVyIG9mIHZhbGlkYXRvciB0ZXN0cy4KLQkgKi8JCi0JcHVibGljIHN0YXRpYyBpbnQgbnVtVmFsaWRhdG9yVGVzdHMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUHJvamVjdFtdIHByb2plY3RzKSB0aHJvd3MgQlZUVmFsaWRhdGlvbkV4Y2VwdGlvbiB7CQotCQlCVlRWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIgcmVhZGVyID0gQlZUVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpOwotCQkKLQkJaW50IHRvdGFsVGVzdHMgPSAwOwotCQlmb3IoaW50IGk9MDsgaTxwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJSVByb2plY3QgcHJvamVjdCA9IHByb2plY3RzW2ldOwotCQkJVmFsaWRhdG9yVGVzdGNhc2VbXSB0ZXN0cyA9IHJlYWRlci5nZXRWYWxpZGF0b3JUZXN0cyhtb25pdG9yLCBwcm9qZWN0KTsKLQkJCWlmKCh0ZXN0cyA9PSBudWxsKSB8fCAodGVzdHMubGVuZ3RoID09IDApKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkKLQkJCXRvdGFsVGVzdHMgKz0gdGVzdHMubGVuZ3RoOwotCQl9Ci0JCQotCQlyZXR1cm4gdG90YWxUZXN0czsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGFsbCBwdWJsaWMgKHZpc2libGUpIHRlc3QgY2FzZXMgZm9yIGEgcGFydGljdWxhciBwcm9qZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVmFsaWRhdG9yVGVzdGNhc2VbXSBnZXRWYWxpZGF0b3JUZXN0cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElQcm9qZWN0W10gcHJvamVjdHMpIHsKLQkJU2V0IHRlc3RTZXQgPSBuZXcgSGFzaFNldCgpOwkJCi0JCWZvcihpbnQgaT0wOyBpPHByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gcHJvamVjdHNbaV07Ci0JCQlWYWxpZGF0b3JUZXN0Y2FzZVtdIHRlc3RzID0gZ2V0VmFsaWRhdG9yVGVzdHMobW9uaXRvciwgcHJvamVjdCk7Ci0JCQlpZih0ZXN0cy5sZW5ndGggPT0gMCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlmb3IoaW50IGo9MDsgajx0ZXN0cy5sZW5ndGg7IGorKykgewotCQkJCVZhbGlkYXRvclRlc3RjYXNlIHZ0ID0gdGVzdHNbal07Ci0JCQkJdGVzdFNldC5hZGQodnQpOwotCQkJfQotCQl9Ci0JCQotCQlWYWxpZGF0b3JUZXN0Y2FzZVtdIHJlc3VsdCA9IG5ldyBWYWxpZGF0b3JUZXN0Y2FzZVt0ZXN0U2V0LnNpemUoKV07Ci0JCXRlc3RTZXQudG9BcnJheShyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbGwgdmlzaWJsZSB2YWxpZGF0b3IgdGVzdCBjYXNlcyBmb3IgYSBwcm9qZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVmFsaWRhdG9yVGVzdGNhc2VbXSBnZXRWYWxpZGF0b3JUZXN0cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJQlZUVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyIHJlYWRlciA9IEJWVFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKTsKLQotCQlWYWxpZGF0b3JUZXN0Y2FzZVtdIHRlc3RzID0gcmVhZGVyLmdldFZhbGlkYXRvclRlc3RzKG1vbml0b3IsIHByb2plY3QpOwotCQlpZih0ZXN0cyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IFZhbGlkYXRvclRlc3RjYXNlWzBdOwotCQl9Ci0JCQotCQlyZXR1cm4gdGVzdHM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFsbCBvZiB0aGUgdGVzdHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBPcGVyYXRpb25UZXN0Y2FzZVtdIGdldE9wZXJhdGlvblRlc3RzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlyZXR1cm4gQlZUVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmdldE9wZXJhdGlvblRlc3RzKG1vbml0b3IsIChTdHJpbmcpbnVsbCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgT3BlcmF0aW9uVGVzdGNhc2VbXSBnZXRPcGVyYXRpb25UZXN0cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJQlZUVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyIHJlYWRlciA9IEJWVFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKTsKLQotCQlPcGVyYXRpb25UZXN0Y2FzZVtdIHRlc3RzID0gcmVhZGVyLmdldE9wZXJhdGlvblRlc3RzKG1vbml0b3IsIHByb2plY3QpOwotCQlpZih0ZXN0cyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IE9wZXJhdGlvblRlc3RjYXNlWzBdOwotCQl9Ci0JCQotCQlyZXR1cm4gdGVzdHM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFsbCBvZiB0aGUgdGVzdHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBWYWxpZGF0b3JUZXN0Y2FzZVtdIGdldFZhbGlkYXRvclRlc3RzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlyZXR1cm4gQlZUVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmdldFZhbGlkYXRvclRlc3RzKG1vbml0b3IsIChTdHJpbmcpbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhbGwgb2YgdGhlIHRlc3RzLCB2aXNpYmxlIGFuZCBpbnZpc2libGUsIG93bmVkIGJ5IHRoZSB2YWxpZGF0b3IgbWV0YWRhdGEuCi0JICovCi0JcHVibGljIHN0YXRpYyBWYWxpZGF0b3JUZXN0Y2FzZVtdIGdldFZhbGlkYXRvclRlc3RzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgVmFsaWRhdG9yTWV0YURhdGEgdm1kKSB7Ci0JCVZhbGlkYXRvclRlc3RjYXNlW10gYWxsVGVzdHMgPSBCVlRWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkuZ2V0VmFsaWRhdG9yVGVzdHMobW9uaXRvciwgKFN0cmluZyludWxsKTsKLQkJVmFsaWRhdG9yVGVzdGNhc2VbXSB0ZW1wID0gbmV3IFZhbGlkYXRvclRlc3RjYXNlW2FsbFRlc3RzLmxlbmd0aF07Ci0JCWludCBjb3VudCA9IDA7Ci0JCWZvcihpbnQgaT0wOyBpPGFsbFRlc3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlWYWxpZGF0b3JUZXN0Y2FzZSB0ZXN0dm1kID0gYWxsVGVzdHNbaV07Ci0JCQlpZih2bWQuZXF1YWxzKHRlc3R2bWQuZ2V0VmFsaWRhdG9yTWV0YURhdGEoKSkpIHsKLQkJCQl0ZW1wW2NvdW50KytdID0gdGVzdHZtZDsKLQkJCX0KLQkJfQotCQlWYWxpZGF0b3JUZXN0Y2FzZVtdIHJlc3VsdCA9IG5ldyBWYWxpZGF0b3JUZXN0Y2FzZVtjb3VudF07Ci0JCVN5c3RlbS5hcnJheWNvcHkodGVtcCwgMCwgcmVzdWx0LCAwLCBjb3VudCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVmFsaWRhdG9yTWV0YURhdGFbXSBnZXRWYWxpZGF0b3JzVGhhdEhhdmVUZXN0cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJVmFsaWRhdG9yVGVzdGNhc2VbXSB0ZXN0cyA9IGdldFZhbGlkYXRvclRlc3RzKG1vbml0b3IpOwotCQlTZXQgdGVtcCA9IG5ldyBIYXNoU2V0KCk7Ci0JCWZvcihpbnQgaT0wOyBpPHRlc3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlWYWxpZGF0b3JUZXN0Y2FzZSB2dCA9IHRlc3RzW2ldOwotCQkJdGVtcC5hZGQodnQuZ2V0VmFsaWRhdG9yTWV0YURhdGEoKSk7Ci0JCX0KLQkJCi0JCVZhbGlkYXRvck1ldGFEYXRhW10gdm1kcyA9IG5ldyBWYWxpZGF0b3JNZXRhRGF0YVt0ZW1wLnNpemUoKV07Ci0JCXRlbXAudG9BcnJheSh2bWRzKTsKLQkJcmV0dXJuIHZtZHM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvaW50ZXJuYWwvdXRpbC9CdWlsZEluZm8uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3V0aWwvQnVpbGRJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNjEyYWEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvaW50ZXJuYWwvdXRpbC9CdWlsZEluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnV0aWw7Ci1wdWJsaWMgY2xhc3MgQnVpbGRJbmZvIHsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIkxpY2Vuc2VkIE1hdGVyaWFscyAtLSBQcm9wZXJ0eSBvZiBJQk1cbihjKSBDb3B5cmlnaHQgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiwgMjAwMSwyMDAzXG5VUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLiI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGZnQnVpbGRMZXZlbCA9ICIyMDAzMTExMl8xOTE1LVdCMjEyLUFELVY1MTFELVc1IjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgbGV2ZWwoKSB7IHJldHVybiBmZ0J1aWxkTGV2ZWw7IH0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0V1NBQnVpbGRMZXZlbCgpIHsgcmV0dXJuIGZnQnVpbGRMZXZlbDsgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvaW50ZXJuYWwvdXRpbC9SdW5UZXN0c09wZXJhdGlvbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvaW50ZXJuYWwvdXRpbC9SdW5UZXN0c09wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjJiMDMyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3V0aWwvUnVuVGVzdHNPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC5yZWdpc3RyeS5JVGVzdGNhc2VNZXRhRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklCdWZmZXI7Ci0KLQotLyoqCi0gKiBSdW4gdGhlIEJWVCBvZiB0aGUgdmFsaWRhdG9yOiBhIGZ1bGwgdGVzdCwgYW4gaW5jcmVtZW50YWwgdGVzdCwKLSAqIGFuZCBhbiBhc3luY2hyb25vdXMgdGVzdCwgaWYgYXBwbGljYWJsZS4KLSAqIAotICogVGhpcyBjbGFzcyBtdXN0IE5PVCBiZSB3cmFwcGVkIGluIGFuIElXb3Jrc3BhY2VSdW5uYWJsZSBvciAKLSAqIHRoZXJlIHdpbGwgYmUgZGVhZGxvY2sgZHVyaW5nIHRoZSBhc3luY2hyb25vdXMgdmFsaWRhdGlvbiB0ZXN0IQotICogKFJlYWQgdGhlIGNvbW1lbnQgYWJvdmUgVlRocmVhZE1hbmFnZXI6OmlzRG9uZSgpIGZvciBkZXRhaWxzLikKLSAqLwotcHVibGljIGNsYXNzIFJ1blRlc3RzT3BlcmF0aW9uIHsKLQlwcml2YXRlIHN0YXRpYyBSdW5UZXN0c09wZXJhdGlvbiBfaW5zdCA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBSdW5UZXN0c09wZXJhdGlvbigpIHsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBSdW5UZXN0c09wZXJhdGlvbiBzaW5nbGV0b24oKSB7Ci0JCWlmKF9pbnN0ID09IG51bGwpIHsKLQkJCV9pbnN0ID0gbmV3IFJ1blRlc3RzT3BlcmF0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIF9pbnN0OwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZSNydW4oSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUJ1ZmZlciBidWZmZXIsIElUZXN0Y2FzZU1ldGFEYXRhW10gYWxsVG1kcykgewotCQlJUHJvamVjdFtdIHByb2plY3RzID0gQlZUVmFsaWRhdGlvblV0aWxpdHkuZ2V0UHJvamVjdHMoYWxsVG1kcyk7Ci0JCWZvcihpbnQgaT0wOyBpPHByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gcHJvamVjdHNbaV07Ci0JCQlJVGVzdGNhc2VNZXRhRGF0YVtdIHRtZHMgPSBCVlRWYWxpZGF0aW9uVXRpbGl0eS5nZXRUZXN0cyhhbGxUbWRzLCBwcm9qZWN0KTsKLQkJCQotCQkJZm9yKGludCBqPTA7IGo8dG1kcy5sZW5ndGg7IGorKykgewotCQkJCUlUZXN0Y2FzZU1ldGFEYXRhIHRtZCA9IHRtZHNbal07Ci0JCQkJdG1kLnJ1bihidWZmZXIsIHByb2plY3QpOwotCQkJfQotCQl9Ci0JfQotCQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9zZXR1cC9BSW1wb3J0T3BlcmF0aW9uLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9zZXR1cC9BSW1wb3J0T3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkNTEzMjIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3Qvc2V0dXAvQUltcG9ydE9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIuTG9nRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LkJWVFZhbGlkYXRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC51dGlsLkJWVFZhbGlkYXRpb25VdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuVmFsaWRhdG9yTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wbHVnaW4uVmFsaWRhdGlvblBsdWdpbjsKLQotLyoqCi0gKiBBYnN0cmFjdCBjbGFzcyB0aGF0IHByb3ZpZGVzIHNvbWUgb2YgdGhlIGZ1bmN0aW9uYWxpdHkgcmVxdWlyZWQgdG8gY3JlYXRlCi0gKiBhIHByb2plY3QgYW5kIHBvcHVsYXRlIGl0IHdpdGggdGhlIGNvbnRlbnRzIG9mIGEgZmlsZS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFJbXBvcnRPcGVyYXRpb24gaW1wbGVtZW50cyBJSW1wb3J0T3BlcmF0aW9uIHsKLQlwcml2YXRlIHZvaWQgcHJlUnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlWYWxpZGF0b3JNYW5hZ2VyLmdldE1hbmFnZXIoKS5zdXNwZW5kQWxsVmFsaWRhdGlvbih0cnVlKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHBvc3RSdW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCVZhbGlkYXRvck1hbmFnZXIuZ2V0TWFuYWdlcigpLnN1c3BlbmRBbGxWYWxpZGF0aW9uKGZhbHNlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZGVsZXRlT2xkUHJvamVjdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIFN0cmluZyBwcm9qZWN0TmFtZSkgewotCQkvLyBkZWxldGUgYW55IGV4aXN0aW5nIHByb2plY3Qgb2YgdGhpcyBuYW1lCi0JCUlQcm9qZWN0IGV4aXN0aW5nUHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JCWlmIChleGlzdGluZ1Byb2plY3QuZXhpc3RzKCkpIHsKLQkJCXRyeSB7Ci0JCQkJZXhpc3RpbmdQcm9qZWN0LmRlbGV0ZSh0cnVlLCBudWxsKTsgLy8gbnVsbD1ubyBwcm9ncmVzcyBtb24gKGRvbid0IHNjYXJlIHVzZXJzKQotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgRmlsZSBmaWxlKSB7Ci0JCWJvb2xlYW4gaW1wb3J0ZWQgPSB0cnVlOwotCQlpbnQgZXhlY3V0aW9uTWFwID0gMHgwOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCXRyeSB7Ci0JCQlpZihtb25pdG9yID09IG51bGwpIHsKLQkJCQltb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJCX0KLQkJCQotCQkJcHJlUnVuKG1vbml0b3IpOwotCQkJCi0JCQl0cnkgewotCQkJCVN0cmluZyBwcm9qZWN0TmFtZSA9IEJWVFZhbGlkYXRpb25VdGlsaXR5LmdldFByb2plY3ROYW1lKGZpbGUpOwotCQkJCWRlbGV0ZU9sZFByb2plY3QobW9uaXRvciwgcHJvamVjdE5hbWUpOwotCQkJCXByb2plY3QgPSBjcmVhdGVOZXdQcm9qZWN0KG1vbml0b3IsIHByb2plY3ROYW1lLCBmaWxlKTsKLQkJCQkKLQkJCQlpZigocHJvamVjdCA9PSBudWxsKSB8fCAoIXByb2plY3QuaXNBY2Nlc3NpYmxlKCkpKSB7Ci0JCQkJCWV4ZWN1dGlvbk1hcCB8PSAweDE7Ci0JCQkJCWltcG9ydGVkID0gZmFsc2U7Ci0JCQkJCVN0cmluZyBtZXNzYWdlID0gIkNhbm5vdCBpbXBvcnQgZmlsZSBiZWNhdXNlIElQcm9qZWN0IGlzIG51bGwgb3Igbm90IGFjY2Vzc2libGUuIjsgLy8kTk9OLU5MUy0xJAotCQkJCQltb25pdG9yLnN1YlRhc2sobWVzc2FnZSk7Ci0JCQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCQlMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCQkJCWVudHJ5LnNldEV4ZWN1dGlvbk1hcChleGVjdXRpb25NYXApOwotCQkJCQkJZW50cnkuc2V0VGV4dChtZXNzYWdlKTsKLQkJCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCQkJfQotCi0JCQkJfQotCQkJCWVsc2UgewkJCQkKLQkJCQkJaW1wb3J0ZWQgPSBpbXBvcnRGaWxlKG1vbml0b3IsIHByb2plY3QsIGZpbGUpOwotCQkJCQlleGVjdXRpb25NYXAgfD0gMHgyOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChUaHJvd2FibGUgZXhjKSB7Ci0JCQkJZXhlY3V0aW9uTWFwIHw9IDB4NDsKLQkJCQlpbXBvcnRlZCA9IGZhbHNlOwotCQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCUxvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCXBvc3RSdW4obW9uaXRvcik7Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZighaW1wb3J0ZWQpIHsKLQkJCQlTdHJpbmcgcHJvamVjdE5hbWUgPSAocHJvamVjdCA9PSBudWxsKSA/IGZpbGUuZ2V0TmFtZSgpIDogcHJvamVjdC5nZXROYW1lKCk7Ci0JCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJZW50cnkuc2V0RXhlY3V0aW9uTWFwKGV4ZWN1dGlvbk1hcCk7Ci0JCQkJZW50cnkuc2V0VGV4dCgiQUltcG9ydE9wZXJhdGlvbiBmb3IgIiArIHByb2plY3ROYW1lICsgIiB3YXMgdW5zdWNjZXNzZnVsLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGltcG9ydGVkOwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSVByb2plY3QgY3JlYXRlTmV3UHJvamVjdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIFN0cmluZyBwcm9qZWN0TmFtZSwgRmlsZSBpbnB1dEZpbGUpOwotCQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBmaWxlIHdhcyBpbXBvcnRlZCBzdWNjZXNzZnVsbHkuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gaW1wb3J0RmlsZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElQcm9qZWN0IHByb2plY3QsIEZpbGUgZmlsZSk7Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9zZXR1cC9CdWlsZEluZm8uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L3NldHVwL0J1aWxkSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDVkY2JlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L3NldHVwL0J1aWxkSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXA7Ci1wdWJsaWMgY2xhc3MgQnVpbGRJbmZvIHsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIkxpY2Vuc2VkIE1hdGVyaWFscyAtLSBQcm9wZXJ0eSBvZiBJQk1cbihjKSBDb3B5cmlnaHQgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiwgMjAwMSwyMDAzXG5VUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLiI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGZnQnVpbGRMZXZlbCA9ICIyMDAzMTExMl8xOTE1LVdCMjEyLUFELVY1MTFELVc1IjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgbGV2ZWwoKSB7IHJldHVybiBmZ0J1aWxkTGV2ZWw7IH0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0V1NBQnVpbGRMZXZlbCgpIHsgcmV0dXJuIGZnQnVpbGRMZXZlbDsgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3Qvc2V0dXAvQ2hlY2tGb3JVbnRlc3RlZFByb3BlcnRpZXNPcGVyYXRpb24uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L3NldHVwL0NoZWNrRm9yVW50ZXN0ZWRQcm9wZXJ0aWVzT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMmViNzcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3Qvc2V0dXAvQ2hlY2tGb3JVbnRlc3RlZFByb3BlcnRpZXNPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXA7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGx1Z2luRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS5wYXJzZXIuUHJvcGVydHlMaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS53b3JrYmVuY2hpbXBsLlBsdWdpblByb3BlcnR5RmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LkJWVFZhbGlkYXRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5WYWxpZGF0aW9uVHlwZUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC5yZWdpc3RyeS5NZXNzYWdlVXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnJlZ2lzdHJ5LlZhbGlkYXRvclRlc3RjYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwudXRpbC5CVlRWYWxpZGF0aW9uVXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0b3JNZXRhRGF0YTsKLS8qKgotICogR2VuZXJhdGUgYSBGVlQgdGVzdCBjYXNlIGZvciBldmVyeSBFSkIgVmFsaWRhdG9yIHZhbGlkYXRpb24gbWFya2VyIG9uIGVhY2gKLSAqIHNlbGVjdGVkIHByb2plY3QuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDaGVja0ZvclVudGVzdGVkUHJvcGVydGllc09wZXJhdGlvbiBpbXBsZW1lbnRzIElXb3Jrc3BhY2VSdW5uYWJsZSB7Ci0JcHJpdmF0ZSBWYWxpZGF0b3JNZXRhRGF0YSBfdm1kID0gbnVsbDsKLQlwcml2YXRlIElCdWZmZXIgX2J1ZmZlciA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgX3Jlc291cmNlQnVuZGxlTmFtZSA9IG51bGw7Ci0JcHVibGljIENoZWNrRm9yVW50ZXN0ZWRQcm9wZXJ0aWVzT3BlcmF0aW9uKElCdWZmZXIgYnVmZmVyLCBWYWxpZGF0b3JNZXRhRGF0YSB2bWQsIFN0cmluZyByZXNvdXJjZUJ1bmRsZU5hbWUpIHsKLQkJc2V0VmFsaWRhdG9yTWV0YURhdGEodm1kKTsKLQkJc2V0QnVmZmVyKGJ1ZmZlcik7Ci0JCXNldFJlc291cmNlQnVuZGxlTmFtZShyZXNvdXJjZUJ1bmRsZU5hbWUpOwotCX0KLQlwdWJsaWMgSUJ1ZmZlciBnZXRCdWZmZXIoKSB7Ci0JCXJldHVybiBfYnVmZmVyOwotCX0KLQl2b2lkIHNldEJ1ZmZlcihJQnVmZmVyIGIpIHsKLQkJX2J1ZmZlciA9IGI7Ci0JfQotCXB1YmxpYyBWYWxpZGF0b3JNZXRhRGF0YSBnZXRWYWxpZGF0b3JNZXRhRGF0YSgpIHsKLQkJcmV0dXJuIF92bWQ7Ci0JfQotCXByaXZhdGUgU3RyaW5nIGdldFBsdWdpbklkKFZhbGlkYXRvck1ldGFEYXRhIHZtZCkgewotCQl0cnkgewotCQkJLy8gVE9ETyBSZW1vdmUgdGhpcyBoYWNrIG9uY2UgYSBnZXR0ZXIgaGFzIGJlZW4gYWRkZWQgdG8gVmFsaWRhdG9yTWV0YURhdGEgZm9yIGl0cyBwbHVnaW5JZC4KLQkJCWlmICh2bWQgIT0gbnVsbCkgewotCQkJCUNsYXNzTG9hZGVyIGNsID0gdm1kLmdldFZhbGlkYXRvcigpLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKLQkJCQlJUGx1Z2luUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRQbHVnaW5SZWdpc3RyeSgpOwotCQkJCUlQbHVnaW5EZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMgPSByZWdpc3RyeS5nZXRQbHVnaW5EZXNjcmlwdG9ycygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSVBsdWdpbkRlc2NyaXB0b3IgZGVzYyA9IGRlc2NyaXB0b3JzW2ldOwotCQkJCQlpZiAoZGVzYy5nZXRQbHVnaW5DbGFzc0xvYWRlcigpLmVxdWFscyhjbCkpIHsKLQkJCQkJCXJldHVybiBkZXNjLmdldFVuaXF1ZUlkZW50aWZpZXIoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0Jdm9pZCBzZXRWYWxpZGF0b3JNZXRhRGF0YShWYWxpZGF0b3JNZXRhRGF0YSB2bWQpIHsKLQkJX3ZtZCA9IHZtZDsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZUJ1bmRsZU5hbWUoKSB7Ci0JCXJldHVybiBfcmVzb3VyY2VCdW5kbGVOYW1lOwotCX0KLQl2b2lkIHNldFJlc291cmNlQnVuZGxlTmFtZShTdHJpbmcgbmFtZSkgewotCQlfcmVzb3VyY2VCdW5kbGVOYW1lID0gbmFtZTsKLQl9Ci0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGUjcnVuKElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlMaXN0IHBMaW5lcyA9IG51bGw7Ci0JCUxpc3QgdW50ZXN0ZWRMaW5lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCB0ZXN0ZWRMaW5lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJQ29tcGFyYXRvciBjb21wYXJhdG9yID0gTWVzc2FnZVV0aWxpdHkuZ2V0TWVzc2FnZVByZWZpeENvbXBhcmF0b3IoKTsKLQkJLy8gQXNzdW1lIHRoYXQgdGhlIEJWVCB0ZXN0cyB3ZXJlIHJ1biBvbiB0aGUgcHJvamVjdHMgYmVmb3JlIHRoaXMgbWVudQotCQkvLyBhY3Rpb24gd2FzIGNsaWNrZWQuCi0JCS8vIExvYWQgYW5kIHBhcnNlIHRoZSAucHJvcGVydGllcyBmaWxlIHRvIGtub3cgd2hhdCBtZXNzYWdlIGlkcyB0byBsb29rCi0JCS8vIGZvci4KLQkJU3RyaW5nIHByb3BGaWxlTmFtZSA9IGdldFJlc291cmNlQnVuZGxlTmFtZSgpOwotCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSBnZXRWYWxpZGF0b3JNZXRhRGF0YSgpOwotCQltb25pdG9yLnN1YlRhc2soIkF0dGVtcHRpbmcgdG8gbG9hZCBmaWxlOiAiICsgcHJvcEZpbGVOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgcGx1Z2luSWQgPSBnZXRQbHVnaW5JZCh2bWQpOwotCQlpZiAocGx1Z2luSWQgPT0gbnVsbCkgewotCQkJbW9uaXRvci5zdWJUYXNrKCJDYW5ub3QgbG9hZCBwbHVnaW4gaWQgZm9yIHZhbGlkYXRvciAiICsgdm1kLmdldFZhbGlkYXRvckRpc3BsYXlOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsICJDYW5ub3QgbG9hZCBwbHVnaW4gaWQgZm9yIHZhbGlkYXRvciAiICsgdm1kLmdldFZhbGlkYXRvckRpc3BsYXlOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJUGx1Z2luUHJvcGVydHlGaWxlIHBGaWxlID0gbmV3IFBsdWdpblByb3BlcnR5RmlsZShwbHVnaW5JZCwgcHJvcEZpbGVOYW1lKTsKLQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCW1vbml0b3Iuc3ViVGFzaygiUGFyc2luZy4iKTsgLy8kTk9OLU5MUy0xJAotCQlwTGluZXMgPSBwRmlsZS5nZXRQcm9wZXJ0eUxpbmVzKCk7Ci0JCUNvbGxlY3Rpb25zLnNvcnQocExpbmVzLCBjb21wYXJhdG9yKTsgLy8gZmFsc2UgPSBubyB2ZXJib3NlIG91dHB1dAotCQltb25pdG9yLndvcmtlZCgxKTsKLQkJbW9uaXRvci5zdWJUYXNrKCJMb2FkaW5nIHRlc3QgbWVzc2FnZXMuIik7IC8vJE5PTi1OTFMtMSQKLQkJVmFsaWRhdG9yVGVzdGNhc2VbXSB0bWRzID0gQlZUVmFsaWRhdGlvblV0aWxpdHkuZ2V0VmFsaWRhdG9yVGVzdHMobW9uaXRvciwgdm1kKTsKLQkJZm9yIChpbnQgayA9IDA7IGsgPCB0bWRzLmxlbmd0aDsgaysrKSB7Ci0JCQlWYWxpZGF0b3JUZXN0Y2FzZSB0bWQgPSB0bWRzW2tdOwotCQkJTGlzdCBtc3NnID0gdG1kLmdldE1lc3NhZ2VzKFZhbGlkYXRpb25UeXBlRW51bS5SVU5fVkFMSURBVElPTik7Ci0JCQl0ZXN0ZWRMaW5lcy5hZGRBbGwobXNzZyk7Ci0JCX0KLQkJQ29sbGVjdGlvbnMuc29ydCh0ZXN0ZWRMaW5lcywgY29tcGFyYXRvcik7Ci0JCW1vbml0b3Iuc3ViVGFzaygiQ29tcGFyaW5nLiIpOyAvLyROT04tTkxTLTEkCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gcExpbmVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCVByb3BlcnR5TGluZSBsaW5lID0gKFByb3BlcnR5TGluZSlpdGVyYXRvci5uZXh0KCk7Ci0JCQlpbnQgaW5kZXggPSBDb2xsZWN0aW9ucy5iaW5hcnlTZWFyY2godGVzdGVkTGluZXMsIGxpbmUsIGNvbXBhcmF0b3IpOwotCQkJaWYgKGluZGV4IDwgMCkgewotCQkJCS8vIG5vdCBmb3VuZC4KLQkJCQl1bnRlc3RlZExpbmVzLmFkZChsaW5lKTsKLQkJCX0KLQkJfQotCQltb25pdG9yLndvcmtlZCgxKTsKLQkJLy8gbm93IHNlZSBpZiB0aGUgbGlzdCBvZiB1bnRlc3RlZCBsaW5lcyBoYXMgZW50cmllcy4KLQkJQ29sbGVjdGlvbnMuc29ydCh1bnRlc3RlZExpbmVzLCBjb21wYXJhdG9yKTsKLQkJSXRlcmF0b3IgdW50ZXN0ZWRpdGVyYXRvciA9IHVudGVzdGVkTGluZXMuaXRlcmF0b3IoKTsKLQkJaWYgKHVudGVzdGVkaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlnZXRCdWZmZXIoKS53cml0ZSgiTGlzdCBvZiBtZXNzYWdlcyB3aGljaCBhcmUgbm90IHRlc3RlZCAoIiArIHVudGVzdGVkTGluZXMuc2l6ZSgpICsgIiBvZiAiICsgcExpbmVzLnNpemUoKSArICIpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0gZWxzZSB7Ci0JCQlnZXRCdWZmZXIoKS53cml0ZSgiQWxsIG1lc3NhZ2VzIGFyZSB0ZXN0ZWQuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl3aGlsZSAodW50ZXN0ZWRpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCVByb3BlcnR5TGluZSBsaW5lID0gKFByb3BlcnR5TGluZSl1bnRlc3RlZGl0ZXJhdG9yLm5leHQoKTsKLQkJCWdldEJ1ZmZlcigpLndyaXRlKGxpbmUudG9TdHJpbmcoKSk7Ci0JCX0KLQkJdW50ZXN0ZWRMaW5lcy5jbGVhcigpOyAvLyBjbGVhciB0aGUgbGlzdCBmb3IgdGhlIG5leHQgcHJvamVjdAotCQl0ZXN0ZWRMaW5lcy5jbGVhcigpOwotCQltb25pdG9yLndvcmtlZCgxKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9zZXR1cC9JQnVmZmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9zZXR1cC9JQnVmZmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMGJjODEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3Qvc2V0dXAvSUJ1ZmZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci0KLS8qKgotICogSWYgaW5mb3JtYXRpb24gbmVlZHMgdG8gYmUgcmVwb3J0ZWQgdG8gdGhlIHVzZXIsIGJ1dCB0aGF0IGluZm9ybWF0aW9uIGlzIGxvbmcsCi0gKiBhbmQgdGhlIHVzZXIgbmVlZHMgdG8gc2VlIGl0IGFsbCBhdCB0aGUgc2FtZSB0aW1lIChlLmcuLCB0ZXN0IGNhc2UgcmVzdWx0cyksCi0gKiB0aGVuIHRoZSBpbmZvcm1hdGlvbiBpcyByZXBvcnRlZCB0byBpbXBsZW1lbnRhdGlvbnMgb2YgdGhpcyBjbGFzcy4gCi0gKiBJbXBsZW1lbnRhdGlvbnMgY2FuIGNob29zZSB0byByZXBvcnQgdGhlIGluZm9ybWF0aW9uIGltbWVkaWF0ZWx5IAotICogKGUuZy4sIHRvIFN5c3RlbS5vdXQpLCBvciBjYW4gYXBwZW5kIGVhY2ggbWVzc2FnZSwgYW5kIHJlcG9ydCB0aGUgbWVzc2FnZQotICogb25seSBvbmNlIGV2ZXJ5dGhpbmcgaXMgY29tcGxldGUuIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElCdWZmZXIgZXh0ZW5kcyBJVGVzdFN0YXR1cyB7Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBwcm9ncmVzcyBtb25pdG9yIHRoYXQgaXMgdXNlZCBmb3IgcmVwb3J0aW5nIHByb2dyZXNzCi0JICogc3RhdHVzIGFzIHRoZSBsb25nLXJ1bm5pbmcgcHJvY2VzcyBleGVjdXRlcy4KLQkgKi8KLQlwdWJsaWMgSVByb2dyZXNzTW9uaXRvciBnZXRQcm9ncmVzc01vbml0b3IoKTsKLQkKLQkvKioKLQkgKiBEaXNwbGF5IHRoZSBtZXNzYWdlIHRvIHRoZSB1c2VyOyB0aGUgYnVmZmVyIGltcGxlbWVudGF0aW9uIG1heSAKLQkgKiBkaXNwbGF5IHRoZSBtZXNzYWdlIGltbWVkaWF0ZWx5LCBvciBtYXkgZGlzcGxheSB0aGUgbWVzc2FnZSBvbmx5Ci0JICogd2hlbiByZXBvcnQoKSBpcyBjYWxsZWQuCi0JICovCi0JcHVibGljIHZvaWQgd3JpdGUoU3RyaW5nIG1lc3NhZ2UpOwotCQotCS8qKgotCSAqIEJldHdlZW4gb25lIHRhc2sgYW5kIHRoZSBuZXh0LCB1c3VhbGx5IGJldHdlZW4gdGVzdCBjYXNlcywgYWRkIGEgZGVsaW5lYXRpbmcKLQkgKiBtYXJrIHRvIHNob3cgdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIGVhY2ggdGFzayBjbGVhcmx5LiBUaGUgcGFyYW1ldGVyIAotCSAqIHBhc3NlZCBpbiwgdGFza05hbWUsIGlzIHRoZSBuYW1lIG9mIHRoZSB0YXNrIHRoYXQgaXMgZW5kaW5nLgotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGluZWF0ZShTdHJpbmcgdGFza05hbWUpOwotCQkKLQkvKioKLQkgKiBJZiBpbmZvcm1hdGlvbiB3YXMgbm90IHJlcG9ydGVkIGltbWVkaWF0ZWx5LCBjYWxsaW5nIHRoaXMgbWV0aG9kCi0JICogZm9yY2VzIHRoZSBidWZmZXIgdG8gYmUgcmVwb3J0ZWQgdG8gdGhlIHVzZXIuIFRoZSBjb250ZW50cyBvZiB0aGUKLQkgKiBidWZmZXIgYXJlIG5vdCBjbGVhcmVkOyBhIHN1YnNlcWVudCBjYWxsIHRvIHRoaXMgbWV0aG9kIHdpbGwgCi0JICogcmVwZWF0IHdoYXQgaGFzIGJlZW4gcmVwb3J0ZWQgYmVmb3JlLiBBbnkgY2FsbHMgdG8gZWxhcHNlZFRpbWUKLQkgKiB3aWxsIGJlIHJlcG9ydGVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlcG9ydCgpOwotCQotCS8qKgotCSAqIENsZWFyIGFueSBzdG9yZWQgbWVzc2FnZXMgZnJvbSB0aGUgYnVmZmVyLCBidXQgbm90IGFueSBlbGFwc2VkVGltZSAKLQkgKiBudW1iZXJzIGZyb20gdGhlIHN0b3JlLgotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFyKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgbG9nIGZpbGUsIG9yIG51bGwgaWYgbm9uZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExvZ0ZpbGVOYW1lKCk7Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9zZXR1cC9JSW1wb3J0T3BlcmF0aW9uLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9zZXR1cC9JSW1wb3J0T3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxZDBkMDUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3Qvc2V0dXAvSUltcG9ydE9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLQotLyoqCi0gKiBBbGwgdmFsaWRhdGlvbiBGVlQgdGVzdHMgbXVzdCBwcm92aWRlIGFuIElJbXBvcnRPcGVyYXRpb24gaW1wbGVtZW50YXRpb24KLSAqIHRvIGltcG9ydCB0aGUgaW5wdXQgZmlsZS4KLSAqLwotcHVibGljIGludGVyZmFjZSBJSW1wb3J0T3BlcmF0aW9uIHsKLQkvKioKLQkgKiBSdW5zIHRoaXMgb3BlcmF0aW9uIHdpdGhvdXQgZm9yY2luZyBhIFVJIGRlcGVuZGVuY3kuIFJldHVybiB0cnVlIGlmIHRoZSBmaWxlCi0JICogd2FzIGZvdW5kIGFuZCBpbXBvcnRlZCBzdWNjZXNzZnVsbHkuCi0JICoKLQkgKiBAcGFyYW0gbW9uaXRvciB0aGUgcHJvZ3Jlc3MgbW9uaXRvciB0byB1c2UgdG8gZGlzcGxheSBwcm9ncmVzcyBhbmQgcmVjZWl2ZQotCSAqICAgcmVxdWVzdHMgZm9yIGNhbmNlbGF0aW9uCi0JICogQHBhcmFtIGlucHV0RmlsZSB0aGUgZmlsZSB3aGljaCBuZWVkcyB0byBiZSBpbXBvcnRlZCBpbnRvIHRoZSB3b3JrYmVuY2gKLQkgKiBAZXhjZXB0aW9uIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaWYgdGhlIHJ1biBtZXRob2QgbXVzdCBwcm9wYWdhdGUgYSBjaGVja2VkIGV4Y2VwdGlvbiwKLQkgKiAJaXQgc2hvdWxkIHdyYXAgaXQgaW5zaWRlIGFuIDxjb2RlPkludm9jYXRpb25UYXJnZXRFeGNlcHRpb248L2NvZGU+OyBydW50aW1lIGV4Y2VwdGlvbnMgYXJlIGF1dG9tYXRpY2FsbHkKLQkgKiAgd3JhcHBlZCBpbiBhbiA8Y29kZT5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uPC9jb2RlPiBieSB0aGUgY2FsbGluZyBjb250ZXh0Ci0JICogQGV4Y2VwdGlvbiBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZiB0aGUgb3BlcmF0aW9uIGRldGVjdHMgYSByZXF1ZXN0IHRvIGNhbmNlbCwgCi0JICogIHVzaW5nIDxjb2RlPklQcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpPC9jb2RlPiwgaXQgc2hvdWxkIGV4aXQgYnkgdGhyb3dpbmcgCi0JICogIDxjb2RlPkludGVycnVwdGVkRXhjZXB0aW9uPC9jb2RlPgotCSAqCi0JICogQHNlZSBJUnVubmFibGVXaXRoUHJvZ3Jlc3MKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBGaWxlIGlucHV0RmlsZSkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3Qvc2V0dXAvSVRlc3RTdGF0dXMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L3NldHVwL0lUZXN0U3RhdHVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMmI5MzYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3Qvc2V0dXAvSVRlc3RTdGF0dXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cDsKLQotLyoqCi0gKiBJbnN0YW5jZXMgb2YgdGhpcyBpbnRlcmZhY2UgdHJhY2sgdGhlIGV4ZWN1dGlvbiBvZiBhIHRlc3QgY2FzZSwKLSAqIGFuZCBhcmUgdXNlZCB0byByZXBvcnQgYSBzdW1tYXJ5IG9mIHRoZSBleGVjdXRpb24gb2YgYWxsIG9mIHRoZQotICogdGVzdCBjYXNlcyBhdCB0aGUgZW5kIG9mIGEgc2V0IG9mIHRlc3QgcnVucy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJVGVzdFN0YXR1cyB7Ci0JcHVibGljIGZpbmFsIGludCBQQVNTID0gMDsKLQlwdWJsaWMgZmluYWwgaW50IFdBUk4gPSAxOwotCXB1YmxpYyBmaW5hbCBpbnQgRkFJTCA9IDI7Ci0JCi0JLyoqCi0JICogVG8gdHJhY2sgaG93IGxvbmcgYSB0YXNrIHRha2VzLCBjYWxsIHRoaXMgbWV0aG9kIHdpdGggYSB1bmlxdWUgbmFtZQotCSAqIG9mIHRoZSB0YXNrLiBJZiB0aGUgdGFzayBhbHJlYWR5IGV4aXN0cywgdGhlIGVsYXBzZWRUaW1lIGlzIGFkZGVkCi0JICogdG8gdGhlIGV4aXN0aW5nIHRpbWUuCi0JICovCi0JcHVibGljIHZvaWQgYWRkRWxhcHNlZFRpbWUoU3RyaW5nIHRhc2tOYW1lLCBsb25nIGVsYXBzZWRUaW1lKTsKLQkKLQkvKioKLQkgKiBJZiBwYXNzIGlzIHRydWUsIFBBU1MgaXMgdXNlZDsgaWYgcGFzcyBpcyBmYWxzZSwgRkFJTCBpcyB1c2VkLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEV4ZWN1dGlvblN0YXR1cyhTdHJpbmcgdGVzdFBhc3NOYW1lLCBib29sZWFuIHBhc3MpOwotCQotCS8qKgotCSAqIElmIHBhc3MgaXMgdHJ1ZSwgUEFTUyBpcyB1c2VkOyBpZiBwYXNzIGlzIGZhbHNlLCBGQUlMIGlzIHVzZWQuCi0JICogV2hpbGUgc3RpbGwgY29uc2lkZXJlZCBwYXJ0IG9mIHRlc3QgY2FzZSAidGVzdFBhc3NOYW1lIiwgdGhpcyAKLQkgKiBzcGxpdHMgdGhpcyBwYXJ0IG9mIHRoZSB0ZXN0IGNhc2UgaW50byBhIHNlY3Rpb24gbmFtZWQgInN1YlRhc2tOYW1lIi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRFeGVjdXRpb25TdGF0dXMoU3RyaW5nIHRlc3RQYXNzTmFtZSwgU3RyaW5nIHN1YlRhc2tOYW1lLCBib29sZWFuIHBhc3MpOwotCQotCS8qKgotCSAqIEFzIGVhY2ggdGVzdCBpcyBleGVjdXRlZCwgdGhpcyBtZXRob2QgaXMgdXNlZCB0byB0cmFjayBob3cgbWFueSBvZiB0aGF0Ci0JICogdHlwZSBvZiB0ZXN0IHBhc3Mgb3IgZmFpbC4gcGFzc09yRmFpbCBjYW4gYmUgb25lIG9mIHRocmVlIHZhbHVlczogUEFTUywgV0FSTiwgb3IgRkFJTC4KLQkgKiBJZiB2YWx1ZSBpcyBQQVNTLCB0aGVuIHRoZSB0ZXN0IGNhc2UgcGFzc2VzLCBhbmQgbm8gbWVzc2FnZSBuZWVkcyB0byBiZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuCi0JICogSWYgdmFsdWUgaXMgV0FSTiwgdGhlbiB0aGUgdGVzdCBjYXNlIHBhc3NlcywgYW5kIGEgd2FybmluZyBtZXNzYWdlIG11c3QgYmUgZGlzcGxheWVkIHRvIHRoZSB1c2VyLgotCSAqIElmIHZhbHVlIGlzIEZBSUwsIHRoZW4gdGhlIHRlc3QgY2FzZSBmYWlscywgYW5kIGEgZmFpbHVyZSBtZXNzYWdlIG11c3QgYmUgZGlzcGxheWVkIHRvIHRoZSB1c2VyLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEV4ZWN1dGlvblN0YXR1cyhTdHJpbmcgdGVzdGNhc2VOYW1lLCBTdHJpbmcgc3ViVGFza05hbWUsIGludCBwYXNzT3JGYWlsLCBJQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIG1lc3NhZ2UpOwotCQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIGFsbCBvZiB0aGUgdGVzdCBjYXNlcyBydW4gc28gZmFyIGhhdmUgcGFzc2VkOyBvdGhlcndpc2UKLQkgKiByZXR1cm4gZmFsc2UuIElmIG5vIHRlc3QgY2FzZXMgaGF2ZSBydW4sIHJldHVybiB0cnVlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3VjY2Vzc2Z1bCgpOwotCQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIGEgcGFydGljdWxhciB0ZXN0IGNhc2UgcGFzc2VkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3VjY2Vzc2Z1bChTdHJpbmcgdGVzdE5hbWUpOwotCQotCS8qKgotCSAqIFJlc2V0IGFsbCB2YXJpYWJsZXMgdG8gdGhlIGRlZmF1bHQgdmFsdWUgdG8gcHJlcGFyZSB0aGlzIHRlc3Qgc3RhdHVzIGZvciByZXVzZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhcigpOwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3Qvc2V0dXAvSkFSSW1wb3J0T3BlcmF0aW9uLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9zZXR1cC9KQVJJbXBvcnRPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMwODQwMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9zZXR1cC9KQVJJbXBvcnRPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXA7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LkJWVFZhbGlkYXRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5WYWxpZGF0b3JNYW5hZ2VyOwotCi0vKioKLSAqIENyZWF0ZSBhIEphdmEgcHJvamVjdCBieSBpbXBvcnRpbmcgYSBKQVIgZmlsZS4KLSAqLwotcHVibGljIGNsYXNzIEpBUkltcG9ydE9wZXJhdGlvbiBleHRlbmRzIEFJbXBvcnRPcGVyYXRpb24gewotCS8vIE1vc3Qgb2YgdGhlIGNvZGUgaW4gdGhpcyBjbGFzcyB3YXMgc3RvbGVuIGZyb20gdGhlIEpEVC4gU2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS53aXphcmRzLmJ1aWxkcGF0aHMuQnVpbGRQYXRoc0Jsb2NrLgotCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVQcm9qZWN0KElQcm9qZWN0IHByb2plY3QsIElQYXRoIGxvY2F0aW9uUGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChtb25pdG9yID09IG51bGwpIHsKLQkJCW1vbml0b3I9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCX0JCQkJCi0KLQkJLy8gY3JlYXRlIHRoZSBwcm9qZWN0Ci0JCXRyeSB7Ci0JCQlpZiAoIXByb2plY3QuZXhpc3RzKCkpIHsKLQkJCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2M9IHByb2plY3QuZ2V0V29ya3NwYWNlKCkubmV3UHJvamVjdERlc2NyaXB0aW9uKHByb2plY3QuZ2V0TmFtZSgpKTsKLQkJCQlpZiAoUGxhdGZvcm0uZ2V0TG9jYXRpb24oKS5lcXVhbHMobG9jYXRpb25QYXRoKSkgewotCQkJCQlsb2NhdGlvblBhdGg9IG51bGw7Ci0JCQkJfQotCQkJCWRlc2Muc2V0TG9jYXRpb24obG9jYXRpb25QYXRoKTsKLQkJCQlwcm9qZWN0LmNyZWF0ZShkZXNjLCBtb25pdG9yKTsKLQkJCQltb25pdG9yPSBudWxsOwotCQkJfQotCQkJaWYgKCFwcm9qZWN0LmlzT3BlbigpKSB7Ci0JCQkJcHJvamVjdC5vcGVuKG1vbml0b3IpOwotCQkJCW1vbml0b3I9IG51bGw7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCQkJbW9uaXRvci5kb25lKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkSmF2YU5hdHVyZShJUHJvamVjdCBwcm9qZWN0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKCFwcm9qZWN0Lmhhc05hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpKSB7Ci0JCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotCQkJU3RyaW5nW10gcHJldk5hdHVyZXM9IGRlc2NyaXB0aW9uLmdldE5hdHVyZUlkcygpOwotCQkJU3RyaW5nW10gbmV3TmF0dXJlcz0gbmV3IFN0cmluZ1twcmV2TmF0dXJlcy5sZW5ndGggKyAxXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkocHJldk5hdHVyZXMsIDAsIG5ld05hdHVyZXMsIDAsIHByZXZOYXR1cmVzLmxlbmd0aCk7Ci0JCQluZXdOYXR1cmVzW3ByZXZOYXR1cmVzLmxlbmd0aF09IEphdmFDb3JlLk5BVFVSRV9JRDsKLQkJCWRlc2NyaXB0aW9uLnNldE5hdHVyZUlkcyhuZXdOYXR1cmVzKTsKLQkJCXByb2plY3Quc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIG1vbml0b3IpOwotCQl9IGVsc2UgewotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZVByb2plY3QoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRyeSB7Ci0JCQkvLyBTZXQgdGhlIGNsYXNzcGF0aCB0byB0aGUgZGVmYXVsdC4KLQkJCUlKYXZhUHJvamVjdCBqcCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJCWpwLnNldFJhd0NsYXNzcGF0aChudWxsLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDcpKTsJCQotCi0JCQkvLyBOb3cgYWRkIHJ0LmphciB0byBpdAotCQkJSUNsYXNzcGF0aEVudHJ5W10gZXhpc3RpbmdDbGFzc3BhdGggPSBqcC5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJCUlDbGFzc3BhdGhFbnRyeVtdIGNsYXNzcGF0aD0gbmV3IElDbGFzc3BhdGhFbnRyeVtleGlzdGluZ0NsYXNzcGF0aC5sZW5ndGggKyAxXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoZXhpc3RpbmdDbGFzc3BhdGgsIDAsIGNsYXNzcGF0aCwgMCwgZXhpc3RpbmdDbGFzc3BhdGgubGVuZ3RoKTsKLQkJCUlDbGFzc3BhdGhFbnRyeSBydEphciA9IEphdmFDb3JlLm5ld1ZhcmlhYmxlRW50cnkobmV3IFBhdGgoIkpSRV9MSUIiKSwgbmV3IFBhdGgoIkpSRV9TUkMiKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJY2xhc3NwYXRoW2V4aXN0aW5nQ2xhc3NwYXRoLmxlbmd0aF0gPSBydEphcjsKLQkJCWpwLnNldFJhd0NsYXNzcGF0aChjbGFzc3BhdGgsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgNykpOwotCQkJCi0JCQkvLyBFbmFibGUgdGhpcyBqYXZhIHByb2plY3Qgd2l0aCB0aGUgVmFsaWRhdGlvbiBCdWlsZGVyIHNvIHRoYXQgYXV0b21hdGljIHZhbGlkYXRpb24gCi0JCQkvLyBjYW4gcnVuIG9uIGl0LgotCQkJVmFsaWRhdG9yTWFuYWdlci5hZGRQcm9qZWN0QnVpbGRWYWxpZGF0aW9uU3VwcG9ydChwcm9qZWN0KTsKLQkJfQotCQljYXRjaChKYXZhTW9kZWxFeGNlcHRpb24gZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuQUltcG9ydE9wZXJhdGlvbiNjcmVhdGVOZXdQcm9qZWN0KElQcm9ncmVzc01vbml0b3IsIFN0cmluZywgRmlsZSkKLQkgKi8KLQlwcm90ZWN0ZWQgSVByb2plY3QgY3JlYXRlTmV3UHJvamVjdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIFN0cmluZyBwcm9qZWN0TmFtZSwgRmlsZSBpbnB1dEZpbGUpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JCXRyeSB7Ci0JCQljcmVhdGVQcm9qZWN0KHByb2plY3QsIG51bGwsIG1vbml0b3IpOwotCQkJYWRkSmF2YU5hdHVyZShwcm9qZWN0LCBtb25pdG9yKTsKLQkJCWNvbmZpZ3VyZVByb2plY3QobW9uaXRvciwgcHJvamVjdCk7Ci0JCX0KLQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwcm9qZWN0OwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGb2xkZXIoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUHJvamVjdCBwcm9qZWN0LCBJUGF0aCBwYXRobmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJRm9sZGVyIGZvbGRlciA9IHByb2plY3QuZ2V0Rm9sZGVyKHBhdGhuYW1lKTsKLQkJSUNvbnRhaW5lciBjb250YWluZXIgPSBmb2xkZXIuZ2V0UGFyZW50KCk7Ci0JCWlmKCFjb250YWluZXIuZXhpc3RzKCkpIHsKLQkJCWNyZWF0ZUZvbGRlcihtb25pdG9yLCBwcm9qZWN0LCBjb250YWluZXIuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpKTsKLQkJfQotCQlpZighZm9sZGVyLmV4aXN0cygpKSB7Ci0JCQkvLyBEb24ndCBvdmVyd3JpdGUgZXhpc3RpbmcgZmlsZXMuCi0JCQlmb2xkZXIuY3JlYXRlKHRydWUsIHRydWUsIG1vbml0b3IpOyAvLyB0cnVlPWZvcmNlLCB0cnVlPWxvY2FsCi0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRmlsZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElQcm9qZWN0IHByb2plY3QsIElQYXRoIHBhdGhuYW1lLCBJbnB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSUZpbGUgbmZpbGUgPSBwcm9qZWN0LmdldEZpbGUocGF0aG5hbWUpOwotCQlJQ29udGFpbmVyIGNvbnRhaW5lciA9IG5maWxlLmdldFBhcmVudCgpOwotCQlpZighY29udGFpbmVyLmV4aXN0cygpKSB7Ci0JCQljcmVhdGVGb2xkZXIobW9uaXRvciwgcHJvamVjdCwgY29udGFpbmVyLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKSk7Ci0JCX0KLQkJaWYoIW5maWxlLmV4aXN0cygpKSB7Ci0JCQkvLyBEb24ndCBvdmVyd3JpdGUgZXhpc3RpbmcgZmlsZXMuCi0JCQluZmlsZS5jcmVhdGUoc3RyZWFtLCB0cnVlLCBtb25pdG9yKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuQUltcG9ydE9wZXJhdGlvbiNpbXBvcnRGaWxlKElQcm9ncmVzc01vbml0b3IsIElQcm9qZWN0LCBGaWxlKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGltcG9ydEZpbGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUHJvamVjdCBwcm9qZWN0LCBGaWxlIGZpbGUpIHsKLQkJLy8gSW1wb3J0IHRoZSBmaWxlIAotCQl0cnkgewotCQkJWmlwRmlsZSB6aXBGaWxlID0gbmV3IFppcEZpbGUoZmlsZSk7Ci0JCQlFbnVtZXJhdGlvbiB6aXBFbnRyaWVzID0gemlwRmlsZS5lbnRyaWVzKCk7Ci0JCQl3aGlsZSh6aXBFbnRyaWVzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJWmlwRW50cnkgemlwRW50cnkgPSAoWmlwRW50cnkpemlwRW50cmllcy5uZXh0RWxlbWVudCgpOwotCQkJCUlQYXRoIHBhdGhuYW1lID0gbmV3IFBhdGgoemlwRW50cnkuZ2V0TmFtZSgpKTsKLQkJCQlpZih6aXBFbnRyeS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJCWNyZWF0ZUZvbGRlcihtb25pdG9yLCBwcm9qZWN0LCBwYXRobmFtZSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQljcmVhdGVGaWxlKG1vbml0b3IsIHByb2plY3QsIHBhdGhuYW1lLCB6aXBGaWxlLmdldElucHV0U3RyZWFtKHppcEVudHJ5KSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJY2F0Y2goSU9FeGNlcHRpb24gZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQljYXRjaChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L3NldHVwL1Rlc3RDYXNlR2VuZXJhdG9yT3BlcmF0aW9uLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9zZXR1cC9UZXN0Q2FzZUdlbmVyYXRvck9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjRlMzRmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L3NldHVwL1Rlc3RDYXNlR2VuZXJhdG9yT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuQlZUVmFsaWRhdGlvblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnJlZ2lzdHJ5Lk1lc3NhZ2VVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlRhc2tMaXN0VXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0b3JNZXRhRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0vKioKLSAqIEdlbmVyYXRlIGFuIEZWVCB0ZXN0IGNhc2UsIGZvciBhIHNlbGVjdGVkIElQcm9qZWN0IG9yIElQcm9qZWN0cywgdG8KLSAqIGJlIHBhc3RlZCBpbnRvIHBsdWdpbi54bWwuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBUZXN0Q2FzZUdlbmVyYXRvck9wZXJhdGlvbiBpbXBsZW1lbnRzIElXb3Jrc3BhY2VSdW5uYWJsZSB7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIF9URVNUQ0FTRV9URU1QTEFURV8gPSAiXHRcdFx0PHRlc3QgXG5cdFx0XHRcdHByb2plY3Q9XCJ7MH1cIlxuXHRcdFx0XHRpbnB1dD1cIlwiXG5cdFx0XHRcdHZhbGlkYXRvcj1cInsxfVwiPlxuezJ9XHRcdFx0PC90ZXN0PlxuIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBfVEVTVENBU0VfTUVTU0FHRV9URU1QTEFURV8gPSAiXHRcdFx0XHQ8bWVzc2FnZSBwcmVmaXg9XCJ7MH1cIiByZXNvdXJjZT1cInsxfVwiIGxvY2F0aW9uPVwiezJ9XCIgdGV4dD1cInszfVwiLz5cbiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIE1hcCBfdm1kQnVmZmVyID0gbnVsbDsgLy8gbWFwIHdoZXJlIHRoZSBWYWxpZGF0b3JNZXRhRGF0YSBpcyB0aGUga2V5IGFuZCB0aGUgdmFsdWUgaXMgYSBTdHJpbmdCdWZmZXIKLQlwcml2YXRlIElQcm9qZWN0W10gX3Byb2plY3RzID0gbnVsbDsKLQlwcml2YXRlIElCdWZmZXIgX2J1ZmZlciA9IG51bGw7Ci0JCi0JcHVibGljIFRlc3RDYXNlR2VuZXJhdG9yT3BlcmF0aW9uKElQcm9qZWN0W10gcHJvamVjdHMsIElCdWZmZXIgYnVmZmVyKSB7Ci0JCXNldFByb2plY3RzKHByb2plY3RzKTsKLQkJc2V0QnVmZmVyKGJ1ZmZlcik7Ci0JCV92bWRCdWZmZXIgPSBuZXcgSGFzaE1hcCgpOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIGJ1ZmZlciB3aGVyZSB0aGUgdGVzdCBjYXNlIGdlbmVyYXRlZCBvdXRwdXQgd2lsbCBiZSBzZW50LgotCSAqLwotCXB1YmxpYyBJQnVmZmVyIGdldEJ1ZmZlcigpIHsKLQkJcmV0dXJuIF9idWZmZXI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEJ1ZmZlcihJQnVmZmVyIGIpIHsKLQkJX2J1ZmZlciA9IGI7Ci0JfQotCQotCXB1YmxpYyBJUHJvamVjdFtdIGdldFByb2plY3RzKCkgewotCQlyZXR1cm4gX3Byb2plY3RzOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRQcm9qZWN0cyhJUHJvamVjdFtdIHByb2plY3RzKSB7Ci0JCV9wcm9qZWN0cyA9IHByb2plY3RzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlI3J1bihJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIGFyZzApIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWdlbmVyYXRlKGdldFByb2plY3RzKCkpOwotCQl9Ci0JCWNhdGNoKFRocm93YWJsZSBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJfQotCQkJZ2V0QnVmZmVyKCkud3JpdGUoIkEgVGhyb3dhYmxlIHdhcyBjYXVnaHQ7IGNvdWxkIG5vdCBnZW5lcmF0ZSB0aGUgdGVzdCBjYXNlLiBDaGVjayB0aGUgTG9nZ2luZ1V0aWwubG9nIGZpbGUgZm9yIGRldGFpbHMuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlmaW5hbGx5IHsKLQkJCV92bWRCdWZmZXIuY2xlYXIoKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZShJUHJvamVjdFtdIHByb2plY3RzKSB7Ci0JCS8vIEZpcnN0LCBsb2FkIGFsbCBvZiB0aGUgdmFsaWRhdGlvbiBtYXJrZXJzIGZyb20gdGhlIHNlbGVjdGVkIHByb2plY3RzLCAKLQkJLy8gYW5kIGdyb3VwIHRoZW0gYnkgdGhlIHZhbGlkYXRvci4KLQkJZm9yKGludCBpPTA7IGk8cHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBwcm9qZWN0c1tpXTsKLQkJCUlNYXJrZXJbXSBtYXJrZXJzID0gVGFza0xpc3RVdGlsaXR5LmdldFZhbGlkYXRpb25UYXNrcyhwcm9qZWN0LCBJTWVzc2FnZS5BTExfTUVTU0FHRVMpOwotCQkJaWYoKG1hcmtlcnMgPT0gbnVsbCkgfHwgKG1hcmtlcnMubGVuZ3RoID09IDApKXsKLQkJCQlnZXRCdWZmZXIoKS53cml0ZSgiQ2Fubm90IGdlbmVyYXRlIGEgdGVzdCBjYXNlIGZvciBwcm9qZWN0ICIgKyBwcm9qZWN0LmdldE5hbWUoKSArICIgdW50aWwgXCJSdW4gVmFsaWRhdGlvblwiIGhhcyBiZWVuIHJ1bi4gRW5hYmxlIG9ubHkgdGhlIHZhbGlkYXRvciB3aG9zZSB0ZXN0IGNhc2UgaXMgdG8gYmUgZ2VuZXJhdGVkLCByaWdodC1jbGljaywgYW5kIFwiUnVuIFZhbGlkYXRpb25cIi4gT25jZSB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlcyBoYXZlIGJlZW4gcmVwb3J0ZWQsIGEgdGVzdCBjYXNlIGNhbiBiZSBnZW5lcmF0ZWQgZnJvbSB0aG9zZSBtZXNzYWdlcy4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkKLQkJCS8vIEEgdGVzdCBjYXNlID0gb25lIHZhbGlkYXRvciBvbiBvbmUgcHJvamVjdCA9PiB3aGF0IG1hcmtlcnMKLQkJCUxpc3QgbWFya2VyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvcihpbnQgaj0wOyBqPG1hcmtlcnMubGVuZ3RoOyBqKyspIHsKLQkJCQltYXJrZXJMaXN0LmFkZChtYXJrZXJzW2pdKTsKLQkJCX0KLQkJCQotCQkJLy8gU29ydCB0aGUgbWFya2VycyBieSB2YWxpZGF0b3IsIHByb2plY3QsIHByZWZpeCwgbG9jYXRpb24gJiByZXNvdXJjZQotCQkJQ29sbGVjdGlvbnMuc29ydChtYXJrZXJMaXN0LCBNZXNzYWdlVXRpbGl0eS5nZXRNZXNzYWdlQ29tcGFyYXRvcihnZXRCdWZmZXIoKSwgZmFsc2UpKTsKLQotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBtYXJrZXJMaXN0Lml0ZXJhdG9yKCk7Ci0JCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlJTWFya2VyIG1hcmtlciA9IChJTWFya2VyKWl0ZXJhdG9yLm5leHQoKTsJCQkKLQkJCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSBNZXNzYWdlVXRpbGl0eS5nZXRWYWxpZGF0b3IobWFya2VyKTsKLQkJCQlpZih2bWQgIT0gbnVsbCkgewotCQkJCQlTdHJpbmdCdWZmZXIgbWVzc2FnZUJ1ZmZlciA9IGdldEJ1ZmZlcih2bWQpOwotCQkJCQlTdHJpbmcgbWVzc2FnZUlkID0gTWVzc2FnZVV0aWxpdHkuZ2V0TWVzc2FnZVByZWZpeChtYXJrZXIpOwotCQkJCQlTdHJpbmcgcmVzb3VyY2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRSZXNvdXJjZShtYXJrZXIpOwotCQkJCQlJbnRlZ2VyIGxpbmVOdW1iZXIgPSBNZXNzYWdlVXRpbGl0eS5nZXRMaW5lTnVtYmVyKG1hcmtlcik7Ci0JCQkJCVN0cmluZyBsb2NhdGlvbiA9IChsaW5lTnVtYmVyID09IG51bGwpID8gKGxvY2F0aW9uID0gTWVzc2FnZVV0aWxpdHkuZ2V0TG9jYXRpb24obWFya2VyKSkgOiAobG9jYXRpb24gPSBsaW5lTnVtYmVyLnRvU3RyaW5nKCkpOwotCQkJCQlTdHJpbmcgdGV4dCA9IE1lc3NhZ2VVdGlsaXR5LmdldE1lc3NhZ2UobWFya2VyKTsgLy8gRW1pdCB0aGUgdGV4dCBvZiB0aGUgbWVzc2FnZSBzbyB0aGF0LCBpZiB0aGUgbWVzc2FnZSBwcmVmaXhlcyBhcmUgY2hhbmdlZCBpbiB0aGUgZnV0dXJlLCBpdCdzIGVhc3kgdG8gc2VlIHRoYXQgdGhlIHNhbWUgdGVzdCBpcyBydW4gd2l0aCBhIGRpZmZlcmVudCBwcmVmaXgsIGFuZCB0aGF0IHRoZSB0ZXN0IGRpZG4ndCByZWFsbHkgZmFpbC4KLQkJCQkJdGV4dCA9IHRleHQucmVwbGFjZSgnPCcsICdbJyk7IC8vIHJlbW92ZSB0aGUgWE1MIHJlc2VydmVkIGNoYXJhY3RlcnMuCi0JCQkJCXRleHQgPSB0ZXh0LnJlcGxhY2UoJz4nLCAnXScpOwotCQkJCQl0ZXh0ID0gdGV4dC5yZXBsYWNlKCciJywgJ1wnJyk7Ci0JCQkJCW1lc3NhZ2VCdWZmZXIuYXBwZW5kKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KF9URVNUQ0FTRV9NRVNTQUdFX1RFTVBMQVRFXywgbmV3IFN0cmluZ1tde21lc3NhZ2VJZCwgcmVzb3VyY2UsIGxvY2F0aW9uLCB0ZXh0fSkpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJaXRlcmF0b3IgPSBfdm1kQnVmZmVyLmtleVNldCgpLml0ZXJhdG9yKCk7IC8vIGl0ZXJhdGUgb3ZlciB0aGUgdm1kcwotCQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gKFZhbGlkYXRvck1ldGFEYXRhKWl0ZXJhdG9yLm5leHQoKTsKLQkJCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gKFN0cmluZ0J1ZmZlcilfdm1kQnVmZmVyLmdldCh2bWQpOwotCQkJCVN0cmluZyB0ZXN0Y2FzZVRlbXBsYXRlID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoX1RFU1RDQVNFX1RFTVBMQVRFXywgbmV3IFN0cmluZ1tde3Byb2plY3QuZ2V0TmFtZSgpLCB2bWQuZ2V0VmFsaWRhdG9yVW5pcXVlTmFtZSgpLCBidWZmZXIudG9TdHJpbmcoKX0pOwotCQkJCQotCQkJCWdldEJ1ZmZlcigpLndyaXRlKHRlc3RjYXNlVGVtcGxhdGUpOwotCQkJCQotCQkJCWJ1ZmZlci5kZWxldGUoMCwgYnVmZmVyLmxlbmd0aCgpKTsgLy8gY2xlYXIgdGhlIGJ1ZmZlciBmb3IgdGhlIG5leHQgcHJvamVjdAotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nQnVmZmVyIGdldEJ1ZmZlcihWYWxpZGF0b3JNZXRhRGF0YSB2bWQpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IChTdHJpbmdCdWZmZXIpX3ZtZEJ1ZmZlci5nZXQodm1kKTsKLQkJaWYoYnVmZmVyID09IG51bGwpIHsKLQkJCWJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCV92bWRCdWZmZXIucHV0KHZtZCwgYnVmZmVyKTsKLQkJfQotCQlyZXR1cm4gYnVmZmVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0RndrL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvZndrL0J1aWxkSW5mby5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0RndrL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvZndrL0J1aWxkSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTZkMjlhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdEZ3ay9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2Z3ay9CdWlsZEluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmZ3azsKLXB1YmxpYyBjbGFzcyBCdWlsZEluZm8gewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiTGljZW5zZWQgTWF0ZXJpYWxzIC0tIFByb3BlcnR5IG9mIElCTVxuKGMpIENvcHlyaWdodCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uLCAyMDAxLDIwMDNcblVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUgcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZmdCdWlsZExldmVsID0gIjIwMDMxMTEyXzE5MTUtV0IyMTItQUQtVjUxMUQtVzUiOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBsZXZlbCgpIHsgcmV0dXJuIGZnQnVpbGRMZXZlbDsgfQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRXU0FCdWlsZExldmVsKCkgeyByZXR1cm4gZmdCdWlsZExldmVsOyB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3RGd2svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9md2svVGVzdE9wQ29uc3RyQnVpbGRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0RndrL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvZndrL1Rlc3RPcENvbnN0ckJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgyNTBhMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3RGd2svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9md2svVGVzdE9wQ29uc3RyQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmZ3azsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIFRlc3RPcENvbnN0ckJ1aWxkZXIgZXh0ZW5kcyBJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCVUlMREVSX0lEID0gIm9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuZndrLmJ2dGJ1aWxkZXIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBJUmVzb3VyY2VEZWx0YSBfZGVsdGEgPSBudWxsOwotCXByaXZhdGUgc3RhdGljIFRlc3RPcENvbnN0ckJ1aWxkZXIgX2luc3QgPSBudWxsOwotCQotCXB1YmxpYyBUZXN0T3BDb25zdHJCdWlsZGVyKCkgewotCQlfaW5zdCA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmV2ZW50cy5JbnRlcm5hbEJ1aWxkZXIjYnVpbGQoaW50LCBqYXZhLnV0aWwuTWFwLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgSVByb2plY3RbXSBidWlsZChpbnQga2luZCwgTWFwIGFyZ3MsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBOb3RoaW5nIHRvIGRvOyB0aGlzIGNsYXNzIGV4aXN0cyBvbmx5IHNvIHRoYXQgYW4gSVJlc291cmNlRGVsdGEgY2FuIGJlIGNvbnN0cnVjdGVkLgotCQlfZGVsdGEgPSBnZXREZWx0YShnZXRQcm9qZWN0KCkpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSVJlc291cmNlRGVsdGEgZ2V0RGVsdGEoKSB7Ci0JCXJldHVybiBfZGVsdGE7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVGVzdE9wQ29uc3RyQnVpbGRlciBzaW5nbGV0b24oKSB7Ci0JCXJldHVybiBfaW5zdDsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3RGd2svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9md2svVGVzdE9wQ29uc3RySW5wdXRPcGVyYXRpb24uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdEZ3ay9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2Z3ay9UZXN0T3BDb25zdHJJbnB1dE9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzc2N2I5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdEZ3ay9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2Z3ay9UZXN0T3BDb25zdHJJbnB1dE9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5md2s7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5CVlRWYWxpZGF0aW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuZndrLnZhbGlkYXRvci5KRFRVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwucmVnaXN0cnkuVmFsaWRhdG9yVGVzdGNhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JQnVmZmVyOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgY29uc3RydWN0cyB0aGUgaW5wdXQgZm9yIHRoZSBUZXN0T3BDb25zdHJPcGVyYXRpb24uIEJlY2F1c2UKLSAqIFRlc3RPcENvbnN0ck9wZXJhdGlvbiBpcyBub3QgaW52b2tlZCBhcyBwYXJ0IG9mIGEgYnVpbGQsIHdoZW4gaXRzIElSZXNvdXJjZXMKLSAqIGFyZSB0b3VjaGVkLCBhIGJ1aWxkIGlzIGludm9rZWQgYWZ0ZXIgZWFjaCB0b3VjaCwgYW5kIHRoYXQgbWVhbnMgdGhhdCB0aGUKLSAqIElSZXNvdXJjZURlbHRhIHRoYXQncyBjb25zdHJ1Y3RlZCBoYXMgb25seSBvbmUgSVJlc291cmNlIGluIGl0IGluc3RlYWQKLSAqIG9mIHRoZSBncm91cCBvZiBjaGFuZ2VkIElSZXNvdXJjZSBpbnN0YW5jZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0T3BDb25zdHJJbnB1dE9wZXJhdGlvbiBpbXBsZW1lbnRzIElXb3Jrc3BhY2VSdW5uYWJsZSB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRldLX05PQlVJTERfVEVTVF9WQUxJREFUT1JfQ0xBU1MgPSAib3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5md2sudmFsaWRhdG9yLkZ3a05vQnVpbGRUZXN0VmFsaWRhdG9yIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZXS19URVNUX1ZBTElEQVRPUl9DTEFTUyA9ICJvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmZ3ay52YWxpZGF0b3IuRndrVGVzdFZhbGlkYXRvciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUSUVTX1ZBTElEQVRPUl9DTEFTUyA9ICJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5zYW1wbGUuUHJvcGVydGllc1ZhbGlkYXRvciI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIElQcm9qZWN0IF9wcm9qZWN0ID0gbnVsbDsKLQlwcml2YXRlIElCdWZmZXIgX2J1ZmZlciA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgSUNvbW1hbmQgX2J1aWxkZXJDb21tYW5kID0gbnVsbDsKLQkKLQlwcml2YXRlIElSZXNvdXJjZURlbHRhIF9jaGFuZ2VkRGVsdGEgPSBudWxsOwotCXByaXZhdGUgSVJlc291cmNlRGVsdGEgX2VtcHR5RGVsdGEgPSBudWxsOwotCXByaXZhdGUgSmF2YUhlbHBlcnNbXSBfY2hhbmdlZENsYXNzZXMgPSBudWxsOwotCQotCS8qKgotCSAqIElQcm9qZWN0IG11c3QgZXhpc3QgYW5kIGJlIG9wZW4uCi0JICovCi0JcHVibGljIFRlc3RPcENvbnN0cklucHV0T3BlcmF0aW9uKElCdWZmZXIgYnVmZmVyLCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXNldFByb2plY3QocHJvamVjdCk7Ci0JCXNldEJ1ZmZlcihidWZmZXIpOwotCX0KLQotCXB1YmxpYyBJQnVmZmVyIGdldEJ1ZmZlcigpIHsKLQkJcmV0dXJuIF9idWZmZXI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEJ1ZmZlcihJQnVmZmVyIGIpIHsKLQkJX2J1ZmZlciA9IGI7Ci0JfQotCQkKLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIF9wcm9qZWN0OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KElQcm9qZWN0IHApIHsKLQkJX3Byb2plY3QgPSBwOwotCX0KLQotCS8qcGFja2FnZSovIHN0YXRpYyB2b2lkIGRlYnVnKGZpbmFsIElCdWZmZXIgYnVmZmVyLCBTdHJpbmcgdGl0bGUsIElSZXNvdXJjZURlbHRhIGRlbHRhKSB7Ci0JCXRyeSB7Ci0JCQlidWZmZXIud3JpdGUodGl0bGUpOwotCQkJZGVsdGEuYWNjZXB0KG5ldyBJUmVzb3VyY2VEZWx0YVZpc2l0b3IoKSB7Ci0JCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgc3ViZGVsdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQkJaWYgKHN1YmRlbHRhID09IG51bGwpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQotCQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBzdWJkZWx0YS5nZXRSZXNvdXJjZSgpOwotCQkJCQlidWZmZXIud3JpdGUoInJlc291cmNlIGlzOiAiICsgcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuIHRydWU7IC8vIHZpc2l0IHRoZSBzdWJkZWx0YSdzIGNoaWxkcmVuCi0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhbiBJUmVzb3VyY2UgdGhhdCBpcyBub3QgdmFsaWRhdGVkIGJ5IHRoZSBGd2sgVGVzdCBWYWxpZGF0b3IgKHRoaXMKLQkgKiByZXNvdXJjZSBpcyB1c2VkIGZvciB0aGUgY2FzZSB3aGVyZSBhIHJlc291cmNlIGlzIGNoYW5nZWQsIGFuZCBhIGJ1aWxkCi0JICogaXMgaW52b2tlZCwgYnV0IHRoZSBGd2sgVGVzdCB2YWxpZGF0b3IgZG9lcyBub3QgdmFsaWRhdGUgdGhhdCByZXNvdXJjZSBhbmQKLQkgKiBzaG91bGQgbm90IGJlIGxhdW5jaGVkLikKLQkgKi8JCi0JcHVibGljIHN0YXRpYyBJUmVzb3VyY2VbXSBnZXRFbXB0eVJlc291cmNlcyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUlSZXNvdXJjZVtdIGNoYW5nZWRSZXNvdXJjZXMgPSBuZXcgSVJlc291cmNlW117Ci0JCQlwcm9qZWN0LmdldEZpbGUoIi5jbGFzc3BhdGgiKSwgLy8kTk9OLU5MUy0xJAotCQl9OwotCQlyZXR1cm4gY2hhbmdlZFJlc291cmNlczsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHRvdWNoKElQcm9qZWN0IHByb2plY3QsIElSZXNvdXJjZVtdIGNoYW5nZWRSZXNvdXJjZXMpIHsKLQkJZm9yKGludCBpPTA7IGk8Y2hhbmdlZFJlc291cmNlcy5sZW5ndGg7IGkrKykgewotCQkJSVJlc291cmNlIHJlcyA9IGNoYW5nZWRSZXNvdXJjZXNbaV07Ci0JCQl0cnkgewotCQkJCXJlcy50b3VjaChudWxsKTsgLy8gbnVsbCBJUHJvZ3Jlc3NNb25pdG9yCi0JCQl9Ci0JCQljYXRjaChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJCS8vIE9oIHdlbGwuLi5kaXJ0eSB0aGUgbmV4dCBmaWxlLgotCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSVJlc291cmNlRGVsdGEgZ2V0RGVsdGEoSVByb2plY3QgcHJvamVjdCwgSVJlc291cmNlW10gY2hhbmdlZFJlc291cmNlcykgewotCQl0cnkgewotCQkJdG91Y2gocHJvamVjdCwgY2hhbmdlZFJlc291cmNlcyk7Ci0JCQlwcm9qZWN0LmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuSU5DUkVNRU5UQUxfQlVJTEQsIFRlc3RPcENvbnN0ckJ1aWxkZXIuQlVJTERFUl9JRCwgX2J1aWxkZXJDb21tYW5kLmdldEFyZ3VtZW50cygpLCBudWxsKTsgLy8gbnVsbCBJUHJvZ3Jlc3NNb25pdG9yCi0JCQlyZXR1cm4gVGVzdE9wQ29uc3RyQnVpbGRlci5zaW5nbGV0b24oKS5nZXREZWx0YSgpOwotCQl9Ci0JCWNhdGNoKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkQnVpbGRlcihJUHJvamVjdCBwcm9qZWN0LCBib29sZWFuIGRvQWRkKSB7Ci0JCWlmKGRvQWRkKSB7Ci0JCQkvLyBBZGQgdGhlIGJ1aWxkZXIgdG8gdGhlIHByb2plY3QKLQkJCXRyeSB7Ci0JCQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCQlJQ29tbWFuZFtdIG9sZENvbW1hbmRzID0gZGVzY3JpcHRpb24uZ2V0QnVpbGRTcGVjKCk7Ci0JCQkJSUNvbW1hbmRbXSBuZXdDb21tYW5kcyA9IG5ldyBJQ29tbWFuZFtvbGRDb21tYW5kcy5sZW5ndGggKyAxXTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KG9sZENvbW1hbmRzLCAwLCBuZXdDb21tYW5kcywgMCwgb2xkQ29tbWFuZHMubGVuZ3RoKTsKLQkJCQlfYnVpbGRlckNvbW1hbmQgPSBkZXNjcmlwdGlvbi5uZXdDb21tYW5kKCk7Ci0JCQkJX2J1aWxkZXJDb21tYW5kLnNldEJ1aWxkZXJOYW1lKFRlc3RPcENvbnN0ckJ1aWxkZXIuQlVJTERFUl9JRCk7Ci0JCQkJbmV3Q29tbWFuZHNbb2xkQ29tbWFuZHMubGVuZ3RoXSA9IF9idWlsZGVyQ29tbWFuZDsKLQkJCQlkZXNjcmlwdGlvbi5zZXRCdWlsZFNwZWMobmV3Q29tbWFuZHMpOwotCi0JCQkJcHJvamVjdC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgbnVsbCk7Ci0JCQl9Ci0JCQljYXRjaChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJLy8gUmVtb3ZlIHRoZSBidWlsZGVyCi0JCQl0cnkgewotCQkJCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0JCQkJSUNvbW1hbmRbXSBvbGRDb21tYW5kcyA9IGRlc2NyaXB0aW9uLmdldEJ1aWxkU3BlYygpOwotCQkJCUlDb21tYW5kW10gbmV3Q29tbWFuZHMgPSBuZXcgSUNvbW1hbmRbb2xkQ29tbWFuZHMubGVuZ3RoIC0gMV07Ci0JCQkJU3lzdGVtLmFycmF5Y29weShvbGRDb21tYW5kcywgMCwgbmV3Q29tbWFuZHMsIDAsIG5ld0NvbW1hbmRzLmxlbmd0aCk7Ci0JCQkJZGVzY3JpcHRpb24uc2V0QnVpbGRTcGVjKG5ld0NvbW1hbmRzKTsKLQkJCQlwcm9qZWN0LnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBudWxsKTsKLQkJCX0KLQkJCWNhdGNoKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXRyeSB7Ci0JCQlhZGRCdWlsZGVyKGdldFByb2plY3QoKSwgdHJ1ZSk7Ci0JCQkKLQkJCS8vIEZpcnN0LCBidWlsZCB0aGUgcHJvamVjdCBzbyB0aGF0IHRoZSBzdWJzZXF1ZW50IGJ1aWxkcyBhcmVuJ3Qgc3RhcnRlZCB3aXRoIGEgbnVsbCBkZWx0YS4KLQkJCWdldFByb2plY3QoKS5idWlsZChJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLklOQ1JFTUVOVEFMX0JVSUxELCBUZXN0T3BDb25zdHJCdWlsZGVyLkJVSUxERVJfSUQsIF9idWlsZGVyQ29tbWFuZC5nZXRBcmd1bWVudHMoKSwgbnVsbCk7IC8vIG51bGwgSVByb2dyZXNzTW9uaXRvcgotCQkJCi0JCQlWYWxpZGF0b3JUZXN0Y2FzZVtdIHRtZHMgPSBKRFRVdGlsaXR5LmdldFZGVGVzdHMobW9uaXRvciwgZ2V0UHJvamVjdCgpKTsKLQkJCWlmKCh0bWRzID09IG51bGwpIHx8ICh0bWRzLmxlbmd0aCA9PSAwKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJLy8gVGhlbiBjYWxjdWxhdGUgdGhlIGRlbHRhcwotCQkJSVJlc291cmNlW10gY2hhbmdlZFJlc291cmNlcyA9IGdldENoYW5nZWRSZXNvdXJjZXMoZ2V0UHJvamVjdCgpLCB0bWRzKTsKLQkJCV9lbXB0eURlbHRhID0gZ2V0RGVsdGEoZ2V0UHJvamVjdCgpLCBnZXRFbXB0eVJlc291cmNlcyhnZXRQcm9qZWN0KCkpKTsKLQkJCV9jaGFuZ2VkRGVsdGEgPSBnZXREZWx0YShnZXRQcm9qZWN0KCksIGNoYW5nZWRSZXNvdXJjZXMpOwotCQkJCi0JCQkvLyBUaGVuIHJlc3RvcmUgdGhlIHByb2plY3QncyBidWlsZCBjb21tYW5kcyBiYWNrIHRvIHdoYXQgdGhleSB3ZXJlLgotCQkJYWRkQnVpbGRlcihnZXRQcm9qZWN0KCksIGZhbHNlKTsKLQotCQkJX2NoYW5nZWRDbGFzc2VzID0gZ2V0Q2hhbmdlZENsYXNzZXMoY2hhbmdlZFJlc291cmNlcyk7Ci0JCX0KLQkJY2F0Y2goVGhyb3dhYmxlIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIElSZXNvdXJjZURlbHRhIGdldENoYW5nZWREZWx0YSgpIHsKLQkJcmV0dXJuIF9jaGFuZ2VkRGVsdGE7Ci0JfQotCQotCXB1YmxpYyBJUmVzb3VyY2VEZWx0YSBnZXRFbXB0eURlbHRhKCkgewotCQlyZXR1cm4gX2VtcHR5RGVsdGE7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSVJlc291cmNlW10gZ2V0Q2hhbmdlZFJlc291cmNlcyhJUHJvamVjdCBwcm9qZWN0LCBWYWxpZGF0b3JUZXN0Y2FzZVtdIHRtZHMpIHsKLQkJU2V0IHRlbXAgPSBuZXcgSGFzaFNldCgpOwotCQlmb3IoaW50IGk9MDsgaTx0bWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlWYWxpZGF0b3JUZXN0Y2FzZSB0bWQgPSB0bWRzW2ldOwotCQkJSVJlc291cmNlW10gcmVzID0gdG1kLmdldFJlc291cmNlcyhwcm9qZWN0KTsKLQkJCWZvcihpbnQgaj0wOyBqPHJlcy5sZW5ndGg7IGorKykgewotCQkJCXRlbXAuYWRkKHJlc1tqXSk7Ci0JCQl9Ci0JCX0KLQkJSVJlc291cmNlW10gcmVzdWx0ID0gbmV3IElSZXNvdXJjZVt0ZW1wLnNpemUoKV07Ci0JCXRlbXAudG9BcnJheShyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgSmF2YUhlbHBlcnNbXSBnZXRDaGFuZ2VkQ2xhc3NlcyhJUmVzb3VyY2VbXSByZXNvdXJjZXMpIHsKLQkJaWYoX2NoYW5nZWRDbGFzc2VzID09IG51bGwpIHsKLQkJCWlmKHJlc291cmNlcyA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG5ldyBKYXZhSGVscGVyc1swXTsKLQkJCX0KLQkJCQotCQkJSmF2YUhlbHBlcnNbXSByZXN1bHQgPSBuZXcgSmF2YUhlbHBlcnNbcmVzb3VyY2VzLmxlbmd0aF07Ci0JCQlpbnQgY291bnQgPSAwOwotCQkJZm9yKGludCBpPTA7IGk8cmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VzW2ldOwotCQkJCWlmKChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKSAmJiAocmVzb3VyY2UuZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFscygiamF2YSIpIHx8IHJlc291cmNlLmdldEZpbGVFeHRlbnNpb24oKS5lcXVhbHMoImNsYXNzIikpKSB7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJCQkJSmF2YUhlbHBlcnMgaCA9IEpEVFV0aWxpdHkuZ2V0SmF2YUhlbHBlcnMoKElGaWxlKXJlc291cmNlKTsKLQkJCQkJaWYoaCAhPSBudWxsKSB7Ci0JCQkJCQlyZXN1bHRbY291bnQrK10gPSBoOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlpZihjb3VudCAhPSByZXNvdXJjZXMubGVuZ3RoKSB7Ci0JCQkJSmF2YUhlbHBlcnNbXSB0ZW1wID0gbmV3IEphdmFIZWxwZXJzW2NvdW50XTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KHJlc3VsdCwgMCwgdGVtcCwgMCwgY291bnQpOwotCQkJCXJldHVybiB0ZW1wOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gX2NoYW5nZWRDbGFzc2VzOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0RndrL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvZndrL1Rlc3RPcENvbnN0ck9wZXJhdGlvbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0RndrL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvZndrL1Rlc3RPcENvbnN0ck9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTkzZDM4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdEZ3ay9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2Z3ay9UZXN0T3BDb25zdHJPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxOSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuZndrOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5CVlRWYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuQlZUVmFsaWRhdGlvblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LklPcGVyYXRpb25SdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LlZhbGlkYXRpb25UeXBlRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmZ3ay52YWxpZGF0b3IuSkRUVXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnJlZ2lzdHJ5LlZhbGlkYXRvclRlc3RjYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwudXRpbC5CVlRSdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JQnVmZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkdsb2JhbENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuSW50ZXJuYWxWYWxpZGF0b3JNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlRhc2tMaXN0VXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0aW9uQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0b3JNZXRhRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkFsbFZhbGlkYXRvcnNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5FbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuRW5hYmxlZFZhbGlkYXRvcnNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5JUnVsZUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuT25lVmFsaWRhdG9yT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuVmFsaWRhdGlvbk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLlZhbGlkYXRvclN1YnNldE9wZXJhdGlvbjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHRlc3RzIGV2ZXJ5IGNvbnN0cnVjdG9yIGF2YWlsYWJsZSBpbiB0aGUgVmFsaWRhdGlvbk9wZXJhdGlvbgotICogaGllcmFyY2h5IGFuZCBlbnN1cmVzIHRoYXQgYW4gb3BlcmF0aW9uLCBjcmVhdGVkIHdpdGggdGhhdCBjb25zdHJ1Y3RvciwgCi0gKiByZXN1bHRzIGluIHRoZSBleHBlY3RlZCB2YWxpZGF0aW9uIElNYXJrZXJzLgotICovCi1wdWJsaWMgY2xhc3MgVGVzdE9wQ29uc3RyT3BlcmF0aW9uIGltcGxlbWVudHMgSU9wZXJhdGlvblJ1bm5hYmxlIHsKLQlwcml2YXRlIElQcm9qZWN0IF9wcm9qZWN0ID0gbnVsbDsKLQlwcml2YXRlIElCdWZmZXIgX2J1ZmZlciA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgX3Rlc3RDYXNlTmFtZSA9IG51bGw7Ci0JCi0JLyoqCi0JICogTXVzdCBoYXZlIGEgcHVibGljIGRlZmF1bHQgY29uc3RydWN0b3IgaW4gb3JkZXIgdG8gY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbi4KLQkgKiBNVVNUIGNhbGwgc2V0QnVmZmVyLCBzZXRQcm9qZWN0LCBhbmQgc2V0TmFtZSBiZWZvcmUgdXNpbmcgdGhlIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgVGVzdE9wQ29uc3RyT3BlcmF0aW9uKCkgewotCX0KLQkKLQkvKioKLQkgKiBJUHJvamVjdCBtdXN0IGV4aXN0IGFuZCBiZSBvcGVuLgotCSAqLwotCXB1YmxpYyBUZXN0T3BDb25zdHJPcGVyYXRpb24oSUJ1ZmZlciBidWZmZXIsIElQcm9qZWN0IHByb2plY3QsIFN0cmluZyB0ZXN0Q2FzZU5hbWUpIHsKLQkJc2V0QnVmZmVyKGJ1ZmZlcik7Ci0JCXNldFByb2plY3QocHJvamVjdCk7Ci0JCXNldE5hbWUodGVzdENhc2VOYW1lKTsKLQl9Ci0JCi0JcHVibGljIElCdWZmZXIgZ2V0QnVmZmVyKCkgewotCQlyZXR1cm4gX2J1ZmZlcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0QnVmZmVyKElCdWZmZXIgYikgewotCQlfYnVmZmVyID0gYjsKLQl9Ci0JCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCXJldHVybiBfcHJvamVjdDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UHJvamVjdChJUHJvamVjdCBwKSB7Ci0JCV9wcm9qZWN0ID0gcDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gX3Rlc3RDYXNlTmFtZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlfdGVzdENhc2VOYW1lID0gbmFtZTsKLQl9CQotCi0JcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJR2xvYmFsQ29uZmlndXJhdGlvbiBnY29uZiA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRHbG9iYWxDb25maWd1cmF0aW9uKCk7Ci0JCQlHbG9iYWxDb25maWd1cmF0aW9uIG9yaWdHY29uZiA9IG5ldyBHbG9iYWxDb25maWd1cmF0aW9uKGdjb25mKTsKLQkJCWJvb2xlYW4gYXV0b0J1aWxkRW5hYmxlZCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5pc0F1dG9CdWlsZGluZygpOwotCQkJdHJ5IHsKLQkJCQkvLyBJbiBvcmRlciBmb3IgdGhlIG9wZXJhdGlvbnMgdG8gd29yayBjb3JyZWN0bHksIHNldCB0aGUgZW5hYmxlZCB2YWxpZGF0b3JzIHRvCi0JCQkJLy8gdGhlIHZhbGlkYXRvcnMgZm9yIHdoaWNoIHRlc3RzIGV4aXN0LCBhbmQgdHVybiBvZmYgYXV0by1idWlsZCBzbyB0aGF0IGEKLQkJCQkvLyB2YWxpZGF0aW9uIGlzIGZvcmNlZC4KLQkJCQlnY29uZi5zZXRDYW5Qcm9qZWN0c092ZXJyaWRlKGZhbHNlKTsKLQkJCQkvL2djb25mLnNldEF1dG9WYWxpZGF0ZShmYWxzZSk7Ci0JCQkJLy9nY29uZi5zZXRBdXRvVmFsaWRhdGUodHJ1ZSk7Ci0JCQkJLy9nY29uZi5zZXRCdWlsZFZhbGlkYXRlKHRydWUpOwotCQkJCS8vZ2NvbmYuc2V0TWF4aW11bU51bWJlck9mTWVzc2FnZXMoV29ya2JlbmNoUmVwb3J0ZXIuTk9fTUVTU0FHRV9MSU1JVCk7Ci0JCQkJZ2NvbmYucGFzc2l2YXRlKCk7Ci0JCQkJCi0JCQkJSkRUVXRpbGl0eS5zZXRBdXRvQnVpbGQoZmFsc2UpOwotCQkJCQotCQkJCW1vbml0b3Iuc3ViVGFzaygiTG9hZGluZyBvcGVyYXRpb25zOyBwbGVhc2Ugd2FpdC4uLiIpOyAvLyROT04tTkxTLTEkCi0JCQkJVGVzdFdyYXBwZXJbXSB0ZXN0Q2FzZUFuZE9wZXJhdGlvbnMgPSBnZXRPcGVyYXRpb25zKG1vbml0b3IsIGdjb25mKTsKLQkJCQlpZih0ZXN0Q2FzZUFuZE9wZXJhdGlvbnMgPT0gbnVsbCkgewotCQkJCQlTdHJpbmcgbWVzc2FnZSA9ICJUZXN0IGNhc2UgZmFpbGVkOyBjYW5ub3QgdGVzdCBudWxsIG9wZXJhdGlvbnMuIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRCdWZmZXIoKS53cml0ZShtZXNzYWdlKTsKLQkJCQkJbW9uaXRvci5zdWJUYXNrKG1lc3NhZ2UpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQotCQkJCWludCBudW1QYXNzZWQgPSAwOwotCQkJCWZvcihpbnQgaT0wOyBpPHRlc3RDYXNlQW5kT3BlcmF0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlUZXN0V3JhcHBlciB0ZXN0V3JhcHBlciA9IHRlc3RDYXNlQW5kT3BlcmF0aW9uc1tpXTsKLQkJCQkJVmFsaWRhdGlvbk9wZXJhdGlvbiBvcGVyYXRpb24gPSB0ZXN0V3JhcHBlci5nZXRPcGVyYXRpb24oKTsKLQkJCQkJYm9vbGVhbiB0cGFzc2VkID0gZmFsc2U7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpZihtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQkJbW9uaXRvci5zdWJUYXNrKCJUZXN0aW5nICIgKyAoaSsxKSArICIgb2YgIiArIHRlc3RDYXNlQW5kT3BlcmF0aW9ucy5sZW5ndGggKyAiIGNvbnN0cnVjdG9ycy4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCXByZVRlc3QodGVzdFdyYXBwZXIpOwotCQkJCQkJaWYodGVzdChtb25pdG9yLCB0ZXN0V3JhcHBlcikpIHsKLQkJCQkJCQludW1QYXNzZWQrKzsKLQkJCQkJCQl0cGFzc2VkID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljYXRjaChUaHJvd2FibGUgZXhjKSB7Ci0JCQkJCQlnZXRCdWZmZXIoKS53cml0ZSgiVGhyb3dhYmxlIGNhdWdodCB3aGlsZSB0ZXN0aW5nICMiICsgKGkrMSkgKyAiICIgKyBvcGVyYXRpb24uZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWZpbmFsbHkgewotCQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSAiVGVzdCAjIiArIChpKzEpICsgIiBvZiAiICsgdGVzdENhc2VBbmRPcGVyYXRpb25zLmxlbmd0aCArICgodHBhc3NlZCkgPyAiIHBhc3NlZC4iIDogIiBmYWlsZWQuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJCQkJCW1vbml0b3Iuc3ViVGFzayhtZXNzYWdlKTsKLQkJCQkJCWdldEJ1ZmZlcigpLndyaXRlKG1lc3NhZ2UpOwotCQkJCQkJZ2V0QnVmZmVyKCkuYWRkRXhlY3V0aW9uU3RhdHVzKGdldE5hbWUoKSwgdGVzdFdyYXBwZXIuZ2V0TmFtZSgpLCB0cGFzc2VkKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCVN0cmluZyBzdGF0dXMgPSBudW1QYXNzZWQgKyAiIG9mICIgKyB0ZXN0Q2FzZUFuZE9wZXJhdGlvbnMubGVuZ3RoICsgIiB0ZXN0cyBwYXNzZWQuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJbW9uaXRvci5zdWJUYXNrKHN0YXR1cyk7Ci0JCQkJZ2V0QnVmZmVyKCkud3JpdGUoc3RhdHVzKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCS8vIFNldCB0aGUgcHJvamVjdCdzIHNldHRpbmdzIGJhY2sgdG8gd2hhdCB0aGV5IHdlcmUuCi0JCQkJZ2NvbmYgPSBvcmlnR2NvbmY7Ci0JCQkJZ2NvbmYucGFzc2l2YXRlKCk7Ci0JCQkJCi0JCQkJSkRUVXRpbGl0eS5zZXRBdXRvQnVpbGQoYXV0b0J1aWxkRW5hYmxlZCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2goSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJCWlmKGV4Yy5nZXRUYXJnZXRFeGNlcHRpb24oKSAhPSBudWxsKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yy5nZXRUYXJnZXRFeGNlcHRpb24oKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBwcmVUZXN0KFRlc3RXcmFwcGVyIHdyYXBwZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gRmlyc3QsIHJlbW92ZSBhbGwgb2YgdGhlIG1hcmtlcnMuIENhbid0IHJlbHkgb24gdGhlIG9wZXJhdGlvbiB0byByZW1vdmUgdGhlIG1hcmtlcnMgYmV0d2VlbgotCQkvLyBvbmUgaW52b2NhdGlvbiBhbmQgdGhlIG5leHQgYmVjYXVzZSBzb21ldGltZXMgdGhlIHZhbGlkYXRpb24gaXMgbm90IHN1cHBvc2VkIHRvIHJ1bi4KLQkJVGFza0xpc3RVdGlsaXR5LnJlbW92ZUFsbFRhc2tzKGdldFByb2plY3QoKSwgd3JhcHBlci5nZXRWYWxpZGF0b3JOYW1lcygpKTsgLy8gbnVsbD1kZWxldGUgbWFya2VycyBvbiBhbGwgb2JqZWN0cwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgdGVzdCBwYXNzZXMsIGFuZCBmYWxzZSBpZiBpdCBmYWlsZWQuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHRlc3QoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBUZXN0V3JhcHBlciB0ZXN0V3JhcHBlcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBCVlRSdW5uZXIuc2luZ2xldG9uKCkudGVzdChnZXRCdWZmZXIoKSwgZ2V0TmFtZSgpLCB0ZXN0V3JhcHBlci5nZXROYW1lKCksIHRlc3RXcmFwcGVyLmdldEV4cGVjdGVkTWVzc2FnZXMoKSwgdGVzdFdyYXBwZXIuZ2V0T3BlcmF0aW9uKCksIHRlc3RXcmFwcGVyLmdldFZhbGlkYXRvck5hbWVzKCkpICYmIHJlc3VsdDsKLQkJfQotCQljYXRjaChCVlRWYWxpZGF0aW9uRXhjZXB0aW9uIGV4YykgewotCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQlpZihleGMuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGV4Yy5nZXRUYXJnZXRFeGNlcHRpb24oKSwgZXhjLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5LCB3aXRoIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgYXJyYXkgdGhlIFZhbGlkYXRvclRlc3RjYXNlIHRoYXQgCi0JICogaG9sZHMgdGhlIGV4cGVjdGVkIHJlc3VsdHMsIGFuZCB0aGUgc2Vjb25kIGVudHJ5IG9mIHRoZSBhcnJheSBhIFZhbGlkYXRpb25PcGVyYXRpb25bXQotCSAqIGNvbnRhaW5pbmcgdGhlIG9wZXJhdGlvbnMgdG8gYmUgdGVzdGVkLgotCSAqLwotCXByaXZhdGUgVGVzdFdyYXBwZXJbXSBnZXRPcGVyYXRpb25zKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gdmNvbmYpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJVmFsaWRhdG9yVGVzdGNhc2VbXSBhbGxUbWRzID0gSkRUVXRpbGl0eS5nZXRWRlRlc3RzKG1vbml0b3IsIGdldFByb2plY3QoKSk7Ci0JCWlmKChhbGxUbWRzID09IG51bGwpIHx8IChhbGxUbWRzLmxlbmd0aCA9PSAwKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBTb21lIG9mIHRoZSBvcGVyYXRpb24gY29uc3RydWN0b3JzIHJlcXVpcmUgZmlsZSBleHRlbnNpb25zLiAKLQkJU3RyaW5nIGZpbGVFeHRlbnNpb24gPSAiLmphdmEiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBkZWZhdWx0RXh0ZW5zaW9uID0gbnVsbDsKLQkJSUZpbGUgamF2YUZpbGUgPSBnZXRQcm9qZWN0KCkuZ2V0RmlsZSgiZm9vLmphdmEiKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIFNvbWUgb2YgdGhlIG9wZXJhdGlvbnMgYmVsb3cgcGFzcyBpZiB0aGV5IGRvbid0IHByb2R1Y2UgYW55IHJlc3VsdHMuCi0JCS8vIENyZWF0ZSBhIHRlc3QgY2FzZSB0aGF0IHBhc3NlcyB0aGUgb3BlcmF0aW9uIGlmIHRoZSBvcGVyYXRpb24gZG9lcyBub3RoaW5nLgotCQlMaXN0IHRtZEVtcHR5ID0gbmV3IEFycmF5TGlzdCgpOyAvLyBleHBlY3RlZCBtZXNzYWdlcyA9PSBub25lCi0JCUxpc3QgdG1kSW5jID0gbmV3IEFycmF5TGlzdCgpOyAvLyBleHBlY3RlZCBtZXNzYWdlcyB3aGVuIGluY3JlbWVudGFsIHZhbGlkYXRvcnMgcmFuCi0JCUxpc3QgdG1kRW5hYmxlZCA9IG5ldyBBcnJheUxpc3QoKTsgLy8gZXhwZWN0ZWQgbWVzc2FnZXMgd2hlbiBlbmFibGVkIHZhbGlkYXRvcnMgcmFuCi0JCUxpc3QgdG1kSmF2YSA9IG5ldyBBcnJheUxpc3QoKTsgLy8gZXhwZWN0ZWQgbWVzc2FnZXMgd2hlbiB2YWxpZGF0b3JzIHRoYXQgdmFsaWRhdGUgLmphdmEgZmlsZXMgYXJlIHJ1bgotCQlMaXN0IHRtZEZ1bGwgPSBuZXcgQXJyYXlMaXN0KCk7IC8vIGV4cGVjdGVkIG1lc3NhZ2VzIHdoZW4gdmFsaWRhdG9ycyB0aGF0IHN1cHBvcnQgb25seSAiUnVuIFZhbGlkYXRpb24iIGFyZSBydW4KLQkJU2V0IGVuYWJsZWRWYWxpZGF0b3JzID0gbmV3IEhhc2hTZXQoKTsgLy8gZW5hYmxlZCB2YWxpZGF0b3JzID09IEZXSyBWYWwsIEZXSyBOb0J1aWxkIFZhbCwgUHJvcGVydGllcyBWYWwKLQkJU2V0IGVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnMgPSBuZXcgSGFzaFNldCgpOyAvLyBlbmFibGVkIGluY3JlbWVudGFsID09IEZXSyBWYWwsIFByb3BlcnRpZXMgVmFsIChzdXBwb3J0IGluY3JlbWVudGFsIHZhbGlkYXRpb24pCi0JCVNldCBqYXZhVmFsaWRhdG9ycyA9IG5ldyBIYXNoU2V0KCk7IC8vIGphdmEgdmFsID09IEZXSyBWYWwsIEZXSyBOb0J1aWxkIFZhbCAodmFsaWRhdGUgLmphdmEgZmlsZXMpCi0JCVNldCBmdWxsVmFsaWRhdG9ycyA9IG5ldyBIYXNoU2V0KCk7IC8vIGZ1bGwgdmFsID09IEZXSyBOb0J1aWxkIFZhbCAocnVucyBvbmx5IHdoZW4gIlJ1biBWYWxpZGF0aW9uIiBjbGlja2VkKQotCQlWYWxpZGF0b3JNZXRhRGF0YVtdIGVuYWJsZWRWbWQgPSBuZXcgVmFsaWRhdG9yTWV0YURhdGFbYWxsVG1kcy5sZW5ndGhdOwotCQlmb3IoaW50IGk9MDsgaTxhbGxUbWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlWYWxpZGF0b3JUZXN0Y2FzZSB2dCA9IGFsbFRtZHNbaV07Ci0JCQkKLQkJCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IHZ0LmdldFZhbGlkYXRvck1ldGFEYXRhKCk7Ci0JCQllbmFibGVkVmFsaWRhdG9ycy5hZGQodm1kKTsKLQkJCWVuYWJsZWRWbWRbaV0gPSB2bWQ7Ci0JCQlpZih2bWQuaXNJbmNyZW1lbnRhbCgpKSB7Ci0JCQkJZW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9ycy5hZGQodm1kKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWZ1bGxWYWxpZGF0b3JzLmFkZCh2bWQpOwotCQkJCXRtZEZ1bGwuYWRkQWxsKHZ0LmdldE1lc3NhZ2VzKFZhbGlkYXRpb25UeXBlRW51bS5SVU5fVkFMSURBVElPTikpOwotCQkJfQotCQkJCi0JCQkvLyBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNvZGUgdGhhdCBpbnN0YW50aWF0ZXMgdGhlIFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbgotCQkJLy8gdG8gZW5zdXJlIHRoYXQgd2hlbiBhbiBhcnJheSBvZiBjaGFuZ2VkIHJlc291cmNlcyBvciBvYmplY3RzIGlzIHBhc3NlZCB0byB0aGUgb3BlcmF0aW9uLAotCQkJLy8gdGhhdCBvbmx5IGluY3JlbWVudGFsIHZhbGlkYXRvcnMgYXJlIGludm9rZWQgYnkgdGhlIG9wZXJhdGlvbi4gVGhlIGZyYW1ld29yayBkb2VzIG5vdAotCQkJLy8gY2hlY2sgaWYgdGhlIHZhbGlkYXRvcnMgYXJlIGluY3JlbWVudGFsIG9yIG5vdDsgaW5zdGVhZCwgdGhlIG5hbWVkIHZhbGlkYXRvcnMgd2lsbCBydW4sCi0JCQkvLyBldmVuIGlmIHRoZXkgcGVyZm9ybSBhIGZ1bGwgdmFsaWRhdGlvbiBpbnN0ZWFkIG9mIHZhbGlkYXRpbmcganVzdCB0aGUgYXJyYXlzLgotCQkJaWYodm1kLmlzQXBwbGljYWJsZVRvKGphdmFGaWxlKSAmJiB2bWQuaXNJbmNyZW1lbnRhbCgpKSB7Ci0JCQkJamF2YVZhbGlkYXRvcnMuYWRkKHZtZCk7Ci0JCQkJdG1kSmF2YS5hZGRBbGwodnQuZ2V0TWVzc2FnZXMoVmFsaWRhdGlvblR5cGVFbnVtLklOQ1JFTUVOVEFMX1ZBTElEQVRJT04pKTsKLQkJCX0KLQkJCQotCQkJdG1kRW5hYmxlZC5hZGRBbGwodnQuZ2V0TWVzc2FnZXMoVmFsaWRhdGlvblR5cGVFbnVtLlJVTl9WQUxJREFUSU9OKSk7Ci0JCQl0bWRJbmMuYWRkQWxsKHZ0LmdldE1lc3NhZ2VzKFZhbGlkYXRpb25UeXBlRW51bS5JTkNSRU1FTlRBTF9WQUxJREFUSU9OKSk7CQkJCi0JCX0KLQkJU3RyaW5nW10gYWxsVmFsaWRhdG9yTmFtZXMgPSBJbnRlcm5hbFZhbGlkYXRvck1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldFZhbGlkYXRvck5hbWVzKGVuYWJsZWRWYWxpZGF0b3JzKTsKLQkJU3RyaW5nW10gaW5jVmFsaWRhdG9yTmFtZXMgPSBJbnRlcm5hbFZhbGlkYXRvck1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldFZhbGlkYXRvck5hbWVzKGVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnMpOwotCQlTdHJpbmdbXSBqYXZhVmFsaWRhdG9yTmFtZXMgPSBJbnRlcm5hbFZhbGlkYXRvck1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldFZhbGlkYXRvck5hbWVzKGphdmFWYWxpZGF0b3JzKTsKLQkJU3RyaW5nW10gZnVsbFZhbGlkYXRvck5hbWVzID0gSW50ZXJuYWxWYWxpZGF0b3JNYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRWYWxpZGF0b3JOYW1lcyhmdWxsVmFsaWRhdG9ycyk7Ci0JCQotCQl2Y29uZi5zZXRFbmFibGVkVmFsaWRhdG9ycyhlbmFibGVkVm1kKTsKLQkJdmNvbmYucGFzc2l2YXRlKCk7Ci0JCQotCQkvLyBTdGFydCBjb25zdHJ1Y3RpbmcgdGhlIHRlc3RzCi0JCS8vIEZvciB0aGUgdGVzdHMgdGhhdCBkZXBlbmQgb24gdGhlIHZhbHVlIG9mIHRoZSBhdXRvQnVpbGQgc2V0dGluZywgaXQgaXMgYXNzdW1lZCB0aGF0Ci0JCS8vIGF1dG9CdWlsZCBpcyBvbi4gVGhlIHRlc3RzIHdpbGwgZmFpbCBpZiBhdXRvQnVpbGQgaXMgZGlzYWJsZWQuCi0JCS8vCi0JCS8vIFVubGlrZSB0aGUgc3Vic2VxdWVudCBvcGVyYXRpb25zLCB0aGVzZSBmaXJzdCB0d28gY2Fubm90IHVzZSB0aGUgYWxsVG1kcyBUTUQgYmVjYXVzZQotCQkvLyBtb3JlIHRoYW4gb25lIHZhbGlkYXRvciBydW5zLiBUaGUgYWxsVG1kRnVsbCBUTUQgY29udGFpbnMgYWxsIHRtZCBvZiB2YWxpZGF0b3JzIHRoYXQKLQkJLy8gd2lsbCBydW4uIAotCQlBbGxWYWxpZGF0b3JzT3BlcmF0aW9uIG9wMSA9IG5ldyBBbGxWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSk7Ci0JCVRlc3RXcmFwcGVyIHRlc3QxID0gbmV3IFRlc3RXcmFwcGVyKG9wMSwgdG1kRW5hYmxlZCwgIm9wMSIsIGFsbFZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJQWxsVmFsaWRhdG9yc09wZXJhdGlvbiBvcDIgPSBuZXcgQWxsVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIGZhbHNlKTsgLy8gZG9uJ3QgZm9yawotCQlUZXN0V3JhcHBlciB0ZXN0MiA9IG5ldyBUZXN0V3JhcHBlcihvcDIsIHRtZEVuYWJsZWQsICJvcDIiLCBhbGxWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBDb25zdHJ1Y3QgdGhlIGlucHV0IGZvciB0aGUgcmVzdCBvZiB0aGUgb3BlcmF0aW9ucyB1c2luZyB0aGUgVkYgVGVzdCB2YWxpZGF0b3JzLgotCQlUZXN0T3BDb25zdHJJbnB1dE9wZXJhdGlvbiBpbnB1dE9wID0gbmV3IFRlc3RPcENvbnN0cklucHV0T3BlcmF0aW9uKGdldEJ1ZmZlcigpLCBnZXRQcm9qZWN0KCkpOwotCQl0cnkgewotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bihpbnB1dE9wLCBtb25pdG9yKTsKLQkJfQotCQljYXRjaChUaHJvd2FibGUgZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCX0KLQkJCXJldHVybiBuZXcgVGVzdFdyYXBwZXJbMF07Ci0JCX0KLQkJCi0JCUlSZXNvdXJjZVtdIGNoYW5nZWRSZXNvdXJjZXMgPSBUZXN0T3BDb25zdHJJbnB1dE9wZXJhdGlvbi5nZXRDaGFuZ2VkUmVzb3VyY2VzKGdldFByb2plY3QoKSwgYWxsVG1kcyk7Ci0JCUlSZXNvdXJjZVtdIGVtcHR5UmVzb3VyY2VzID0gVGVzdE9wQ29uc3RySW5wdXRPcGVyYXRpb24uZ2V0RW1wdHlSZXNvdXJjZXMoZ2V0UHJvamVjdCgpKTsKLQkJSmF2YUhlbHBlcnNbXSBjaGFuZ2VkQ2xhc3NlcyA9IGlucHV0T3AuZ2V0Q2hhbmdlZENsYXNzZXMoY2hhbmdlZFJlc291cmNlcyk7Ci0JCUlSZXNvdXJjZURlbHRhIGVtcHR5RGVsdGEgPSBpbnB1dE9wLmdldEVtcHR5RGVsdGEoKTsKLQkJSVJlc291cmNlRGVsdGEgY2hhbmdlZERlbHRhID0gaW5wdXRPcC5nZXRDaGFuZ2VkRGVsdGEoKTsKLQkJLy8gZW5kIGNvbnN0cnVjdCBpbnB1dAotCi0JCUVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24gb3AzID0gbmV3IEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBudWxsLHRydWUpOwotCQlUZXN0V3JhcHBlciB0ZXN0MyA9IG5ldyBUZXN0V3JhcHBlcihvcDMsIHRtZEluYywgIm9wMyIsIGluY1ZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbiBvcDQgPSBuZXcgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIGNoYW5nZWREZWx0YSxmYWxzZSk7Ci0JCVRlc3RXcmFwcGVyIHRlc3Q0ID0gbmV3IFRlc3RXcmFwcGVyKG9wNCwgdG1kSW5jLCAib3A0IiwgaW5jVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uIG9wNSA9IG5ldyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSwgZW1wdHlEZWx0YSxmYWxzZSk7Ci0JCVRlc3RXcmFwcGVyIHRlc3Q1ID0gbmV3IFRlc3RXcmFwcGVyKG9wNSwgdG1kRW1wdHksICJvcDUiLCBpbmNWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24gb3A2ID0gbmV3IEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBudWxsLCBJUnVsZUdyb3VwLlBBU1NfRkFTVCxmYWxzZSk7Ci0JCVRlc3RXcmFwcGVyIHRlc3Q2ID0gbmV3IFRlc3RXcmFwcGVyKG9wNiwgdG1kSW5jLCAib3A2IiwgaW5jVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uIG9wNyA9IG5ldyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSwgY2hhbmdlZERlbHRhLCBJUnVsZUdyb3VwLlBBU1NfRkFTVCxmYWxzZSk7Ci0JCVRlc3RXcmFwcGVyIHRlc3Q3ID0gbmV3IFRlc3RXcmFwcGVyKG9wNywgdG1kSW5jLCAib3A3IiwgaW5jVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uIG9wOCA9IG5ldyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSwgZW1wdHlEZWx0YSwgSVJ1bGVHcm91cC5QQVNTX0ZBU1QsZmFsc2UpOwotCQlUZXN0V3JhcHBlciB0ZXN0OCA9IG5ldyBUZXN0V3JhcHBlcihvcDgsIHRtZEVtcHR5LCAib3A4IiwgaW5jVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uIG9wOSA9IG5ldyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSwgZW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9ycywgbnVsbCwgSVJ1bGVHcm91cC5QQVNTX0ZBU1QpOwotCQlUZXN0V3JhcHBlciB0ZXN0OSA9IG5ldyBUZXN0V3JhcHBlcihvcDksIHRtZEluYywgIm9wOSIsIGluY1ZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbiBvcDEwID0gbmV3IEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBlbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzLCBjaGFuZ2VkRGVsdGEsIElSdWxlR3JvdXAuUEFTU19GQVNUKTsKLQkJVGVzdFdyYXBwZXIgdGVzdDEwID0gbmV3IFRlc3RXcmFwcGVyKG9wMTAsIHRtZEluYywgIm9wMTAiLCBpbmNWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24gb3AxMSA9IG5ldyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSwgZW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9ycywgZW1wdHlEZWx0YSwgSVJ1bGVHcm91cC5QQVNTX0ZBU1QpOwotCQlUZXN0V3JhcHBlciB0ZXN0MTEgPSBuZXcgVGVzdFdyYXBwZXIob3AxMSwgdG1kRW1wdHksICJvcDExIiwgaW5jVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uIG9wMTIgPSBuZXcgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIG51bGwsIGZhbHNlKTsgLy8gZnVsbCB2YWxpZGF0ZSwgZG9uJ3QgZm9yawotCQlUZXN0V3JhcHBlciB0ZXN0MTIgPSBuZXcgVGVzdFdyYXBwZXIob3AxMiwgdG1kSW5jLCAib3AxMiIsIGluY1ZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbiBvcDEzID0gbmV3IEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBjaGFuZ2VkRGVsdGEsIGZhbHNlKTsgLy8gZGVsdGEgdmFsaWRhdGUsIGRvbid0IGZvcmsKLQkJVGVzdFdyYXBwZXIgdGVzdDEzID0gbmV3IFRlc3RXcmFwcGVyKG9wMTMsIHRtZEluYywgIm9wMTMiLCBpbmNWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24gb3AxNCA9IG5ldyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSwgZW1wdHlEZWx0YSwgZmFsc2UpOyAvLyBlbXB0eSBkZWx0YSB2YWxpZGF0ZSwgZG9uJ3QgZm9yawotCQlUZXN0V3JhcHBlciB0ZXN0MTQgPSBuZXcgVGVzdFdyYXBwZXIob3AxNCwgdG1kRW1wdHksICJvcDE0IiwgaW5jVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uIG9wMTUgPSBuZXcgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIG51bGwsIElSdWxlR3JvdXAuUEFTU19GQVNULCBmYWxzZSk7IC8vIGZ1bGwgdmFsaWRhdGUsIGRvbid0IGZvcmsKLQkJVGVzdFdyYXBwZXIgdGVzdDE1ID0gbmV3IFRlc3RXcmFwcGVyKG9wMTUsIHRtZEluYywgIm9wMTUiLCBpbmNWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24gb3AxNiA9IG5ldyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSwgY2hhbmdlZERlbHRhLCBJUnVsZUdyb3VwLlBBU1NfRkFTVCwgZmFsc2UpOyAvLyBkZWx0YSB2YWxpZGF0ZSwgZG9uJ3QgZm9yawotCQlUZXN0V3JhcHBlciB0ZXN0MTYgPSBuZXcgVGVzdFdyYXBwZXIob3AxNiwgdG1kSW5jLCAib3AxNiIsIGluY1ZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbiBvcDE3ID0gbmV3IEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBlbXB0eURlbHRhLCBJUnVsZUdyb3VwLlBBU1NfRkFTVCwgZmFsc2UpOyAvLyBlbXB0eSBkZWx0YSB2YWxpZGF0ZSwgZG9uJ3QgZm9yawotCQlUZXN0V3JhcHBlciB0ZXN0MTcgPSBuZXcgVGVzdFdyYXBwZXIob3AxNywgdG1kRW1wdHksICJvcDE3IiwgaW5jVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlFbmFibGVkVmFsaWRhdG9yc09wZXJhdGlvbiBvcDE4ID0gbmV3IEVuYWJsZWRWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSk7Ci0JCVRlc3RXcmFwcGVyIHRlc3QxOD0gbmV3IFRlc3RXcmFwcGVyKG9wMTgsIHRtZEVuYWJsZWQsICJvcDE4IiwgYWxsVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlFbmFibGVkVmFsaWRhdG9yc09wZXJhdGlvbiBvcDE5ID0gbmV3IEVuYWJsZWRWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSwgZmFsc2UpOyAvLyBkb24ndCBmb3JrCi0JCVRlc3RXcmFwcGVyIHRlc3QxOSA9IG5ldyBUZXN0V3JhcHBlcihvcDE5LCB0bWRFbmFibGVkLCAib3AxOSIsIGFsbFZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJRW5hYmxlZFZhbGlkYXRvcnNPcGVyYXRpb24gb3AyMCA9IG5ldyBFbmFibGVkVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIElSdWxlR3JvdXAuUEFTU19GQVNUKTsKLQkJVGVzdFdyYXBwZXIgdGVzdDIwID0gbmV3IFRlc3RXcmFwcGVyKG9wMjAsIHRtZEVuYWJsZWQsICJvcDIwIiwgYWxsVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlFbmFibGVkVmFsaWRhdG9yc09wZXJhdGlvbiBvcDIxID0gbmV3IEVuYWJsZWRWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSwgSVJ1bGVHcm91cC5QQVNTX0ZBU1QsIHRydWUsZmFsc2UpOyAvLyBmb3JjZSB2YWxpZGF0aW9uIGlmIGl0IGRvZXNuJ3QgbmVlZCB0byBydW4KLQkJVGVzdFdyYXBwZXIgdGVzdDIxID0gbmV3IFRlc3RXcmFwcGVyKG9wMjEsIHRtZEVuYWJsZWQsICJvcDIxIiwgYWxsVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlFbmFibGVkVmFsaWRhdG9yc09wZXJhdGlvbiBvcDIyID0gbmV3IEVuYWJsZWRWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSwgSVJ1bGVHcm91cC5QQVNTX0ZBU1QsIGZhbHNlLGZhbHNlKTsgLy8gbm8gZm9yY2UgdmFsaWRhdGlvbiBpZiBpdCBkb2Vzbid0IG5lZWQgdG8gcnVuCi0JCVRlc3RXcmFwcGVyIHRlc3QyMiA9IG5ldyBUZXN0V3JhcHBlcihvcDIyLCB0bWRFbmFibGVkLCAib3AyMiIsIGFsbFZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJRW5hYmxlZFZhbGlkYXRvcnNPcGVyYXRpb24gb3AyMyA9IG5ldyBFbmFibGVkVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIElSdWxlR3JvdXAuUEFTU19GQVNULCB0cnVlLCBmYWxzZSk7IC8vIGZvcmNlLCBkb24ndCBmb3JrCi0JCVRlc3RXcmFwcGVyIHRlc3QyMyA9IG5ldyBUZXN0V3JhcHBlcihvcDIzLCB0bWRFbmFibGVkLCAib3AyMyIsIGFsbFZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJRW5hYmxlZFZhbGlkYXRvcnNPcGVyYXRpb24gb3AyNCA9IG5ldyBFbmFibGVkVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIElSdWxlR3JvdXAuUEFTU19GQVNULCBmYWxzZSwgZmFsc2UpOyAvLyBubyBmb3JjZSwgZG9uJ3QgZm9yawotCQlUZXN0V3JhcHBlciB0ZXN0MjQgPSBuZXcgVGVzdFdyYXBwZXIob3AyNCwgdG1kRW5hYmxlZCwgIm9wMjQiLCBhbGxWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUVuYWJsZWRWYWxpZGF0b3JzT3BlcmF0aW9uIG9wMjUgPSBuZXcgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIG51bGwsdHJ1ZSk7IAotCQlUZXN0V3JhcHBlciB0ZXN0MjUgPSBuZXcgVGVzdFdyYXBwZXIob3AyNSwgdG1kRW5hYmxlZCwgIm9wMjUiLCBhbGxWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUVuYWJsZWRWYWxpZGF0b3JzT3BlcmF0aW9uIG9wMjYgPSBuZXcgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIGNoYW5nZWREZWx0YSx0cnVlKTsKLQkJVGVzdFdyYXBwZXIgdGVzdDI2ID0gbmV3IFRlc3RXcmFwcGVyKG9wMjYsIHRtZEluYywgIm9wMjYiLCBpbmNWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUVuYWJsZWRWYWxpZGF0b3JzT3BlcmF0aW9uIG9wMjcgPSBuZXcgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIGVtcHR5RGVsdGEsdHJ1ZSk7Ci0JCVRlc3RXcmFwcGVyIHRlc3QyNyA9IG5ldyBUZXN0V3JhcHBlcihvcDI3LCB0bWRFbXB0eSwgIm9wMjciLCBpbmNWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUVuYWJsZWRWYWxpZGF0b3JzT3BlcmF0aW9uIG9wMjggPSBuZXcgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIG51bGwsIElSdWxlR3JvdXAuUEFTU19GQVNULHRydWUpOwotCQlUZXN0V3JhcHBlciB0ZXN0MjggPSBuZXcgVGVzdFdyYXBwZXIob3AyOCwgdG1kRW5hYmxlZCwgIm9wMjgiLCBhbGxWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUVuYWJsZWRWYWxpZGF0b3JzT3BlcmF0aW9uIG9wMjkgPSBuZXcgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIGNoYW5nZWREZWx0YSwgSVJ1bGVHcm91cC5QQVNTX0ZBU1QsdHJ1ZSk7Ci0JCVRlc3RXcmFwcGVyIHRlc3QyOSA9IG5ldyBUZXN0V3JhcHBlcihvcDI5LCB0bWRJbmMsICJvcDI5IiwgaW5jVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlFbmFibGVkVmFsaWRhdG9yc09wZXJhdGlvbiBvcDMwID0gbmV3IEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBlbXB0eURlbHRhLCBJUnVsZUdyb3VwLlBBU1NfRkFTVCx0cnVlKTsgCi0JCVRlc3RXcmFwcGVyIHRlc3QzMCA9IG5ldyBUZXN0V3JhcHBlcihvcDMwLCB0bWRFbXB0eSwgIm9wMzAiLCBpbmNWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQotCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSBhbGxUbWRzWzBdLmdldFZhbGlkYXRvck1ldGFEYXRhKCk7Ci0JCVN0cmluZyB2YWxpZGF0b3JOYW1lID0gdm1kLmdldFZhbGlkYXRvclVuaXF1ZU5hbWUoKTsKLQkJU3RyaW5nW10gdm1kTmFtZXMgPSBJbnRlcm5hbFZhbGlkYXRvck1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldFZhbGlkYXRvck5hbWVzKG5ldyBWYWxpZGF0b3JNZXRhRGF0YVtde3ZtZH0pOwotCQlMaXN0IGV4cGVjdGVkTWVzc2FnZXMgPSBhbGxUbWRzWzBdLmdldE1lc3NhZ2VzKFZhbGlkYXRpb25UeXBlRW51bS5SVU5fVkFMSURBVElPTik7Ci0JCU9uZVZhbGlkYXRvck9wZXJhdGlvbiBvcDMxID0gbmV3IE9uZVZhbGlkYXRvck9wZXJhdGlvbihnZXRQcm9qZWN0KCksIHZhbGlkYXRvck5hbWUpOwotCQlUZXN0V3JhcHBlciB0ZXN0MzEgPSBuZXcgVGVzdFdyYXBwZXIob3AzMSwgZXhwZWN0ZWRNZXNzYWdlcywgIm9wMzEiLCB2bWROYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCU9uZVZhbGlkYXRvck9wZXJhdGlvbiBvcDMyID0gbmV3IE9uZVZhbGlkYXRvck9wZXJhdGlvbihnZXRQcm9qZWN0KCksIHZhbGlkYXRvck5hbWUsIHRydWUpOyAvLyBmb3JjZSBpZiBuZWNlc3NhcnkKLQkJVGVzdFdyYXBwZXIgdGVzdDMyID0gbmV3IFRlc3RXcmFwcGVyKG9wMzIsIGV4cGVjdGVkTWVzc2FnZXMsICJvcDMyIiwgdm1kTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlPbmVWYWxpZGF0b3JPcGVyYXRpb24gb3AzMyA9IG5ldyBPbmVWYWxpZGF0b3JPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCB2YWxpZGF0b3JOYW1lLCBmYWxzZSk7IC8vIG5vIGZvcmNlCi0JCVRlc3RXcmFwcGVyIHRlc3QzMyA9IG5ldyBUZXN0V3JhcHBlcihvcDMzLCBleHBlY3RlZE1lc3NhZ2VzLCAib3AzMyIsIHZtZE5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJT25lVmFsaWRhdG9yT3BlcmF0aW9uIG9wMzQgPSBuZXcgT25lVmFsaWRhdG9yT3BlcmF0aW9uKGdldFByb2plY3QoKSwgdmFsaWRhdG9yTmFtZSwgdHJ1ZSwgZmFsc2UpOyAvLyBmb3JjZSwgbm8gZm9yawotCQlUZXN0V3JhcHBlciB0ZXN0MzQgPSBuZXcgVGVzdFdyYXBwZXIob3AzNCwgZXhwZWN0ZWRNZXNzYWdlcywgIm9wMzQiLCB2bWROYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCU9uZVZhbGlkYXRvck9wZXJhdGlvbiBvcDM1ID0gbmV3IE9uZVZhbGlkYXRvck9wZXJhdGlvbihnZXRQcm9qZWN0KCksIHZhbGlkYXRvck5hbWUsIGZhbHNlLCBmYWxzZSk7IC8vIG5vIGZvcmNlLCBubyBmb3JrCi0JCVRlc3RXcmFwcGVyIHRlc3QzNSA9IG5ldyBUZXN0V3JhcHBlcihvcDM1LCBleHBlY3RlZE1lc3NhZ2VzLCAib3AzNSIsIHZtZE5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJT25lVmFsaWRhdG9yT3BlcmF0aW9uIG9wMzYgPSBuZXcgT25lVmFsaWRhdG9yT3BlcmF0aW9uKGdldFByb2plY3QoKSwgdmFsaWRhdG9yTmFtZSwgdHJ1ZSwgSVJ1bGVHcm91cC5QQVNTX0ZBU1QpOyAvLyBmb3JjZQotCQlUZXN0V3JhcHBlciB0ZXN0MzYgPSBuZXcgVGVzdFdyYXBwZXIob3AzNiwgZXhwZWN0ZWRNZXNzYWdlcywgIm9wMzYiLCB2bWROYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCU9uZVZhbGlkYXRvck9wZXJhdGlvbiBvcDM3ID0gbmV3IE9uZVZhbGlkYXRvck9wZXJhdGlvbihnZXRQcm9qZWN0KCksIHZhbGlkYXRvck5hbWUsIGZhbHNlLCBJUnVsZUdyb3VwLlBBU1NfRkFTVCk7IC8vIG5vIGZvcmNlCi0JCVRlc3RXcmFwcGVyIHRlc3QzNyA9IG5ldyBUZXN0V3JhcHBlcihvcDM3LCBleHBlY3RlZE1lc3NhZ2VzLCAib3AzNyIsIHZtZE5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJT25lVmFsaWRhdG9yT3BlcmF0aW9uIG9wMzggPSBuZXcgT25lVmFsaWRhdG9yT3BlcmF0aW9uKGdldFByb2plY3QoKSwgdmFsaWRhdG9yTmFtZSwgdHJ1ZSwgSVJ1bGVHcm91cC5QQVNTX0ZBU1QsIGZhbHNlKTsgLy8gZm9yY2UsIG5vIGZvcmsKLQkJVGVzdFdyYXBwZXIgdGVzdDM4ID0gbmV3IFRlc3RXcmFwcGVyKG9wMzgsIGV4cGVjdGVkTWVzc2FnZXMsICJvcDM4Iiwgdm1kTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlPbmVWYWxpZGF0b3JPcGVyYXRpb24gb3AzOSA9IG5ldyBPbmVWYWxpZGF0b3JPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCB2YWxpZGF0b3JOYW1lLCBmYWxzZSwgSVJ1bGVHcm91cC5QQVNTX0ZBU1QsIGZhbHNlKTsgLy8gbm8gZm9yY2UsIG5vIGZvcmsKLQkJVGVzdFdyYXBwZXIgdGVzdDM5ID0gbmV3IFRlc3RXcmFwcGVyKG9wMzksIGV4cGVjdGVkTWVzc2FnZXMsICJvcDM5Iiwgdm1kTmFtZXMpOyAvLyROT04tTkxTLTEkCi0KLQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG9wNDAgPSBuZXcgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKGdldFByb2plY3QoKSx0cnVlLGZhbHNlKTsKLQkJb3A0MC5zZXRWYWxpZGF0b3JzKGFsbFZhbGlkYXRvck5hbWVzKTsKLQkJVGVzdFdyYXBwZXIgdGVzdDQwID0gbmV3IFRlc3RXcmFwcGVyKG9wNDAsIHRtZEVuYWJsZWQsICJvcDQwIiwgYWxsVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gb3A0MSA9IG5ldyBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCB0cnVlLGZhbHNlKTsgLy8gZm9yY2UKLQkJb3A0MS5zZXRWYWxpZGF0b3JzKGFsbFZhbGlkYXRvck5hbWVzKTsKLQkJVGVzdFdyYXBwZXIgdGVzdDQxID0gbmV3IFRlc3RXcmFwcGVyKG9wNDEsIHRtZEVuYWJsZWQsICJvcDQxIiwgYWxsVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gb3A0MiA9IG5ldyBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBmYWxzZSxmYWxzZSk7IC8vIG5vIGZvcmNlCi0JCW9wNDIuc2V0VmFsaWRhdG9ycyhhbGxWYWxpZGF0b3JOYW1lcyk7Ci0JCVRlc3RXcmFwcGVyIHRlc3Q0MiA9IG5ldyBUZXN0V3JhcHBlcihvcDQyLCB0bWRFbmFibGVkLCAib3A0MiIsIGFsbFZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG9wNDMgPSBuZXcgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKGdldFByb2plY3QoKSwgdHJ1ZSwgZmFsc2UpOyAvLyBmb3JjZSwgbm8gZm9yawotCQlvcDQzLnNldFZhbGlkYXRvcnMoYWxsVmFsaWRhdG9yTmFtZXMpOwotCQlUZXN0V3JhcHBlciB0ZXN0NDMgPSBuZXcgVGVzdFdyYXBwZXIob3A0MywgdG1kRW5hYmxlZCwgIm9wNDMiLCBhbGxWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBvcDQ0ID0gbmV3IFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbihnZXRQcm9qZWN0KCksIGZhbHNlLCBmYWxzZSk7IC8vIG5vIGZvcmNlLCBubyBmb3JrCi0JCW9wNDQuc2V0VmFsaWRhdG9ycyhhbGxWYWxpZGF0b3JOYW1lcyk7Ci0JCVRlc3RXcmFwcGVyIHRlc3Q0NCA9IG5ldyBUZXN0V3JhcHBlcihvcDQ0LCB0bWRFbmFibGVkLCAib3A0NCIsIGFsbFZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG9wNDUgPSBuZXcgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKGdldFByb2plY3QoKSwgdHJ1ZSwgSVJ1bGVHcm91cC5QQVNTX0ZBU1QsZmFsc2UpOyAvLyBmb3JjZQotCQlvcDQ1LnNldFZhbGlkYXRvcnMoYWxsVmFsaWRhdG9yTmFtZXMpOwotCQlUZXN0V3JhcHBlciB0ZXN0NDUgPSBuZXcgVGVzdFdyYXBwZXIob3A0NSwgdG1kRW5hYmxlZCwgIm9wNDUiLCBhbGxWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBvcDQ2ID0gbmV3IFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbihnZXRQcm9qZWN0KCksIGZhbHNlLCBJUnVsZUdyb3VwLlBBU1NfRkFTVCxmYWxzZSk7IC8vIG5vIGZvcmNlCi0JCW9wNDYuc2V0VmFsaWRhdG9ycyhhbGxWYWxpZGF0b3JOYW1lcyk7Ci0JCVRlc3RXcmFwcGVyIHRlc3Q0NiA9IG5ldyBUZXN0V3JhcHBlcihvcDQ2LCB0bWRFbmFibGVkLCAib3A0NiIsIGFsbFZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG9wNDcgPSBuZXcgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKGdldFByb2plY3QoKSwgdHJ1ZSwgSVJ1bGVHcm91cC5QQVNTX0ZBU1QsIGZhbHNlKTsgLy8gZm9yY2UsIG5vIGZvcmsKLQkJb3A0Ny5zZXRWYWxpZGF0b3JzKGFsbFZhbGlkYXRvck5hbWVzKTsKLQkJVGVzdFdyYXBwZXIgdGVzdDQ3ID0gbmV3IFRlc3RXcmFwcGVyKG9wNDcsIHRtZEVuYWJsZWQsICJvcDQ3IiwgYWxsVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gb3A0OCA9IG5ldyBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBmYWxzZSwgSVJ1bGVHcm91cC5QQVNTX0ZBU1QsIGZhbHNlKTsgLy8gbm8gZm9yY2UsIG5vIGZvcmsKLQkJb3A0OC5zZXRWYWxpZGF0b3JzKGFsbFZhbGlkYXRvck5hbWVzKTsKLQkJVGVzdFdyYXBwZXIgdGVzdDQ4ID0gbmV3IFRlc3RXcmFwcGVyKG9wNDgsIHRtZEVuYWJsZWQsICJvcDQ4IiwgYWxsVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gb3A0OSA9IG5ldyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSwgbnVsbCxmYWxzZSk7Ci0JCW9wNDkuc2V0VmFsaWRhdG9ycyhhbGxWYWxpZGF0b3JOYW1lcyk7Ci0JCVRlc3RXcmFwcGVyIHRlc3Q0OSA9IG5ldyBUZXN0V3JhcHBlcihvcDQ5LCB0bWRFbmFibGVkLCAib3A0OSIsIGFsbFZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG9wNTAgPSBuZXcgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIGNoYW5nZWREZWx0YSxmYWxzZSk7Ci0JCW9wNTAuc2V0VmFsaWRhdG9ycyhpbmNWYWxpZGF0b3JOYW1lcyk7Ci0JCVRlc3RXcmFwcGVyIHRlc3Q1MCA9IG5ldyBUZXN0V3JhcHBlcihvcDUwLCB0bWRJbmMsICJvcDUwIiwgaW5jVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gb3A1MSA9IG5ldyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSwgZW1wdHlEZWx0YSxmYWxzZSk7Ci0JCW9wNTEuc2V0VmFsaWRhdG9ycyhpbmNWYWxpZGF0b3JOYW1lcyk7Ci0JCVRlc3RXcmFwcGVyIHRlc3Q1MSA9IG5ldyBUZXN0V3JhcHBlcihvcDUxLCB0bWRFbXB0eSwgIm9wNTEiLCBpbmNWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBvcDUyID0gbmV3IEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBudWxsLCBmYWxzZSk7IC8vIGZhbHNlPWF1dG9CdWlsZCBkaXNhYmxlZAotCQlvcDUyLnNldFZhbGlkYXRvcnMoYWxsVmFsaWRhdG9yTmFtZXMpOwotCQlUZXN0V3JhcHBlciB0ZXN0NTIgPSBuZXcgVGVzdFdyYXBwZXIob3A1MiwgdG1kRW5hYmxlZCwgIm9wNTIiLCBhbGxWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBvcDUzID0gbmV3IEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBudWxsLCB0cnVlKTsgLy8gdHJ1ZT1hdXRvQnVpbGQgZW5hYmxlZAotCQlvcDUzLnNldFZhbGlkYXRvcnMoZnVsbFZhbGlkYXRvck5hbWVzKTsKLQkJVGVzdFdyYXBwZXIgdGVzdDUzID0gbmV3IFRlc3RXcmFwcGVyKG9wNTMsIHRtZEZ1bGwsICJvcDUzIiwgZnVsbFZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG9wNTQgPSBuZXcgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIGNoYW5nZWREZWx0YSwgZmFsc2UpOyAvLyBmYWxzZT1hdXRvQnVpbGQgZGlzYWJsZWQKLQkJb3A1NC5zZXRWYWxpZGF0b3JzKGluY1ZhbGlkYXRvck5hbWVzKTsKLQkJVGVzdFdyYXBwZXIgdGVzdDU0ID0gbmV3IFRlc3RXcmFwcGVyKG9wNTQsIHRtZEluYywgIm9wNTQiLCBpbmNWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBvcDU1ID0gbmV3IEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBjaGFuZ2VkRGVsdGEsIHRydWUpOyAvLyB0cnVlPWF1dG9CdWlsZCBlbmFibGVkCi0JCW9wNTUuc2V0VmFsaWRhdG9ycyhpbmNWYWxpZGF0b3JOYW1lcyk7Ci0JCVRlc3RXcmFwcGVyIHRlc3Q1NSA9IG5ldyBUZXN0V3JhcHBlcihvcDU1LCB0bWRFbXB0eSwgIm9wNTUiLCBpbmNWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBvcDU2ID0gbmV3IEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBlbXB0eURlbHRhLCBmYWxzZSk7IC8vIGZhbHNlPWF1dG9CdWlsZCBkaXNhYmxlZAotCQlvcDU2LnNldFZhbGlkYXRvcnMoaW5jVmFsaWRhdG9yTmFtZXMpOwotCQlUZXN0V3JhcHBlciB0ZXN0NTYgPSBuZXcgVGVzdFdyYXBwZXIob3A1NiwgdG1kRW1wdHksICJvcDU2IiwgaW5jVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gb3A1NyA9IG5ldyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSwgZW1wdHlEZWx0YSwgdHJ1ZSk7IC8vIHRydWU9YXV0b0J1aWxkIGVuYWJsZWQKLQkJb3A1Ny5zZXRWYWxpZGF0b3JzKGluY1ZhbGlkYXRvck5hbWVzKTsKLQkJVGVzdFdyYXBwZXIgdGVzdDU3ID0gbmV3IFRlc3RXcmFwcGVyKG9wNTcsIHRtZEVtcHR5LCAib3A1NyIsIGluY1ZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG9wNTggPSBuZXcgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksbnVsbCwgSVJ1bGVHcm91cC5QQVNTX0ZBU1QsZmFsc2UpOyAvLyBmYWxzZT1hdXRvQnVpbGQgZGlzYWJsZWQKLQkJb3A1OC5zZXRWYWxpZGF0b3JzKGFsbFZhbGlkYXRvck5hbWVzKTsKLQkJVGVzdFdyYXBwZXIgdGVzdDU4ID0gbmV3IFRlc3RXcmFwcGVyKG9wNTgsIHRtZEVuYWJsZWQsICJvcDU4IiwgYWxsVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gb3A1OSA9IG5ldyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSwgbnVsbCwgSVJ1bGVHcm91cC5QQVNTX0ZBU1QsZmFsc2UpOyAvLyB0cnVlPWF1dG9CdWlsZCBlbmFibGVkCi0JCW9wNTkuc2V0VmFsaWRhdG9ycyhhbGxWYWxpZGF0b3JOYW1lcyk7Ci0JCVRlc3RXcmFwcGVyIHRlc3Q1OSA9IG5ldyBUZXN0V3JhcHBlcihvcDU5LCB0bWRGdWxsLCAib3A1OSIsIGFsbFZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG9wNjAgPSBuZXcgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIGNoYW5nZWREZWx0YSwgSVJ1bGVHcm91cC5QQVNTX0ZBU1QsZmFsc2UpOyAvLyBmYWxzZT1hdXRvQnVpbGQgZGlzYWJsZWQKLQkJb3A2MC5zZXRWYWxpZGF0b3JzKGluY1ZhbGlkYXRvck5hbWVzKTsKLQkJVGVzdFdyYXBwZXIgdGVzdDYwID0gbmV3IFRlc3RXcmFwcGVyKG9wNjAsIHRtZEluYywgIm9wNjAiLCBpbmNWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBvcDYxID0gbmV3IEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBjaGFuZ2VkRGVsdGEsIElSdWxlR3JvdXAuUEFTU19GQVNULGZhbHNlKTsgLy8gdHJ1ZT1hdXRvQnVpbGQgZW5hYmxlZAotCQlvcDYxLnNldFZhbGlkYXRvcnMoaW5jVmFsaWRhdG9yTmFtZXMpOwotCQlUZXN0V3JhcHBlciB0ZXN0NjEgPSBuZXcgVGVzdFdyYXBwZXIob3A2MSwgdG1kRW1wdHksICJvcDYxIiwgaW5jVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gb3A2MiA9IG5ldyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSwgZW1wdHlEZWx0YSxJUnVsZUdyb3VwLlBBU1NfRkFTVCxmYWxzZSk7IC8vIGZhbHNlPWF1dG9CdWlsZCBkaXNhYmxlZAotCQlvcDYyLnNldFZhbGlkYXRvcnMoaW5jVmFsaWRhdG9yTmFtZXMpOwotCQlUZXN0V3JhcHBlciB0ZXN0NjIgPSBuZXcgVGVzdFdyYXBwZXIob3A2MiwgdG1kRW1wdHksICJvcDYyIiwgaW5jVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gb3A2MyA9IG5ldyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSwgZW1wdHlEZWx0YSxJUnVsZUdyb3VwLlBBU1NfRkFTVCx0cnVlKTsgLy8gdHJ1ZT1hdXRvQnVpbGQgZW5hYmxlZAotCQlvcDYzLnNldFZhbGlkYXRvcnMoaW5jVmFsaWRhdG9yTmFtZXMpOwotCQlUZXN0V3JhcHBlciB0ZXN0NjMgPSBuZXcgVGVzdFdyYXBwZXIob3A2MywgdG1kRW1wdHksICJvcDYzIiwgaW5jVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gb3A2NCA9IG5ldyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSxudWxsLElSdWxlR3JvdXAuUEFTU19GQVNULHRydWUpOwotCQlvcDY0LnNldFZhbGlkYXRvcnMoYWxsVmFsaWRhdG9yTmFtZXMpOwotCQlUZXN0V3JhcHBlciB0ZXN0NjQgPSBuZXcgVGVzdFdyYXBwZXIob3A2NCwgdG1kRW5hYmxlZCwgIm9wNjQiLCBhbGxWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBvcDY1ID0gbmV3IEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBjaGFuZ2VkRGVsdGEsIElSdWxlR3JvdXAuUEFTU19GQVNULHRydWUpOwotCQlvcDY1LnNldFZhbGlkYXRvcnMoaW5jVmFsaWRhdG9yTmFtZXMpOwotCQlUZXN0V3JhcHBlciB0ZXN0NjUgPSBuZXcgVGVzdFdyYXBwZXIob3A2NSwgdG1kSW5jLCAib3A2NSIsIGluY1ZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG9wNjYgPSBuZXcgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIGVtcHR5RGVsdGEsIElSdWxlR3JvdXAuUEFTU19GQVNULHRydWUpOwotCQlvcDY2LnNldFZhbGlkYXRvcnMoaW5jVmFsaWRhdG9yTmFtZXMpOwotCQlUZXN0V3JhcHBlciB0ZXN0NjYgPSBuZXcgVGVzdFdyYXBwZXIob3A2NiwgdG1kRW1wdHksICJvcDY2IiwgaW5jVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0KLQkJaWYoY2hhbmdlZENsYXNzZXMgIT0gbnVsbCkgewotCQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG9wNjcgPSBuZXcgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKGdldFByb2plY3QoKSwgZmlsZUV4dGVuc2lvbiwgY2hhbmdlZFJlc291cmNlcyxmYWxzZSk7Ci0JCQlvcDY3LnNldFZhbGlkYXRvcnMoamF2YVZhbGlkYXRvck5hbWVzKTsKLQkJCVRlc3RXcmFwcGVyIHRlc3Q2NyA9IG5ldyBUZXN0V3JhcHBlcihvcDY3LCB0bWRKYXZhLCAib3A2NyIsIGphdmFWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG9wNjggPSBuZXcgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKGdldFByb2plY3QoKSwgZmlsZUV4dGVuc2lvbiwgY2hhbmdlZFJlc291cmNlcywgZmFsc2UpOyAvLyBubyBmb3JrCi0JCQlvcDY4LnNldFZhbGlkYXRvcnMoamF2YVZhbGlkYXRvck5hbWVzKTsKLQkJCVRlc3RXcmFwcGVyIHRlc3Q2OCA9IG5ldyBUZXN0V3JhcHBlcihvcDY4LCB0bWRKYXZhLCAib3A2OCIsIGphdmFWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG9wNjkgPSBuZXcgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKGdldFByb2plY3QoKSwgZmlsZUV4dGVuc2lvbiwgZGVmYXVsdEV4dGVuc2lvbiwgY2hhbmdlZFJlc291cmNlcyxmYWxzZSk7Ci0JCQlvcDY5LnNldFZhbGlkYXRvcnMoamF2YVZhbGlkYXRvck5hbWVzKTsKLQkJCVRlc3RXcmFwcGVyIHRlc3Q2OSA9IG5ldyBUZXN0V3JhcHBlcihvcDY5LCB0bWRKYXZhLCAib3A2OSIsIGphdmFWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG9wNzAgPSBuZXcgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKGdldFByb2plY3QoKSwgZmlsZUV4dGVuc2lvbiwgZGVmYXVsdEV4dGVuc2lvbiwgY2hhbmdlZFJlc291cmNlcywgZmFsc2UpOyAvLyBubyBmb3JrCi0JCQlvcDcwLnNldFZhbGlkYXRvcnMoamF2YVZhbGlkYXRvck5hbWVzKTsKLQkJCVRlc3RXcmFwcGVyIHRlc3Q3MCA9IG5ldyBUZXN0V3JhcHBlcihvcDcwLCB0bWRKYXZhLCAib3A3MCIsIGphdmFWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG9wNzEgPSBuZXcgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKGdldFByb2plY3QoKSwgZmlsZUV4dGVuc2lvbiwgZW1wdHlSZXNvdXJjZXMsZmFsc2UpOwotCQkJb3A3MS5zZXRWYWxpZGF0b3JzKGphdmFWYWxpZGF0b3JOYW1lcyk7Ci0JCQlUZXN0V3JhcHBlciB0ZXN0NzEgPSBuZXcgVGVzdFdyYXBwZXIob3A3MSwgdG1kRW1wdHksICJvcDcxIiwgamF2YVZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gb3A3MiA9IG5ldyBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBmaWxlRXh0ZW5zaW9uLCBlbXB0eVJlc291cmNlcywgZmFsc2UpOyAvLyBubyBmb3JrCi0JCQlvcDcyLnNldFZhbGlkYXRvcnMoamF2YVZhbGlkYXRvck5hbWVzKTsKLQkJCVRlc3RXcmFwcGVyIHRlc3Q3MiA9IG5ldyBUZXN0V3JhcHBlcihvcDcyLCB0bWRFbXB0eSwgIm9wNzIiLCBqYXZhVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBvcDczID0gbmV3IFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbihnZXRQcm9qZWN0KCksIGZpbGVFeHRlbnNpb24sIGRlZmF1bHRFeHRlbnNpb24sIGVtcHR5UmVzb3VyY2VzLGZhbHNlKTsKLQkJCW9wNzMuc2V0VmFsaWRhdG9ycyhqYXZhVmFsaWRhdG9yTmFtZXMpOwotCQkJVGVzdFdyYXBwZXIgdGVzdDczID0gbmV3IFRlc3RXcmFwcGVyKG9wNzMsIHRtZEVtcHR5LCAib3A3MyIsIGphdmFWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG9wNzQgPSBuZXcgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKGdldFByb2plY3QoKSwgZmlsZUV4dGVuc2lvbiwgZGVmYXVsdEV4dGVuc2lvbiwgZW1wdHlSZXNvdXJjZXMsIGZhbHNlKTsgLy8gbm8gZm9yawotCQkJb3A3NC5zZXRWYWxpZGF0b3JzKGphdmFWYWxpZGF0b3JOYW1lcyk7Ci0JCQlUZXN0V3JhcHBlciB0ZXN0NzQgPSBuZXcgVGVzdFdyYXBwZXIob3A3NCwgdG1kRW1wdHksICJvcDc0IiwgamF2YVZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gb3A3NSA9IG5ldyBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBmaWxlRXh0ZW5zaW9uLCBjaGFuZ2VkQ2xhc3NlcyxmYWxzZSk7Ci0JCQlvcDc1LnNldFZhbGlkYXRvcnMoamF2YVZhbGlkYXRvck5hbWVzKTsKLQkJCVRlc3RXcmFwcGVyIHRlc3Q3NSA9IG5ldyBUZXN0V3JhcHBlcihvcDc1LCB0bWRKYXZhLCAib3A3NSIsIGphdmFWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG9wNzYgPSBuZXcgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKGdldFByb2plY3QoKSwgZmlsZUV4dGVuc2lvbiwgY2hhbmdlZENsYXNzZXMsIGZhbHNlKTsgLy8gbm8gZm9yawotCQkJb3A3Ni5zZXRWYWxpZGF0b3JzKGphdmFWYWxpZGF0b3JOYW1lcyk7Ci0JCQlUZXN0V3JhcHBlciB0ZXN0NzYgPSBuZXcgVGVzdFdyYXBwZXIob3A3NiwgdG1kSmF2YSwgIm9wNzYiLCBqYXZhVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBvcDc3ID0gbmV3IFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbihnZXRQcm9qZWN0KCksIGZpbGVFeHRlbnNpb24sIGRlZmF1bHRFeHRlbnNpb24sIGNoYW5nZWRDbGFzc2VzLGZhbHNlKTsKLQkJCW9wNzcuc2V0VmFsaWRhdG9ycyhqYXZhVmFsaWRhdG9yTmFtZXMpOwotCQkJVGVzdFdyYXBwZXIgdGVzdDc3ID0gbmV3IFRlc3RXcmFwcGVyKG9wNzcsIHRtZEphdmEsICJvcDc3IiwgamF2YVZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gb3A3OCA9IG5ldyBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBmaWxlRXh0ZW5zaW9uLCBkZWZhdWx0RXh0ZW5zaW9uLCBjaGFuZ2VkQ2xhc3NlcywgZmFsc2UpOyAvLyBubyBmb3JrCi0JCQlvcDc4LnNldFZhbGlkYXRvcnMoamF2YVZhbGlkYXRvck5hbWVzKTsKLQkJCVRlc3RXcmFwcGVyIHRlc3Q3OCA9IG5ldyBUZXN0V3JhcHBlcihvcDc4LCB0bWRKYXZhLCAib3A3OCIsIGphdmFWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJVGVzdFdyYXBwZXJbXSByZXN1bHQgPSBuZXcgVGVzdFdyYXBwZXJbXSB7Ci0JCQkJdGVzdDEsIHRlc3QyLCB0ZXN0MywgdGVzdDQsIHRlc3Q1LCB0ZXN0NiwgdGVzdDcsIHRlc3Q4LCB0ZXN0OSwKLQkJCQl0ZXN0MTAsIHRlc3QxMSwgdGVzdDEyLCB0ZXN0MTMsIHRlc3QxNCwgdGVzdDE1LCB0ZXN0MTYsIHRlc3QxNywgdGVzdDE4LCB0ZXN0MTksCi0JCQkJdGVzdDIwLCB0ZXN0MjEsIHRlc3QyMiwgdGVzdDIzLCB0ZXN0MjQsIHRlc3QyNSwgdGVzdDI2LCB0ZXN0MjcsIHRlc3QyOCwgdGVzdDI5LAotCQkJCXRlc3QzMCwgdGVzdDMxLCB0ZXN0MzIsIHRlc3QzMywgdGVzdDM0LCB0ZXN0MzUsIHRlc3QzNiwgdGVzdDM3LCB0ZXN0MzgsIHRlc3QzOSwKLQkJCQl0ZXN0NDAsIHRlc3Q0MSwgdGVzdDQyLCB0ZXN0NDMsIHRlc3Q0NCwgdGVzdDQ1LCB0ZXN0NDYsIHRlc3Q0NywgdGVzdDQ4LCB0ZXN0NDksCi0JCQkJdGVzdDUwLCB0ZXN0NTEsIHRlc3Q1MiwgdGVzdDUzLCB0ZXN0NTQsIHRlc3Q1NSwgdGVzdDU2LCB0ZXN0NTcsIHRlc3Q1OCwgdGVzdDU5LAotCQkJCXRlc3Q2MCwgdGVzdDYxLCB0ZXN0NjIsIHRlc3Q2MywgdGVzdDY0LCB0ZXN0NjUsIHRlc3Q2NiwgdGVzdDY3LCB0ZXN0NjgsIHRlc3Q2OSwKLQkJCQl0ZXN0NzAsIHRlc3Q3MSwgdGVzdDcyLCB0ZXN0NzMsIHRlc3Q3NCwgdGVzdDc1LCB0ZXN0NzYsIHRlc3Q3NywgdGVzdDc4Ci0JCQl9OwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQllbHNlIHsKLQkJCVRlc3RXcmFwcGVyW10gcmVzdWx0ID0gbmV3IFRlc3RXcmFwcGVyW10gewotCQkJCXRlc3QxLCB0ZXN0MiwgdGVzdDMsIHRlc3Q0LCB0ZXN0NSwgdGVzdDYsIHRlc3Q3LCB0ZXN0OCwgdGVzdDksCi0JCQkJdGVzdDEwLCB0ZXN0MTEsIHRlc3QxMiwgdGVzdDEzLCB0ZXN0MTQsIHRlc3QxNSwgdGVzdDE2LCB0ZXN0MTcsIHRlc3QxOCwgdGVzdDE5LAotCQkJCXRlc3QyMCwgdGVzdDIxLCB0ZXN0MjIsIHRlc3QyMywgdGVzdDI0LCB0ZXN0MjUsIHRlc3QyNiwgdGVzdDI3LCB0ZXN0MjgsIHRlc3QyOSwKLQkJCQl0ZXN0MzAsIHRlc3QzMSwgdGVzdDMyLCB0ZXN0MzMsIHRlc3QzNCwgdGVzdDM1LCB0ZXN0MzYsIHRlc3QzNywgdGVzdDM4LCB0ZXN0MzksCi0JCQkJdGVzdDQwLCB0ZXN0NDEsIHRlc3Q0MiwgdGVzdDQzLCB0ZXN0NDQsIHRlc3Q0NSwgdGVzdDQ2LCB0ZXN0NDcsIHRlc3Q0OCwgdGVzdDQ5LAotCQkJCXRlc3Q1MCwgdGVzdDUxLCB0ZXN0NTIsIHRlc3Q1MywgdGVzdDU0LCB0ZXN0NTUsIHRlc3Q1NiwgdGVzdDU3LCB0ZXN0NTgsIHRlc3Q1OSwKLQkJCQl0ZXN0NjAsIHRlc3Q2MSwgdGVzdDYyLCB0ZXN0NjMsIHRlc3Q2NCwgdGVzdDY1LCB0ZXN0NjYKLQkJCX07Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9CQkKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFRlc3RXcmFwcGVyIHsKLQkJcHJpdmF0ZSBMaXN0IF9tZXNzYWdlcyA9IG51bGw7Ci0JCXByaXZhdGUgVmFsaWRhdGlvbk9wZXJhdGlvbiBfb3BlcmF0aW9uID0gbnVsbDsKLQkJcHJpdmF0ZSBTdHJpbmcgX3Rlc3ROYW1lID0gbnVsbDsKLQkJcHJpdmF0ZSBTdHJpbmdbXSBfdmFsaWRhdG9yTmFtZXMgPSBudWxsOwotCQkKLQkJVGVzdFdyYXBwZXIoVmFsaWRhdGlvbk9wZXJhdGlvbiBvcCwgTGlzdCBleHBlY3RlZE1lc3NhZ2VzLCBTdHJpbmcgdGVzdE5hbWUsIFN0cmluZ1tdIHZhbGlkYXRvck5hbWVzKSB7Ci0JCQlfbWVzc2FnZXMgPSBleHBlY3RlZE1lc3NhZ2VzOwotCQkJX29wZXJhdGlvbiA9IG9wOwotCQkJX3Rlc3ROYW1lID0gdGVzdE5hbWU7Ci0JCQlfdmFsaWRhdG9yTmFtZXMgPSB2YWxpZGF0b3JOYW1lczsKLQkJfQotCQkKLQkJcHVibGljIExpc3QgZ2V0RXhwZWN0ZWRNZXNzYWdlcygpIHsKLQkJCXJldHVybiBfbWVzc2FnZXM7Ci0JCX0KLQkJCi0JCXB1YmxpYyBWYWxpZGF0aW9uT3BlcmF0aW9uIGdldE9wZXJhdGlvbigpIHsKLQkJCXJldHVybiBfb3BlcmF0aW9uOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gX3Rlc3ROYW1lOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nW10gZ2V0VmFsaWRhdG9yTmFtZXMoKSB7Ci0JCQlyZXR1cm4gX3ZhbGlkYXRvck5hbWVzOwotCQl9Ci0JfQotfQotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3RGd2svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9md2svVkFMRldLMDJPcGVyYXRpb24uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdEZ3ay9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2Z3ay9WQUxGV0swMk9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2UxMmIyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdEZ3ay9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2Z3ay9WQUxGV0swMk9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzExICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5md2s7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5CVlRWYWxpZGF0aW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuSU9wZXJhdGlvblJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuVmFsaWRhdGlvblR5cGVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuZndrLnZhbGlkYXRvci5KRFRVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwucmVnaXN0cnkuVmFsaWRhdG9yVGVzdGNhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC51dGlsLkJWVFJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuQ29uZmlndXJhdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuR2xvYmFsQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5Qcm9qZWN0Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5UYXNrTGlzdFV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRvck1ldGFEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuRW5hYmxlZFZhbGlkYXRvcnNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5WYWxpZGF0b3JNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnBsdWdpbi5WYWxpZGF0aW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBydW5zIHRoZSBWQUxGV0swMiB0ZXN0LgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVkFMRldLMDJPcGVyYXRpb24gaW1wbGVtZW50cyBJT3BlcmF0aW9uUnVubmFibGUgewotCXByaXZhdGUgSVByb2plY3QgX3Byb2plY3QgPSBudWxsOwotCXByaXZhdGUgSUJ1ZmZlciBfYnVmZmVyID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBfdGVzdENhc2VOYW1lID0gbnVsbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBORVdMSU5FID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogTXVzdCBoYXZlIGEgcHVibGljIGRlZmF1bHQgY29uc3RydWN0b3IgaW4gb3JkZXIgdG8gY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbi4KLQkgKiBNVVNUIGNhbGwgc2V0QnVmZmVyLCBzZXRQcm9qZWN0LCBhbmQgc2V0TmFtZSBiZWZvcmUgdXNpbmcgdGhlIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgVkFMRldLMDJPcGVyYXRpb24oKSB7Ci0JfQotCQotCS8qKgotCSAqIElQcm9qZWN0IG11c3QgZXhpc3QgYW5kIGJlIG9wZW4uCi0JICovCi0JcHVibGljIFZBTEZXSzAyT3BlcmF0aW9uKElCdWZmZXIgYnVmZmVyLCBJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgdGVzdENhc2VOYW1lKSB7Ci0JCXNldFByb2plY3QocHJvamVjdCk7Ci0JCXNldEJ1ZmZlcihidWZmZXIpOwotCQlzZXROYW1lKHRlc3RDYXNlTmFtZSk7Ci0JfQotCi0JcHVibGljIElCdWZmZXIgZ2V0QnVmZmVyKCkgeyAKLQkJcmV0dXJuIF9idWZmZXI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEJ1ZmZlcihJQnVmZmVyIGIpIHsKLQkJX2J1ZmZlciA9IGI7Ci0JfQotCQotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gX3Byb2plY3Q7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFByb2plY3QoSVByb2plY3QgcCkgewotCQlfcHJvamVjdCA9IHA7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gX3Rlc3RDYXNlTmFtZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlfdGVzdENhc2VOYW1lID0gbmFtZTsKLQl9CQotCi0JcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwotCQlpZihwcm9qZWN0ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJ1biBWQUxGV0swMiBvbiBhbiBleGlzdGluZyBvcGVuIElQcm9qZWN0LiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCS8vIEZpcnN0LCBhZGQgdGhlIFZhbGlkYXRpb25CdWlsZGVyIHRvIHRoZSBKYXZhIFByb2plY3QKLQkJVmFsaWRhdG9yTWFuYWdlci5hZGRQcm9qZWN0QnVpbGRWYWxpZGF0aW9uU3VwcG9ydChwcm9qZWN0KTsKLQotCQkvLyBTYXZlIHRoZSBvbGQgdXNlciBjb25maWd1cmF0aW9uIGFuZCByZXN0b3JlIGl0IGluIHRoZSBmaW5hbGx5IGJsb2NrLgotCQl0cnkgewotCQkJR2xvYmFsQ29uZmlndXJhdGlvbiBnY29uZiA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRHbG9iYWxDb25maWd1cmF0aW9uKCk7Ci0JCQlQcm9qZWN0Q29uZmlndXJhdGlvbiBwY29uZiA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRQcm9qZWN0Q29uZmlndXJhdGlvbihwcm9qZWN0KTsKLQkJCUdsb2JhbENvbmZpZ3VyYXRpb24gb3JpZ0djb25mID0gbmV3IEdsb2JhbENvbmZpZ3VyYXRpb24oZ2NvbmYpOyAvLyBjb3B5IHRoZSBvcmlnaW5hbCB2YWx1ZXMgc28gdGhhdCB0aGV5IGNhbiBiZSByZXN0b3JlZCBpbiB0aGUgZmluYWxseSBibG9jawotCQkJUHJvamVjdENvbmZpZ3VyYXRpb24gb3JpZ1Bjb25mID0gbmV3IFByb2plY3RDb25maWd1cmF0aW9uKHBjb25mKTsgLy8gY29weSB0aGUgb3JpZ2luYWwgdmFsdXNlIHNvIHRoYXQgdGhleSBjYW4gYmUgcmVzdG9yZWQgaW4gdGhlIGZpbmFsbHkgYmxvY2sKLQkJCUxldmVsIGxldmVsID0gVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKS5nZXRMZXZlbCgpOwotCQkJYm9vbGVhbiBhdXRvQnVpbGRFbmFibGVkID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmlzQXV0b0J1aWxkaW5nKCk7Ci0JCQkJCi0JCQlWYWxpZGF0b3JNZXRhRGF0YVtdIGNvbmZpZ3VyZWRWYWxpZGF0b3JzID0gcGNvbmYuZ2V0VmFsaWRhdG9ycygpOwotCQkJaWYoY29uZmlndXJlZFZhbGlkYXRvcnMubGVuZ3RoIDwgMikgewotCQkJCW1vbml0b3Iuc3ViVGFzaygiUnVuIFZBTEZXSzAyIG9uIGFuIGV4aXN0aW5nIG9wZW4gcHJvamVjdCB0aGF0IGhhcyBhdCBsZWFzdCB0d28gdmFsaWRhdG9ycyBjb25maWd1cmVkOiBvbmUgdG8gZW5hYmxlLCBhbmQgb25lIHRvIGRpc2FibGUuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCS8vIERpc2FibGUgYXQgbGVhc3Qgb25lIHZhbGlkYXRvciBmb3IgdGhpcyB0ZXN0LgotCQkJLy8gUmVtb3ZlIHRoZSBmaXJzdCBlbmFibGVkIHZhbGlkYXRvciBmcm9tIHRoZSBQcm9wZXJ0aWVzLCBhbmQgdGhlIHNlY29uZCBlbmFibGVkIHZhbGlkYXRvciBmcm9tIHRoZQotCQkJLy8gUHJlZmVyZW5jZXMuIChJdCBkb2Vzbid0IG1hdHRlciB3aGljaCB2YWxpZGF0b3IgaXMgcmVtb3ZlZDsgaXQgb25seSBtYXR0ZXJzIHRoYXQgdGhlIFByb3BlcnRpZXMgYW5kCi0JCQkvLyB0aGUgUHJlZmVyZW5jZXMgaGF2ZSBkaWZmZXJlbnQgdmFsaWRhdG9ycy4pCi0JCQlWYWxpZGF0b3JNZXRhRGF0YSB2ZlRlc3RWYWxpZGF0b3IgPSBWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkuZ2V0VmFsaWRhdG9yTWV0YURhdGEoVGVzdE9wQ29uc3RySW5wdXRPcGVyYXRpb24uRldLX05PQlVJTERfVEVTVF9WQUxJREFUT1JfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCQlWYWxpZGF0b3JNZXRhRGF0YSB2Zk5vQnVpbGRUZXN0VmFsaWRhdG9yID0gVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmdldFZhbGlkYXRvck1ldGFEYXRhKFRlc3RPcENvbnN0cklucHV0T3BlcmF0aW9uLkZXS19URVNUX1ZBTElEQVRPUl9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJCVZhbGlkYXRvck1ldGFEYXRhIHByb3BlcnRpZXNWYWxpZGF0b3IgPSBWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkuZ2V0VmFsaWRhdG9yTWV0YURhdGEoVGVzdE9wQ29uc3RySW5wdXRPcGVyYXRpb24uUFJPUEVSVElFU19WQUxJREFUT1JfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCQlWYWxpZGF0b3JNZXRhRGF0YVtdIGVuYWJsZWRQcm9wVmFsaWRhdG9ycyA9IG5ldyBWYWxpZGF0b3JNZXRhRGF0YVsyXTsKLQkJCWVuYWJsZWRQcm9wVmFsaWRhdG9yc1swXSA9IHZmVGVzdFZhbGlkYXRvcjsKLQkJCWVuYWJsZWRQcm9wVmFsaWRhdG9yc1sxXSA9IHZmTm9CdWlsZFRlc3RWYWxpZGF0b3I7Ci0JCQlwY29uZi5zZXRFbmFibGVkVmFsaWRhdG9ycyhlbmFibGVkUHJvcFZhbGlkYXRvcnMpOwotCQkJLy9wY29uZi5zZXRNYXhpbXVtTnVtYmVyT2ZNZXNzYWdlcygxKTsKLQkJCXBjb25mLnBhc3NpdmF0ZSgpOwotCi0JCQlWYWxpZGF0b3JNZXRhRGF0YVtdIGVuYWJsZWRQcmVmVmFsaWRhdG9ycyA9IG5ldyBWYWxpZGF0b3JNZXRhRGF0YVsxXTsKLQkJCWVuYWJsZWRQcmVmVmFsaWRhdG9yc1swXSA9IHByb3BlcnRpZXNWYWxpZGF0b3I7Ci0JCQlnY29uZi5zZXRFbmFibGVkVmFsaWRhdG9ycyhlbmFibGVkUHJlZlZhbGlkYXRvcnMpOwotCQkJLy9nY29uZi5zZXRNYXhpbXVtTnVtYmVyT2ZNZXNzYWdlcygxMCk7Ci0JCQlnY29uZi5wYXNzaXZhdGUoKTsKLQkJCQotCQkJCi0JCQlWYWxpZGF0b3JUZXN0Y2FzZVtdIHRtZHMgPSBKRFRVdGlsaXR5LmdldFZGVGVzdHMobW9uaXRvciwgZ2V0UHJvamVjdCgpKTsKLQkJCWlmKCh0bWRzID09IG51bGwpIHx8ICh0bWRzLmxlbmd0aCA9PSAwKSkgewotCQkJCW1vbml0b3Iuc3ViVGFzaygiQ2Fubm90IHJ1biBWQUxGV0swMiBiZWNhdXNlIHRoZXJlIGFyZSBubyB0ZXN0IGNhc2VzIHJlZ2lzdGVyZWQgZm9yIEphdmFQcm9qZWN0LiIpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQlWYWxpZGF0b3JUZXN0Y2FzZSBmd2tOb2J1aWxkVGVzdFRNRCA9IG51bGw7Ci0JCQlWYWxpZGF0b3JUZXN0Y2FzZSBmd2tUZXN0VE1EID0gbnVsbDsKLQkJCVZhbGlkYXRvclRlc3RjYXNlIHByb3BUTUQgPSBudWxsOwotCQkJZm9yKGludCBpPTA7IGk8dG1kcy5sZW5ndGg7IGkrKykgewotCQkJCVZhbGlkYXRvclRlc3RjYXNlIHRtZCA9IHRtZHNbaV07Ci0JCQkJaWYodG1kLmdldFZhbGlkYXRvckNsYXNzKCkuZXF1YWxzKFRlc3RPcENvbnN0cklucHV0T3BlcmF0aW9uLkZXS19URVNUX1ZBTElEQVRPUl9DTEFTUykpIHsKLQkJCQkJZndrVGVzdFRNRCA9IHRtZDsKLQkJCQl9Ci0JCQkJZWxzZSBpZih0bWQuZ2V0VmFsaWRhdG9yQ2xhc3MoKS5lcXVhbHMoVGVzdE9wQ29uc3RySW5wdXRPcGVyYXRpb24uUFJPUEVSVElFU19WQUxJREFUT1JfQ0xBU1MpKSB7Ci0JCQkJCXByb3BUTUQgPSB0bWQ7Ci0JCQkJfQotCQkJCWVsc2UgaWYodG1kLmdldFZhbGlkYXRvckNsYXNzKCkuZXF1YWxzKFRlc3RPcENvbnN0cklucHV0T3BlcmF0aW9uLkZXS19OT0JVSUxEX1RFU1RfVkFMSURBVE9SX0NMQVNTKSkgewotCQkJCQlmd2tOb2J1aWxkVGVzdFRNRCA9IHRtZDsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYoKGZ3a1Rlc3RUTUQgIT0gbnVsbCkgJiYgKHByb3BUTUQgIT0gbnVsbCkgJiYgKGZ3a05vYnVpbGRUZXN0VE1EICE9IG51bGwpKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJaWYoKGZ3a1Rlc3RUTUQgPT0gbnVsbCkgfHwgKHByb3BUTUQgPT0gbnVsbCkgfHwgKGZ3a05vYnVpbGRUZXN0VE1EID09IG51bGwpKSB7Ci0JCQkJLy8gQ2FuJ3QgcnVuIHRoZSB0ZXN0cwotCQkJCW1vbml0b3Iuc3ViVGFzaygiQ2Fubm90IHJ1biBWQUxGV0swMiBiZWNhdXNlIHRoZSB0ZXN0IGNhc2UgaXMgbWlzc2luZyBmb3IgZWl0aGVyIHRoZSBWRiBUZXN0IFZhbGlkYXRvciwgUHJvcGVydGllcyBWYWxpZGF0b3IsIG9yIGJvdGguIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJLy8gU2V0IGxldmVsIHRvIEZJTkVTVCBzbyB0aGF0IHRoZSBsYXVuY2ggdmFsaWRhdG9ycyBhcmUgYWNjdW11bGF0ZWQgaW4gVmFsaWRhdGlvbk9wZXJhdGlvbi4KLQkJCQkvLyAoU2VlIFZhbGlkYXRpb25PcGVyYXRpb246OmdldExhdW5jaGVkVmFsaWRhdG9ycygpKQotCQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCkuc2V0TGV2ZWwoTGV2ZWwuRklORVNUKTsgCi0JCQkJCi0JCQkJZ2V0QnVmZmVyKCkud3JpdGUoInRlc3RQcm9wTm90T3ZlcnJpZGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWludCBhbGxvd1Bhc3MgPSB0ZXN0UHJvcE5vdE92ZXJyaWRlKG1vbml0b3IsIHByb2plY3QsIGdjb25mLCBwY29uZiwgcHJvcFRNRCk7Ci0JCQkJZ2V0QnVmZmVyKCkud3JpdGUoTkVXTElORSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRCdWZmZXIoKS53cml0ZSgidGVzdFByb3BPdmVycmlkZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJaW50IHByb3BQYXNzID0gdGVzdFByb3BPdmVycmlkZShtb25pdG9yLCBwcm9qZWN0LCBnY29uZiwgcGNvbmYsIGZ3a1Rlc3RUTUQpOwotCQkJCWdldEJ1ZmZlcigpLndyaXRlKE5FV0xJTkUpOyAvLyROT04tTkxTLTEkCi0JCQkJZ2V0QnVmZmVyKCkud3JpdGUoInRlc3RQcmVmTm90QWxsb3dPdmVycmlkZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJaW50IG5vdEFsbG93UGFzcyA9IHRlc3RQcmVmTm90QWxsb3dPdmVycmlkZShtb25pdG9yLCBwcm9qZWN0LCBnY29uZiwgcGNvbmYsIHByb3BUTUQpOwotCQkJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKE5FV0xJTkUpOwotCQkJCXJlc3VsdC5hcHBlbmQoIlByb3BlcnRpZXMgRG9lc24ndCBPdmVycmlkZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXN1bHQuYXBwZW5kKGFsbG93UGFzcyk7Ci0JCQkJcmVzdWx0LmFwcGVuZCgiIG9mIDcgcGFzcy4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdC5hcHBlbmQoTkVXTElORSk7Ci0JCQkJcmVzdWx0LmFwcGVuZCgiUHJvcGVyaXRlcyBPdmVycmlkZXM6ICIpOyAvLyROT04tTkxTLTEkCi0JCQkJcmVzdWx0LmFwcGVuZChwcm9wUGFzcyk7Ci0JCQkJcmVzdWx0LmFwcGVuZCgiIG9mIDcgcGFzcy4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdC5hcHBlbmQoTkVXTElORSk7Ci0JCQkJcmVzdWx0LmFwcGVuZCgiUHJlZmVyZW5jZSBEb2Vzbid0IEFsbG93IE92ZXJyaWRlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdC5hcHBlbmQobm90QWxsb3dQYXNzKTsKLQkJCQlyZXN1bHQuYXBwZW5kKCIgb2YgNyBwYXNzLiIpOyAvLyROT04tTkxTLTEkCi0JCQkJcmVzdWx0LmFwcGVuZChORVdMSU5FKTsKLQkJCQltb25pdG9yLnN1YlRhc2socmVzdWx0LnRvU3RyaW5nKCkpOwotCQkJCWdldEJ1ZmZlcigpLndyaXRlKE5FV0xJTkUpOyAvLyROT04tTkxTLTEkCi0JCQkJZ2V0QnVmZmVyKCkud3JpdGUocmVzdWx0LnRvU3RyaW5nKCkpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJZ2NvbmYgPSBvcmlnR2NvbmY7Ci0JCQkJZ2NvbmYucGFzc2l2YXRlKCk7Ci0JCQkJCi0JCQkJcGNvbmYgPSBvcmlnUGNvbmY7Ci0JCQkJcGNvbmYucGFzc2l2YXRlKCk7Ci0JCQkJCi0JCQkJSkRUVXRpbGl0eS5zZXRBdXRvQnVpbGQoYXV0b0J1aWxkRW5hYmxlZCk7Ci0JCi0JCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKS5zZXRMZXZlbChsZXZlbCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2goSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJCWlmKGV4Yy5nZXRUYXJnZXRFeGNlcHRpb24oKSAhPSBudWxsKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yy5nZXRUYXJnZXRFeGNlcHRpb24oKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoKFRocm93YWJsZSBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgZGVidWcoSUJ1ZmZlciBidWZmZXIsIFN0cmluZyB0aXRsZSwgVmFsaWRhdG9yTWV0YURhdGFbXSBlbmFibGVkVmFsaWRhdG9ycykgewotCQlidWZmZXIud3JpdGUoIkNvbnRlbnRzIG9mICIgKyB0aXRsZSk7IC8vJE5PTi1OTFMtMSQKLQkJZm9yKGludCBpPTA7IGk8ZW5hYmxlZFZhbGlkYXRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IGVuYWJsZWRWYWxpZGF0b3JzW2ldOwotCQkJYnVmZmVyLndyaXRlKCJcdCIgKyB2bWQuZ2V0VmFsaWRhdG9yRGlzcGxheU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlidWZmZXIud3JpdGUoIkVuZCBjb250ZW50cyBvZiAiICsgdGl0bGUpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci53cml0ZShORVdMSU5FKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkKLQlwcml2YXRlIGludCB0ZXN0UHJvcE5vdE92ZXJyaWRlKGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgZmluYWwgSVByb2plY3QgcHJvamVjdCwgR2xvYmFsQ29uZmlndXJhdGlvbiBnY29uZiwgUHJvamVjdENvbmZpZ3VyYXRpb24gcGNvbmYsIFZhbGlkYXRvclRlc3RjYXNlIHRtZCkgewotCQlpbnQgbnVtUGFzcyA9IDA7Ci0JCXRyeSB7Ci0JCQkvLyBTZXQgdXAgdGhlIHVzZXIgY29uZmlndXJhdGlvbiBmb3IgdGhlIHRlc3QuIFRoZSBydW4oSVByb2dyZXNzTW9uaXRvcikgbWV0aG9kCi0JCQkvLyB3aWxsIHNldCB0aGUgdmFsdWVzIGJhY2sgdG8gd2hhdCB0aGV5IHdlcmUgYmVmb3JlIHRoZSB0ZXN0LgkJCi0JCQlnY29uZi5zZXRDYW5Qcm9qZWN0c092ZXJyaWRlKHRydWUpOwotCQkJZ2NvbmYucGFzc2l2YXRlKCk7Ci0JCQlwY29uZi5zZXREb2VzUHJvamVjdE92ZXJyaWRlKGZhbHNlKTsKLQkJCXBjb25mLnBhc3NpdmF0ZSgpOwotCQkJCi0JCQlWYWxpZGF0b3JNYW5hZ2VyLmdldE1hbmFnZXIoKS51cGRhdGVUYXNrTGlzdChwcm9qZWN0KTsgLy8gVXBkYXRlIHRoZSB0YXNrIGxpc3QgYmVjYXVzZSB0aGUgcHJlZmVyZW5jZSBhbmQgcHJvcGVydGllcyBwYWdlIGRvLCBzbyB0aGUgY29uZmlndXJhdGlvbiBjbGFzc2VzIGRvbid0LgotCQkJCi0JCQlkZWJ1ZyhnZXRCdWZmZXIoKSwgIkVuYWJsZWQgUHJvcGVydGllcyBWYWxpZGF0b3JzIiwgcGNvbmYuZ2V0RW5hYmxlZFZhbGlkYXRvcnMoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWRlYnVnKGdldEJ1ZmZlcigpLCAiRW5hYmxlZCBQcmVmZXJlbmNlIFZhbGlkYXRvcnMiLCBnY29uZi5nZXRFbmFibGVkVmFsaWRhdG9ycygpKTsgLy8kTk9OLU5MUy0xJAotCQotCQkJbnVtUGFzcyA9IHZhbGlkYXRlKG1vbml0b3IsIHByb2plY3QsIGdjb25mLCB0bWQsICJ0ZXN0UHJvcE5vdE92ZXJyaWRlIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQljYXRjaChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQkJaWYoZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQkJCQl9Ci0JCQl9Ci0JCQludW1QYXNzID0gMDsKLQkJfQotCQljYXRjaChUaHJvd2FibGUgZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCX0KLQkJCW51bVBhc3MgPSAwOwotCQl9Ci0JCQotCQkJcmV0dXJuIG51bVBhc3M7Ci0JfQotCQotCQotCXByaXZhdGUgaW50IHRlc3RQcm9wT3ZlcnJpZGUoZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0LCBHbG9iYWxDb25maWd1cmF0aW9uIGdjb25mLCBQcm9qZWN0Q29uZmlndXJhdGlvbiBwY29uZiwgVmFsaWRhdG9yVGVzdGNhc2UgdG1kKSB7Ci0JCWludCBudW1QYXNzID0gMDsKLQkJdHJ5IHsKLQkJCS8vIFNldCB1cCB0aGUgdXNlciBjb25maWd1cmF0aW9uIGZvciB0aGUgdGVzdC4gVGhlIHJ1bihJUHJvZ3Jlc3NNb25pdG9yKSBtZXRob2QKLQkJCS8vIHdpbGwgc2V0IHRoZSB2YWx1ZXMgYmFjayB0byB3aGF0IHRoZXkgd2VyZSBiZWZvcmUgdGhlIHRlc3QuCQkKLQkJCWdjb25mLnNldENhblByb2plY3RzT3ZlcnJpZGUodHJ1ZSk7Ci0JCQlnY29uZi5wYXNzaXZhdGUoKTsKLQkJCXBjb25mLnNldERvZXNQcm9qZWN0T3ZlcnJpZGUodHJ1ZSk7Ci0JCQlwY29uZi5wYXNzaXZhdGUoKTsKLQotCQkJVmFsaWRhdG9yTWFuYWdlci5nZXRNYW5hZ2VyKCkudXBkYXRlVGFza0xpc3QocHJvamVjdCk7IC8vIFVwZGF0ZSB0aGUgdGFzayBsaXN0IGJlY2F1c2UgdGhlIHByZWZlcmVuY2UgYW5kIHByb3BlcnRpZXMgcGFnZSBkbywgc28gdGhlIGNvbmZpZ3VyYXRpb24gY2xhc3NlcyBkb24ndC4KLQkJCQotCQkJZGVidWcoZ2V0QnVmZmVyKCksICJFbmFibGVkIFByb3BlcnRpZXMgVmFsaWRhdG9ycyIsIHBjb25mLmdldEVuYWJsZWRWYWxpZGF0b3JzKCkpOyAvLyROT04tTkxTLTEkCi0JCQlkZWJ1ZyhnZXRCdWZmZXIoKSwgIkVuYWJsZWQgUHJlZmVyZW5jZSBWYWxpZGF0b3JzIiwgZ2NvbmYuZ2V0RW5hYmxlZFZhbGlkYXRvcnMoKSk7IC8vJE5PTi1OTFMtMSQKLQkKLQkJCW51bVBhc3MgPSB2YWxpZGF0ZShtb25pdG9yLCBwcm9qZWN0LCBwY29uZiwgdG1kLCAidGVzdFByb3BPdmVycmlkZSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJY2F0Y2goSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJCWlmKGV4Yy5nZXRUYXJnZXRFeGNlcHRpb24oKSAhPSBudWxsKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yy5nZXRUYXJnZXRFeGNlcHRpb24oKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoKFRocm93YWJsZSBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudW1QYXNzOwotCX0KLQkKLQlwcml2YXRlIGludCB0ZXN0UHJlZk5vdEFsbG93T3ZlcnJpZGUoZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0LCBHbG9iYWxDb25maWd1cmF0aW9uIGdjb25mLCBQcm9qZWN0Q29uZmlndXJhdGlvbiBwY29uZiwgVmFsaWRhdG9yVGVzdGNhc2UgdG1kKSB7Ci0JCWludCBudW1QYXNzID0gMDsKLQkJdHJ5IHsKLQkJCS8vIFNldCB1cCB0aGUgdXNlciBjb25maWd1cmF0aW9uIGZvciB0aGUgdGVzdC4gVGhlIHJ1bihJUHJvZ3Jlc3NNb25pdG9yKSBtZXRob2QKLQkJCS8vIHdpbGwgc2V0IHRoZSB2YWx1ZXMgYmFjayB0byB3aGF0IHRoZXkgd2VyZSBiZWZvcmUgdGhlIHRlc3QuCQkKLQkJCWdjb25mLnNldENhblByb2plY3RzT3ZlcnJpZGUoZmFsc2UpOwotCQkJZ2NvbmYucGFzc2l2YXRlKCk7Ci0JCQlwY29uZi5zZXREb2VzUHJvamVjdE92ZXJyaWRlKHRydWUpOwotCQkJcGNvbmYucGFzc2l2YXRlKCk7Ci0KLQkJCVZhbGlkYXRvck1hbmFnZXIuZ2V0TWFuYWdlcigpLnVwZGF0ZVRhc2tMaXN0KHByb2plY3QpOyAvLyBVcGRhdGUgdGhlIHRhc2sgbGlzdCBiZWNhdXNlIHRoZSBwcmVmZXJlbmNlIGFuZCBwcm9wZXJ0aWVzIHBhZ2UgZG8sIHNvIHRoZSBjb25maWd1cmF0aW9uIGNsYXNzZXMgZG9uJ3QuCi0JCQkKLQkJCWRlYnVnKGdldEJ1ZmZlcigpLCAiRW5hYmxlZCBQcm9wZXJ0aWVzIFZhbGlkYXRvcnMiLCBwY29uZi5nZXRFbmFibGVkVmFsaWRhdG9ycygpKTsgLy8kTk9OLU5MUy0xJAotCQkJZGVidWcoZ2V0QnVmZmVyKCksICJFbmFibGVkIFByZWZlcmVuY2UgVmFsaWRhdG9ycyIsIGdjb25mLmdldEVuYWJsZWRWYWxpZGF0b3JzKCkpOyAvLyROT04tTkxTLTEkCi0JCi0JCQludW1QYXNzID0gdmFsaWRhdGUobW9uaXRvciwgcHJvamVjdCwgZ2NvbmYsIHRtZCwgInRlc3RQcmVmTm90QWxsb3dPdmVycmlkZSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJY2F0Y2goSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJCWlmKGV4Yy5nZXRUYXJnZXRFeGNlcHRpb24oKSAhPSBudWxsKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yy5nZXRUYXJnZXRFeGNlcHRpb24oKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoKFRocm93YWJsZSBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudW1QYXNzOwotCX0KLQkKLQlwcml2YXRlIGludCB2YWxpZGF0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElQcm9qZWN0IHByb2plY3QsIFZhbGlkYXRpb25Db25maWd1cmF0aW9uIHZjb25mLCBWYWxpZGF0b3JUZXN0Y2FzZSB0bWQsIFN0cmluZyB0ZXN0TmFtZSkgewotCQlpbnQgbnVtUGFzcyA9IDA7Ci0JCWJvb2xlYW4gc3VjY2Vzc2Z1bCA9IHRydWU7IC8vIEFzc3VtZSB0aGF0IGFsbCBvZiB0aGUgdGVzdCBjYXNlcyB3aWxsIHBhc3MuCi0JCXRyeSB7Ci0JCQkvLyBGb3IgdGhlIGZpcnN0IGZvdXIgdGVzdHMsIG5lZWQgYWxsIG9mIHRoZSBtZXNzYWdlcyB0byBiZSByZXBvcnRlZAotCQkJLy9pbnQgb3JpZ2luYWxMaW1pdCA9IHZjb25mLmdldE1heGltdW1OdW1iZXJPZk1lc3NhZ2VzKCk7Ci0JCQkvL3Zjb25mLnNldE1heGltdW1OdW1iZXJPZk1lc3NhZ2VzKFdvcmtiZW5jaFJlcG9ydGVyLk5PX01FU1NBR0VfTElNSVQpOwotCQkJdmNvbmYucGFzc2l2YXRlKCk7Ci0JCQkKLQkJCWJvb2xlYW4gcGFzcyA9IHJ1blZhbGlkYXRpb24obW9uaXRvciwgcHJvamVjdCwgdmNvbmYpOwotCQkJaWYoIXBhc3MpIHsKLS8vCQkJCWdldEJ1ZmZlcigpLndyaXRlKHRlc3ROYW1lICsgIjo6cnVuVmFsaWRhdGlvbiBmYWlsZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXN1Y2Nlc3NmdWwgPSBmYWxzZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW51bVBhc3MrKzsKLS8vCQkJCWdldEJ1ZmZlcigpLndyaXRlKHRlc3ROYW1lICsgIjo6cnVuVmFsaWRhdGlvbiBwYXNzZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZ2V0QnVmZmVyKCkuYWRkRXhlY3V0aW9uU3RhdHVzKGdldE5hbWUoKSwgIjo6IiArIHRlc3ROYW1lICsgInJ1blZhbGlkYXRpb24iLCBwYXNzKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkKLQkJCXBhc3MgPSBmdWxsQnVpbGRWYWxpZGF0ZShtb25pdG9yLCBwcm9qZWN0LCB2Y29uZiwgdG1kKTsKLQkJCWlmKCFwYXNzKSB7Ci0vLwkJCQlnZXRCdWZmZXIoKS53cml0ZSh0ZXN0TmFtZSArICI6OmZ1bGxCdWlsZFZhbGlkYXRpb24gZmFpbGVkIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlzdWNjZXNzZnVsID0gZmFsc2U7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQludW1QYXNzKys7Ci0vLwkJCQlnZXRCdWZmZXIoKS53cml0ZSh0ZXN0TmFtZSArICI6OmZ1bGxCdWlsZFZhbGlkYXRpb24gcGFzc2VkIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWdldEJ1ZmZlcigpLmFkZEV4ZWN1dGlvblN0YXR1cyhnZXROYW1lKCksICI6OiIgKyB0ZXN0TmFtZSArICJmdWxsQnVpbGRWYWxpZGF0aW9uIiwgcGFzcyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCi0JCQlwYXNzID0gYXV0b1ZhbGlkYXRlRW5hYmxlZChtb25pdG9yLCBwcm9qZWN0LCB2Y29uZiwgdG1kKTsKLQkJCWlmKCFwYXNzKSB7Ci0JCQkJc3VjY2Vzc2Z1bCA9IGZhbHNlOwotLy8JCQkJZ2V0QnVmZmVyKCkud3JpdGUodGVzdE5hbWUgKyAiOjphdXRvVmFsaWRhdGVFbmFibGVkIGZhaWxlZCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQludW1QYXNzKys7Ci0vLwkJCQlnZXRCdWZmZXIoKS53cml0ZSh0ZXN0TmFtZSArICI6OmF1dG9WYWxpZGF0ZUVuYWJsZWQgcGFzc2VkIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWdldEJ1ZmZlcigpLmFkZEV4ZWN1dGlvblN0YXR1cyhnZXROYW1lKCksICI6OiIgKyB0ZXN0TmFtZSArICJhdXRvVmFsaWRhdGVFbmFibGVkIiwgcGFzcyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCi0JCQlwYXNzID0gYXV0b1ZhbGlkYXRlRGlzYWJsZWQobW9uaXRvciwgcHJvamVjdCwgdmNvbmYsIHRtZCk7Ci0JCQlpZighcGFzcykgewotLy8JCQkJZ2V0QnVmZmVyKCkud3JpdGUodGVzdE5hbWUgKyAiOjphdXRvVmFsaWRhdGVEaXNhYmxlZCBmYWlsZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXN1Y2Nlc3NmdWwgPSBmYWxzZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW51bVBhc3MrKzsKLS8vCQkJCWdldEJ1ZmZlcigpLndyaXRlKHRlc3ROYW1lICsgIjo6YXV0b1ZhbGlkYXRlRGlzYWJsZWQgcGFzc2VkIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWdldEJ1ZmZlcigpLmFkZEV4ZWN1dGlvblN0YXR1cyhnZXROYW1lKCksICI6OiIgKyB0ZXN0TmFtZSArICJhdXRvVmFsaWRhdGVEaXNhYmxlZCIsIHBhc3MpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQotCQkJcGFzcyA9IGJ1aWxkVmFsaWRhdGVFbmFibGVkKG1vbml0b3IsIHByb2plY3QsIHZjb25mLCB0bWQpOwotCQkJaWYoIXBhc3MpIHsKLS8vCQkJCWdldEJ1ZmZlcigpLndyaXRlKHRlc3ROYW1lICsgIjo6YnVpbGRWYWxpZGF0ZUVuYWJsZWQgZmFpbGVkIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlzdWNjZXNzZnVsID0gZmFsc2U7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQludW1QYXNzKys7Ci0vLwkJCQlnZXRCdWZmZXIoKS53cml0ZSh0ZXN0TmFtZSArICI6OmJ1aWxkVmFsaWRhdGVFbmFibGVkIHBhc3NlZCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlnZXRCdWZmZXIoKS5hZGRFeGVjdXRpb25TdGF0dXMoZ2V0TmFtZSgpLCAiOjoiICsgdGVzdE5hbWUgKyAiYnVpbGRWYWxpZGF0ZUVuYWJsZWQiLCBwYXNzKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCXBhc3MgPSBidWlsZFZhbGlkYXRlRGlzYWJsZWQobW9uaXRvciwgcHJvamVjdCwgdmNvbmYsIHRtZCk7Ci0JCQlpZighcGFzcykgewotLy8JCQkJZ2V0QnVmZmVyKCkud3JpdGUodGVzdE5hbWUgKyAiOjpidWlsZFZhbGlkYXRlRGlzYWJsZWQgZmFpbGVkIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlzdWNjZXNzZnVsID0gZmFsc2U7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQludW1QYXNzKys7Ci0vLwkJCQlnZXRCdWZmZXIoKS53cml0ZSh0ZXN0TmFtZSArICI6OmJ1aWxkVmFsaWRhdGVEaXNhYmxlZCBwYXNzZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZ2V0QnVmZmVyKCkuYWRkRXhlY3V0aW9uU3RhdHVzKGdldE5hbWUoKSwgIjo6IiArIHRlc3ROYW1lICsgImJ1aWxkVmFsaWRhdGVEaXNhYmxlZCIsIHBhc3MpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJLy8gQW5kIGZvciB0aGlzIHRlc3QsIHRoZSBvcmlnaW5hbCBsaW1pdCBuZWVkcyB0byBiZSBlbmZvcmNlZAotCQkJLy92Y29uZi5zZXRNYXhpbXVtTnVtYmVyT2ZNZXNzYWdlcyhvcmlnaW5hbExpbWl0KTsKLQkJCXZjb25mLnBhc3NpdmF0ZSgpOwotCi0JCQlwYXNzID0gbWF4TWVzc2FnZXNSZXBvcnRlZChtb25pdG9yLCBwcm9qZWN0LCB2Y29uZik7Ci0JCQlpZighcGFzcykgewotCQkJCXN1Y2Nlc3NmdWwgPSBmYWxzZTsKLS8vCQkJCWdldEJ1ZmZlcigpLndyaXRlKHRlc3ROYW1lICsgIjo6bWF4TWVzc2FnZXNSZXBvcnRlZCBmYWlsZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZWxzZSB7Ci0JCQkJbnVtUGFzcysrOwotLy8JCQkJZ2V0QnVmZmVyKCkud3JpdGUodGVzdE5hbWUgKyAiOjptYXhNZXNzYWdlc1JlcG9ydGVkIHBhc3NlZCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlnZXRCdWZmZXIoKS5hZGRFeGVjdXRpb25TdGF0dXMoZ2V0TmFtZSgpLCAiOjoiICsgdGVzdE5hbWUgKyAibWF4TWVzc2FnZXNSZXBvcnRlZCIsIHBhc3MpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQljYXRjaChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4YykgewotCQkJc3VjY2Vzc2Z1bCA9IGZhbHNlOwotCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQkJaWYoZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlnZXRCdWZmZXIoKS5hZGRFeGVjdXRpb25TdGF0dXMoZ2V0TmFtZSgpLCB0ZXN0TmFtZSwgc3VjY2Vzc2Z1bCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbnVtUGFzczsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHJ1blZhbGlkYXRpb24oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUHJvamVjdCBwcm9qZWN0LCBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiB2Y29uZikgewotCQlib29sZWFuIHBhc3NlZCA9IHRydWU7Ci0JCXRyeSB7Ci0JCQkvLyBVbmxpa2UgdGhlIG90aGVyIHZhbGlkYXRpb25zLCB3aGljaCByZWx5IG9uIGEgYnVpbGQsIHRoaXMgbWV0aG9kIGhhcyBhY2Nlc3MgdG8gdGhlCi0JCQkvLyBvcGVyYXRpb24gYW5kIGNhbiBxdWVyeSBpdCBmb3IgdGhlIGxpc3Qgb2YgdmFsaWRhdG9ycyB0aGF0IHdlcmUgbGF1bmNoZWQuIFRoaXMgdGVjaG5pcXVlCi0JCQkvLyBpcyBiZXR0ZXIgYmVjYXVzZSBpdCBkb2Vzbid0IHJlbHkgb24gdGhlIHZhbGlkYXRvciBwcm9kdWNpbmcgdGhlIGNvcnJlY3Qgb3V0cHV0IChtYXJrZXJzKS4KLQkJCS8vIFZBTEZXSzAyIGp1c3Qgd2FudHMgdG8gY2hlY2sgdGhhdCB0aGUgY29ycmVjdCB2YWxpZGF0b3JzIHdlcmUgbGF1bmNoZWQ7IHRoZSBUZXN0T3BDb25zdHIKLQkJCS8vIHRlc3Qgd2FudHMgdG8gY2hlY2sgdGhlIHJlc3VsdCBnaXZlbiBkaWZmZXJlbnQgb3V0cHV0IGFuZCBjb25zdHJ1Y3RvciBvZiB0aGUgT3BlcmF0aW9uLgotCQkJCi0JCQlFbmFibGVkVmFsaWRhdG9yc09wZXJhdGlvbiB2YWxpZE9wID0gbmV3IEVuYWJsZWRWYWxpZGF0b3JzT3BlcmF0aW9uKHByb2plY3QsZmFsc2UpOwotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bih2YWxpZE9wLCBtb25pdG9yKTsKLQkJCS8vIExhdW5jaGVkIHZhbGlkYXRvcnMgc2hvdWxkIGJlIGNvbmZpZ3VyZWQsIGVuYWJsZWQsIGFuZCBoYWQgZmlsZXMgdG8gdmFsaWRhdGUgb24gdGhlIHByb2plY3QuCi0JCQlTZXQgbGF1bmNoZWRWYWxpZGF0b3JzID0gdmFsaWRPcC5nZXRMYXVuY2hlZFZhbGlkYXRvcnMoKTsKLQkJCQotCQkJLy8gU2luY2UgYSBmdWxsIHZhbGlkYXRpb24gd2FzIHJ1biwgdGhlIGxhdW5jaGVkIHZhbGlkYXRvcnMgc2hvdWxkIGJlIGVxdWl2YWxlbnQKLQkJCS8vIHRvIHRoZSBjb25maWd1cmVkIGVuYWJsZWQgdmFsZGlhdG9ycy4KLQkJCVZhbGlkYXRvck1ldGFEYXRhW10gZW5hYmxlZFZhbGlkYXRvcnMgPSB2Y29uZi5nZXRFbmFibGVkVmFsaWRhdG9ycygpOwotCQkJZm9yKGludCBpPTA7IGk8ZW5hYmxlZFZhbGlkYXRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSBlbmFibGVkVmFsaWRhdG9yc1tpXTsKLQkJCQkKLQkJCQkvLyBJZiBpdCdzIGNvbmZpZ3VyZWQgb24gdGhlIHByb2plY3QsIGVuc3VyZSB0aGF0IHRoZSBlbmFibGVkIHZhbGlkYXRvciB3YXMgbGF1bmNoZWQuCi0JCQkJLy8gKE1heSBub3QgYmUgY29uZmlndXJlZCBpZiB0aGUgZW5hYmxlZCB2YWxpZGF0b3JzIGlzIHRoZSBsaXN0IG9mIFByZWZlcmVuY2UgZW5hYmxlZAotCQkJCS8vIHZhbGlkYXRvcnMuKQotCQkJCWlmKCFsYXVuY2hlZFZhbGlkYXRvcnMuY29udGFpbnModm1kKSkgewotCQkJCQlnZXRCdWZmZXIoKS53cml0ZSgiRVJST1I6IEV4cGVjdGVkIHZhbGlkYXRvciAiICsgdm1kLmdldFZhbGlkYXRvckRpc3BsYXlOYW1lKCkgKyAiIHdhcyBub3QgcnVuIG9uIHByb2plY3QgIiArIHByb2plY3QuZ2V0TmFtZSgpICsgIi4gRmFpbGluZyB0ZXN0LiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlwYXNzZWQgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWdldEJ1ZmZlcigpLndyaXRlKCJJTkZPOiBFeHBlY3RlZCB2YWxpZGF0b3IgIiArIHZtZC5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpICsgIiByYW4gYXMgZXhwZWN0ZWQgb24gcHJvamVjdCAiICsgcHJvamVjdC5nZXROYW1lKCkgKyAiLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCX0KLQkJCX0KLQkJCQotCQkJaWYocGFzc2VkID09IGZhbHNlKSB7Ci0JCQkJZ2V0QnVmZmVyKCkud3JpdGUoImxhdW5jaGVkIHZhbGlkYXRvcnMgYXJlIHRoZSBmb2xsb3dpbmc6Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IGxhdW5jaGVkVmFsaWRhdG9ycy5pdGVyYXRvcigpOwotCQkJCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSAoVmFsaWRhdG9yTWV0YURhdGEpaXRlcmF0b3IubmV4dCgpOwotCQkJCQlnZXRCdWZmZXIoKS53cml0ZSgiXHQiICsgdm1kLmdldFZhbGlkYXRvckRpc3BsYXlOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWdldEJ1ZmZlcigpLndyaXRlKCJlbmQgb2YgbGF1bmNoZWQgdmFsaWRhdG9ycyIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJfQotCQkJcGFzc2VkID0gZmFsc2U7Ci0JCX0KLQkJY2F0Y2goSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJCWlmKGV4Yy5nZXRUYXJnZXRFeGNlcHRpb24oKSAhPSBudWxsKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yy5nZXRUYXJnZXRFeGNlcHRpb24oKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkKLQkJcmV0dXJuIHBhc3NlZDsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGZ1bGxCdWlsZFZhbGlkYXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSVByb2plY3QgcHJvamVjdCwgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gdmNvbmYsIFZhbGlkYXRvclRlc3RjYXNlIHRtZCkgewotCQl0cnkgewotCQkJLy92Y29uZi5zZXRCdWlsZFZhbGlkYXRlKHRydWUpOwotCQkJdmNvbmYucGFzc2l2YXRlKCk7Ci0KLQkJCVRhc2tMaXN0VXRpbGl0eS5yZW1vdmVBbGxUYXNrcyhwcm9qZWN0KTsKLQkJCUlSZXNvdXJjZVtdIGNoYW5nZWRSZXNvdXJjZXMgPSB0bWQuZ2V0UmVzb3VyY2VzKHByb2plY3QpOzsKLQkJCVRlc3RPcENvbnN0cklucHV0T3BlcmF0aW9uLnRvdWNoKHByb2plY3QsIGNoYW5nZWRSZXNvdXJjZXMpOwotCQkJCi0JCQlwcm9qZWN0LmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuRlVMTF9CVUlMRCwgbW9uaXRvcik7Ci0JCQlJTWFya2VyW10gbWVzc2FnZXNBZnRlckJ1aWxkID0gVGFza0xpc3RVdGlsaXR5LmdldFZhbGlkYXRpb25UYXNrcyhwcm9qZWN0LCBJTWVzc2FnZS5BTExfTUVTU0FHRVMpOwotCQkJCi0JCQlyZXR1cm4gQlZUUnVubmVyLnNpbmdsZXRvbigpLmNvbXBhcmUoZ2V0QnVmZmVyKCksIGdldE5hbWUoKSwgdG1kLmdldE5hbWUoKSwgdG1kLmdldE1lc3NhZ2VzKFZhbGlkYXRpb25UeXBlRW51bS5GVUxMX1ZBTElEQVRJT04pLCBtZXNzYWdlc0FmdGVyQnVpbGQpOwotCQl9Ci0JCWNhdGNoKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQljYXRjaChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQkJaWYoZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGF1dG9WYWxpZGF0ZUVuYWJsZWQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUHJvamVjdCBwcm9qZWN0LCBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiB2Y29uZiwgVmFsaWRhdG9yVGVzdGNhc2UgdG1kKSB7Ci0JCUpEVFV0aWxpdHkuc2V0QXV0b0J1aWxkKHRydWUpOwotCQkKLQkJdHJ5IHsKLQkJCS8vdmNvbmYuc2V0QXV0b1ZhbGlkYXRlKHRydWUpOwotCQkJdmNvbmYucGFzc2l2YXRlKCk7Ci0JCQkKLQkJCVRhc2tMaXN0VXRpbGl0eS5yZW1vdmVBbGxUYXNrcyhwcm9qZWN0KTsKLQkJCUlSZXNvdXJjZVtdIGNoYW5nZWRSZXNvdXJjZXMgPSB0bWQuZ2V0UmVzb3VyY2VzKHByb2plY3QpOzsKLQkJCVRlc3RPcENvbnN0cklucHV0T3BlcmF0aW9uLnRvdWNoKHByb2plY3QsIGNoYW5nZWRSZXNvdXJjZXMpOwotCQkJCi0JCQlwcm9qZWN0LmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuQVVUT19CVUlMRCwgbW9uaXRvcik7Ci0JCQlJTWFya2VyW10gbWVzc2FnZXNBZnRlckJ1aWxkID0gVGFza0xpc3RVdGlsaXR5LmdldFZhbGlkYXRpb25UYXNrcyhwcm9qZWN0LCBJTWVzc2FnZS5BTExfTUVTU0FHRVMpOwotCQkJCi0JCQlyZXR1cm4gQlZUUnVubmVyLnNpbmdsZXRvbigpLmNvbXBhcmUoZ2V0QnVmZmVyKCksIGdldE5hbWUoKSwgdG1kLmdldE5hbWUoKSwgdG1kLmdldE1lc3NhZ2VzKFZhbGlkYXRpb25UeXBlRW51bS5BVVRPX1ZBTElEQVRJT04pLCBtZXNzYWdlc0FmdGVyQnVpbGQpOwotCQl9Ci0JCWNhdGNoKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQljYXRjaChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQkJaWYoZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGF1dG9WYWxpZGF0ZURpc2FibGVkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSVByb2plY3QgcHJvamVjdCwgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gdmNvbmYsIFZhbGlkYXRvclRlc3RjYXNlIHRtZCkgewotCQlKRFRVdGlsaXR5LnNldEF1dG9CdWlsZCh0cnVlKTsKLQotCQl0cnkgewkJCi0JCQkvL3Zjb25mLnNldEF1dG9WYWxpZGF0ZShmYWxzZSk7Ci0JCQl2Y29uZi5wYXNzaXZhdGUoKTsKLQotCQkJVGFza0xpc3RVdGlsaXR5LnJlbW92ZUFsbFRhc2tzKHByb2plY3QpOwotCQkJSVJlc291cmNlW10gY2hhbmdlZFJlc291cmNlcyA9IHRtZC5nZXRSZXNvdXJjZXMocHJvamVjdCk7Ci0JCQlUZXN0T3BDb25zdHJJbnB1dE9wZXJhdGlvbi50b3VjaChwcm9qZWN0LCBjaGFuZ2VkUmVzb3VyY2VzKTsKLQkJCi0JCQlwcm9qZWN0LmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuQVVUT19CVUlMRCwgbW9uaXRvcik7Ci0JCQlJTWFya2VyW10gbWVzc2FnZXNBZnRlckJ1aWxkID0gVGFza0xpc3RVdGlsaXR5LmdldFZhbGlkYXRpb25UYXNrcyhwcm9qZWN0LCBJTWVzc2FnZS5BTExfTUVTU0FHRVMpOwotCQkJCi0JCQkvLyBQYXNzIGluIGFuIGVtcHR5IGxpc3QgYmVjYXVzZSB0aGUgdmFsaWRhdGlvbiBpc24ndCBzdXBwb3NlZCB0byBydW4uCi0JCQlyZXR1cm4gQlZUUnVubmVyLnNpbmdsZXRvbigpLmNvbXBhcmUoZ2V0QnVmZmVyKCksIGdldE5hbWUoKSwgdG1kLmdldE5hbWUoKSwgQ29sbGVjdGlvbnMuRU1QVFlfTElTVCwgbWVzc2FnZXNBZnRlckJ1aWxkKTsKLQkJfQotCQljYXRjaChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJY2F0Y2goSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJCWlmKGV4Yy5nZXRUYXJnZXRFeGNlcHRpb24oKSAhPSBudWxsKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yy5nZXRUYXJnZXRFeGNlcHRpb24oKSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBidWlsZFZhbGlkYXRlRW5hYmxlZChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElQcm9qZWN0IHByb2plY3QsIFZhbGlkYXRpb25Db25maWd1cmF0aW9uIHZjb25mLCBWYWxpZGF0b3JUZXN0Y2FzZSB0bWQpIHsKLQkJdHJ5IHsKLQkJCS8vdmNvbmYuc2V0QnVpbGRWYWxpZGF0ZSh0cnVlKTsKLQkJCXZjb25mLnBhc3NpdmF0ZSgpOwotCQkJSkRUVXRpbGl0eS5zZXRBdXRvQnVpbGQoZmFsc2UpOwotCQotCQkJLy8gQ29uc3RydWN0IHRoZSBpbnB1dAotCQkJVGFza0xpc3RVdGlsaXR5LnJlbW92ZUFsbFRhc2tzKHByb2plY3QpOwotCQkJSVJlc291cmNlW10gY2hhbmdlZFJlc291cmNlcyA9IHRtZC5nZXRSZXNvdXJjZXMocHJvamVjdCk7Ci0JCQlUZXN0T3BDb25zdHJJbnB1dE9wZXJhdGlvbi50b3VjaChwcm9qZWN0LCBjaGFuZ2VkUmVzb3VyY2VzKTsKLQkJCXRyeSB7CQkKLQkJCQlwcm9qZWN0LmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuSU5DUkVNRU5UQUxfQlVJTEQsIG1vbml0b3IpOwotCQkJfQotCQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlJTWFya2VyW10gbWVzc2FnZXNBZnRlckJ1aWxkID0gVGFza0xpc3RVdGlsaXR5LmdldFZhbGlkYXRpb25UYXNrcyhwcm9qZWN0LCBJTWVzc2FnZS5BTExfTUVTU0FHRVMpOwotCQkJCi0JCQlyZXR1cm4gQlZUUnVubmVyLnNpbmdsZXRvbigpLmNvbXBhcmUoZ2V0QnVmZmVyKCksIGdldE5hbWUoKSwgdG1kLmdldE5hbWUoKSwgdG1kLmdldE1lc3NhZ2VzKFZhbGlkYXRpb25UeXBlRW51bS5JTkNSRU1FTlRBTF9WQUxJREFUSU9OKSwgbWVzc2FnZXNBZnRlckJ1aWxkKTsKLQkJfQotCQljYXRjaChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQkJaWYoZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGJ1aWxkVmFsaWRhdGVEaXNhYmxlZChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElQcm9qZWN0IHByb2plY3QsIFZhbGlkYXRpb25Db25maWd1cmF0aW9uIHZjb25mLCBWYWxpZGF0b3JUZXN0Y2FzZSB0bWQpIHsKLQkJdHJ5IHsKLQkJCS8vdmNvbmYuc2V0QnVpbGRWYWxpZGF0ZShmYWxzZSk7Ci0JCQl2Y29uZi5wYXNzaXZhdGUoKTsKLQkJCUpEVFV0aWxpdHkuc2V0QXV0b0J1aWxkKGZhbHNlKTsKLQkJCQotCQkJLy8gQ29uc3RydWN0IHRoZSBpbnB1dAotCQkJVGFza0xpc3RVdGlsaXR5LnJlbW92ZUFsbFRhc2tzKHByb2plY3QpOwotCQkJSVJlc291cmNlW10gY2hhbmdlZFJlc291cmNlcyA9IHRtZC5nZXRSZXNvdXJjZXMocHJvamVjdCk7Ci0JCQlUZXN0T3BDb25zdHJJbnB1dE9wZXJhdGlvbi50b3VjaChwcm9qZWN0LCBjaGFuZ2VkUmVzb3VyY2VzKTsKLQkJCXRyeSB7CQkKLQkJCQlwcm9qZWN0LmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuSU5DUkVNRU5UQUxfQlVJTEQsIG1vbml0b3IpOwotCQkJCUlNYXJrZXJbXSBtZXNzYWdlc0FmdGVyQnVpbGQgPSBUYXNrTGlzdFV0aWxpdHkuZ2V0VmFsaWRhdGlvblRhc2tzKHByb2plY3QsIElNZXNzYWdlLkFMTF9NRVNTQUdFUyk7Ci0KLQkJCQkvLyBQYXNzIGluIGFuIGVtcHR5IGxpc3QgYmVjYXVzZSB2YWxpZGF0aW9uIGlzbid0IHN1cHBvc2VkIHRvIHJ1bi4JCQkJCi0JCQkJcmV0dXJuIEJWVFJ1bm5lci5zaW5nbGV0b24oKS5jb21wYXJlKGdldEJ1ZmZlcigpLCBnZXROYW1lKCksIHRtZC5nZXROYW1lKCksIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QsIG1lc3NhZ2VzQWZ0ZXJCdWlsZCk7Ci0JCQl9Ci0JCQljYXRjaChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQljYXRjaChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQkJaWYoZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIG1heE1lc3NhZ2VzUmVwb3J0ZWQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUHJvamVjdCBwcm9qZWN0LCBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiB2Y29uZikgewotCQkJRW5hYmxlZFZhbGlkYXRvcnNPcGVyYXRpb24gdmFsaWRPcCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXZhbGlkT3AgPSBuZXcgRW5hYmxlZFZhbGlkYXRvcnNPcGVyYXRpb24ocHJvamVjdCxmYWxzZSk7Ci0JCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bih2YWxpZE9wLCBtb25pdG9yKTsKLQkJCX0KLQkJCWNhdGNoKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJCi0JCQlJTWFya2VyW10gbWVzc2FnZXMgPSBUYXNrTGlzdFV0aWxpdHkuZ2V0VmFsaWRhdGlvblRhc2tzKHByb2plY3QsIElNZXNzYWdlLkFMTF9NRVNTQUdFUyk7Ci0JCQkvL2lmKG1lc3NhZ2VzLmxlbmd0aCA8PSB2Y29uZi5nZXRNYXhpbXVtTnVtYmVyT2ZNZXNzYWdlcygpKzEpIHsgLy8gYWRkIG9uZSBmb3IgdGhlIElXQUQzMDAwIG1lc3NhZ2UsIGkuZS4sICJWYWxpZGF0aW9uIHdhcyB0ZXJtaW5hdGVkIGJlY2F1c2UgdGhlIG1heGltdW0gbnVtYmVyIG9mIG1lc3NhZ2VzIC4uLiIKLQkJCS8vCXJldHVybiB0cnVlOwotCQkJLy99Ci0JCQkKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLX0KLQotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3RGd2svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9md2svdmFsaWRhdG9yL0Z3a05vQnVpbGRUZXN0SGVscGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3RGd2svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9md2svdmFsaWRhdG9yL0Z3a05vQnVpbGRUZXN0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ZTliMDYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0RndrL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvZndrL3ZhbGlkYXRvci9Gd2tOb0J1aWxkVGVzdEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5md2sudmFsaWRhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnZhbGlkYXRpb24uQVdvcmtiZW5jaE1PRkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLklGaWxlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5Xb3JrYmVuY2hGaWxlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotcHVibGljIGNsYXNzIEZ3a05vQnVpbGRUZXN0SGVscGVyIGV4dGVuZHMgQVdvcmtiZW5jaE1PRkhlbHBlciB7Ci0JCi0JcHVibGljIEZ3a05vQnVpbGRUZXN0SGVscGVyKCkgewotCQlzdXBlcigpOwotCQkKLQkJcmVnaXN0ZXJNb2RlbChGd2tUZXN0VmFsaWRhdG9yLkFMTF9GSUxFUywgImxvYWRBbGxGaWxlcyIpOyAvLyROT04tTkxTLTEkCi0JCXJlZ2lzdGVyTW9kZWwoRndrVGVzdFZhbGlkYXRvci5KQVZBSEVMUEVSUywgImxvYWRKYXZhSGVscGVycyIsIG5ldyBDbGFzc1tde0lGaWxlRGVsdGEuY2xhc3N9KTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLnZhbGlkYXRlLklXb3JrYmVuY2hIZWxwZXIjZ2V0VGFyZ2V0T2JqZWN0TmFtZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0T2JqZWN0TmFtZShPYmplY3QgYXJnMCkgewotCQkvLyBObyB0YXJnZXQgb2JqZWN0cyBvdXRzaWRlIG9mIGFuIElSZXNvdXJjZSBhcmUgdXNlZCwgdGhlcmVmb3JlIG5vIHRhcmdldCBvYmplY3QgbmFtZXMgYXJlIG5lZWRlZC4KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElGaWxlRGVsdGFbXSBsb2FkQWxsRmlsZXMoKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KCk7Ci0JCQotCQlmaW5hbCBTZXQgZmlsZXMgPSBuZXcgSGFzaFNldCgpOwotCQlJUmVzb3VyY2VWaXNpdG9yIHZpc2l0b3IgPSBuZXcgSVJlc291cmNlVmlzaXRvcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZSByZXMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQlpZighcmVzLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsgLy8gaWYgdGhlIHJlc291cmNlIGlzbid0IGFjY2Vzc2libGUgdGhlbiBuZWl0aGVyIGFyZSBpdHMgY2hpbGRyZW4KLQkJCQl9Ci0JCQkJCi0JCQkJaWYoKHJlcyBpbnN0YW5jZW9mIElGaWxlKSAmJiAocmVzLmdldEZpbGVFeHRlbnNpb24oKS5lcXVhbHMoImphdmEiKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlXb3JrYmVuY2hGaWxlRGVsdGEgbmV3RmlsZURlbHRhID0gbmV3IFdvcmtiZW5jaEZpbGVEZWx0YShyZXMuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCBJRmlsZURlbHRhLkNIQU5HRUQsIHJlcyk7Ci0JCQkJCWZpbGVzLmFkZChuZXdGaWxlRGVsdGEpOwotCQkJCX0KLQotCQkJCXJldHVybiB0cnVlOyAvLyB2aXNpdCB0aGUgcmVzb3VyY2UncyBjaGlsZHJlbiBhcyB3ZWxsCi0JCQl9Ci0JCX07Ci0KLQkJdHJ5IHsKLQkJCXByb2plY3QuYWNjZXB0KHZpc2l0b3IsIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgdHJ1ZSk7IC8vIHRydWUgbWVhbnMgaW5jbHVkZSBwaGFudG9tIHJlc291cmNlcwotCQl9Ci0JCWNhdGNoKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQlleGMucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJCi0JCUlGaWxlRGVsdGFbXSByZXN1bHQgPSBuZXcgSUZpbGVEZWx0YVtmaWxlcy5zaXplKCldOwotCQlmaWxlcy50b0FycmF5KHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBKYXZhSGVscGVycyBsb2FkSmF2YUhlbHBlcnMoSUZpbGVEZWx0YSBkZWx0YSkgewotCQlXb3JrYmVuY2hGaWxlRGVsdGEgZmQgPSAoV29ya2JlbmNoRmlsZURlbHRhKWRlbHRhOwotCQlJUmVzb3VyY2UgcmVzdWx0ID0gZmQuZ2V0UmVzb3VyY2UoKTsKLQkJaWYocmVzdWx0ICE9IG51bGwpewotCQkJaWYocmVzdWx0IGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCQlyZXR1cm4gSkRUVXRpbGl0eS5nZXRKYXZhSGVscGVycygoSUZpbGUpcmVzdWx0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJLy8gVGhpcyB2YWxpZGF0b3IgdmFsaWRhdGVzIG9ubHkgLmphdmEgZmlsZXMsIHNvIHRoaXMKLQkJCS8vIG11c3QgYmUgYW4gaW5zdGFuY2VvZiBKYXZhQ2xhc3MuCi0JCQlyZXR1cm4gKEphdmFIZWxwZXJzKWZkLmdldE9iamVjdCgpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMudmFsaWRhdGUuSVdvcmtiZW5jaEhlbHBlciNnZXRSZXNvdXJjZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoT2JqZWN0IG9iamVjdCkgewotCQlJUmVzb3VyY2UgcmVzdWx0ID0gc3VwZXIuZ2V0UmVzb3VyY2Uob2JqZWN0KTsKLQkJaWYoKHJlc3VsdCAhPSBudWxsKSAmJiAocmVzdWx0LmV4aXN0cygpKSkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQkKLQkJaWYgKG9iamVjdCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWlmKG9iamVjdCBpbnN0YW5jZW9mIEphdmFIZWxwZXJzKSB7Ci0JCQkvLyBJZiB0aGUgbWVzc2FnZSB3YXMgYWRkZWQgdG8gYSBKYXZhSGVscGVycywgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQuCi0JCQlyZXR1cm4gSkRUVXRpbGl0eS5nZXRSZXNvdXJjZShnZXRQcm9qZWN0KCksIChKYXZhSGVscGVycykgb2JqZWN0KTsKLQkJfQotCQllbHNlIGlmKG9iamVjdCBpbnN0YW5jZW9mIFdvcmtiZW5jaEZpbGVEZWx0YSkgewotCQkJLy8gSWYgdGhlIHdvcmtiZW5jaCBpcyByZW1vdmluZyBtZXNzYWdlcyBmcm9tIGZpbGVzLCBhbmQgdGhlIG9iamVjdCBpcyBzZXQKLQkJCS8vIGluc3RlYWQgb2YgdGhlIElSZXNvdXJjZSwgbmVlZCB0byBwcm9jZXNzIHRoZSBkZWx0YSdzIG9iamVjdCBpbnN0ZWFkIG9mCi0JCQkvLyBpdHMgcmVzb3VyY2UuCi0JCQlyZXR1cm4gSkRUVXRpbGl0eS5nZXRSZXNvdXJjZShnZXRQcm9qZWN0KCksIChKYXZhSGVscGVycykoKFdvcmtiZW5jaEZpbGVEZWx0YSlvYmplY3QpLmdldE9iamVjdCgpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy52YWxpZGF0ZS5BV29ya2JlbmNoSGVscGVyI2dldExpbmVObyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGluZU5vKE9iamVjdCBvYmplY3QpIHsKLQkJaW50IGxpbmVObyA9IHN1cGVyLmdldExpbmVObyhvYmplY3QpOwotCQlpZihsaW5lTm8gPT0gSU1lc3NhZ2UuTElORU5PX1VOU0VUKSB7Ci0JCQkvLyBObyBhZGFwdGVycywgc28gZnVkZ2UgdGhlIGxpbmUgbnVtYmVyIGJ5IGFkZGluZyB0aGUgbWVzc2FnZSB0byB0aGUgZmlyc3QgbGluZSBpbiB0aGUgZmlsZS4KLQkJCXJldHVybiAxOwotCQl9Ci0JCXJldHVybiBsaW5lTm87Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3RGd2svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9md2svdmFsaWRhdG9yL0Z3a05vQnVpbGRUZXN0VmFsaWRhdG9yLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3RGd2svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9md2svdmFsaWRhdG9yL0Z3a05vQnVpbGRUZXN0VmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4MjQyZjAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0RndrL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvZndrL3ZhbGlkYXRvci9Gd2tOb0J1aWxkVGVzdFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmZ3ay52YWxpZGF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLklGaWxlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuTG9jYWxpemVkTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLQotcHVibGljIGNsYXNzIEZ3a05vQnVpbGRUZXN0VmFsaWRhdG9yIGltcGxlbWVudHMgSVZhbGlkYXRvciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxMX0ZJTEVTID0gIkFMTF9GSUxFUyI7IC8vIExvYWQgYWxsIElGaWxlRGVsdGFzIGZvciB0aGUgZW50aXJlIGNvbnRlbnRzIG9mIHRoZSBjdXJyZW50IHByb2plY3QuIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBSEVMUEVSUyA9ICJKQVZBSEVMUEVSUyI7IC8vIFRoZSBKYXZhQ2xhc3MgdGhhdCB0aGUgSUZpbGVEZWx0YSBtYXBzIHRvLiAvLyROT04tTkxTLTEkCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy52YWxpZGF0aW9uLklWYWxpZGF0b3IjY2xlYW51cChjb20uaWJtLmV0b29scy52YWxpZGF0aW9uLklSZXBvcnRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhbnVwKElSZXBvcnRlciByZXBvcnRlcikgewotCQkvLyBOb3RoaW5nIGlzIGNhY2hlZCwgc28gbm90aGluZyB0byBkby4KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy52YWxpZGF0aW9uLklWYWxpZGF0b3IjdmFsaWRhdGUoY29tLmlibS5ldG9vbHMudmFsaWRhdGlvbi5JSGVscGVyLCBjb20uaWJtLmV0b29scy52YWxpZGF0aW9uLklSZXBvcnRlciwgY29tLmlibS5ldG9vbHMudmFsaWRhdGlvbi5JRmlsZURlbHRhW10pCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlciwgSVJlcG9ydGVyIHJlcG9ydGVyKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCUlGaWxlRGVsdGFbXSBkZWx0YSA9IG51bGwgOwotCQlpZigoZGVsdGEgPT0gbnVsbCkgfHwgKGRlbHRhLmxlbmd0aCA9PTApKSB7Ci0JCQkvLyBGdWxsIFZhbGlkYXRlCi0JCQlkZWx0YSA9IChJRmlsZURlbHRhW10paGVscGVyLmxvYWRNb2RlbChBTExfRklMRVMpOwotCQl9Ci0JCQotCQlpZihkZWx0YSA9PSBudWxsKSB7Ci0JCQkvLyBQcm9ibGVtIGxvYWRpbmcgdGhlIGZpbGVzCi0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWZvcihpbnQgaT0wOyBpPGRlbHRhLmxlbmd0aDsgaSsrKSB7Ci0JCQlKYXZhSGVscGVycyB0YXJnZXQgPSAoSmF2YUhlbHBlcnMpaGVscGVyLmxvYWRNb2RlbChKQVZBSEVMUEVSUywgbmV3IE9iamVjdFtde2RlbHRhW2ldfSk7Ci0JCQlMb2NhbGl6ZWRNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShJTWVzc2FnZS5MT1dfU0VWRVJJVFksICJUaGlzIGlzIGEgdGVzdCBtZXNzYWdlIGZvciB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmssIHJlcG9ydGVkIGJ5IFZGIE5vQnVpbGQgVGVzdCBWYWxpZGF0b3IuIFBsZWFzZSBpZ25vcmUuIiwgdGFyZ2V0KTsgLy8kTk9OLU5MUy0xJAotCQkJcmVwb3J0ZXIuYWRkTWVzc2FnZSh0aGlzLCBtZXNzYWdlKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0RndrL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvZndrL3ZhbGlkYXRvci9Gd2tUZXN0SGVscGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3RGd2svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9md2svdmFsaWRhdG9yL0Z3a1Rlc3RIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI3NGU1NS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3RGd2svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9md2svdmFsaWRhdG9yL0Z3a1Rlc3RIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuZndrLnZhbGlkYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC52YWxpZGF0aW9uLkFXb3JrYmVuY2hNT0ZIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5JRmlsZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuV29ya2JlbmNoRmlsZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLXB1YmxpYyBjbGFzcyBGd2tUZXN0SGVscGVyIGV4dGVuZHMgQVdvcmtiZW5jaE1PRkhlbHBlciB7Ci0JCi0JcHVibGljIEZ3a1Rlc3RIZWxwZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCQotCQlyZWdpc3Rlck1vZGVsKEZ3a1Rlc3RWYWxpZGF0b3IuQUxMX0ZJTEVTLCAibG9hZEFsbEZpbGVzIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVnaXN0ZXJNb2RlbChGd2tUZXN0VmFsaWRhdG9yLkpBVkFIRUxQRVJTLCAibG9hZEphdmFIZWxwZXJzIiwgbmV3IENsYXNzW117SUZpbGVEZWx0YS5jbGFzc30pOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMudmFsaWRhdGUuSVdvcmtiZW5jaEhlbHBlciNnZXRUYXJnZXRPYmplY3ROYW1lKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUYXJnZXRPYmplY3ROYW1lKE9iamVjdCBhcmcwKSB7Ci0JCS8vIE5vIHRhcmdldCBvYmplY3RzIG91dHNpZGUgb2YgYW4gSVJlc291cmNlIGFyZSB1c2VkLCB0aGVyZWZvcmUgbm8gdGFyZ2V0IG9iamVjdCBuYW1lcyBhcmUgbmVlZGVkLgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSUZpbGVEZWx0YVtdIGxvYWRBbGxGaWxlcygpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoKTsKLQkJCi0JCWZpbmFsIFNldCBmaWxlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCUlSZXNvdXJjZVZpc2l0b3IgdmlzaXRvciA9IG5ldyBJUmVzb3VyY2VWaXNpdG9yKCkgewotCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlIHJlcykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCWlmKCFyZXMuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOyAvLyBpZiB0aGUgcmVzb3VyY2UgaXNuJ3QgYWNjZXNzaWJsZSB0aGVuIG5laXRoZXIgYXJlIGl0cyBjaGlsZHJlbgotCQkJCX0KLQkJCQkKLQkJCQlpZigocmVzIGluc3RhbmNlb2YgSUZpbGUpICYmICggKHJlcy5nZXRGaWxlRXh0ZW5zaW9uKCkgIT0gbnVsbCkgJiYgcmVzLmdldEZpbGVFeHRlbnNpb24oKS5lcXVhbHMoImphdmEiKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlXb3JrYmVuY2hGaWxlRGVsdGEgbmV3RmlsZURlbHRhID0gbmV3IFdvcmtiZW5jaEZpbGVEZWx0YShyZXMuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCBJRmlsZURlbHRhLkNIQU5HRUQsIHJlcyk7Ci0JCQkJCWZpbGVzLmFkZChuZXdGaWxlRGVsdGEpOwotCQkJCX0KLQotCQkJCXJldHVybiB0cnVlOyAvLyB2aXNpdCB0aGUgcmVzb3VyY2UncyBjaGlsZHJlbiBhcyB3ZWxsCi0JCQl9Ci0JCX07Ci0KLQkJdHJ5IHsKLQkJCXByb2plY3QuYWNjZXB0KHZpc2l0b3IsIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgdHJ1ZSk7IC8vIHRydWUgbWVhbnMgaW5jbHVkZSBwaGFudG9tIHJlc291cmNlcwotCQl9Ci0JCWNhdGNoKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQlleGMucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJCi0JCUlGaWxlRGVsdGFbXSByZXN1bHQgPSBuZXcgSUZpbGVEZWx0YVtmaWxlcy5zaXplKCldOwotCQlmaWxlcy50b0FycmF5KHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBKYXZhSGVscGVycyBsb2FkSmF2YUhlbHBlcnMoSUZpbGVEZWx0YSBkZWx0YSkgewotCQlXb3JrYmVuY2hGaWxlRGVsdGEgZmQgPSAoV29ya2JlbmNoRmlsZURlbHRhKWRlbHRhOwotCQlJUmVzb3VyY2UgcmVzdWx0ID0gZmQuZ2V0UmVzb3VyY2UoKTsKLQkJaWYocmVzdWx0ICE9IG51bGwpewotCQkJaWYocmVzdWx0IGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCQlyZXR1cm4gSkRUVXRpbGl0eS5nZXRKYXZhSGVscGVycygoSUZpbGUpcmVzdWx0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJLy8gVGhpcyB2YWxpZGF0b3IgdmFsaWRhdGVzIG9ubHkgLmphdmEgZmlsZXMsIHNvIHRoaXMKLQkJCS8vIG11c3QgYmUgYW4gaW5zdGFuY2VvZiBKYXZhQ2xhc3MuCi0JCQlyZXR1cm4gKEphdmFIZWxwZXJzKWZkLmdldE9iamVjdCgpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMudmFsaWRhdGUuSVdvcmtiZW5jaEhlbHBlciNnZXRSZXNvdXJjZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoT2JqZWN0IG9iamVjdCkgewotCQlJUmVzb3VyY2UgcmVzdWx0ID0gc3VwZXIuZ2V0UmVzb3VyY2Uob2JqZWN0KTsKLQkJaWYoKHJlc3VsdCAhPSBudWxsKSAmJiAocmVzdWx0LmV4aXN0cygpKSkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQkKLQkJaWYgKG9iamVjdCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWlmKG9iamVjdCBpbnN0YW5jZW9mIEphdmFIZWxwZXJzKSB7Ci0JCQkvLyBJZiB0aGUgbWVzc2FnZSB3YXMgYWRkZWQgdG8gYSBKYXZhSGVscGVycywgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQuCi0JCQlyZXR1cm4gSkRUVXRpbGl0eS5nZXRSZXNvdXJjZShnZXRQcm9qZWN0KCksIChKYXZhSGVscGVycykgb2JqZWN0KTsKLQkJfQotCQllbHNlIGlmKG9iamVjdCBpbnN0YW5jZW9mIFdvcmtiZW5jaEZpbGVEZWx0YSkgewotCQkJLy8gSWYgdGhlIHdvcmtiZW5jaCBpcyByZW1vdmluZyBtZXNzYWdlcyBmcm9tIGZpbGVzLCBhbmQgdGhlIG9iamVjdCBpcyBzZXQKLQkJCS8vIGluc3RlYWQgb2YgdGhlIElSZXNvdXJjZSwgbmVlZCB0byBwcm9jZXNzIHRoZSBkZWx0YSdzIG9iamVjdCBpbnN0ZWFkIG9mCi0JCQkvLyBpdHMgcmVzb3VyY2UuCi0JCQlyZXR1cm4gSkRUVXRpbGl0eS5nZXRSZXNvdXJjZShnZXRQcm9qZWN0KCksIChKYXZhSGVscGVycykoKFdvcmtiZW5jaEZpbGVEZWx0YSlvYmplY3QpLmdldE9iamVjdCgpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy52YWxpZGF0ZS5BV29ya2JlbmNoSGVscGVyI2dldExpbmVObyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGluZU5vKE9iamVjdCBvYmplY3QpIHsKLQkJaW50IGxpbmVObyA9IHN1cGVyLmdldExpbmVObyhvYmplY3QpOwotCQlpZihsaW5lTm8gPT0gSU1lc3NhZ2UuTElORU5PX1VOU0VUKSB7Ci0JCQkvLyBObyBhZGFwdGVycywgc28gZnVkZ2UgdGhlIGxpbmUgbnVtYmVyIGJ5IGFkZGluZyB0aGUgbWVzc2FnZSB0byB0aGUgZmlyc3QgbGluZSBpbiB0aGUgZmlsZS4KLQkJCXJldHVybiAxOwotCQl9Ci0JCXJldHVybiBsaW5lTm87Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3RGd2svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9md2svdmFsaWRhdG9yL0Z3a1Rlc3RWYWxpZGF0b3IuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdEZ3ay9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2Z3ay92YWxpZGF0b3IvRndrVGVzdFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDFmYWJkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdEZ3ay9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2Z3ay92YWxpZGF0b3IvRndrVGVzdFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmZ3ay52YWxpZGF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLklGaWxlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuTG9jYWxpemVkTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLQotcHVibGljIGNsYXNzIEZ3a1Rlc3RWYWxpZGF0b3IgaW1wbGVtZW50cyBJVmFsaWRhdG9yIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTExfRklMRVMgPSAiQUxMX0ZJTEVTIjsgLy8gTG9hZCBhbGwgSUZpbGVEZWx0YXMgZm9yIHRoZSBlbnRpcmUgY29udGVudHMgb2YgdGhlIGN1cnJlbnQgcHJvamVjdC4gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFIRUxQRVJTID0gIkpBVkFIRUxQRVJTIjsgLy8gVGhlIEphdmFDbGFzcyB0aGF0IHRoZSBJRmlsZURlbHRhIG1hcHMgdG8uIC8vJE5PTi1OTFMtMSQKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24uSVZhbGlkYXRvciNjbGVhbnVwKGNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24uSVJlcG9ydGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFudXAoSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCS8vIE5vdGhpbmcgaXMgY2FjaGVkLCBzbyBub3RoaW5nIHRvIGRvLgotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24uSVZhbGlkYXRvciN2YWxpZGF0ZShjb20uaWJtLmV0b29scy52YWxpZGF0aW9uLklIZWxwZXIsIGNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24uSVJlcG9ydGVyLCBjb20uaWJtLmV0b29scy52YWxpZGF0aW9uLklGaWxlRGVsdGFbXSkKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJSUZpbGVEZWx0YVtdIGRlbHRhID0gbnVsbDsKLQkJaWYoKGRlbHRhID09IG51bGwpIHx8IChkZWx0YS5sZW5ndGggPT0wKSkgewotCQkJLy8gRnVsbCBWYWxpZGF0ZQotCQkJZGVsdGEgPSAoSUZpbGVEZWx0YVtdKWhlbHBlci5sb2FkTW9kZWwoQUxMX0ZJTEVTKTsKLQkJfQotCQkKLQkJaWYoZGVsdGEgPT0gbnVsbCkgewotCQkJLy8gUHJvYmxlbSBsb2FkaW5nIHRoZSBmaWxlcwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlmb3IoaW50IGk9MDsgaTxkZWx0YS5sZW5ndGg7IGkrKykgewotCQkJSmF2YUhlbHBlcnMgdGFyZ2V0ID0gKEphdmFIZWxwZXJzKWhlbHBlci5sb2FkTW9kZWwoSkFWQUhFTFBFUlMsIG5ldyBPYmplY3RbXXtkZWx0YVtpXX0pOwotCQkJTG9jYWxpemVkTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoSU1lc3NhZ2UuTE9XX1NFVkVSSVRZLCAiVGhpcyBpcyBhIHRlc3QgbWVzc2FnZSBmb3IgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLCByZXBvcnRlZCBieSBWRiBUZXN0IFZhbGlkYXRvci4gUGxlYXNlIGlnbm9yZS4iLCB0YXJnZXQpOyAvLyROT04tTkxTLTEkCi0JCQlyZXBvcnRlci5hZGRNZXNzYWdlKHRoaXMsIG1lc3NhZ2UpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3RGd2svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9md2svdmFsaWRhdG9yL0pEVFV0aWxpdHkuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdEZ3ay9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2Z3ay92YWxpZGF0b3IvSkRUVXRpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Mzk2ZjFjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdEZ3ay9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2Z3ay92YWxpZGF0b3IvSkRUVXRpbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5md2sudmFsaWRhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnBsdWdpbi5KYXZhRU1GTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5CVlRWYWxpZGF0aW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuZndrLlRlc3RPcENvbnN0cklucHV0T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwucmVnaXN0cnkuQlZUVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwucmVnaXN0cnkuVmFsaWRhdG9yVGVzdGNhc2U7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNvbnRhaW5zIHNvbWUgdXRpbGl0eSBtZXRob2RzIHVzZWQgdG8gCi0gKiBhY2Nlc3MsIG1hbmlwdWxhdGUsIGV0Yy4gamR0IHR5cGVzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgSkRUVXRpbGl0eSB7Ci0JcHJpdmF0ZSBKRFRVdGlsaXR5KCkgewotCQkvLyBEbyBub3QgbmVlZCBhbnkgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MuCi0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgY29udGFpbmVycyBpbiB0aGUgZ2l2ZW4gcHJvamVjdCB0aGF0IGNvbnRhaW4gZWl0aGVyCi0JICogLmphdmEgc291cmNlIGZpbGVzIG9yIC5jbGFzcyBiaW5hcnkgZmlsZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBJQ29udGFpbmVyW10gZ2V0SmF2YUNvbnRhaW5lcnMoSUphdmFQcm9qZWN0IGpwKSB7Ci0JCWlmIChqcCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUlQcm9qZWN0IHByb2plY3QgPSBqcC5nZXRQcm9qZWN0KCk7Ci0JCUlDbGFzc3BhdGhFbnRyeVtdIGNsYXNzcGF0aCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQljbGFzc3BhdGggPSBqcC5nZXRSZXNvbHZlZENsYXNzcGF0aCh0cnVlKTsgLy8gdHJ1ZSBtZWFucyBpZ25vcmUgdW5yZXNvbHZlZCAobWlzc2luZykgdmFyaWFibGVzLCBpbnN0ZWFkIG9mIHRocm93aW5nIGFuIGV4Y2VwdGlvbgotCQl9Ci0JCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXhjKSB7Ci0JCQlleGMucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWlmIChjbGFzc3BhdGggPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBUcmF2ZXJzZSB0aGUgY2xhc3NwYXRoLCBhbmQgY2FsY3VsYXRlIGEgbGlzdCBvZiBqdXN0IHRoZSAKLQkJLy8gSUZvbGRlcnMgYW5kIElQcm9qZWN0cyAoaS5lLiwgSUNvbnRhaW5lcnMpIHRoYXQgY29udGFpbiBzb3VyY2UKLQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCUlDb250YWluZXJbXSBpY29udGFpbmVycyA9IG5ldyBJQ29udGFpbmVyW2NsYXNzcGF0aC5sZW5ndGhdOwotCQlpbnQgdmFsaWRDb3VudCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3NwYXRoLmxlbmd0aDsgaSsrKSB7Ci0JCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBjbGFzc3BhdGhbaV07Ci0JCQlpZiAoZW50cnkuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UpIHsKLQkJCQlJUmVzb3VyY2UgcmVzID0gcm9vdC5maW5kTWVtYmVyKGVudHJ5LmdldFBhdGgoKSk7Ci0JCQkJaWYocmVzID09IG51bGwpIHsKLQkJCQkJLy8gbm90IGluIHRoZSB3b3Jrc3BhY2UKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJaWYoIXJlcy5nZXRQcm9qZWN0KCkuZXF1YWxzKHByb2plY3QpKSB7Ci0JCQkJCS8vIGluIGEgZGlmZmVyZW50IHByb2plY3QKLQkJCQkJY29udGludWU7Ci0JCQkJfQkJCQkKLQotCQkJCWlmIChyZXMgaW5zdGFuY2VvZiBJQ29udGFpbmVyKSB7Ci0JCQkJCWljb250YWluZXJzW3ZhbGlkQ291bnQrK10gPSAoSUNvbnRhaW5lcikgcmVzOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXRyeSB7Ci0JCQlJQ29udGFpbmVyIG91dHB1dENvbnRhaW5lciA9IChJQ29udGFpbmVyKXJvb3QuZmluZE1lbWJlcihqcC5nZXRPdXRwdXRMb2NhdGlvbigpKTsKLQkJCUlDb250YWluZXJbXSBjb250YWluZXJzID0gbnVsbDsKLQkJCWlmKG91dHB1dENvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQkJY29udGFpbmVycyA9IG5ldyBJQ29udGFpbmVyW3ZhbGlkQ291bnRdOwotCQkJfQotCQkJZWxzZSBpZihvdXRwdXRDb250YWluZXIuZ2V0UHJvamVjdCgpLmVxdWFscyhwcm9qZWN0KSkgewotCQkJCWNvbnRhaW5lcnMgPSBuZXcgSUNvbnRhaW5lclt2YWxpZENvdW50KzFdOwotCQkJCWNvbnRhaW5lcnNbdmFsaWRDb3VudF0gPSBvdXRwdXRDb250YWluZXI7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQljb250YWluZXJzID0gbmV3IElDb250YWluZXJbdmFsaWRDb3VudF07Ci0JCQl9Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGljb250YWluZXJzLCAwLCBjb250YWluZXJzLCAwLCB2YWxpZENvdW50KTsKLQkJCXJldHVybiBjb250YWluZXJzOwotCQl9Ci0JCWNhdGNoKEphdmFNb2RlbEV4Y2VwdGlvbiBleGMpIHsKLQkJCWV4Yy5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgSVR5cGUgdGhhdCByZXByZXNlbnRzIHRoaXMgZmlsZSwgb3IgbnVsbCBpZiBub25lIGV4aXN0cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElUeXBlIGdldFR5cGUoSUNvbnRhaW5lcltdIGphdmFDb250YWluZXJzLCBJRmlsZSBmaWxlKSB7Ci0JCWlmKGZpbGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCVN0cmluZyBmaWxlRXh0ZW5zaW9uID0gZmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCk7Ci0JCWlmKGZpbGVFeHRlbnNpb24gPT0gbnVsbCkgewotCQkJLy8gbm90IGEgLmphdmEgb3IgYSAuY2xhc3MgZmlsZQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCWlmKCEoZmlsZUV4dGVuc2lvbi5lcXVhbHMoImphdmEiKSB8fCBmaWxlRXh0ZW5zaW9uLmVxdWFscygiY2xhc3MiKSkpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJSVByb2plY3QgcHJvamVjdCA9IGZpbGUuZ2V0UHJvamVjdCgpOwotCQlJSmF2YVByb2plY3QganAgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCWlmKGpwID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQl0cnkgewotCQkJSVBhdGggcmVsYXRpdmVQYXRoID0gZ2V0UmVsYXRpdmVQYXRoKGphdmFDb250YWluZXJzLCBmaWxlKTsKLQkJCWlmKHJlbGF0aXZlUGF0aCA9PSBudWxsKSB7Ci0JCQkJLy8gTm90IGEgbWVtYmVyIG9mIGEgc291cmNlIG9yIG91dHB1dCBjb250YWluZXIKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJSVBhdGggcGFja2FnZVBhdGggPSByZWxhdGl2ZVBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpOwotCQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gcGFja2FnZVBhdGgudG9TdHJpbmcoKS5yZXBsYWNlKElQYXRoLlNFUEFSQVRPUiwgJy4nKTsKLQkJCVN0cmluZyB0eXBlTmFtZSA9IHJlbGF0aXZlUGF0aC5sYXN0U2VnbWVudCgpOwotCQkJdHlwZU5hbWUgPSB0eXBlTmFtZS5zdWJzdHJpbmcoMCwgdHlwZU5hbWUubGVuZ3RoKCkgLSBmaWxlRXh0ZW5zaW9uLmxlbmd0aCgpIC0gMSk7Ci0JCQlTdHJpbmcgcXVhbGlmaWVkTmFtZSA9IG51bGw7Ci0JCQlpZiAocGFja2FnZU5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJcXVhbGlmaWVkTmFtZSA9IHBhY2thZ2VOYW1lICsgIi4iICsgdHlwZU5hbWU7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSB7Ci0JCQkJcXVhbGlmaWVkTmFtZSA9IHR5cGVOYW1lOwotCQkJfQotCQkJcmV0dXJuIGpwLmZpbmRUeXBlKHF1YWxpZmllZE5hbWUpOwotCQl9Ci0JCWNhdGNoKEphdmFNb2RlbEV4Y2VwdGlvbiBleGMpIHsKLQkJCWV4Yy5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgSVBhdGggb2YgdGhlIHJlc291cmNlIHJlbGF0aXZlIHRvIHRoZSBmaXJzdCBjb250YWluZXIgdGhhdCB0aGUKLQkgKiByZXNvdXJjZSBpcyBmb3VuZCBpbi4gSWYgdGhlIHJlc291cmNlIGlzIGNvbnRhaW5lZCBpbiBtb3JlIHRoYW4gb25lIGNvbnRhaW5lcgotCSAqIGluIHRoZSBhcnJheSwgcmV0dXJuIHRoZSBmaXJzdCBJUGF0aCBmb3VuZC4gSWYgdGhlIHJlc291cmNlIGlzIG5vdCBhIG1lbWJlcgotCSAqIG9mIGFueSBvZiB0aGUgY29udGFpbmVycywgcmV0dXJuIG51bGwuCi0JICovCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRSZWxhdGl2ZVBhdGgoSUNvbnRhaW5lcltdIGNvbnRhaW5lcnMsIElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlmb3IoaW50IGk9MDsgaTxjb250YWluZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJUGF0aCBwYXRoID0gZ2V0UmVsYXRpdmVQYXRoKGNvbnRhaW5lcnNbaV0sIHJlc291cmNlKTsKLQkJCWlmKHBhdGggIT0gbnVsbCkgewotCQkJCXJldHVybiBwYXRoOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBJUGF0aCBvZiBhIHJlc291cmNlIHJlbGF0aXZlIHRvIHRoZSBjb250YWluZXIuCi0JICogSWYgdGhlIElSZXNvdXJjZSBpcyBub3QgYSBtZW1iZXIgb2YgdGhlIGNvbnRhaW5lciwgcmV0dXJuIG51bGwuIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0UmVsYXRpdmVQYXRoKElDb250YWluZXIgY29udGFpbmVyLCBJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJaWYgKChyZXNvdXJjZSA9PSBudWxsKSB8fCAoY29udGFpbmVyID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIElzIHRoZSBwYXRoIHBhcnQgb2YgdGhlIElDb250YWluZXI/Ci0JCWludCBtYXRjaGluZ0ZpcnN0U2VnbWVudHMgPSBjb250YWluZXIuZ2V0RnVsbFBhdGgoKS5tYXRjaGluZ0ZpcnN0U2VnbWVudHMocmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSk7Ci0JCWlmKG1hdGNoaW5nRmlyc3RTZWdtZW50cyA9PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS5yZW1vdmVGaXJzdFNlZ21lbnRzKG1hdGNoaW5nRmlyc3RTZWdtZW50cyk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSmF2YUhlbHBlcnMgZ2V0SmF2YUhlbHBlcnMoSUZpbGUgZmlsZSkgewotCQlJVHlwZSB0eXBlID0gZ2V0VHlwZShmaWxlKTsKLQkJaWYodHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJcmV0dXJuIGdldEphdmFIZWxwZXJzKHR5cGUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElUeXBlIGdldFR5cGUoSUZpbGUgZmlsZSkgewotCQlJSmF2YVByb2plY3QganAgPSBKYXZhQ29yZS5jcmVhdGUoZmlsZS5nZXRQcm9qZWN0KCkpOwotCQlJQ29udGFpbmVyW10gamF2YUNvbnRhaW5lcnMgPSAoanAgPT0gbnVsbCkgPyBudWxsIDogSkRUVXRpbGl0eS5nZXRKYXZhQ29udGFpbmVycyhqcCk7Ci0JCWlmKGphdmFDb250YWluZXJzICE9IG51bGwpIHsKLQkJCXJldHVybiBKRFRVdGlsaXR5LmdldFR5cGUoamF2YUNvbnRhaW5lcnMsIGZpbGUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSmF2YUhlbHBlcnMgZ2V0SmF2YUhlbHBlcnMoSVR5cGUgdHlwZSkgewotCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IGdldFJlc291cmNlU2V0KHR5cGUpOwotCQlpZihyZXNvdXJjZVNldCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLnJlZmxlY3RUeXBlKHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCksIHJlc291cmNlU2V0KTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZVNldCBnZXRSZXNvdXJjZVNldChJVHlwZSB0eXBlKSB7Ci0JCUphdmFFTUZOYXR1cmUgbmF0dXJlID0gZ2V0TmF0dXJlKHR5cGUpOwotCQlpZihuYXR1cmUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIG5hdHVyZS5nZXRSZXNvdXJjZVNldCgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSmF2YUVNRk5hdHVyZSBnZXROYXR1cmUoSVR5cGUgdHlwZSkgewotCQlJSmF2YVByb2plY3QganAgPSB0eXBlLmdldEphdmFQcm9qZWN0KCk7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBqcC5nZXRQcm9qZWN0KCk7Ci0JCQotCQl0cnkgewotCQkJSmF2YUVNRk5hdHVyZSBuYXR1cmUgPSBKYXZhRU1GTmF0dXJlLmNyZWF0ZVJ1bnRpbWUocHJvamVjdCk7Ci0JCQlyZXR1cm4gbmF0dXJlOwotCQl9Ci0JCWNhdGNoKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQlleGMucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVJlc291cmNlIGdldFJlc291cmNlKElQcm9qZWN0IHByb2plY3QsIEphdmFIZWxwZXJzIGNsYXp6KSB7Ci0JCUlUeXBlIHR5cGUgPSBnZXRUeXBlKHByb2plY3QsIGNsYXp6KTsKLQkJcmV0dXJuIHR5cGUuZ2V0UmVzb3VyY2UoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElUeXBlIGdldFR5cGUoSVByb2plY3QgcHJvamVjdCwgSmF2YUhlbHBlcnMgY2xhenopIHsKLQkJaWYoY2xhenogPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCVN0cmluZyBmdWxseVF1YWxpZmllZE5hbWUgPSBjbGF6ei5nZXRKYXZhTmFtZSgpOwotCQlJSmF2YVByb2plY3QganAgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4ganAuZmluZFR5cGUoZnVsbHlRdWFsaWZpZWROYW1lKTsKLQkJfQotCQljYXRjaChKYXZhTW9kZWxFeGNlcHRpb24gZXhjKSB7Ci0JCQlleGMucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgdGhyZWUgdmFsaWRhdG9yIHRlc3QgY2FzZXMgdXNlZCB0byB0ZXN0IHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFZhbGlkYXRvclRlc3RjYXNlW10gZ2V0VkZUZXN0cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJVmFsaWRhdG9yVGVzdGNhc2VbXSB0bWRzID0gQlZUVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmdldEFsbFZhbGlkYXRvclRlc3RzKG1vbml0b3IsIHByb2plY3QpOwotCQlpZigodG1kcyA9PSBudWxsKSB8fCAodG1kcy5sZW5ndGggPT0gMCkpIHsKLQkJCXJldHVybiBuZXcgVmFsaWRhdG9yVGVzdGNhc2VbMF07Ci0JCX0KLQkJCi0JCVZhbGlkYXRvclRlc3RjYXNlIGZ3a05vYnVpbGRUZXN0VE1EID0gbnVsbDsKLQkJVmFsaWRhdG9yVGVzdGNhc2UgZndrVGVzdFRNRCA9IG51bGw7Ci0JCVZhbGlkYXRvclRlc3RjYXNlIHByb3BUTUQgPSBudWxsOwotCQlWYWxpZGF0b3JUZXN0Y2FzZVtdIHJlc3VsdCA9IG5ldyBWYWxpZGF0b3JUZXN0Y2FzZVszXTsKLQkJaW50IGNvdW50ID0gMDsKLQkJZm9yKGludCBpPTA7IGk8dG1kcy5sZW5ndGg7IGkrKykgewotCQkJVmFsaWRhdG9yVGVzdGNhc2UgdG1kID0gdG1kc1tpXTsKLQkJCWlmKHRtZC5nZXRWYWxpZGF0b3JDbGFzcygpLmVxdWFscyhUZXN0T3BDb25zdHJJbnB1dE9wZXJhdGlvbi5GV0tfVEVTVF9WQUxJREFUT1JfQ0xBU1MpKSB7Ci0JCQkJZndrVGVzdFRNRCA9IHRtZDsKLQkJCQlyZXN1bHRbY291bnQrK10gPSB0bWQ7Ci0JCQl9Ci0JCQllbHNlIGlmKHRtZC5nZXRWYWxpZGF0b3JDbGFzcygpLmVxdWFscyhUZXN0T3BDb25zdHJJbnB1dE9wZXJhdGlvbi5QUk9QRVJUSUVTX1ZBTElEQVRPUl9DTEFTUykpIHsKLQkJCQlwcm9wVE1EID0gdG1kOwotCQkJCXJlc3VsdFtjb3VudCsrXSA9IHRtZDsKLQkJCX0KLQkJCWVsc2UgaWYodG1kLmdldFZhbGlkYXRvckNsYXNzKCkuZXF1YWxzKFRlc3RPcENvbnN0cklucHV0T3BlcmF0aW9uLkZXS19OT0JVSUxEX1RFU1RfVkFMSURBVE9SX0NMQVNTKSkgewotCQkJCWZ3a05vYnVpbGRUZXN0VE1EID0gdG1kOwotCQkJCXJlc3VsdFtjb3VudCsrXSA9IHRtZDsKLQkJCX0KLQkJCQotCQkJaWYoKGZ3a1Rlc3RUTUQgIT0gbnVsbCkgJiYgKHByb3BUTUQgIT0gbnVsbCkgJiYgKGZ3a05vYnVpbGRUZXN0VE1EICE9IG51bGwpKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmKGNvdW50ICE9IHJlc3VsdC5sZW5ndGgpIHsKLQkJCS8vIE9uIHRoaXMgcHJvamVjdCwgbm90IGFsbCBvZiB0aGUgdGVzdCB2YWxpZGF0b3JzIGFyZSB1c2VkLgotCQkJVmFsaWRhdG9yVGVzdGNhc2VbXSByID0gbmV3IFZhbGlkYXRvclRlc3RjYXNlW2NvdW50XTsKLQkJCVN5c3RlbS5hcnJheWNvcHkocmVzdWx0LCAwLCByLCAwLCBjb3VudCk7Ci0JCQlyZXR1cm4gcjsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEF1dG9CdWlsZChib29sZWFuIGF1dG9CdWlsZEVuYWJsZWQpIHsKLQkJdHJ5IHsKLQkJCUlXb3Jrc3BhY2VEZXNjcmlwdGlvbiBkZXNjID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldERlc2NyaXB0aW9uKCk7Ci0JCQlkZXNjLnNldEF1dG9CdWlsZGluZyhhdXRvQnVpbGRFbmFibGVkKTsKLQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5zZXREZXNjcmlwdGlvbihkZXNjKTsKLQkJfQotCQljYXRjaChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3RJbnB1dC9GV0svQlZUL29wQ29uc3RyLmphciBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdElucHV0L0ZXSy9CVlQvb3BDb25zdHIuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTRiMDM3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdElucHV0L0ZXSy9CVlQvb3BDb25zdHIuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0SW5wdXQvUHJvcGVydGllcy9hUHJvcGVydGllcy5qYXIgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3RJbnB1dC9Qcm9wZXJ0aWVzL2FQcm9wZXJ0aWVzLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk2ZjRjZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3RJbnB1dC9Qcm9wZXJ0aWVzL2FQcm9wZXJ0aWVzLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIK