ZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdGVzdHMuZmVhdHVyZS8uY3ZzaWdub3JlIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl90ZXN0cy5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMDRiNjUuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl90ZXN0cy5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl90ZXN0cy5mZWF0dXJlXzEuMC4wLmJpbi5kaXN0LnppcAotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl90ZXN0cy5mZWF0dXJlXzEuMC4xLjIwMDYwMjE1MDEwNC5iaW4uZGlzdC56aXAKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdGVzdHMuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdGVzdHMuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA2OWE4Mi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3Rlc3RzLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QuY29tbW9uX3Rlc3RzLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3Rlc3RzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjQ3Njk0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3Rlc3RzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdGVzdHMuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdGVzdHMuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl90ZXN0cy5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdGVzdHMuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl90ZXN0cy5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3Rlc3RzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl90ZXN0cy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA5YWE3NC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3Rlc3RzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9V1NUIENvbW1vbiBUZXN0cwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVdTVCBjb21tb24gdGVzdHMKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSAwNiwgMjAwN1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLSAgICAtIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl90ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl90ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTVmYjJiLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb25fdGVzdHMuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIzLjAuNC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcy8iLz4KLSAgIDwvdXJsPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZSIgdmVyc2lvbj0iMy4wLjAiLz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UucGxhdGZvcm0iIHZlcnNpb249IjMuNC4wIi8+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLnRlc3QiIHZlcnNpb249IjMuMy4wIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3IiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMucGVyZm9ybWFuY2UiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uc25pcHBldHMudGVzdHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS50ZXN0cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS50ZXN0cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24uZ3VhcmQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdGVzdHMuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3Rlc3RzLmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjQ0NTk4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdGVzdHMuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53M2Mub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvbG9vc2UuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+Ci08SFRNTD48SEVBRD48VElUTEU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L1RJVExFPgotPE1FVEEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPE1FVEEgY29udGVudD0iTVNIVE1MIDYuMDAuMjgwMC4xNDc5IiBuYW1lPUdFTkVSQVRPUj48L0hFQUQ+Ci08Qk9EWSBsYW5nPUVOLVVTIHZMaW5rPXB1cnBsZSBsaW5rPWJsdWU+Ci08SDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9IMj4KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci08SDM+VXNhZ2UgT2YgQ29udGVudDwvSDM+Ci08UD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gCi1BTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRiAKLVRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgCi1CRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIAotQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIAotQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIAotQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgCi1NQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L1A+Ci08SDM+QXBwbGljYWJsZSBMaWNlbnNlczwvSDM+Ci08UD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgCi1Gb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgCi1QdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8QSAKLWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotPFA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgCi0oIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIAotYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L1A+Ci08UD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgCi0oIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgCi1QbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSAKLWNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIAotYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyAKLW5hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgImZlYXR1cmVzIi48L1A+Ci08UD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWQgCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCAKLUZlYXR1cmVzLjwvUD4KLTxQPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIAotaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgCi1GZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAKLSgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IAotZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgCi1sb2NhdGlvbnM6PC9QPgotPFVMPgotICA8TEk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5IAotICA8TEk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXMgCi0gIDxMST5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnMgCi0gIDxMST5GZWF0dXJlIGRpcmVjdG9yaWVzIDwvTEk+PC9VTD4KLTxQPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCAKLXVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSAKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCAKLUZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gCi1sb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgCi1maWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgCi1VcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyAKLWFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgCi1kaXJlY3RvcnkuPC9QPgotPFA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgCi1PUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UgCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvUD4KLTxVTD4KLSAgPExJPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L0E+KSAKLQotICA8TEk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L0E+KSAKLQotICA8TEk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvQT4pIAotCi0gIDxMST5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9BPikgCi0gIDwvTEk+Ci0gICAgCi0gIDxMST5Db21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwiPmh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCk8L0E+Ci0gIDwvTEk+Ci08L1VMPgotPFA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiAKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIAotcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9QPgotPEgzPkNyeXB0b2dyYXBoeTwvSDM+Ci08UD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciAKLXJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgCi1lbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCi1jb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCAKLXRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L1A+PC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yLy5jbGFzc3BhdGggYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3Rvci8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTM4MmVjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImNvbGxlY3RvciIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3IvLmN2c2lnbm9yZSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkN2I3NDUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3IvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluCi1idWlsZC54bWwKLXJ1bnRpbWUKLXRlbXAuZm9sZGVyCi1qYXZhQ29tcGlsZXIucnVudGltZV9jb2xsZWN0b3IuamFyLmFyZ3MKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yLy5wcm9qZWN0IGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3IvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NDE3NjkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3IvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3RvcjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3Rvci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3Rvci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0MmRhNDEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3IvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jU3VuIEp1biAwMyAwMjoyMDoyMSBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3IvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3Rvci9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE0ZDBkYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3Rvci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3RvcgotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3I7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMS4wCi1CdW5kbGUtQ2xhc3NQYXRoOiBydW50aW1lL2NvbGxlY3Rvci5qYXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuY29tcGF0aWJpbGl0eS5QbHVnaW5BY3RpdmF0b3IKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5qdW5pdDtidW5kbGUtdmVyc2lvbj0iWzMuOC4yLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHkKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yL2Fib3V0Lmh0bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3Rvci9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yL2J1aWxkLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3Rvci9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmIwMDdiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcnVudGltZS9jb2xsZWN0b3IuamFyLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1zb3VyY2UucnVudGltZS9jb2xsZWN0b3IuamFyID0gY29sbGVjdG9yLwotb3V0cHV0LnJ1bnRpbWUvY29sbGVjdG9yLmphciA9IGJpbi8KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yL2NvbGxlY3Rvci9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL2NvbGxlY3Rvci9TdWl0ZUhlbHBlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3IvY29sbGVjdG9yL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvY29sbGVjdG9yL1N1aXRlSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0M2Y4ZWMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3IvY29sbGVjdG9yL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvY29sbGVjdG9yL1N1aXRlSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3RvcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBlZGl0IHRoZSB0ZW1wbGF0ZSB2YXJpYWJsZSAidHlwZWNvbW1lbnQiOgotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+VGVtcGxhdGVzLgotICogVG8gZW5hYmxlIGFuZCBkaXNhYmxlIHRoZSBjcmVhdGlvbiBvZiB0eXBlIGNvbW1lbnRzIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBTdWl0ZUhlbHBlciB7Ci0KLSAgICBwcml2YXRlIEhhc2h0YWJsZSBhbGxUZXN0cyA9IG5ldyBIYXNodGFibGUoKTsKLQotICAgIHB1YmxpYyBTdWl0ZUhlbHBlcihUZXN0U3VpdGUgc3VpdGUpIHsKLSAgICAgICAgYWRkVGVzdChzdWl0ZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFRlc3QoVGVzdCB0ZXN0KSB7Ci0gICAgICAgIGlmICh0ZXN0IGluc3RhbmNlb2YgVGVzdFN1aXRlKSB7Ci0gICAgICAgICAgICBFbnVtZXJhdGlvbiB0ZXN0cyA9ICgoVGVzdFN1aXRlKSB0ZXN0KS50ZXN0cygpOwotICAgICAgICAgICAgd2hpbGUgKHRlc3RzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgVGVzdCB0ID0gKFRlc3QpIHRlc3RzLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgYWxsVGVzdHMucHV0KHQudG9TdHJpbmcoKSwgdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgYWxsVGVzdHMucHV0KHRlc3QudG9TdHJpbmcoKSwgdGVzdCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZ1tdIGdldEFsbFRlc3RzKCkgewotICAgICAgICBBcnJheUxpc3QgdGVzdExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIEVudW1lcmF0aW9uIGVudW1lcmF0aW9uID0gYWxsVGVzdHMua2V5cygpOwotICAgICAgICB3aGlsZSAoZW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIHRlc3RMaXN0LmFkZChlbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpKTsKLSAgICAgICAgfQotICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHRlc3RMaXN0LCBuZXcgQ29tcGFyYXRvcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotICAgICAgICAgICAgICAgIHJldHVybiAoKFN0cmluZykgbzEpLmNvbXBhcmVUbygoKFN0cmluZykgbzIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgU3RyaW5nW10gc3RyQXJyYXkgPSBuZXcgU3RyaW5nW3Rlc3RMaXN0LnNpemUoKV07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyQXJyYXkubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHN0ckFycmF5W2ldID0gKFN0cmluZykgdGVzdExpc3QuZ2V0KGkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHN0ckFycmF5OwotICAgIH0KLQotICAgIHB1YmxpYyBUZXN0U3VpdGUgYnVpbGRTdWl0ZShTdHJpbmdbXSBjb21wbGV0ZVRlc3RzLCBTdHJpbmdbXSBwYXJ0aWFsVGVzdHMpIHsKLSAgICAgICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbXBsZXRlVGVzdHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHN1aXRlLmFkZFRlc3QoKFRlc3QpIGFsbFRlc3RzLmdldChjb21wbGV0ZVRlc3RzW2ldKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJ0aWFsVGVzdHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHN1aXRlLmFkZFRlc3QoZ2V0VGVzdChwYXJ0aWFsVGVzdHNbaV0pKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VpdGU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFRlc3RNZXRob2RzKFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICBBcnJheUxpc3QgbWV0aG9kTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgVGVzdCB0ZXN0ID0gKFRlc3QpIGFsbFRlc3RzLmdldCh0ZXN0TmFtZSk7Ci0gICAgICAgIGlmICh0ZXN0IGluc3RhbmNlb2YgVGVzdFN1aXRlKSB7Ci0gICAgICAgICAgICBFbnVtZXJhdGlvbiB0ZXN0c0VudW0gPSAoKFRlc3RTdWl0ZSkgdGVzdCkudGVzdHMoKTsKLSAgICAgICAgICAgIHdoaWxlICh0ZXN0c0VudW0uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICBUZXN0IHQgPSAoVGVzdCkgdGVzdHNFbnVtLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgbWV0aG9kTGlzdC5hZGQodC50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQobWV0aG9kTGlzdCwgbmV3IENvbXBhcmF0b3IoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKChTdHJpbmcpIG8xKS5jb21wYXJlVG8oKChTdHJpbmcpIG8yKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIFN0cmluZ1tdIHN0ckFycmF5ID0gbmV3IFN0cmluZ1ttZXRob2RMaXN0LnNpemUoKV07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyQXJyYXkubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHN0ckFycmF5W2ldID0gKFN0cmluZykgbWV0aG9kTGlzdC5nZXQoaSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3RyQXJyYXk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBUZXN0IGdldFN1YlRlc3QoVGVzdFN1aXRlIHN1aXRlLCBTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgaWYgKG51bGwgIT0gc3VpdGUpIHsKLSAgICAgICAgICAgIEVudW1lcmF0aW9uIHRlc3RzID0gc3VpdGUudGVzdHMoKTsKLSAgICAgICAgICAgIHdoaWxlICh0ZXN0cy5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgIFRlc3QgdCA9IChUZXN0KSB0ZXN0cy5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgIGlmICh0LnRvU3RyaW5nKCkuZXF1YWxzKHRlc3ROYW1lKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIFRlc3RTdWl0ZSB0byBydW4KLSAgICAgKi8KLSAgICBwcml2YXRlIFRlc3QgZ2V0VGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgaW50IGZpcnN0SW5kZXggPSB0ZXN0TmFtZS5pbmRleE9mKCIuIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgU3RyaW5nIHN1aXRlTmFtZSA9IHRlc3ROYW1lLnN1YnN0cmluZygwLCBmaXJzdEluZGV4KTsKLSAgICAgICAgU3RyaW5nIHN1YlRlc3ROYW1lID0gdGVzdE5hbWUuc3Vic3RyaW5nKGZpcnN0SW5kZXggKyAxKTsKLQotICAgICAgICAvL2NoZWNrIHRoZSBvYnZpb3VzIHN1aXRlIGZpcnN0Ci0gICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IChUZXN0U3VpdGUpIGFsbFRlc3RzLmdldChzdWl0ZU5hbWUpOwotICAgICAgICBUZXN0IHRlc3QgPSBnZXRTdWJUZXN0KHN1aXRlLCBzdWJUZXN0TmFtZSk7Ci0gICAgICAgIGlmICh0ZXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0ZXN0OwotICAgICAgICB9Ci0gICAgICAgIC8vb3RoZXJ3aXNlIGNoZWNrIGFsbCBzdWl0ZXMKLSAgICAgICAgRW51bWVyYXRpb24ga2V5cyA9IGFsbFRlc3RzLmtleXMoKTsKLSAgICAgICAgd2hpbGUgKGtleXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBrZXlzLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICBpZiAodGVzdE5hbWUuc3RhcnRzV2l0aChrZXkpKSB7Ci0gICAgICAgICAgICAgICAgc3VpdGUgPSAoVGVzdFN1aXRlKSBhbGxUZXN0cy5nZXQoa2V5KTsKLSAgICAgICAgICAgICAgICBzdWJUZXN0TmFtZSA9IHRlc3ROYW1lLnN1YnN0cmluZyhrZXkubGVuZ3RoKCkgKyAxKTsKLSAgICAgICAgICAgICAgICB0ZXN0ID0gZ2V0U3ViVGVzdChzdWl0ZSwgc3ViVGVzdE5hbWUpOwotICAgICAgICAgICAgICAgIGlmICh0ZXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRlc3Q7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yL2NvbGxlY3Rvci9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL2NvbGxlY3Rvci9TdWl0ZVRlc3RSdW5uZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yL2NvbGxlY3Rvci9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL2NvbGxlY3Rvci9TdWl0ZVRlc3RSdW5uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JhYjM4ZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3Rvci9jb2xsZWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy9jb2xsZWN0b3IvU3VpdGVUZXN0UnVubmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQuc3dpbmd1aS5UZXN0UnVubmVyOwotCi0vKioKLSAqIEBhdXRob3IganNob2xsCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZWRpdCB0aGUgdGVtcGxhdGUgdmFyaWFibGUgInR5cGVjb21tZW50IjoKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPlRlbXBsYXRlcy4KLSAqIFRvIGVuYWJsZSBhbmQgZGlzYWJsZSB0aGUgY3JlYXRpb24gb2YgdHlwZSBjb21tZW50cyBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgU3VpdGVUZXN0UnVubmVyIGV4dGVuZHMgVGVzdFJ1bm5lciB7Ci0KLSAgICBwcml2YXRlIFRlc3RTdWl0ZSBzdWl0ZTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBQbHVnaW5UZXN0UnVubmVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIFN1aXRlVGVzdFJ1bm5lcihUZXN0U3VpdGUgc3VpdGVUb1J1bikgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBzdWl0ZSA9IHN1aXRlVG9SdW47Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT25seSByZXR1cm4gdGhlIHNwZWNpZmllZCBzdWl0ZQotICAgICAqLwotICAgIHB1YmxpYyBUZXN0IGdldFRlc3QoU3RyaW5nIHN1aXRlQ2xhc3NOYW1lKSB7Ci0gICAgICAgIHJldHVybiBzdWl0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBjYWxsZWQgYnkgdGhlIGd1aQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGxhdW5jaCgpIHsKLSAgICAgICAgc3RhcnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSAiZHluYW1pYyB0ZXN0IjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBmRnJhbWUgPSBjcmVhdGVVSShuYW1lKTsKLSAgICAgICAgZkZyYW1lLnBhY2soKTsKLSAgICAgICAgZkZyYW1lLnNldFZpc2libGUodHJ1ZSk7Ci0gICAgICAgIHNldFN1aXRlKG5hbWUpOwotICAgICAgICBydW5TdWl0ZSgpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBUZXN0UnVubmVyI3Rlcm1pbmF0ZSgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVybWluYXRlKCkgewotICAgICAgICBmRnJhbWUuZGlzcG9zZSgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3IvY29sbGVjdG9yL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvY29sbGVjdG9yL1Rlc3RDb2xsZWN0b3JBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3IvY29sbGVjdG9yL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvY29sbGVjdG9yL1Rlc3RDb2xsZWN0b3JBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjJiZDI4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yL2NvbGxlY3Rvci9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL2NvbGxlY3Rvci9UZXN0Q29sbGVjdG9yQWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGU7Ci0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBlZGl0IHRoZSB0ZW1wbGF0ZSB2YXJpYWJsZSAidHlwZWNvbW1lbnQiOgotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+VGVtcGxhdGVzLgotICogVG8gZW5hYmxlIGFuZCBkaXNhYmxlIHRoZSBjcmVhdGlvbiBvZiB0eXBlIGNvbW1lbnRzIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0Q29sbGVjdG9yQWN0aW9uRGVsZWdhdGUgaW1wbGVtZW50cyBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUgewotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNpbml0KElXb3JrYmVuY2hXaW5kb3cpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3J1bihJQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCgpOwotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlzaGVsbC5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0JCXNoZWxsLnNldFRleHQoIlRlc3QgQ29sbGVjdG9yIik7IC8vJE5PTi1OTFMtMSQKLQkJVGVzdENvbGxlY3RvckdVSSB0ZXN0Q29sbGVjdG9yR1VJID0gbmV3IFRlc3RDb2xsZWN0b3JHVUkoc2hlbGwsIFNXVC5OVUxMKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOwotICAgICAgICB0ZXN0Q29sbGVjdG9yR1VJLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICAgICAgCi0JCXNoZWxsLnNldFNpemUoNTAwLCA1MDApOwotCQlzaGVsbC5vcGVuKCk7Ci0JfQotCQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uLCBJU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3IvY29sbGVjdG9yL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvY29sbGVjdG9yL1Rlc3RDb2xsZWN0b3JHVUkuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yL2NvbGxlY3Rvci9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL2NvbGxlY3Rvci9UZXN0Q29sbGVjdG9yR1VJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNjI1MmYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3IvY29sbGVjdG9yL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvY29sbGVjdG9yL1Rlc3RDb2xsZWN0b3JHVUkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBNYXIgNiwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIAotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICogCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFRlc3RDb2xsZWN0b3JHVUkgZXh0ZW5kcyBDb21wb3NpdGUgaW1wbGVtZW50cyBNb2RpZnlMaXN0ZW5lciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVUlURVNfRVhUX1BUID0gInN1aXRlcyI7IC8vJE5PTi1OTFMtMSQKLS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0vLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIENvbXBvc2l0ZSBpbm5lclBhbmVzID0gbnVsbDsKLQlwcml2YXRlIENvbWJvIGNvbWJvID0gbnVsbDsKLQotCXByaXZhdGUgSGFzaHRhYmxlIHRlc3RTdWl0ZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIHN0eWxlCi0JICovCi0JcHVibGljIFRlc3RDb2xsZWN0b3JHVUkoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCXN1cGVyKHBhcmVudCwgc3R5bGUpOwotCi0JCWxvYWRDb25maWd1cmF0aW9uKCk7Ci0KLQkJY3JlYXRlUGFydENvbnRyb2woKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbG9hZENvbmZpZ3VyYXRpb24oKSB7Ci0JCUlFeHRlbnNpb25Qb2ludCBzdWl0ZUV4dFB0ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRFeHRlbnNpb25Qb2ludChQTFVHSU5fSUQsIFNVSVRFU19FWFRfUFQpOwotCQlJRXh0ZW5zaW9uW10gc3VpdGVzRXh0ZW5zaW9ucyA9IHN1aXRlRXh0UHQuZ2V0RXh0ZW5zaW9ucygpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc3VpdGVzRXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBzdWl0ZXNFeHRlbnNpb25zW2ldOwotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gdGVzdHMgPSBleHRlbnNpb24uZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHRlc3RzLmxlbmd0aDsgaisrKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSB0ZXN0c1tqXTsKLQkJCQkJU3RyaW5nIHN1aXRlTmFtZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJuYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJdGVzdFN1aXRlcy5wdXQoc3VpdGVOYW1lLCBlbGVtZW50KTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKCkgewotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQlzZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOwotCi0JCWNvbWJvID0gbmV3IENvbWJvKHRoaXMsIFNXVC5SRUFEX09OTFkpOwotCQlFbnVtZXJhdGlvbiBrZXlzID0gdGVzdFN1aXRlcy5rZXlzKCk7Ci0JCUFycmF5TGlzdCBhcnJheUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXdoaWxlIChrZXlzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQlhcnJheUxpc3QuYWRkKGtleXMubmV4dEVsZW1lbnQoKSk7Ci0JCX0KLQotCQlDb2xsZWN0aW9ucy5zb3J0KGFycmF5TGlzdCwgbmV3IENvbXBhcmF0b3IoKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJCQlyZXR1cm4gKChTdHJpbmcpIG8xKS5jb21wYXJlVG8oKChTdHJpbmcpIG8yKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXlMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQljb21iby5hZGQoKFN0cmluZykgYXJyYXlMaXN0LmdldChpKSk7Ci0JCX0KLQkJY29tYm8uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWNvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCQlpZiAoY29tYm8uZ2V0SXRlbUNvdW50KCkgPiAwKSB7Ci0JCQljb21iby5zZWxlY3QoMCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJaWYgKGUuZ2V0U291cmNlKCkgPT0gY29tYm8pIHsKLQkJCXVwZGF0ZUNvbWJvKGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUNvbWJvKE1vZGlmeUV2ZW50IGUpIHsKLQkJaWYgKG51bGwgIT0gaW5uZXJQYW5lcykgewotCQkJaW5uZXJQYW5lcy5kaXNwb3NlKCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCVN0cmluZyB0ZXN0TmFtZSA9IGNvbWJvLmdldFRleHQoKTsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gKElDb25maWd1cmF0aW9uRWxlbWVudCkgdGVzdFN1aXRlcy5nZXQodGVzdE5hbWUpOwotCQkJVGVzdFN1aXRlIHN1aXRlID0gKFRlc3RTdWl0ZSkgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOyAvLyROT04tTkxTLTEkCi0JCQlpbm5lclBhbmVzID0gbmV3IFRlc3RDb2xsZWN0b3JJbm5lclBhbmVzKHRoaXMsIFNXVC5OVUxMLCBuZXcgU3VpdGVIZWxwZXIoc3VpdGUpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlpbm5lclBhbmVzID0gbmV3IENvbXBvc2l0ZSh0aGlzLCBTV1QuTlVMTCk7Ci0JCQlpbm5lclBhbmVzLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJCWlubmVyUGFuZXMuc2V0QmFja2dyb3VuZChnZXRCYWNrZ3JvdW5kKCkpOwotCQkJTGFiZWwgZXJyb3JMYWJlbCA9IG5ldyBMYWJlbChpbm5lclBhbmVzLCBTV1QuTk9ORSk7Ci0JCQllcnJvckxhYmVsLnNldFRleHQoZXguZ2V0TWVzc2FnZSgpKTsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCQllcnJvckxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMTsKLQkJaW5uZXJQYW5lcy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJbGF5b3V0KCk7Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yL2NvbGxlY3Rvci9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL2NvbGxlY3Rvci9UZXN0Q29sbGVjdG9ySW5uZXJQYW5lcy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3IvY29sbGVjdG9yL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvY29sbGVjdG9yL1Rlc3RDb2xsZWN0b3JJbm5lclBhbmVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2MmQ5NmIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3IvY29sbGVjdG9yL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvY29sbGVjdG9yL1Rlc3RDb2xsZWN0b3JJbm5lclBhbmVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3RvcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TYXNoRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotCi0vKioKLSAqIEBhdXRob3IganNob2xsCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZWRpdCB0aGUgdGVtcGxhdGUgdmFyaWFibGUgInR5cGVjb21tZW50IjoKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPlRlbXBsYXRlcy4KLSAqIFRvIGVuYWJsZSBhbmQgZGlzYWJsZSB0aGUgY3JlYXRpb24gb2YgdHlwZSBjb21tZW50cyBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgVGVzdENvbGxlY3RvcklubmVyUGFuZXMgZXh0ZW5kcyBDb21wb3NpdGUgewotCi0gICAgcHJpdmF0ZSBUYWJsZSB0ZXN0Q2xhc3NUYWJsZTsKLSAgICBwcml2YXRlIFRhYmxlIHRlc3RNZXRob2RUYWJsZTsKLQotICAgIHByaXZhdGUgQnV0dG9uIGxhdW5jaFRlc3RCdXR0b247Ci0KLSAgICBwcml2YXRlIFN1aXRlSGVscGVyIHBsdWdpblRlc3RMb2FkZXI7Ci0KLSAgICBwcml2YXRlIEhhc2hTZXQgcGFydGlhbFNldEhhc2ggPSBuZXcgSGFzaFNldCgpOwotICAgIHByaXZhdGUgSGFzaHRhYmxlIHNob3J0VG9GdWxsSGFzaHRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIHByaXZhdGUgSGFzaHRhYmxlIGZ1bGxUb1Nob3J0SGFzaHRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotCi0gICAgcHVibGljIFRlc3RDb2xsZWN0b3JJbm5lclBhbmVzKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwgU3VpdGVIZWxwZXIgbG9hZGVyKSB7Ci0gICAgICAgIHN1cGVyKHBhcmVudCwgc3R5bGUpOwotICAgICAgICBwbHVnaW5UZXN0TG9hZGVyID0gbG9hZGVyOwotICAgICAgICBjcmVhdGVQYXJ0Q29udHJvbCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKCkgewotICAgICAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotICAgICAgICBncmlkTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICAgICAgZ3JpZExheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotICAgICAgICBzZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0gICAgICAgIEdyaWREYXRhIGdyaWREYXRhID0gbnVsbDsKLQotICAgICAgICBHcm91cCB0YWJsZUdyb3VwID0gbmV3IEdyb3VwKHRoaXMsIFNXVC5OVUxMKTsKLSAgICAgICAgR3JpZExheW91dCB0YWJsZUdyb3VwTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgdGFibGVHcm91cExheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSB0cnVlOwotICAgICAgICB0YWJsZUdyb3VwTGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotICAgICAgICB0YWJsZUdyb3VwTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICAgICAgdGFibGVHcm91cExheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotICAgICAgICB0YWJsZUdyb3VwLnNldExheW91dCh0YWJsZUdyb3VwTGF5b3V0KTsKLSAgICAgICAgdGFibGVHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotICAgICAgICBTYXNoRm9ybSBzcGxpdFZpZXcgPSBuZXcgU2FzaEZvcm0odGFibGVHcm91cCwgU1dULkhPUklaT05UQUwpOwotICAgICAgICBzcGxpdFZpZXcuc2V0QmFja2dyb3VuZChnZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0RBUktfR1JBWSkpOwotICAgICAgICAKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBzcGxpdFZpZXcuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgIAotICAgICAgICBDb21wb3NpdGUgbGVmdENvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoc3BsaXRWaWV3LCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgbGVmdExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIGxlZnRMYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0gICAgICAgIGxlZnRDb21wb3NpdGUuc2V0TGF5b3V0KGxlZnRMYXlvdXQpOwotICAgICAgICBMYWJlbCBsYWJlbDIgPSBuZXcgTGFiZWwobGVmdENvbXBvc2l0ZSwgU1dULk5VTEwpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuQ0VOVEVSOwotICAgICAgICBsYWJlbDIuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgIGxhYmVsMi5zZXRUZXh0KCJUZXN0IFN1aXRlcyIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgQ29tcG9zaXRlIHJpZ2h0Q29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShzcGxpdFZpZXcsIFNXVC5OT05FKTsKLSAgICAgICAgR3JpZExheW91dCByaWdodExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIHJpZ2h0TGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotICAgICAgICByaWdodENvbXBvc2l0ZS5zZXRMYXlvdXQocmlnaHRMYXlvdXQpOwotICAgICAgICBMYWJlbCBsYWJlbDMgPSBuZXcgTGFiZWwocmlnaHRDb21wb3NpdGUsIFNXVC5OVUxMKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkNFTlRFUjsKLSAgICAgICAgbGFiZWwzLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICBsYWJlbDMuc2V0VGV4dCgiVGVzdHMiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIHRlc3RDbGFzc1RhYmxlID0gbmV3IFRhYmxlKGxlZnRDb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0gICAgICAgIHRlc3RDbGFzc1RhYmxlLnNldEJhY2tncm91bmQoZ2V0QmFja2dyb3VuZCgpKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICAgICAgdGVzdENsYXNzVGFibGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgIFN0cmluZ1tdIGFsbFRlc3RzID0gcGx1Z2luVGVzdExvYWRlci5nZXRBbGxUZXN0cygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFsbFRlc3RzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBUYWJsZUl0ZW0gdGFibGVJdGVtID0gbmV3IFRhYmxlSXRlbSh0ZXN0Q2xhc3NUYWJsZSwgU1dULk5VTEwpOwotICAgICAgICAgICAgdGFibGVJdGVtLnNldFRleHQoYWxsVGVzdHNbaV0pOwotICAgICAgICB9Ci0gICAgICAgIHRlc3RDbGFzc1RhYmxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBUYWJsZUl0ZW0gaXRlbSA9IChUYWJsZUl0ZW0pIGUuaXRlbTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdGVzdE5hbWUgPSBpdGVtLmdldFRleHQoKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVNZXRob2RUYWJsZSh0ZXN0TmFtZSwgcGx1Z2luVGVzdExvYWRlci5nZXRUZXN0TWV0aG9kcyh0ZXN0TmFtZSkpOwotICAgICAgICAgICAgICAgIHRlc3RDbGFzc1RhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW10geyBpdGVtIH0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9KTsKLSAgICAgICAgCi0gICAgICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKGxlZnRDb21wb3NpdGUsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTCk7Ci0gICAgICAgIGxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICAKLSAgICAgICAgZmluYWwgQnV0dG9uIHNlbGVjdEFsbENoZWNrYm94ID0gbmV3IEJ1dHRvbihsZWZ0Q29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotICAgICAgICBzZWxlY3RBbGxDaGVja2JveC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgc2VsZWN0QWxsQ2hlY2tib3guc2V0VGV4dCgiU2VsZWN0IEFsbCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHNlbGVjdEFsbENoZWNrYm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCl7Ci0gICAgICAgIAlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgIAkJYm9vbGVhbiBjaGVja2VkID0gc2VsZWN0QWxsQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIAkJVGFibGVJdGVtIFtdIGl0ZW1zID0gdGVzdENsYXNzVGFibGUuZ2V0SXRlbXMoKTsKLSAgICAgICAgCQlmb3IoaW50IGk9MDtpPGl0ZW1zLmxlbmd0aDsgaSsrKXsKLSAgICAgICAgCQkJaXRlbXNbaV0uc2V0Q2hlY2tlZChjaGVja2VkKTsKLSAgICAgICAgCQl9Ci0gICAgICAgIAl9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHRlc3RNZXRob2RUYWJsZSA9IG5ldyBUYWJsZShyaWdodENvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLSAgICAgICAgdGVzdE1ldGhvZFRhYmxlLnNldEJhY2tncm91bmQoZ2V0QmFja2dyb3VuZCgpKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICAgICAgdGVzdE1ldGhvZFRhYmxlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIGxhdW5jaFRlc3RCdXR0b24gPSBuZXcgQnV0dG9uKHRoaXMsIFNXVC5QVVNIKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkNFTlRFUjsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBsYXVuY2hUZXN0QnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICBsYXVuY2hUZXN0QnV0dG9uLnNldFRleHQoIlJ1biBUZXN0cyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGxhdW5jaFRlc3RCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIFN1aXRlVGVzdFJ1bm5lciBydW5uZXIgPSBuZXcgU3VpdGVUZXN0UnVubmVyKGJ1aWxkU3VpdGUoKSk7Ci0gICAgICAgICAgICAgICAgcnVubmVyLmxhdW5jaCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHN0b3JlTWV0aG9kc1RhYmxlKCkgewotICAgICAgICBUYWJsZUl0ZW1bXSBpdGVtcyA9IHRlc3RNZXRob2RUYWJsZS5nZXRJdGVtcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgbnVsbCAhPSBpdGVtcyAmJiBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyBwYXJ0aWFsVGVzdE5hbWUgPSAoU3RyaW5nKXNob3J0VG9GdWxsSGFzaHRhYmxlLmdldChpdGVtc1tpXS5nZXRUZXh0KCkpOwotICAgICAgICAgICAgaWYgKGl0ZW1zW2ldLmdldENoZWNrZWQoKSAmJiAhcGFydGlhbFNldEhhc2guY29udGFpbnMocGFydGlhbFRlc3ROYW1lKSkgewotICAgICAgICAgICAgICAgIHBhcnRpYWxTZXRIYXNoLmFkZChwYXJ0aWFsVGVzdE5hbWUpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghaXRlbXNbaV0uZ2V0Q2hlY2tlZCgpICYmIHBhcnRpYWxTZXRIYXNoLmNvbnRhaW5zKHBhcnRpYWxUZXN0TmFtZSkpIHsKLSAgICAgICAgICAgICAgICBwYXJ0aWFsU2V0SGFzaC5yZW1vdmUocGFydGlhbFRlc3ROYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVNZXRob2RUYWJsZShTdHJpbmcgdGVzdE5hbWUsIFN0cmluZ1tdIG1ldGhvZEFycmF5KSB7Ci0gICAgICAgIHN0b3JlTWV0aG9kc1RhYmxlKCk7Ci0gICAgICAgIHRlc3RNZXRob2RUYWJsZS5yZW1vdmVBbGwoKTsKLQkJc2hvcnRUb0Z1bGxIYXNodGFibGUuY2xlYXIoKTsKLQkJZnVsbFRvU2hvcnRIYXNodGFibGUuY2xlYXIoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgbnVsbCAhPSBtZXRob2RBcnJheSAmJiBpIDwgbWV0aG9kQXJyYXkubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyBwYXJ0aWFsVGVzdE5hbWUgPSB0ZXN0TmFtZSArICIuIiArIG1ldGhvZEFycmF5W2ldOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBpbnQgZW5kSW5kZXggPSBtZXRob2RBcnJheVtpXS5pbmRleE9mKCcoJyk7Ci0gICAgICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZSA9IGVuZEluZGV4ID4gMCA/IG1ldGhvZEFycmF5W2ldLnN1YnN0cmluZygwLCBlbmRJbmRleCkgOiBtZXRob2RBcnJheVtpXTsKLSAgICAgICAgICAgIHNob3J0VG9GdWxsSGFzaHRhYmxlLnB1dChtZXRob2ROYW1lLCBwYXJ0aWFsVGVzdE5hbWUpOwotICAgICAgICAgICAgZnVsbFRvU2hvcnRIYXNodGFibGUucHV0KHBhcnRpYWxUZXN0TmFtZSwgbWV0aG9kTmFtZSk7Ci0gICAgICAgICAgICBUYWJsZUl0ZW0gdGFibGVJdGVtID0gbmV3IFRhYmxlSXRlbSh0ZXN0TWV0aG9kVGFibGUsIFNXVC5OVUxMKTsKLSAgICAgICAgICAgIHRhYmxlSXRlbS5zZXRUZXh0KG1ldGhvZE5hbWUpOwotICAgICAgICAgICAgdGFibGVJdGVtLnNldENoZWNrZWQocGFydGlhbFNldEhhc2guY29udGFpbnMocGFydGlhbFRlc3ROYW1lKSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHByaXZhdGUgVGVzdFN1aXRlIGJ1aWxkU3VpdGUoKSB7Ci0gICAgICAgIEFycmF5TGlzdCBjb21wbGV0ZVRlc3RzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBUYWJsZUl0ZW1bXSBpdGVtcyA9IHRlc3RDbGFzc1RhYmxlLmdldEl0ZW1zKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChpdGVtc1tpXS5nZXRDaGVja2VkKCkpIHsKLSAgICAgICAgICAgICAgICBjb21wbGV0ZVRlc3RzLmFkZChpdGVtc1tpXS5nZXRUZXh0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nW10gY29tcGxldGVBcnJheSA9IG5ldyBTdHJpbmdbY29tcGxldGVUZXN0cy5zaXplKCldOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbXBsZXRlQXJyYXkubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGNvbXBsZXRlQXJyYXlbaV0gPSAoU3RyaW5nKSBjb21wbGV0ZVRlc3RzLmdldChpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEFycmF5TGlzdCBwYXJ0aWFsVGVzdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHN0b3JlTWV0aG9kc1RhYmxlKCk7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gcGFydGlhbFNldEhhc2guaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgcGFydGlhbFRlc3RzLmFkZChpdGVyYXRvci5uZXh0KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nW10gcGFydGlhbEFycmF5ID0gbmV3IFN0cmluZ1twYXJ0aWFsVGVzdHMuc2l6ZSgpXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJ0aWFsQXJyYXkubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHBhcnRpYWxBcnJheVtpXSA9IChTdHJpbmcpIHBhcnRpYWxUZXN0cy5nZXQoaSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcGx1Z2luVGVzdExvYWRlci5idWlsZFN1aXRlKGNvbXBsZXRlQXJyYXksIHBhcnRpYWxBcnJheSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3Rvci9wbHVnaW4ucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDRkZTc5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3Rvcj1vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3Rvcgotc3VpdGVzPXN1aXRlcwotVGVzdF9Db2xsZWN0b3I9VGVzdCBDb2xsZWN0b3IKLVdUUF9UZXN0cz1XVFAgVGVzdHMKLU9wZW49T3BlbgotVGVzdF9Db2xsZWN0b3I9VGVzdCBDb2xsZWN0b3IKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3Rvci9wbHVnaW4ueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3IvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg5ODZmZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3Rvci9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgICAgPGV4dGVuc2lvbi1wb2ludCBpZD0ic3VpdGVzIiBuYW1lPSIlc3VpdGVzIiBzY2hlbWE9InNjaGVtYS9zdWl0ZXMuZXhzZCIvPgotCi0KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmFjdGlvblNldHMiPgotICAgICAgPGFjdGlvblNldAotICAgICAgICAgICAgbGFiZWw9IiVUZXN0X0NvbGxlY3RvciIKLSAgICAgICAgICAgIHZpc2libGU9InRydWUiCi0gICAgICAgICAgICBpZD0idGVzdENvbGxlY3RvciI+Ci0gICAgICAgICA8bWVudQotICAgICAgICAgICAgICAgbGFiZWw9IiVXVFBfVGVzdHMiCi0gICAgICAgICAgICAgICBwYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3IudGVzdHNNZW51Ij4KLSAgICAgICAgICAgIDxzZXBhcmF0b3IKLSAgICAgICAgICAgICAgICAgIG5hbWU9Imdyb3VwMSI+Ci0gICAgICAgICAgICA8L3NlcGFyYXRvcj4KLSAgICAgICAgIDwvbWVudT4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlT3BlbiIKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVUZXN0X0NvbGxlY3RvciIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3Rvci5UZXN0Q29sbGVjdG9yQWN0aW9uRGVsZWdhdGUiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3IudGVzdHNNZW51L2dyb3VwMSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3Rvci50ZXN0c0FjdGlvbiI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvYWN0aW9uU2V0PgotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3Ivc2NoZW1hL3N1aXRlcy5leHNkIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3Ivc2NoZW1hL3N1aXRlcy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmVjM2M1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yL3NjaGVtYS9zdWl0ZXMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3RvciI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3IiIGlkPSJzdWl0ZXMiIG5hbWU9InN1aXRlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZGVzY3JpcHRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJzdWl0ZSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJzdWl0ZSI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciB0aGUgZmlyc3QgcmVsZWFzZSBpbiB3aGljaCB0aGlzIGV4dGVuc2lvbiBwb2ludCBhcHBlYXJzLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLy5jbGFzc3BhdGggYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhNzI0NTguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC9jb21tb24vKioiLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLy5jdnNpZ25vcmUgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyYzBjNmQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4KLXRlbXAuZm9sZGVyCi1idWlsZC54bWwKLXVpLmphcgotamF2YUNvbXBpbGVyLnVpLmphci5hcmdzCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLy5wcm9qZWN0IGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVmZTc4ZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Yzc4ZDNkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jU3VuIEp1biAwMyAwMjoyMDo1NCBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5NjAwZDcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVVaV9QbHVnLWluCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMTAxLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzUGF0aDogdWkuamFyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLlVpUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlRWNsaXBzZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLm1hbmFnZXIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS53aXphcmQKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudAotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNApkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9hYm91dC5odG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9idWlsZC5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWUxNzM5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotc291cmNlLnVpLmphciA9IHNyYy8KLW91dHB1dC51aS5qYXIgPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHVpLmphcixcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLwpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9wbHVnaW4ucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMDY5YzguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotVWlfUGx1Zy1pbj1UZXN0IFVpIFBsdWctaW4KLUVjbGlwc2U9RWNsaXBzZS5vcmcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3BsdWdpbi54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiOGNiNjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yLnN1aXRlcyI+Ci0gICAgICAgICA8c3VpdGUKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLkRhdGFNb2RlbFVJQVBJVGVzdHMiCi0gICAgICAgICAgICBuYW1lPSJEYXRhTW9kZWwgVUkgQVBJIFRlc3RzIj4KLSAgICAgICAgIDwvc3VpdGU+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkuRGF0YU1vZGVsV2l6YXJkRXh0ZW5zaW9uIj4KLSAgICAgIDxEYXRhTW9kZWxXaXphcmQKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLlRlc3REYXRhTW9kZWxXaXphcmQiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0cy5JVGVzdERhdGFNb2RlbCIvPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpLndpemFyZFBhZ2VHcm91cCI+Ci0gICAgICA8d2l6YXJkUGFnZUdyb3VwCi0gICAgICAgICAgICBwYWdlR3JvdXBJRD0iZm9vIgotICAgICAgICAgICAgd2l6YXJkSUQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkud2l6YXJkLlRlc3QyRGF0YU1vZGVsUHJvdmlkZXIiPgotICAgICAgICAgPGZhY3RvcnkgY2xhc3NOYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLndpemFyZC5UZXN0MkRhdGFNb2RlbFdpemFyZEZhY3RvcnkiLz4KLSAgICAgIDwvd2l6YXJkUGFnZUdyb3VwPgotICAgICAgPHdpemFyZFBhZ2VHcm91cAotICAgICAgICAgICAgcGFnZUdyb3VwSUQ9ImJhciIKLSAgICAgICAgICAgIHdpemFyZElEPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLndpemFyZC5UZXN0MkRhdGFNb2RlbFByb3ZpZGVyIj4KLSAgICAgICAgIDxmYWN0b3J5IGNsYXNzTmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS53aXphcmQuVGVzdDJEYXRhTW9kZWxXaXphcmRGYWN0b3J5MiIvPgotICAgICAgPC93aXphcmRQYWdlR3JvdXA+Ci0gICAgICA8d2l6YXJkUGFnZUdyb3VwCi0gICAgICAgICAgICBwYWdlR3JvdXBJRD0iZm9vYmFyIgotICAgICAgICAgICAgd2l6YXJkSUQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkud2l6YXJkLlRlc3QyRGF0YU1vZGVsUHJvdmlkZXIiPgotICAgICAgICAgPGZhY3RvcnkgY2xhc3NOYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLndpemFyZC5UZXN0MkRhdGFNb2RlbFdpemFyZEZhY3RvcnkzIi8+Ci0gICAgICA8L3dpemFyZFBhZ2VHcm91cD4KLSAgICAgIDx3aXphcmRQYWdlCi0gICAgICAgICAgICB3aXphcmRJRD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS53aXphcmQuVGVzdDJEYXRhTW9kZWxQcm92aWRlciI+Ci0gICAgICAgICA8ZmFjdG9yeQotICAgICAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLndpemFyZC5UZXN0MlBhZ2VXaXphcmRFeHRlbnNpb25GYWN0b3J5Ij4KLSAgICAgICAgIDwvZmFjdG9yeT4KLSAgICAgIDwvd2l6YXJkUGFnZT4KLSAgICAgIDx3aXphcmRQYWdlCi0gICAgICAgICAgICB3aXphcmRJRD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS53aXphcmQuVGVzdDJEYXRhTW9kZWxQcm92aWRlciI+Ci0gICAgICAgICA8ZmFjdG9yeQotICAgICAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLndpemFyZC5UZXN0MlBhZ2VXaXphcmRFeHRlbnNpb25GYWN0b3J5MiI+Ci0gICAgICAgICA8L2ZhY3Rvcnk+Ci0gICAgICA8L3dpemFyZFBhZ2U+Ci0gICA8L2V4dGVuc2lvbj4KLSAgCi0gICAgIDwhLS0KLSAgIAkJQSBwaWN0dXJlIG9mIHRoZSBvcGVyYXRpb24gdHJlZQotICAJCS8qKgotCQkgKiBPcGVyYXRpb25zIGFyZSBvcmdhbml6ZWQgYXMgZm9sbG93czogPGNvZGU+Ci0JCSAqCSAgICBECi0JCSAqICAgICAvIFwKLQkJICogICAgLyAgIFwKLQkJICogICBCICAgICBGCi0JCSAqICAvIFwgICAvIFwKLQkJICogQSAgIEMgRSAgIEcKLQkJICogPC9jb2RlPgotCQkgKi8KLSAgICAgICAtLT4KLSAgIAotICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLk9wZXJhdGlvbkV4dGVuc2lvbiIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLm1hbmFnZXIiPgotICAgICAgPG9wZXJhdGlvbkV4dGVuc2lvbgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkubWFuYWdlci5EIgotICAgICAgICAgICAgcG9zdE9wZXJhdGlvbkNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLm1hbmFnZXIuRiIKLSAgICAgICAgICAgIHByZU9wZXJhdGlvbkNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLm1hbmFnZXIuQiIvPgotICAgICAgPG9wZXJhdGlvbkV4dGVuc2lvbgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkubWFuYWdlci5CIgotICAgICAgICAgICAgcG9zdE9wZXJhdGlvbkNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLm1hbmFnZXIuQyIKLSAgICAgICAgICAgIHByZU9wZXJhdGlvbkNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLm1hbmFnZXIuQSIvPgotICAgICAgPG9wZXJhdGlvbkV4dGVuc2lvbgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkubWFuYWdlci5GIgotICAgICAgICAgICAgcG9zdE9wZXJhdGlvbkNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLm1hbmFnZXIuRyIKLSAgICAgICAgICAgIHByZU9wZXJhdGlvbkNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLm1hbmFnZXIuRSIvPgotICAgPC9leHRlbnNpb24+Ci0gIAotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvRGF0YU1vZGVsVUlBUElUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS9EYXRhTW9kZWxVSUFQSVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3ZjM1ODEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS9EYXRhTW9kZWxVSUFQSVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLlNpbXBsZVRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLndpemFyZC5UZXN0V2l6YXJkVGVzdGNhc2U7Ci0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqIAotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0KLSAqIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgRGF0YU1vZGVsVUlBUElUZXN0cyBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgRGF0YU1vZGVsVUlBUElUZXN0cygpOwotCX0KLQotCXB1YmxpYyBEYXRhTW9kZWxVSUFQSVRlc3RzKCkgewotCQlzdXBlcigpOwotCQlhZGRUZXN0KG5ldyBTaW1wbGVUZXN0U3VpdGUoRGF0YU1vZGVsVUlGYWN0b3J5VGVzdC5jbGFzcykpOwotCQlhZGRUZXN0KG5ldyBTaW1wbGVUZXN0U3VpdGUoVGVzdFdpemFyZFRlc3RjYXNlLmNsYXNzKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS9EYXRhTW9kZWxVSUZhY3RvcnlUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL0RhdGFNb2RlbFVJRmFjdG9yeVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYyZDI4MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL0RhdGFNb2RlbFVJRmFjdG9yeVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzLklUZXN0RGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuVGVzdERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuRGF0YU1vZGVsV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuRGF0YU1vZGVsV2l6YXJkRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIERhdGFNb2RlbFVJRmFjdG9yeVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsaWRFeHRlbnNpb25JRCgpIHsKLQkJSURhdGFNb2RlbCBkYXRhTW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbCgib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0cy5JVGVzdERhdGFNb2RlbCIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoZGF0YU1vZGVsLmlzUHJvcGVydHkoSVRlc3REYXRhTW9kZWwuRk9PKSk7Ci0JCURhdGFNb2RlbFdpemFyZCB3aXphcmQgPSBEYXRhTW9kZWxXaXphcmRGYWN0b3J5LmNyZWF0ZVdpemFyZCgib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0cy5JVGVzdERhdGFNb2RlbCIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwod2l6YXJkKTsKLQkJYXNzZXJ0Tm90TnVsbCh3aXphcmQuZ2V0RGF0YU1vZGVsKCkpOwotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdFZhbGlkRXh0ZW5zaW9uQ2xhc3MoKSB7Ci0JCUlEYXRhTW9kZWwgZGF0YU1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwoSVRlc3REYXRhTW9kZWwuY2xhc3MpOwotCQlhc3NlcnRUcnVlKGRhdGFNb2RlbC5pc1Byb3BlcnR5KElUZXN0RGF0YU1vZGVsLkZPTykpOwotCQlEYXRhTW9kZWxXaXphcmQgd2l6YXJkID0gRGF0YU1vZGVsV2l6YXJkRmFjdG9yeS5jcmVhdGVXaXphcmQoSVRlc3REYXRhTW9kZWwuY2xhc3MpOwotCQlhc3NlcnROb3ROdWxsKHdpemFyZCk7Ci0JCWFzc2VydE5vdE51bGwod2l6YXJkLmdldERhdGFNb2RlbCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsaWRFeHRlbnNpb25JbnN0YW5jZSgpIHsKLQkJaW50IHN0YXJ0SW5zdGFuY2VDb3VudCA9IFRlc3REYXRhTW9kZWxQcm92aWRlci5nZXRJbnN0YW5jZUNvdW50KCk7Ci0JCUlEYXRhTW9kZWwgZGF0YU1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IFRlc3REYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJYXNzZXJ0VHJ1ZShkYXRhTW9kZWwuaXNQcm9wZXJ0eShJVGVzdERhdGFNb2RlbC5GT08pKTsKLQkJRGF0YU1vZGVsV2l6YXJkIHdpemFyZCA9IERhdGFNb2RlbFdpemFyZEZhY3RvcnkuY3JlYXRlV2l6YXJkKGRhdGFNb2RlbCk7Ci0JCWFzc2VydE5vdE51bGwod2l6YXJkKTsKLQkJYXNzZXJ0VHJ1ZShkYXRhTW9kZWwgPT0gd2l6YXJkLmdldERhdGFNb2RlbCgpKTsKLQkJaW50IGVuZEluc3RhbmNlQ291bnQgPSBUZXN0RGF0YU1vZGVsUHJvdmlkZXIuZ2V0SW5zdGFuY2VDb3VudCgpOwotCQlhc3NlcnRFcXVhbHMoMSwgZW5kSW5zdGFuY2VDb3VudC1zdGFydEluc3RhbmNlQ291bnQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS9UZXN0RGF0YU1vZGVsV2l6YXJkLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL1Rlc3REYXRhTW9kZWxXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYwNDRjNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL1Rlc3REYXRhTW9kZWxXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuVGVzdERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuRGF0YU1vZGVsV2l6YXJkOwotCi1wdWJsaWMgY2xhc3MgVGVzdERhdGFNb2RlbFdpemFyZCBleHRlbmRzIERhdGFNb2RlbFdpemFyZCB7Ci0KLQlwdWJsaWMgVGVzdERhdGFNb2RlbFdpemFyZCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgVGVzdERhdGFNb2RlbFdpemFyZChJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQlzdXBlcihkYXRhTW9kZWwpOwotCX0KLQotCXByb3RlY3RlZCBJRGF0YU1vZGVsUHJvdmlkZXIgZ2V0RGVmYXVsdFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IFRlc3REYXRhTW9kZWxQcm92aWRlcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS9VaVBsdWdpbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS9VaVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzZmYzZlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvVWlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aTsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgVWlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQkvL1RoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgVWlQbHVnaW4gcGx1Z2luOwotCS8vUmVzb3VyY2UgYnVuZGxlLgotCXByaXZhdGUgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBVaVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBwbHVnLWluIGFjdGl2YXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcGx1Zy1pbiBpcyBzdG9wcGVkCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCQlyZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVWlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgZnJvbSB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqIG9yICdrZXknIGlmIG5vdCBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IFVpUGx1Z2luLmdldERlZmF1bHQoKS5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotCQl0cnkgewotCQkJcmV0dXJuIChidW5kbGUgIT0gbnVsbCkgPyBidW5kbGUuZ2V0U3RyaW5nKGtleSkgOiBrZXk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJdHJ5IHsKLQkJCWlmIChyZXNvdXJjZUJ1bmRsZSA9PSBudWxsKQotCQkJCXJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLlVpUGx1Z2luUmVzb3VyY2VzIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJCXJlc291cmNlQnVuZGxlID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBpbWFnZSBkZXNjcmlwdG9yIGZvciB0aGUgaW1hZ2UgZmlsZSBhdCB0aGUgZ2l2ZW4KLQkgKiBwbHVnLWluIHJlbGF0aXZlIHBhdGguCi0JICoKLQkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aAotCSAqIEByZXR1cm4gdGhlIGltYWdlIGRlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHBhdGgpIHsKLQkJcmV0dXJuIEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbigib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aSIsIHBhdGgpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS9tYW5hZ2VyL0EuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvbWFuYWdlci9BLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwYTdmNTcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS9tYW5hZ2VyL0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLm1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBBIGV4dGVuZHMgQmFzZU9wZXJhdGlvbiB7Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvbWFuYWdlci9CLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL21hbmFnZXIvQi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTY0MWI0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvbWFuYWdlci9CLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS5tYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgQiBleHRlbmRzIEJhc2VPcGVyYXRpb24gewotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL21hbmFnZXIvQmFzZU9wZXJhdGlvbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS9tYW5hZ2VyL0Jhc2VPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcyYjFmNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL21hbmFnZXIvQmFzZU9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkubWFuYWdlcjsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VPcGVyYXRpb24gZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiB7Ci0JcHVibGljIHN0YXRpYyBWZWN0b3IgcmVzdWx0TGlzdDsKLQlwdWJsaWMgc3RhdGljIFZlY3RvciB1bmRvTGlzdDsKLQlwcml2YXRlIElTdGF0dXMgc3RhdHVzOwotCXByaXZhdGUgYm9vbGVhbiBjaGVja01vZGVsczsKLQlwcml2YXRlIGJvb2xlYW4gbW9kZWxzT0sgPSBmYWxzZTsKLQotCXB1YmxpYyBCYXNlT3BlcmF0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN0YXR1cyhJU3RhdHVzIHN0YXR1cykgewotCQl0aGlzLnN0YXR1cyA9IHN0YXR1czsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJcmVzdWx0TGlzdC5hZGQoZ2V0SUQoKSk7Ci0KLQkJZ2V0RGF0YU1vZGVsKCkuc2V0UHJvcGVydHkoImV4ZWN1dGVkT3BzIiwgcmVzdWx0TGlzdCk7Ci0JCWdldERhdGFNb2RlbCgpLnNldFByb3BlcnR5KCJleGVjdXRlZFVuZG9PcHMiLCB1bmRvTGlzdCk7Ci0JCWlmIChjaGVja01vZGVscykKLQkJCW1vZGVsc09LID0gY2hlY2tNb2RlbHMoKTsKLQotCQlnZXRFbnZpcm9ubWVudCgpLmdldExvZygpLmxvZyhJTG9nLk9LLCAxMjM0LCB0aGlzLCAiQmFzZU9wZXJhdGlvbiIsIChUaHJvd2FibGUpIG51bGwpOyAvLyROT04tTkxTLTEkCi0KLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyByZWRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgdW5kbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXJlc3VsdExpc3QucmVtb3ZlKHJlc3VsdExpc3Quc2l6ZSgpIC0gMSk7Ci0JCXVuZG9MaXN0LmFkZChnZXRJRCgpKTsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2hlY2tNb2RlbHMoYm9vbGVhbiBjaGVja01vZGVscykgewotCQl0aGlzLmNoZWNrTW9kZWxzID0gY2hlY2tNb2RlbHM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0TW9kZWxzT0soKSB7Ci0JCXJldHVybiBtb2RlbHNPSzsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2hlY2tNb2RlbHMoKSB7Ci0JCUlEYXRhTW9kZWwgbW9kZWwgPSBnZXREYXRhTW9kZWwoKTsKLQotCQlib29sZWFuIGNvbnRhaW5zTW9kZWwxID0gbW9kZWwuaXNOZXN0ZWRNb2RlbCgidGVzdHByb3ZpZGVyMSIpOwotCQlib29sZWFuIGNvbnRhaW5zTW9kZWwyID0gbW9kZWwuaXNOZXN0ZWRNb2RlbCgidGVzdHByb3ZpZGVyMiIpOwotCQlib29sZWFuIHByb3AxID0gbW9kZWwuaXNQcm9wZXJ0eVNldCgicHJvdmlkZXIxUHJvcDEiKTsKLQkJYm9vbGVhbiBwcm9wMiA9IG1vZGVsLmlzUHJvcGVydHlTZXQoInByb3ZpZGVyMVByb3AyIik7Ci0JCWJvb2xlYW4gcHJvcDMgPSBtb2RlbC5pc1Byb3BlcnR5U2V0KCJwcm92aWRlcjFQcm9wMyIpOwotCQlib29sZWFuIHByb3A0ID0gbW9kZWwuaXNQcm9wZXJ0eVNldCgicHJvdmlkZXIxUHJvcDQiKTsKLQkJYm9vbGVhbiBwcm9wNSA9IG1vZGVsLmlzUHJvcGVydHlTZXQoInByb3ZpZGVyMlByb3AxIik7Ci0JCWJvb2xlYW4gcHJvcDYgPSBtb2RlbC5pc1Byb3BlcnR5U2V0KCJwcm92aWRlcjJQcm9wMiIpOwotCQlib29sZWFuIHByb3A3ID0gbW9kZWwuaXNQcm9wZXJ0eVNldCgicHJvdmlkZXIyUHJvcDMiKTsKLQkJYm9vbGVhbiBwcm9wOCA9IG1vZGVsLmlzUHJvcGVydHlTZXQoInByb3ZpZGVyMlByb3A0Iik7Ci0JCWJvb2xlYW4gdmFsdWUxID0gbW9kZWwuZ2V0UHJvcGVydHkoInByb3ZpZGVyMVByb3AxIikuZXF1YWxzKCIxMSIpOwotCQlib29sZWFuIHZhbHVlMiA9IG1vZGVsLmdldFByb3BlcnR5KCJwcm92aWRlcjFQcm9wMiIpLmVxdWFscygiMjIiKTsKLQkJYm9vbGVhbiB2YWx1ZTMgPSBtb2RlbC5nZXRQcm9wZXJ0eSgicHJvdmlkZXIxUHJvcDMiKS5lcXVhbHMoIjMzIik7Ci0JCWJvb2xlYW4gdmFsdWU0ID0gbW9kZWwuZ2V0UHJvcGVydHkoInByb3ZpZGVyMVByb3A0IikuZXF1YWxzKCI0NCIpOwotCQlib29sZWFuIHZhbHVlNSA9IG1vZGVsLmdldFByb3BlcnR5KCJwcm92aWRlcjJQcm9wMSIpLmVxdWFscygiMTExMSIpOwotCQlib29sZWFuIHZhbHVlNiA9IG1vZGVsLmdldFByb3BlcnR5KCJwcm92aWRlcjJQcm9wMiIpLmVxdWFscygiMjIyMiIpOwotCQlib29sZWFuIHZhbHVlNyA9IG1vZGVsLmdldFByb3BlcnR5KCJwcm92aWRlcjJQcm9wMyIpLmVxdWFscygiMzMzMyIpOwotCQlib29sZWFuIHZhbHVlOCA9IG1vZGVsLmdldFByb3BlcnR5KCJwcm92aWRlcjJQcm9wNCIpLmVxdWFscygiNDQ0NCIpOwotCi0JCXJldHVybiBjb250YWluc01vZGVsMSAmJiBjb250YWluc01vZGVsMiAmJiBwcm9wMSAmJiBwcm9wMiAmJiBwcm9wMyAmJiBwcm9wNCAmJiBwcm9wNSAmJiBwcm9wNiAmJiBwcm9wNyAmJiBwcm9wOCAmJiB2YWx1ZTEgJiYgdmFsdWUyICYmIHZhbHVlMyAmJiB2YWx1ZTQgJiYgdmFsdWU1ICYmIHZhbHVlNiAmJiB2YWx1ZTcgJiYgdmFsdWU4OwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvbWFuYWdlci9DLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL21hbmFnZXIvQy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjk3NTFiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvbWFuYWdlci9DLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS5tYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgQyBleHRlbmRzIEJhc2VPcGVyYXRpb24gewotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL21hbmFnZXIvRC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS9tYW5hZ2VyL0QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRhYWQyMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL21hbmFnZXIvRC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkubWFuYWdlcjsKLQotcHVibGljIGNsYXNzIEQgZXh0ZW5kcyBCYXNlT3BlcmF0aW9uIHsKLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS9tYW5hZ2VyL0UuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvbWFuYWdlci9FLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMGM2NzEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS9tYW5hZ2VyL0UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLm1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBFIGV4dGVuZHMgQmFzZU9wZXJhdGlvbiB7Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvbWFuYWdlci9GLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL21hbmFnZXIvRi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDIzMjhlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvbWFuYWdlci9GLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS5tYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgRiBleHRlbmRzIEJhc2VPcGVyYXRpb24gewotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL21hbmFnZXIvRy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS9tYW5hZ2VyL0cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY4YTQwZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL21hbmFnZXIvRy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkubWFuYWdlcjsKLQotcHVibGljIGNsYXNzIEcgZXh0ZW5kcyBCYXNlT3BlcmF0aW9uIHsKLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS9tYW5hZ2VyL1Rlc3RFeHRlbmRlZFByb3ZpZGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL21hbmFnZXIvVGVzdEV4dGVuZGVkUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYxMGUzMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL21hbmFnZXIvVGVzdEV4dGVuZGVkUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS5tYW5hZ2VyOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0RXh0ZW5kZWRQcm92aWRlciBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXIKLXsKLSAgcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCl7Ci0gICAgU2V0IHByb3BlcnR5TmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7Ci0gICAgcHJvcGVydHlOYW1lcy5hZGQoImV4ZWN1dGVkT3BzIik7Ci0gICAgcHJvcGVydHlOYW1lcy5hZGQoImV4ZWN1dGVkVW5kb09wcyIpOwotICAgIAotICAgIHJldHVybiBwcm9wZXJ0eU5hbWVzOwotICB9Ci0KLSAgcHVibGljIHZvaWQgaW5pdCgpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SUQoKQotICB7Ci0gICAgcmV0dXJuICJUZXN0RXh0ZW5kZWRQcm92aWRlciI7Ci0gIH0KLSAgCi0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvbWFuYWdlci9UZXN0R3JvdXBNYW5hZ2VyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL21hbmFnZXIvVGVzdEdyb3VwTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDQzZGViLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvbWFuYWdlci9UZXN0R3JvdXBNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLm1hbmFnZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5FbnZpcm9ubWVudFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwuRGF0YU1vZGVsSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLkRhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLklEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5JRE1QYWdlR3JvdXBIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuSURNUGFnZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5TaW1wbGVQYWdlR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLlBhZ2VHcm91cE1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0R3JvdXBNYW5hZ2VyIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHJpdmF0ZSBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb24gcm9vdE9wZXJhdGlvbjsKLQotCXByaXZhdGUgUGFnZUdyb3VwTWFuYWdlciBwYWdlR3JvdXBNYW5hZ2VyOwotCXByaXZhdGUgU2ltcGxlUGFnZUdyb3VwIHBnQTsKLQlwcml2YXRlIFNpbXBsZVBhZ2VHcm91cCBwZ0I7Ci0JcHJpdmF0ZSBTaW1wbGVQYWdlR3JvdXAgcGdDOwotCXByaXZhdGUgU2ltcGxlUGFnZUdyb3VwIHBnRDsKLQlwcml2YXRlIFNpbXBsZVBhZ2VHcm91cCBwZ0U7Ci0JcHJpdmF0ZSBTaW1wbGVQYWdlR3JvdXAgcGdGOwotCXByaXZhdGUgU2ltcGxlUGFnZUdyb3VwIHBnRzsKLQlwcml2YXRlIFNpbXBsZVBhZ2VHcm91cCBwZ0g7Ci0JcHJpdmF0ZSBTaW1wbGVQYWdlR3JvdXAgcGdSb290OwotCXByaXZhdGUgV2l6YXJkUGFnZSByMTsKLQlwcml2YXRlIFdpemFyZFBhZ2UgYjE7Ci0JcHJpdmF0ZSBXaXphcmRQYWdlIGIyOwotCXByaXZhdGUgV2l6YXJkUGFnZSBjMTsKLQlwcml2YXRlIFdpemFyZFBhZ2UgZDE7Ci0JcHJpdmF0ZSBXaXphcmRQYWdlIGQyOwotCXByaXZhdGUgV2l6YXJkUGFnZSBkMzsKLQlwcml2YXRlIFdpemFyZFBhZ2UgZjE7Ci0JcHJpdmF0ZSBXaXphcmRQYWdlIGYyOwotCXByaXZhdGUgV2l6YXJkUGFnZSBmMzsKLQlwcml2YXRlIFdpemFyZFBhZ2UgZjQ7Ci0JcHJpdmF0ZSBXaXphcmRQYWdlIGY1OwotCXByaXZhdGUgV2l6YXJkUGFnZSBmNjsKLQlwcml2YXRlIFdpemFyZFBhZ2UgZzE7Ci0KLQlwcml2YXRlIEFHcm91cEhhbmRsZXIgYUdyb3VwSGFuZGxlcjsKLQlwcml2YXRlIEZHcm91cEhhbmRsZXIgZkdyb3VwSGFuZGxlcjsKLQlwcml2YXRlIFZlY3RvciBleHBlY3RlZE9wczsKLQlwcml2YXRlIFZlY3RvciBleHBlY3RlZFVuZG9PcHM7Ci0JcHJpdmF0ZSBJRGF0YU1vZGVsIGRhdGFNb2RlbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGEgPSBBLmNsYXNzLmdldE5hbWUoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBiID0gQi5jbGFzcy5nZXROYW1lKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgYyA9IEMuY2xhc3MuZ2V0TmFtZSgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGQgPSBELmNsYXNzLmdldE5hbWUoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBlID0gRS5jbGFzcy5nZXROYW1lKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZiA9IEYuY2xhc3MuZ2V0TmFtZSgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGcgPSBHLmNsYXNzLmdldE5hbWUoKTsKLQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJQmFzZU9wZXJhdGlvbi5yZXN1bHRMaXN0ID0gbmV3IFZlY3RvcigpOwotCQlCYXNlT3BlcmF0aW9uLnVuZG9MaXN0ID0gbmV3IFZlY3RvcigpOwotCi0JCWV4cGVjdGVkT3BzID0gbmV3IFZlY3RvcigpOwotCQlleHBlY3RlZFVuZG9PcHMgPSBuZXcgVmVjdG9yKCk7Ci0JCWRhdGFNb2RlbCA9IG5ldyBEYXRhTW9kZWxJbXBsKG5ldyBFbXB0eVByb3ZpZGVyKCkpOwotCQlkYXRhTW9kZWwuYWRkTmVzdGVkTW9kZWwoInRlc3Rwcm92aWRlcjEiLCBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgVGVzdFByb3ZpZGVyMSgpKSk7Ci0JCWRhdGFNb2RlbC5hZGROZXN0ZWRNb2RlbCgidGVzdHByb3ZpZGVyMiIsIERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBUZXN0UHJvdmlkZXIyKCkpKTsKLQkJZGF0YU1vZGVsLmFkZE5lc3RlZE1vZGVsKCJ0ZXN0ZXh0ZW5kZWRwcm92aWRlciIsIERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBUZXN0RXh0ZW5kZWRQcm92aWRlcigpKSk7Ci0KLQkJLyoqCi0JCSAqIE9wZXJhdGlvbnMgYXJlIG9yZ2FuaXplZCBhcyBmb2xsb3dzOiA8Y29kZT4KLQkJICoJICAgIEQKLQkJICogICAgIC8gXAotCQkgKiAgICAvICAgXAotCQkgKiAgIEIgICAgIEYKLQkJICogIC8gXCAgIC8gXAotCQkgKiBBICAgQyBFICAgRwotCQkgKiA8L2NvZGU+Ci0JCSAqLwotCQlyb290T3BlcmF0aW9uID0gbmV3IERhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uSW1wbChuZXcgRCgpKTsKLQkJcm9vdE9wZXJhdGlvbi5zZXREYXRhTW9kZWwoZGF0YU1vZGVsKTsKLQkJcm9vdE9wZXJhdGlvbi5zZXRFbnZpcm9ubWVudChFbnZpcm9ubWVudFNlcnZpY2UuZ2V0RWNsaXBzZUNvbnNvbGVFbnZpcm9ubWVudCgpKTsKLQotCQkvKioKLQkJICogUGFnZSBncm91cHMgYXJlIG9yZ2FuaXplZCBhcyBmb2xsb3dzOgotCQkgKiAKLQkJICogPGNvZGU+Ci0JCSAqCi0JCSAqICAgICAgICAgICAgICBCIC0gQwotCQkgKiAgICAgICAgICAgICAvICAgICBcCi0JCSAqIFJvb3QgLSBBIC0gRCAgICAgICBcICAgICAgICAgRwotCQkgKiAgICAgICAgICAgICBcICAgICAgIFwgICAgICAvCi0JCSAqICAgICAgICAgICAgICAgLS0tLS0tIEUgLSBGIC0gSAotCQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIG51bGwKLQkJICogPC9jb2RlPgotCQkgKi8KLQotCQkvLyBUaGUgcGFnZSBncm91cCBoYW5kbGVyIGZvciBBIHdpbGwgcmV0dXJuIGVpdGhlciBCIGFuZCB0aGVuIEUgb3IgRCBhbmQKLQkJLy8gdGhlbiBFLiBUaGUgZ3JvdXAgaGFuZGxlciBmb3IgRiB3aWxsIHJldHVybiBlaXRoZXIgRyBvciBIIGFuZCB0aGVuIG51bGwgb3IKLQkJLy8ganVzdCBudWxsLgotCQkvLyAKLQkJLy8gU29tZSBvZiB0aGVzZSBncm91cCByZXF1aXJlIG9wZXJhdGlvbnMgdG8gcnVuIGZpcnN0OgotCQkvLwotCQkvLyBQYWdlIGdyb3VwIEIgcmVxdWlyZXMgb3BlcmF0aW9uIEMuCi0JCS8vIFBhZ2UgZ3JvdXAgRCByZXF1aXJlcyBvcGVyYXRpb24gQy4KLQkJLy8gUGFnZSBncm91cCBFIHJlcXVpcmVzIG9wZXJhdGlvbiBFLgotCQkvLyBQYWdlIGdyb3VwIEYgcmVxdWlyZXMgb3BlcmF0aW9uIEMuKCBDIHdpbGwgYWxyZWFkeSBoYXZlIGJlZW4gcnVuIGFuZCBzaG91bGQgbm90IGJlCi0JCS8vIHJlcnVuLikKLQkJLy8KLQkJLy8gRWFjaCBwYWdlIGdyb3VwIGhhcyBzb21lIHBhZ2VzIGFzc29jaWF0ZWQgd2l0aCBpdCBhcyBmb2xsb3dzOgotCQkvLwotCQkvLyBSb290IGhhcyBwYWdlIHIxLgotCQkvLyBBIGhhcyBubyBwYWdlcy4KLQkJLy8gQiBoYXMgYjEgYW5kIGIyLgotCQkvLyBDIGhhcyBjMQotCQkvLyBEIGhhcyBkMSwgZDIsIGFuZCBkMwotCQkvLyBFIGhhcyBubyBwYWdlcy4KLQkJLy8gRiBoYXMgcGFnZXMgZjEsIGYyLCBmMywgZjQsIGY1LCBmNgotCQkvLyB0aGUgcGFnZSBoYW5kbGVyIGZvciBGIHdpbGwgcmV0dXJuIHRoZSBmb2xsb3dpbmc6Ci0JCS8vIGV4cGVjdGVkID0gZjEgcmV0dXJucyBmMQotCQkvLyBleHBlY3RlZCA9IGYyIHJldHVybnMgc2tpcAotCQkvLyBleHBlY3RlZCA9IGYzIHJldHVybnMgYmVmb3JlIGY2Ci0JCS8vIGV4cGVjdGVkID0gZjQgcmV0dXJucyBudWxsCi0JCS8vIGV4cGVjdGVkID0gZjUgcmV0dXJucyBhZnRlciBmNQotCQkvLyBleHBlY3RlZCA9IGY2IHJldHVybnMgZjQKLQkJLy8gRyBoYXMgcGFnZXMgZzEKLQkJLy8gSCBoYXMgbm8gcGFnZXMuCi0JCXIxID0gbmV3IFdpemFyZFBhZ2UoInIxIik7IC8vJE5PTi1OTFMtMSQKLQkJYjEgPSBuZXcgV2l6YXJkUGFnZSgiYjEiKTsgLy8kTk9OLU5MUy0xJAotCQliMiA9IG5ldyBXaXphcmRQYWdlKCJiMiIpOyAvLyROT04tTkxTLTEkCi0JCWMxID0gbmV3IFdpemFyZFBhZ2UoImMxIik7IC8vJE5PTi1OTFMtMSQKLQkJZDEgPSBuZXcgV2l6YXJkUGFnZSgiZDEiKTsgLy8kTk9OLU5MUy0xJAotCQlkMiA9IG5ldyBXaXphcmRQYWdlKCJkMiIpOyAvLyROT04tTkxTLTEkCi0JCWQzID0gbmV3IFdpemFyZFBhZ2UoImQzIik7IC8vJE5PTi1OTFMtMSQKLQkJZjEgPSBuZXcgV2l6YXJkUGFnZSgiZjEiKTsgLy8kTk9OLU5MUy0xJAotCQlmMiA9IG5ldyBXaXphcmRQYWdlKCJmMiIpOyAvLyROT04tTkxTLTEkCi0JCWYzID0gbmV3IFdpemFyZFBhZ2UoImYzIik7IC8vJE5PTi1OTFMtMSQKLQkJZjQgPSBuZXcgV2l6YXJkUGFnZSgiZjQiKTsgLy8kTk9OLU5MUy0xJAotCQlmNSA9IG5ldyBXaXphcmRQYWdlKCJmNSIpOyAvLyROT04tTkxTLTEkCi0JCWY2ID0gbmV3IFdpemFyZFBhZ2UoImY2Iik7IC8vJE5PTi1OTFMtMSQKLQkJZzEgPSBuZXcgV2l6YXJkUGFnZSgiZzEiKTsgLy8kTk9OLU5MUy0xJAotCi0JCVN0cmluZyB3aXphcmRJRCA9ICJ0ZXN0V2l6YXJkIjsgLy8kTk9OLU5MUy0xJAotCi0JCXBnUm9vdCA9IG5ldyBTaW1wbGVQYWdlR3JvdXAoIlJvb3QiLCB3aXphcmRJRCk7IC8vJE5PTi1OTFMtMSQKLQkJcGdBID0gbmV3IFNpbXBsZVBhZ2VHcm91cCgiQSIsIHdpemFyZElEKTsgLy8kTk9OLU5MUy0xJAotCQlwZ0IgPSBuZXcgU2ltcGxlUGFnZUdyb3VwKCJCIiwgd2l6YXJkSUQsIHRydWUsIGMpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcGdDID0gbmV3IFNpbXBsZVBhZ2VHcm91cCgiQyIsIHdpemFyZElEKTsgLy8kTk9OLU5MUy0xJAotCQlwZ0QgPSBuZXcgU2ltcGxlUGFnZUdyb3VwKCJEIiwgd2l6YXJkSUQsIHRydWUsIGMpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcGdFID0gbmV3IFNpbXBsZVBhZ2VHcm91cCgiRSIsIHdpemFyZElELCB0cnVlLCBlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXBnRiA9IG5ldyBTaW1wbGVQYWdlR3JvdXAoIkYiLCB3aXphcmRJRCwgdHJ1ZSwgYyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlwZ0cgPSBuZXcgU2ltcGxlUGFnZUdyb3VwKCJHIiwgd2l6YXJkSUQpOyAvLyROT04tTkxTLTEkCi0JCXBnSCA9IG5ldyBTaW1wbGVQYWdlR3JvdXAoIkgiLCB3aXphcmRJRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlwZ1Jvb3QuYWRkUGFnZXMobmV3IFdpemFyZFBhZ2VbXXtyMX0pOwotCQlwZ0IuYWRkUGFnZXMobmV3IFdpemFyZFBhZ2VbXXtiMSwgYjJ9KTsKLQkJcGdDLmFkZFBhZ2VzKG5ldyBXaXphcmRQYWdlW117YzF9KTsKLQkJcGdELmFkZFBhZ2VzKG5ldyBXaXphcmRQYWdlW117ZDEsIGQyLCBkM30pOwotCQlwZ0YuYWRkUGFnZXMobmV3IFdpemFyZFBhZ2VbXXtmMSwgZjIsIGYzLCBmNCwgZjUsIGY2fSk7Ci0JCXBnRy5hZGRQYWdlcyhuZXcgV2l6YXJkUGFnZVtde2cxfSk7Ci0KLQkJcGdGLnNldFBhZ2VIYW5kbGVyKG5ldyBGUGFnZUhhbmRsZXIoKSk7Ci0KLQkJYUdyb3VwSGFuZGxlciA9IG5ldyBBR3JvdXBIYW5kbGVyKCk7Ci0JCWZHcm91cEhhbmRsZXIgPSBuZXcgRkdyb3VwSGFuZGxlcigpOwotCi0JCXBnQS5zZXRQYWdlR3JvdXBIYW5kbGVyKGFHcm91cEhhbmRsZXIpOwotCQlwZ0Yuc2V0UGFnZUdyb3VwSGFuZGxlcihmR3JvdXBIYW5kbGVyKTsKLQotCQlwYWdlR3JvdXBNYW5hZ2VyID0gbmV3IFBhZ2VHcm91cE1hbmFnZXIocm9vdE9wZXJhdGlvbiwgcGdSb290KTsKLQkJcGFnZUdyb3VwTWFuYWdlci5hZGRHcm91cEFmdGVyKCJSb290IiwgcGdBKTsgLy8kTk9OLU5MUy0xJAotCQlwYWdlR3JvdXBNYW5hZ2VyLmFkZEdyb3VwQWZ0ZXIoIkEiLCBwZ0IpOyAvLyROT04tTkxTLTEkCi0JCXBhZ2VHcm91cE1hbmFnZXIuYWRkR3JvdXBBZnRlcigiQSIsIHBnRCk7IC8vJE5PTi1OTFMtMSQKLQkJcGFnZUdyb3VwTWFuYWdlci5hZGRHcm91cEFmdGVyKCJBIiwgcGdFKTsgLy8kTk9OLU5MUy0xJAotCQlwYWdlR3JvdXBNYW5hZ2VyLmFkZEdyb3VwQWZ0ZXIoIkIiLCBwZ0MpOyAvLyROT04tTkxTLTEkCi0JCXBhZ2VHcm91cE1hbmFnZXIuYWRkR3JvdXBBZnRlcigiRSIsIHBnRik7IC8vJE5PTi1OTFMtMSQKLQkJcGFnZUdyb3VwTWFuYWdlci5hZGRHcm91cEFmdGVyKCJGIiwgcGdHKTsgLy8kTk9OLU5MUy0xJAotCQlwYWdlR3JvdXBNYW5hZ2VyLmFkZEdyb3VwQWZ0ZXIoIkYiLCBwZ0gpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpbXBsZVJ1bigpIHRocm93cyBFeGNlcHRpb24gewotCQlIYXNoU2V0IGlkcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWlkcy5hZGQoInRlc3Rwcm92aWRlcjEiKTsKLQkJaWRzLmFkZCgidGVzdHByb3ZpZGVyMiIpOwotCQlwZ0Euc2V0RGF0YU1vZGVsSURzKGlkcyk7Ci0JCWFzc2VydFRydWUoIlRoZXJlIHNob3VsZCBiZSBhIG5leHQgcGFnZSIsIHBhZ2VHcm91cE1hbmFnZXIuaGFzTmV4dFBhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHJvb3QgcGFnZSBzaG91bGQgYmUgbnVsbCIsIHBhZ2VHcm91cE1hbmFnZXIuZ2V0Q3VycmVudFBhZ2UoKSA9PSBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQlwYWdlR3JvdXBNYW5hZ2VyLm1vdmVCYWNrT25lUGFnZSgpOyAvLyBTaG91bGQgZG8gbm90aGluZy4KLQkJY2hlY2tSZXN1bHRzKCk7Ci0KLQkJcGFnZUdyb3VwTWFuYWdlci5tb3ZlRm9yd2FyZE9uZVBhZ2UoKTsKLQkJYUdyb3VwSGFuZGxlci5zZXRHcm91cElEVG9TZWxlY3QoIkIiKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJUaGVyZSBzaG91bGQgYmUgYSBuZXh0IHBhZ2UiLCBwYWdlR3JvdXBNYW5hZ2VyLmhhc05leHRQYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlRoZSBwYWdlIHNob3VsZCBiZSByMSIsIHBhZ2VHcm91cE1hbmFnZXIuZ2V0Q3VycmVudFBhZ2UoKSA9PSByMSk7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tSZXN1bHRzKCk7Ci0JCWFzc2VydFRydWUoIkRhdGEgbW9kZWxzIG5vdCBPayBmb3IgcGFnZSBncm91cCBBIiwgY2hlY2tEYXRhTW9kZWxzKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJcGFnZUdyb3VwTWFuYWdlci5tb3ZlRm9yd2FyZE9uZVBhZ2UoKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlcmUgc2hvdWxkIGJlIGEgbmV4dCBwYWdlIiwgcGFnZUdyb3VwTWFuYWdlci5oYXNOZXh0UGFnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJUaGUgcGFnZSBzaG91bGQgYmUgYjEiLCBwYWdlR3JvdXBNYW5hZ2VyLmdldEN1cnJlbnRQYWdlKCkgPT0gYjEpOyAvLyROT04tTkxTLTEkCi0JCWV4cGVjdGVkT3BzLmFkZChhKTsKLQkJZXhwZWN0ZWRPcHMuYWRkKGIpOwotCQlleHBlY3RlZE9wcy5hZGQoYyk7Ci0JCWNoZWNrUmVzdWx0cygpOwotCi0JCXBhZ2VHcm91cE1hbmFnZXIubW92ZUZvcndhcmRPbmVQYWdlKCk7Ci0JCWFzc2VydFRydWUoIlRoZXJlIHNob3VsZCBiZSBhIG5leHQgcGFnZSIsIHBhZ2VHcm91cE1hbmFnZXIuaGFzTmV4dFBhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHBhZ2Ugc2hvdWxkIGJlIGIyIiwgcGFnZUdyb3VwTWFuYWdlci5nZXRDdXJyZW50UGFnZSgpID09IGIyKTsgLy8kTk9OLU5MUy0xJAotCQljaGVja1Jlc3VsdHMoKTsKLQotCQlwYWdlR3JvdXBNYW5hZ2VyLm1vdmVGb3J3YXJkT25lUGFnZSgpOwotCQlhc3NlcnRUcnVlKCJUaGVyZSBzaG91bGQgYmUgYSBuZXh0IHBhZ2UiLCBwYWdlR3JvdXBNYW5hZ2VyLmhhc05leHRQYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlRoZSBwYWdlIHNob3VsZCBiZSBjMSIsIHBhZ2VHcm91cE1hbmFnZXIuZ2V0Q3VycmVudFBhZ2UoKSA9PSBjMSk7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tSZXN1bHRzKCk7Ci0KLQkJcGFnZUdyb3VwTWFuYWdlci5tb3ZlRm9yd2FyZE9uZVBhZ2UoKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlcmUgc2hvdWxkIGJlIGEgbmV4dCBwYWdlIiwgcGFnZUdyb3VwTWFuYWdlci5oYXNOZXh0UGFnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJUaGUgcGFnZSBzaG91bGQgYmUgZjEiLCBwYWdlR3JvdXBNYW5hZ2VyLmdldEN1cnJlbnRQYWdlKCkgPT0gZjEpOyAvLyROT04tTkxTLTEkCi0JCWV4cGVjdGVkT3BzLmFkZChkKTsKLQkJZXhwZWN0ZWRPcHMuYWRkKGUpOwotCQljaGVja1Jlc3VsdHMoKTsKLQotCQlwYWdlR3JvdXBNYW5hZ2VyLm1vdmVGb3J3YXJkT25lUGFnZSgpOwotCQlhc3NlcnRUcnVlKCJUaGVyZSBzaG91bGQgYmUgYSBuZXh0IHBhZ2UiLCBwYWdlR3JvdXBNYW5hZ2VyLmhhc05leHRQYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlRoZSBwYWdlIHNob3VsZCBiZSBmMyIsIHBhZ2VHcm91cE1hbmFnZXIuZ2V0Q3VycmVudFBhZ2UoKSA9PSBmMyk7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tSZXN1bHRzKCk7Ci0KLQkJcGFnZUdyb3VwTWFuYWdlci5tb3ZlRm9yd2FyZE9uZVBhZ2UoKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlcmUgc2hvdWxkIGJlIGEgbmV4dCBwYWdlIiwgcGFnZUdyb3VwTWFuYWdlci5oYXNOZXh0UGFnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJUaGUgcGFnZSBzaG91bGQgYmUgZjUiLCBwYWdlR3JvdXBNYW5hZ2VyLmdldEN1cnJlbnRQYWdlKCkgPT0gZjUpOyAvLyROT04tTkxTLTEkCi0JCWNoZWNrUmVzdWx0cygpOwotCi0JCXBhZ2VHcm91cE1hbmFnZXIubW92ZUZvcndhcmRPbmVQYWdlKCk7Ci0JCWFzc2VydFRydWUoIlRoZXJlIHNob3VsZCBiZSBhIG5leHQgcGFnZSIsIHBhZ2VHcm91cE1hbmFnZXIuaGFzTmV4dFBhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHBhZ2Ugc2hvdWxkIGJlIGY2IiwgcGFnZUdyb3VwTWFuYWdlci5nZXRDdXJyZW50UGFnZSgpID09IGY2KTsgLy8kTk9OLU5MUy0xJAotCQljaGVja1Jlc3VsdHMoKTsKLQotCQlwYWdlR3JvdXBNYW5hZ2VyLm1vdmVGb3J3YXJkT25lUGFnZSgpOwotCQlmR3JvdXBIYW5kbGVyLnNldEdyb3VwSURUb1NlbGVjdCgiRyIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlRoZXJlIHNob3VsZCBiZSBhIG5leHQgcGFnZSIsIHBhZ2VHcm91cE1hbmFnZXIuaGFzTmV4dFBhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHBhZ2Ugc2hvdWxkIGJlIGY0IiwgcGFnZUdyb3VwTWFuYWdlci5nZXRDdXJyZW50UGFnZSgpID09IGY0KTsgLy8kTk9OLU5MUy0xJAotCQljaGVja1Jlc3VsdHMoKTsKLQotCQlwYWdlR3JvdXBNYW5hZ2VyLm1vdmVGb3J3YXJkT25lUGFnZSgpOwotCQlhc3NlcnRGYWxzZSgiVGhlcmUgc2hvdWxkIG5vdCBiZSBhIG5leHQgcGFnZSIsIHBhZ2VHcm91cE1hbmFnZXIuaGFzTmV4dFBhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHBhZ2Ugc2hvdWxkIGJlIGcxIiwgcGFnZUdyb3VwTWFuYWdlci5nZXRDdXJyZW50UGFnZSgpID09IGcxKTsgLy8kTk9OLU5MUy0xJAotCQljaGVja1Jlc3VsdHMoKTsKLQotCQlwYWdlR3JvdXBNYW5hZ2VyLm1vdmVCYWNrT25lUGFnZSgpOwotCQlhc3NlcnRUcnVlKCJUaGVyZSBzaG91bGQgYmUgYSBuZXh0IHBhZ2UiLCBwYWdlR3JvdXBNYW5hZ2VyLmhhc05leHRQYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlRoZSBwYWdlIHNob3VsZCBiZSBmNCIsIHBhZ2VHcm91cE1hbmFnZXIuZ2V0Q3VycmVudFBhZ2UoKSA9PSBmNCk7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tSZXN1bHRzKCk7Ci0KLQkJcGFnZUdyb3VwTWFuYWdlci5tb3ZlQmFja09uZVBhZ2UoKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlcmUgc2hvdWxkIGJlIGEgbmV4dCBwYWdlIiwgcGFnZUdyb3VwTWFuYWdlci5oYXNOZXh0UGFnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJUaGUgcGFnZSBzaG91bGQgYmUgZjQiLCBwYWdlR3JvdXBNYW5hZ2VyLmdldEN1cnJlbnRQYWdlKCkgPT0gZjYpOyAvLyROT04tTkxTLTEkCi0JCWNoZWNrUmVzdWx0cygpOwotCi0JCXBhZ2VHcm91cE1hbmFnZXIubW92ZUJhY2tPbmVQYWdlKCk7Ci0JCWFzc2VydFRydWUoIlRoZXJlIHNob3VsZCBiZSBhIG5leHQgcGFnZSIsIHBhZ2VHcm91cE1hbmFnZXIuaGFzTmV4dFBhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHBhZ2Ugc2hvdWxkIGJlIGY0IiwgcGFnZUdyb3VwTWFuYWdlci5nZXRDdXJyZW50UGFnZSgpID09IGY1KTsgLy8kTk9OLU5MUy0xJAotCQljaGVja1Jlc3VsdHMoKTsKLQotCQlwYWdlR3JvdXBNYW5hZ2VyLm1vdmVCYWNrT25lUGFnZSgpOwotCQlhc3NlcnRUcnVlKCJUaGVyZSBzaG91bGQgYmUgYSBuZXh0IHBhZ2UiLCBwYWdlR3JvdXBNYW5hZ2VyLmhhc05leHRQYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlRoZSBwYWdlIHNob3VsZCBiZSBmNCIsIHBhZ2VHcm91cE1hbmFnZXIuZ2V0Q3VycmVudFBhZ2UoKSA9PSBmMyk7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tSZXN1bHRzKCk7Ci0KLQkJcGFnZUdyb3VwTWFuYWdlci5tb3ZlQmFja09uZVBhZ2UoKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlcmUgc2hvdWxkIGJlIGEgbmV4dCBwYWdlIiwgcGFnZUdyb3VwTWFuYWdlci5oYXNOZXh0UGFnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJUaGUgcGFnZSBzaG91bGQgYmUgZjQiLCBwYWdlR3JvdXBNYW5hZ2VyLmdldEN1cnJlbnRQYWdlKCkgPT0gZjEpOyAvLyROT04tTkxTLTEkCi0JCWNoZWNrUmVzdWx0cygpOwotCi0JCXBhZ2VHcm91cE1hbmFnZXIubW92ZUJhY2tPbmVQYWdlKCk7Ci0JCWFzc2VydFRydWUoIlRoZXJlIHNob3VsZCBiZSBhIG5leHQgcGFnZSIsIHBhZ2VHcm91cE1hbmFnZXIuaGFzTmV4dFBhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHBhZ2Ugc2hvdWxkIGJlIGY0IiwgcGFnZUdyb3VwTWFuYWdlci5nZXRDdXJyZW50UGFnZSgpID09IGMxKTsgLy8kTk9OLU5MUy0xJAotCQlleHBlY3RlZE9wcy5zZXRTaXplKDMpOwotCQlleHBlY3RlZFVuZG9PcHMuYWRkKGUpOwotCQlleHBlY3RlZFVuZG9PcHMuYWRkKGQpOwotCQljaGVja1Jlc3VsdHMoKTsKLQotCQlwYWdlR3JvdXBNYW5hZ2VyLm1vdmVCYWNrT25lUGFnZSgpOwotCQlhc3NlcnRUcnVlKCJUaGVyZSBzaG91bGQgYmUgYSBuZXh0IHBhZ2UiLCBwYWdlR3JvdXBNYW5hZ2VyLmhhc05leHRQYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlRoZSBwYWdlIHNob3VsZCBiZSBiMiIsIHBhZ2VHcm91cE1hbmFnZXIuZ2V0Q3VycmVudFBhZ2UoKSA9PSBiMik7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tSZXN1bHRzKCk7Ci0KLQkJcGFnZUdyb3VwTWFuYWdlci5tb3ZlQmFja09uZVBhZ2UoKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlcmUgc2hvdWxkIGJlIGEgbmV4dCBwYWdlIiwgcGFnZUdyb3VwTWFuYWdlci5oYXNOZXh0UGFnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJUaGUgcGFnZSBzaG91bGQgYmUgYjEiLCBwYWdlR3JvdXBNYW5hZ2VyLmdldEN1cnJlbnRQYWdlKCkgPT0gYjEpOyAvLyROT04tTkxTLTEkCi0JCWNoZWNrUmVzdWx0cygpOwotCi0JCXBhZ2VHcm91cE1hbmFnZXIubW92ZUJhY2tPbmVQYWdlKCk7Ci0JCWFzc2VydFRydWUoIlRoZXJlIHNob3VsZCBiZSBhIG5leHQgcGFnZSIsIHBhZ2VHcm91cE1hbmFnZXIuaGFzTmV4dFBhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHJvb3QgcGFnZSBzaG91bGQgYmUgcjEiLCBwYWdlR3JvdXBNYW5hZ2VyLmdldEN1cnJlbnRQYWdlKCkgPT0gcjEpOyAvLyROT04tTkxTLTEkCi0JCWV4cGVjdGVkT3BzID0gbmV3IFZlY3RvcigpOwotCQlleHBlY3RlZFVuZG9PcHMuYWRkKGMpOwotCQlleHBlY3RlZFVuZG9PcHMuYWRkKGIpOwotCQlleHBlY3RlZFVuZG9PcHMuYWRkKGEpOwotCQljaGVja1Jlc3VsdHMoKTsKLQotCQlyZXNldCgpOwotCQlhR3JvdXBIYW5kbGVyLnNldEdyb3VwSURUb1NlbGVjdCgiRCIpOyAvLyROT04tTkxTLTEkCi0JCXBhZ2VHcm91cE1hbmFnZXIubW92ZUZvcndhcmRPbmVQYWdlKCk7Ci0JCWFzc2VydFRydWUoIlRoZXJlIHNob3VsZCBiZSBhIG5leHQgcGFnZSIsIHBhZ2VHcm91cE1hbmFnZXIuaGFzTmV4dFBhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHBhZ2Ugc2hvdWxkIGJlIGQxIiwgcGFnZUdyb3VwTWFuYWdlci5nZXRDdXJyZW50UGFnZSgpID09IGQxKTsgLy8kTk9OLU5MUy0xJAotCQlleHBlY3RlZE9wcy5hZGQoYSk7Ci0JCWV4cGVjdGVkT3BzLmFkZChiKTsKLQkJZXhwZWN0ZWRPcHMuYWRkKGMpOwotCQljaGVja1Jlc3VsdHMoKTsKLQotCQlwYWdlR3JvdXBNYW5hZ2VyLm1vdmVGb3J3YXJkT25lUGFnZSgpOwotCQlhc3NlcnRUcnVlKCJUaGVyZSBzaG91bGQgYmUgYSBuZXh0IHBhZ2UiLCBwYWdlR3JvdXBNYW5hZ2VyLmhhc05leHRQYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlRoZSBwYWdlIHNob3VsZCBiZSBkMiIsIHBhZ2VHcm91cE1hbmFnZXIuZ2V0Q3VycmVudFBhZ2UoKSA9PSBkMik7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tSZXN1bHRzKCk7Ci0KLQkJcGFnZUdyb3VwTWFuYWdlci5tb3ZlRm9yd2FyZE9uZVBhZ2UoKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlcmUgc2hvdWxkIGJlIGEgbmV4dCBwYWdlIiwgcGFnZUdyb3VwTWFuYWdlci5oYXNOZXh0UGFnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJUaGUgcGFnZSBzaG91bGQgYmUgZDMiLCBwYWdlR3JvdXBNYW5hZ2VyLmdldEN1cnJlbnRQYWdlKCkgPT0gZDMpOyAvLyROT04tTkxTLTEkCi0JCWNoZWNrUmVzdWx0cygpOwotCi0JCXBhZ2VHcm91cE1hbmFnZXIubW92ZUZvcndhcmRPbmVQYWdlKCk7Ci0JCWFzc2VydFRydWUoIlRoZXJlIHNob3VsZCBiZSBhIG5leHQgcGFnZSIsIHBhZ2VHcm91cE1hbmFnZXIuaGFzTmV4dFBhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHBhZ2Ugc2hvdWxkIGJlIGYxIiwgcGFnZUdyb3VwTWFuYWdlci5nZXRDdXJyZW50UGFnZSgpID09IGYxKTsgLy8kTk9OLU5MUy0xJAotCQlleHBlY3RlZE9wcy5hZGQoZCk7Ci0JCWV4cGVjdGVkT3BzLmFkZChlKTsKLQkJY2hlY2tSZXN1bHRzKCk7Ci0KLQkJcGFnZUdyb3VwTWFuYWdlci5tb3ZlRm9yd2FyZE9uZVBhZ2UoKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlcmUgc2hvdWxkIGJlIGEgbmV4dCBwYWdlIiwgcGFnZUdyb3VwTWFuYWdlci5oYXNOZXh0UGFnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJUaGUgcGFnZSBzaG91bGQgYmUgZjMiLCBwYWdlR3JvdXBNYW5hZ2VyLmdldEN1cnJlbnRQYWdlKCkgPT0gZjMpOyAvLyROT04tTkxTLTEkCi0JCWNoZWNrUmVzdWx0cygpOwotCi0JCXBhZ2VHcm91cE1hbmFnZXIubW92ZUZvcndhcmRPbmVQYWdlKCk7Ci0JCWFzc2VydFRydWUoIlRoZXJlIHNob3VsZCBiZSBhIG5leHQgcGFnZSIsIHBhZ2VHcm91cE1hbmFnZXIuaGFzTmV4dFBhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHBhZ2Ugc2hvdWxkIGJlIGY1IiwgcGFnZUdyb3VwTWFuYWdlci5nZXRDdXJyZW50UGFnZSgpID09IGY1KTsgLy8kTk9OLU5MUy0xJAotCQljaGVja1Jlc3VsdHMoKTsKLQotCQlwYWdlR3JvdXBNYW5hZ2VyLm1vdmVGb3J3YXJkT25lUGFnZSgpOwotCQlhc3NlcnRUcnVlKCJUaGVyZSBzaG91bGQgYmUgYSBuZXh0IHBhZ2UiLCBwYWdlR3JvdXBNYW5hZ2VyLmhhc05leHRQYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlRoZSBwYWdlIHNob3VsZCBiZSBmNiIsIHBhZ2VHcm91cE1hbmFnZXIuZ2V0Q3VycmVudFBhZ2UoKSA9PSBmNik7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tSZXN1bHRzKCk7Ci0KLQkJcGFnZUdyb3VwTWFuYWdlci5tb3ZlRm9yd2FyZE9uZVBhZ2UoKTsKLQkJZkdyb3VwSGFuZGxlci5zZXRHcm91cElEVG9TZWxlY3QobnVsbCk7Ci0JCWFzc2VydEZhbHNlKCJUaGVyZSBzaG91bGQgbm90IGJlIGEgbmV4dCBwYWdlIiwgcGFnZUdyb3VwTWFuYWdlci5oYXNOZXh0UGFnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJUaGUgcGFnZSBzaG91bGQgYmUgZjQiLCBwYWdlR3JvdXBNYW5hZ2VyLmdldEN1cnJlbnRQYWdlKCkgPT0gZjQpOyAvLyROT04tTkxTLTEkCi0JCWNoZWNrUmVzdWx0cygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja1Jlc3VsdHMoKSB7Ci0JCWFzc2VydFRydWUoIkV4cGVjdGVkPSIgKyBleHBlY3RlZE9wcy5zaXplKCkgKyAiIGV4ZWN1dGVkPSIgKyBCYXNlT3BlcmF0aW9uLnJlc3VsdExpc3Quc2l6ZSgpLCBCYXNlT3BlcmF0aW9uLnJlc3VsdExpc3Quc2l6ZSgpID09IGV4cGVjdGVkT3BzLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBCYXNlT3BlcmF0aW9uLnJlc3VsdExpc3Quc2l6ZSgpOyBpbmRleCsrKSB7Ci0JCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRPcHMuZWxlbWVudEF0KGluZGV4KSwgQmFzZU9wZXJhdGlvbi5yZXN1bHRMaXN0LmVsZW1lbnRBdChpbmRleCkpOwotCQl9Ci0KLQkJYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgdW5kbz0iICsgZXhwZWN0ZWRVbmRvT3BzLnNpemUoKSArICIgZXhlY3V0ZWQ9IiArIEJhc2VPcGVyYXRpb24udW5kb0xpc3Quc2l6ZSgpLCBCYXNlT3BlcmF0aW9uLnVuZG9MaXN0LnNpemUoKSA9PSBleHBlY3RlZFVuZG9PcHMuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IEJhc2VPcGVyYXRpb24udW5kb0xpc3Quc2l6ZSgpOyBpbmRleCsrKSB7Ci0JCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRVbmRvT3BzLmVsZW1lbnRBdChpbmRleCksIEJhc2VPcGVyYXRpb24udW5kb0xpc3QuZWxlbWVudEF0KGluZGV4KSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVzZXQoKSB7Ci0JCUJhc2VPcGVyYXRpb24ucmVzdWx0TGlzdC5yZW1vdmVBbGxFbGVtZW50cygpOwotCQlleHBlY3RlZE9wcy5yZW1vdmVBbGxFbGVtZW50cygpOwotCQlCYXNlT3BlcmF0aW9uLnVuZG9MaXN0LnJlbW92ZUFsbEVsZW1lbnRzKCk7Ci0JCWV4cGVjdGVkVW5kb09wcy5yZW1vdmVBbGxFbGVtZW50cygpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjaGVja0RhdGFNb2RlbHMoKSB7Ci0JCUlEYXRhTW9kZWwgbW9kZWwgPSBkYXRhTW9kZWw7Ci0KLQkJYm9vbGVhbiBjb250YWluc01vZGVsMSA9IG1vZGVsLmlzTmVzdGVkTW9kZWwoInRlc3Rwcm92aWRlcjEiKTsKLQkJYm9vbGVhbiBjb250YWluc01vZGVsMiA9IG1vZGVsLmlzTmVzdGVkTW9kZWwoInRlc3Rwcm92aWRlcjIiKTsKLQkJYm9vbGVhbiBwcm9wMSA9IG1vZGVsLmlzUHJvcGVydHlTZXQoInByb3ZpZGVyMVByb3AxIik7Ci0JCWJvb2xlYW4gcHJvcDIgPSBtb2RlbC5pc1Byb3BlcnR5U2V0KCJwcm92aWRlcjFQcm9wMiIpOwotCQlib29sZWFuIHByb3AzID0gbW9kZWwuaXNQcm9wZXJ0eVNldCgicHJvdmlkZXIxUHJvcDMiKTsKLQkJYm9vbGVhbiBwcm9wNCA9IG1vZGVsLmlzUHJvcGVydHlTZXQoInByb3ZpZGVyMVByb3A0Iik7Ci0JCWJvb2xlYW4gcHJvcDUgPSBtb2RlbC5pc1Byb3BlcnR5U2V0KCJwcm92aWRlcjJQcm9wMSIpOwotCQlib29sZWFuIHByb3A2ID0gbW9kZWwuaXNQcm9wZXJ0eVNldCgicHJvdmlkZXIyUHJvcDIiKTsKLQkJYm9vbGVhbiBwcm9wNyA9IG1vZGVsLmlzUHJvcGVydHlTZXQoInByb3ZpZGVyMlByb3AzIik7Ci0JCWJvb2xlYW4gcHJvcDggPSBtb2RlbC5pc1Byb3BlcnR5U2V0KCJwcm92aWRlcjJQcm9wNCIpOwotCQlib29sZWFuIHZhbHVlMSA9IG1vZGVsLmdldFByb3BlcnR5KCJwcm92aWRlcjFQcm9wMSIpLmVxdWFscygiMTEiKTsKLQkJYm9vbGVhbiB2YWx1ZTIgPSBtb2RlbC5nZXRQcm9wZXJ0eSgicHJvdmlkZXIxUHJvcDIiKS5lcXVhbHMoIjIyIik7Ci0JCWJvb2xlYW4gdmFsdWUzID0gbW9kZWwuZ2V0UHJvcGVydHkoInByb3ZpZGVyMVByb3AzIikuZXF1YWxzKCIzMyIpOwotCQlib29sZWFuIHZhbHVlNCA9IG1vZGVsLmdldFByb3BlcnR5KCJwcm92aWRlcjFQcm9wNCIpLmVxdWFscygiNDQiKTsKLQkJYm9vbGVhbiB2YWx1ZTUgPSBtb2RlbC5nZXRQcm9wZXJ0eSgicHJvdmlkZXIyUHJvcDEiKS5lcXVhbHMoIjExMTEiKTsKLQkJYm9vbGVhbiB2YWx1ZTYgPSBtb2RlbC5nZXRQcm9wZXJ0eSgicHJvdmlkZXIyUHJvcDIiKS5lcXVhbHMoIjIyMjIiKTsKLQkJYm9vbGVhbiB2YWx1ZTcgPSBtb2RlbC5nZXRQcm9wZXJ0eSgicHJvdmlkZXIyUHJvcDMiKS5lcXVhbHMoIjMzMzMiKTsKLQkJYm9vbGVhbiB2YWx1ZTggPSBtb2RlbC5nZXRQcm9wZXJ0eSgicHJvdmlkZXIyUHJvcDQiKS5lcXVhbHMoIjQ0NDQiKTsKLQotCQlyZXR1cm4gY29udGFpbnNNb2RlbDEgJiYgY29udGFpbnNNb2RlbDIgJiYgcHJvcDEgJiYgcHJvcDIgJiYgcHJvcDMgJiYgcHJvcDQgJiYgcHJvcDUgJiYgcHJvcDYgJiYgcHJvcDcgJiYgcHJvcDggJiYgdmFsdWUxICYmIHZhbHVlMiAmJiB2YWx1ZTMgJiYgdmFsdWU0ICYmIHZhbHVlNSAmJiB2YWx1ZTYgJiYgdmFsdWU3ICYmIHZhbHVlODsKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIEFHcm91cEhhbmRsZXIgaW1wbGVtZW50cyBJRE1QYWdlR3JvdXBIYW5kbGVyIHsKLQkJcHJpdmF0ZSBTdHJpbmcgZ3JvdXBJRF87Ci0KLQkJcHVibGljIFN0cmluZyBnZXROZXh0UGFnZUdyb3VwKFN0cmluZyBjdXJyZW50UGFnZUdyb3VwSUQsIFN0cmluZ1tdIHBhZ2VHcm91cElEcykgewotCQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0KLQkJCWlmIChjdXJyZW50UGFnZUdyb3VwSUQgPT0gbnVsbCkgewotCQkJCXJlc3VsdCA9IGdyb3VwSURfOwotCQkJfSBlbHNlIGlmIChjdXJyZW50UGFnZUdyb3VwSUQuZXF1YWxzKCJFIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdCA9IG51bGw7Ci0JCQl9IGVsc2UgewotCQkJCXJlc3VsdCA9ICJFIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0R3JvdXBJRFRvU2VsZWN0KFN0cmluZyBpZCkgewotCQkJZ3JvdXBJRF8gPSBpZDsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgRkdyb3VwSGFuZGxlciBpbXBsZW1lbnRzIElETVBhZ2VHcm91cEhhbmRsZXIgewotCQlwcml2YXRlIFN0cmluZyBncm91cElEXzsKLQotCQlwdWJsaWMgU3RyaW5nIGdldE5leHRQYWdlR3JvdXAoU3RyaW5nIGN1cnJlbnRQYWdlR3JvdXBJRCwgU3RyaW5nW10gcGFnZUdyb3VwSURzKSB7Ci0JCQlpZiAoY3VycmVudFBhZ2VHcm91cElEID09IG51bGwpCi0JCQkJcmV0dXJuIGdyb3VwSURfOwotCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldEdyb3VwSURUb1NlbGVjdChTdHJpbmcgaWQpIHsKLQkJCWdyb3VwSURfID0gaWQ7Ci0JCX0KLQl9Ci0KLQkvLwotCS8vIEYgaGFzIHBhZ2VzIGYxLCBmMiwgZjMsIGY0LCBmNSwgZjYKLQkvLyB0aGUgcGFnZSBoYW5kbGVyIGZvciBGIHdpbGwgcmV0dXJuIHRoZSBmb2xsb3dpbmc6Ci0JLy8gZXhwZWN0ZWQgPSBmMSByZXR1cm5zIGYxCi0JLy8gZXhwZWN0ZWQgPSBmMiByZXR1cm5zIHNraXAKLQkvLyBleHBlY3RlZCA9IGYzIHJldHVybnMgYmVmb3JlIGY2Ci0JLy8gZXhwZWN0ZWQgPSBmNCByZXR1cm5zIG51bGwKLQkvLyBleHBlY3RlZCA9IGY1IHJldHVybnMgYWZ0ZXIgZjUKLQkvLyBleHBlY3RlZCA9IGY2IHJldHVybnMgZjQKLQkvLwotCS8vIFRoaXMgaGFuZGxlIHNob3VsZCBjYXVzZSB0aGUgZm9sbG93aW5nIHBhZ2VzIHRvIGJlIHVzZWQuCi0JLy8gZjEsIGYzLCBmNSwgZjYsIGY0LCBudWxsCi0JLy8KLQlwcml2YXRlIGNsYXNzIEZQYWdlSGFuZGxlciBpbXBsZW1lbnRzIElETVBhZ2VIYW5kbGVyIHsKLQkJcHVibGljIFN0cmluZyBnZXROZXh0UGFnZShTdHJpbmcgY3VycmVudFBhZ2VOYW1lLCBTdHJpbmcgZXhwZWN0ZWROZXh0UGFnZU5hbWUpIHsKLQkJCVN0cmluZyByZXN1bHQgPSBudWxsOwotCi0JCQlpZiAoY3VycmVudFBhZ2VOYW1lID09IG51bGwpIHsKLQkJCQlyZXN1bHQgPSAiZjEiOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgaWYgKGN1cnJlbnRQYWdlTmFtZS5lcXVhbHMoImYxIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdCA9IElETVBhZ2VIYW5kbGVyLlNLSVBfUEFHRTsKLQkJCX0gZWxzZSBpZiAoY3VycmVudFBhZ2VOYW1lLmVxdWFscygiZjMiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJcmVzdWx0ID0gSURNUGFnZUhhbmRsZXIuUEFHRV9CRUZPUkUgKyAiZjYiOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgaWYgKGN1cnJlbnRQYWdlTmFtZS5lcXVhbHMoImY0IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdCA9IG51bGw7Ci0JCQl9IGVsc2UgaWYgKGN1cnJlbnRQYWdlTmFtZS5lcXVhbHMoImY1IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdCA9IElETVBhZ2VIYW5kbGVyLlBBR0VfQUZURVIgKyAiZjUiOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgaWYgKGN1cnJlbnRQYWdlTmFtZS5lcXVhbHMoImY2IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdCA9ICJmNCI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0UHJldmlvdXNQYWdlKFN0cmluZyBjdXJyZW50UGFnZU5hbWUsIFN0cmluZyBleHBlY3RlZFByZXZpb3VzUGFnZU5hbWUpIHsKLQkJCXJldHVybiBleHBlY3RlZFByZXZpb3VzUGFnZU5hbWU7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgY2xhc3MgRW1wdHlQcm92aWRlciBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXIgewotCi0JCXB1YmxpYyBTZXQgZ2V0UHJvcGVydHlOYW1lcygpIHsKLQkJCXJldHVybiBuZXcgSGFzaFNldCgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBXaXphcmRQYWdlIGV4dGVuZHMgRGF0YU1vZGVsV2l6YXJkUGFnZSB7Ci0JCXByaXZhdGUgYm9vbGVhbiBjYW5GaW5pc2hfID0gdHJ1ZTsKLQotCQlwdWJsaWMgV2l6YXJkUGFnZShTdHJpbmcgaWQpIHsKLQkJCXN1cGVyKGRhdGFNb2RlbCwgaWQpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpIHsKLQkJCXJldHVybiBuZXcgU3RyaW5nWzBdOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0Q2FuRmluaXNoKGJvb2xlYW4gY2FuRmluaXNoKSB7Ci0JCQljYW5GaW5pc2hfID0gY2FuRmluaXNoOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gY2FuUGFnZUZpbmlzaCgpIHsKLQkJCXJldHVybiBjYW5GaW5pc2hfOwotCQl9Ci0KLQkJcHVibGljIElEYXRhTW9kZWxPcGVyYXRpb24gY3JlYXRlT3BlcmF0aW9uKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL21hbmFnZXIvVGVzdFByb3ZpZGVyMS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS9tYW5hZ2VyL1Rlc3RQcm92aWRlcjEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk2YjAyZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL21hbmFnZXIvVGVzdFByb3ZpZGVyMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLm1hbmFnZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlcjsKLQotcHVibGljIGNsYXNzIFRlc3RQcm92aWRlcjEgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyCi17Ci0gIHB1YmxpYyBTZXQgZ2V0UHJvcGVydHlOYW1lcygpewotICAgIFNldCBwcm9wZXJ0eU5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwotICAgIHByb3BlcnR5TmFtZXMuYWRkKCJwcm92aWRlcjFQcm9wMSIpOwotICAgIHByb3BlcnR5TmFtZXMuYWRkKCJwcm92aWRlcjFQcm9wMiIpOwotICAgIHByb3BlcnR5TmFtZXMuYWRkKCJwcm92aWRlcjFQcm9wMyIpOwotICAgIHByb3BlcnR5TmFtZXMuYWRkKCJwcm92aWRlcjFQcm9wNCIpOwotICAgIAotICAgIHJldHVybiBwcm9wZXJ0eU5hbWVzOwotICB9Ci0KLSAgcHVibGljIHZvaWQgaW5pdCgpCi0gIHsKLSAgICBzZXRQcm9wZXJ0eSggInByb3ZpZGVyMVByb3AxIiwgIjExIiApOwotICAgIHNldFByb3BlcnR5KCAicHJvdmlkZXIxUHJvcDIiLCAiMjIiICk7Ci0gICAgc2V0UHJvcGVydHkoICJwcm92aWRlcjFQcm9wMyIsICIzMyIgKTsKLSAgICBzZXRQcm9wZXJ0eSggInByb3ZpZGVyMVByb3A0IiwgIjQ0IiApOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRJRCgpCi0gIHsKLSAgICByZXR1cm4gInRlc3Rwcm92aWRlcjEiOwotICB9Ci0gIAotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL21hbmFnZXIvVGVzdFByb3ZpZGVyMi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS9tYW5hZ2VyL1Rlc3RQcm92aWRlcjIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcwMTQ5ZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL21hbmFnZXIvVGVzdFByb3ZpZGVyMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLm1hbmFnZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlcjsKLQotcHVibGljIGNsYXNzIFRlc3RQcm92aWRlcjIgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyCi17Ci0gIHB1YmxpYyBTZXQgZ2V0UHJvcGVydHlOYW1lcygpewotICAgIFNldCBwcm9wZXJ0eU5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwotICAgIHByb3BlcnR5TmFtZXMuYWRkKCJwcm92aWRlcjJQcm9wMSIpOwotICAgIHByb3BlcnR5TmFtZXMuYWRkKCJwcm92aWRlcjJQcm9wMiIpOwotICAgIHByb3BlcnR5TmFtZXMuYWRkKCJwcm92aWRlcjJQcm9wMyIpOwotICAgIHByb3BlcnR5TmFtZXMuYWRkKCJwcm92aWRlcjJQcm9wNCIpOwotICAgIAotICAgIHJldHVybiBwcm9wZXJ0eU5hbWVzOwotICB9Ci0KLSAgcHVibGljIHZvaWQgaW5pdCgpCi0gIHsKLSAgICBzZXRQcm9wZXJ0eSggInByb3ZpZGVyMlByb3AxIiwgIjExMTEiICk7Ci0gICAgc2V0UHJvcGVydHkoICJwcm92aWRlcjJQcm9wMiIsICIyMjIyIiApOwotICAgIHNldFByb3BlcnR5KCAicHJvdmlkZXIyUHJvcDMiLCAiMzMzMyIgKTsKLSAgICBzZXRQcm9wZXJ0eSggInByb3ZpZGVyMlByb3A0IiwgIjQ0NDQiICk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SUQoKQotICB7Ci0gICAgcmV0dXJuICJ0ZXN0cHJvdmlkZXIyIjsKLSAgfQotICAKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvd2l6YXJkL1Rlc3QyRGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvd2l6YXJkL1Rlc3QyRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDYxOWQ0OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL3dpemFyZC9UZXN0MkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0MkRhdGFNb2RlbFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlciB7Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvd2l6YXJkL1Rlc3QyRGF0YU1vZGVsV2l6YXJkLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL3dpemFyZC9UZXN0MkRhdGFNb2RlbFdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2ViNmU2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvd2l6YXJkL1Rlc3QyRGF0YU1vZGVsV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkFkZGFibGVQYWdlR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5EYXRhTW9kZWxXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5TaW1wbGVQYWdlR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLlNpbXBsZVBhZ2VHcm91cEhhbmRsZXI7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0MkRhdGFNb2RlbFdpemFyZCBleHRlbmRzIERhdGFNb2RlbFdpemFyZCB7Ci0KLQlwcm90ZWN0ZWQgSURhdGFNb2RlbFByb3ZpZGVyIGdldERlZmF1bHRQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBUZXN0MkRhdGFNb2RlbFByb3ZpZGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEFkZGFibGVQYWdlR3JvdXAgY3JlYXRlUm9vdFBhZ2VHcm91cCgpIHsKLQkJU2ltcGxlUGFnZUdyb3VwIHBnID0gKFNpbXBsZVBhZ2VHcm91cCkgc3VwZXIuY3JlYXRlUm9vdFBhZ2VHcm91cCgpOwotCQlwZy5zZXRQYWdlR3JvdXBIYW5kbGVyKG5ldyBTaW1wbGVQYWdlR3JvdXBIYW5kbGVyKCkgewotCQkJcHVibGljIFN0cmluZyBnZXROZXh0UGFnZUdyb3VwKFN0cmluZyBjdXJyZW50UGFnZUdyb3VwSUQsIFN0cmluZ1tdIHBhZ2VHcm91cElEcykgewotCQkJCWlmIChjdXJyZW50UGFnZUdyb3VwSUQgPT0gbnVsbCkgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhZ2VHcm91cElEcy5sZW5ndGg7IGkrKykgewotCQkJCQkJaWYgKHBhZ2VHcm91cElEc1tpXS5lcXVhbHMoImJhciIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlyZXR1cm4gImJhciI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gc3VwZXIuZ2V0TmV4dFBhZ2VHcm91cChjdXJyZW50UGFnZUdyb3VwSUQsIHBhZ2VHcm91cElEcyk7Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gcGc7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL3dpemFyZC9UZXN0MkRhdGFNb2RlbFdpemFyZEZhY3RvcnkuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvd2l6YXJkL1Rlc3QyRGF0YU1vZGVsV2l6YXJkRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTM2OWFkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvd2l6YXJkL1Rlc3QyRGF0YU1vZGVsV2l6YXJkRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbi5leHRlbnNpb251aS5ETVdpemFyZEV4dGVuc2lvbkZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0MkRhdGFNb2RlbFdpemFyZEZhY3RvcnkgZXh0ZW5kcyBETVdpemFyZEV4dGVuc2lvbkZhY3RvcnkgewotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQYWdlTmFtZSgpIHsKLQkJcmV0dXJuICJBIFBhZ2UiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIElEYXRhTW9kZWxQcm92aWRlciBnZXRQcm92aWRlcigpewotCQlyZXR1cm4gbmV3IFRlc3QyRGF0YU1vZGVsUHJvdmlkZXIoKXsKLQkJCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldERlZmF1bHRPcGVyYXRpb24oKSB7Ci0JCQkJcmV0dXJuIG5ldyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbigpewotCQkJCQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRQYWdlTmFtZSgpKTsJCi0JCQkJCQlyZXR1cm4gT0tfU1RBVFVTOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHVibGljIERhdGFNb2RlbFdpemFyZFBhZ2VbXSBjcmVhdGVQYWdlR3JvdXAoSURhdGFNb2RlbCBkYXRhTW9kZWwsIFN0cmluZyBwYWdlR3JvdXBJRCkgewotCQlyZXR1cm4gbmV3IERhdGFNb2RlbFdpemFyZFBhZ2VbXXtuZXcgRGF0YU1vZGVsV2l6YXJkUGFnZShEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChnZXRQcm92aWRlcigpKSwgZ2V0UGFnZU5hbWUoKSkgewotCQkJcHJvdGVjdGVkIFN0cmluZ1tdIGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkgewotCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTlVMTCk7Ci0JCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCQlsYWJlbC5zZXRUZXh0KGdldFBhZ2VOYW1lKCkpOwotCQkJCXJldHVybiBjb21wb3NpdGU7Ci0JCQl9Ci0JCX19OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS93aXphcmQvVGVzdDJEYXRhTW9kZWxXaXphcmRGYWN0b3J5Mi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS93aXphcmQvVGVzdDJEYXRhTW9kZWxXaXphcmRGYWN0b3J5Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjc1OGE3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvd2l6YXJkL1Rlc3QyRGF0YU1vZGVsV2l6YXJkRmFjdG9yeTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLndpemFyZDsKLQotcHVibGljIGNsYXNzIFRlc3QyRGF0YU1vZGVsV2l6YXJkRmFjdG9yeTIgZXh0ZW5kcyBUZXN0MkRhdGFNb2RlbFdpemFyZEZhY3RvcnkgewotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQYWdlTmFtZSgpIHsKLQkJcmV0dXJuICJBIEJldHRlciBQYWdlIjsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvd2l6YXJkL1Rlc3QyRGF0YU1vZGVsV2l6YXJkRmFjdG9yeTMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvd2l6YXJkL1Rlc3QyRGF0YU1vZGVsV2l6YXJkRmFjdG9yeTMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODkxZTQwMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL3dpemFyZC9UZXN0MkRhdGFNb2RlbFdpemFyZEZhY3RvcnkzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS53aXphcmQ7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0MkRhdGFNb2RlbFdpemFyZEZhY3RvcnkzIGV4dGVuZHMgVGVzdDJEYXRhTW9kZWxXaXphcmRGYWN0b3J5IHsKLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGFnZU5hbWUoKSB7Ci0JCXJldHVybiAiQW5vdGhlciBQYWdlLCBidXQgbm90IGJldHRlciI7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL3dpemFyZC9UZXN0MlBhZ2VXaXphcmRFeHRlbnNpb25GYWN0b3J5LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL3dpemFyZC9UZXN0MlBhZ2VXaXphcmRFeHRlbnNpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMjcxNzQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS93aXphcmQvVGVzdDJQYWdlV2l6YXJkRXh0ZW5zaW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uLmV4dGVuc2lvbnVpLkRNV2l6YXJkUGFnZUV4dGVuc2lvbkZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0MlBhZ2VXaXphcmRFeHRlbnNpb25GYWN0b3J5IGV4dGVuZHMKLQkJRE1XaXphcmRQYWdlRXh0ZW5zaW9uRmFjdG9yeSB7Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVBZGRpdGlvbmFsQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgSURhdGFNb2RlbCBtb2RlbCwKLQkJCVN0cmluZyBwYWdlTmFtZSkgewotCQlTdHJpbmcgbGFiZWxOYW1lOwotCQlpZiAoIkEgQmV0dGVyIFBhZ2UiLmVxdWFscyhwYWdlTmFtZSkpIHsKLQkJCWxhYmVsTmFtZSA9ICJBbiBhZGRpdG9uYWwgdGV4dCBib3ggZm9yIHRoZSBiZXR0ZXIgcGFnZSI7Ci0JCX0gZWxzZSBpZiAoIkFub3RoZXIgUGFnZSwgYnV0IG5vdCBiZXR0ZXIiLmVxdWFscyhwYWdlTmFtZSkpIHsKLQkJCWxhYmVsTmFtZSA9ICJBbiBhZGRpdG9uYWwgdGV4dCBib3ggZm9yIHRoZSBOT1QgYmV0dGVyIHBhZ2UiOwotCQl9IGVsc2UgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChsYWJlbE5hbWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS93aXphcmQvVGVzdDJQYWdlV2l6YXJkRXh0ZW5zaW9uRmFjdG9yeTIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvd2l6YXJkL1Rlc3QyUGFnZVdpemFyZEV4dGVuc2lvbkZhY3RvcnkyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzYzBiMmYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS93aXphcmQvVGVzdDJQYWdlV2l6YXJkRXh0ZW5zaW9uRmFjdG9yeTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb24uZXh0ZW5zaW9udWkuRE1XaXphcmRQYWdlRXh0ZW5zaW9uRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIFRlc3QyUGFnZVdpemFyZEV4dGVuc2lvbkZhY3RvcnkyIGV4dGVuZHMKLQkJRE1XaXphcmRQYWdlRXh0ZW5zaW9uRmFjdG9yeSB7Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVBZGRpdGlvbmFsQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgSURhdGFNb2RlbCBtb2RlbCwKLQkJCVN0cmluZyBwYWdlTmFtZSkgewotCQlpZiAoIkEgQmV0dGVyIFBhZ2UiLmVxdWFscyhwYWdlTmFtZSkpIHsKLQkJCUJ1dHRvbiBjaGVja2JveCA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCQkJY2hlY2tib3guc2V0VGV4dCgiQWRkaXRpb25hbCBjaGVja2JveCBmb3IgYSBiZXR0ZXIgcGFnZSIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL3dpemFyZC9UZXN0RGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvd2l6YXJkL1Rlc3REYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmI3NGY0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvd2l6YXJkL1Rlc3REYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLndpemFyZDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLQotcHVibGljIGNsYXNzIFRlc3REYXRhTW9kZWxQcm92aWRlciBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXIgewotCXB1YmxpYyBTdHJpbmcgZ2V0SUQoKSB7Ci0JCXJldHVybiAiVGVzdFdpemFyZElEIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTZXQgZ2V0UHJvcGVydHlOYW1lcygpIHsKLQkJSGFzaFNldCByZXN1bHQgPSBuZXcgSGFzaFNldCgpOwotCi0JCXJlc3VsdC5hZGQoInByb3AxIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFkZCgicHJvcDIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIElEYXRhTW9kZWxPcGVyYXRpb24gZ2V0RGVmYXVsdE9wZXJhdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBUZXN0T3BlcmF0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS93aXphcmQvVGVzdERhdGFXaXphcmQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvd2l6YXJkL1Rlc3REYXRhV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNmRkZTcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS93aXphcmQvVGVzdERhdGFXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkFkZGFibGVQYWdlR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5EYXRhTW9kZWxXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5TaW1wbGVQYWdlR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLlBhZ2VHcm91cE1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0RGF0YVdpemFyZCBleHRlbmRzIERhdGFNb2RlbFdpemFyZCB7Ci0JcHJpdmF0ZSBTaW1wbGVQYWdlR3JvdXAgcm9vdDsKLQotCXB1YmxpYyBUZXN0RGF0YVdpemFyZCgpIHsKLQkJc2V0Rm9yY2VQcmV2aW91c0FuZE5leHRCdXR0b25zKHRydWUpOwotCQlzZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkb0FkZFBhZ2VzKCkgewotCQlQYWdlR3JvdXBNYW5hZ2VyIHBhZ2VNYW5hZ2VyID0gZ2V0UGFnZUdyb3VwTWFuYWdlcigpOwotCQlwYWdlTWFuYWdlci5hZGRHcm91cEFmdGVyKHJvb3QuZ2V0UGFnZUdyb3VwSUQoKSwgbmV3IFRlc3RQYWdlR3JvdXAyKGdldERhdGFNb2RlbCgpKSk7Ci0KLQkJc3VwZXIuZG9BZGRQYWdlcygpOwotCX0KLQotCXByb3RlY3RlZCBJRGF0YU1vZGVsUHJvdmlkZXIgZ2V0RGVmYXVsdFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IFRlc3REYXRhTW9kZWxQcm92aWRlcigpOwotCX0KLQotCXByb3RlY3RlZCBBZGRhYmxlUGFnZUdyb3VwIGNyZWF0ZVJvb3RQYWdlR3JvdXAoKSB7Ci0JCXJvb3QgPSBuZXcgVGVzdFJvb3RQYWdlR3JvdXAoZ2V0RGF0YU1vZGVsKCkpOwotCi0JCXJldHVybiByb290OwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvd2l6YXJkL1Rlc3RPcGVyYXRpb24uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvd2l6YXJkL1Rlc3RPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNmNGEzNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL3dpemFyZC9UZXN0T3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgVGVzdE9wZXJhdGlvbiBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIHsKLQotCXB1YmxpYyBUZXN0T3BlcmF0aW9uKCkgewotCQlzZXRJRCgiVGVzdE9wZXJhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiSW4gZXhlY3V0ZTogZGF0YSBtb2RlbD0iICsgZ2V0RGF0YU1vZGVsKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJdHJ5IHsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKCJUZXN0IG9wZXJhdGlvbjogIiwgNSk7IC8vJE5PTi1OTFMtMSQKLQkJCWZvciAoaW50IGluZGV4ID0gMTsgaW5kZXggPCA2OyBpbmRleCsrKSB7Ci0JCQkJbW9uaXRvci5zdWJUYXNrKCJwYXJ0ICIgKyBpbmRleCArICIgb2YgNSBjb21wbGV0ZS4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJVGhyZWFkLnNsZWVwKDEwMDApOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjKSB7Ci0JCQl0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKCJleGVjdXRlIHRocmV3IGFuZCBleGNlcHRpb24gIiwgZXhjKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgcmVkbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHVuZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVuZG8gdGVzdCBvcGVyYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCi0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvd2l6YXJkL1Rlc3RQYWdlMS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS93aXphcmQvVGVzdFBhZ2UxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyYTcxYjQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS93aXphcmQvVGVzdFBhZ2UxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5EYXRhTW9kZWxXaXphcmRQYWdlOwotCi1wdWJsaWMgY2xhc3MgVGVzdFBhZ2UxIGV4dGVuZHMgRGF0YU1vZGVsV2l6YXJkUGFnZSB7Ci0JcHVibGljIFRlc3RQYWdlMShJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsLCAiUGFnZTEiKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRUaXRsZSgiVGl0bGUgZm9yIHRlc3QgcGFnZTEiKTsgLy8kTk9OLU5MUy0xJAotCQlzZXREZXNjcmlwdGlvbigiRGVzY3JpcHRpb24gZm9yIHRlc3QgcGFnZSAxIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5QYWdlRmluaXNoKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBjcmVhdGVPcGVyYXRpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgZ3JvdXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlCdXR0b24gYnV0dG9uMSA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5QVVNIKTsKLQkJQnV0dG9uIGJ1dHRvbjIgPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuUFVTSCk7Ci0KLQkJYnV0dG9uMS5zZXRUZXh0KCJCdXR0b24xIik7IC8vJE5PTi1OTFMtMSQKLQkJYnV0dG9uMi5zZXRUZXh0KCJCdXR0b24yIik7IC8vJE5PTi1OTFMtMSQKLQkJZ3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlncm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQlyZXR1cm4gZ3JvdXA7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1swXTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL3dpemFyZC9UZXN0UGFnZTIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvd2l6YXJkL1Rlc3RQYWdlMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODk2M2Y5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvd2l6YXJkL1Rlc3RQYWdlMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuRGF0YU1vZGVsV2l6YXJkUGFnZTsKLQotcHVibGljIGNsYXNzIFRlc3RQYWdlMiBleHRlbmRzIERhdGFNb2RlbFdpemFyZFBhZ2UgewotCXB1YmxpYyBUZXN0UGFnZTIoSURhdGFNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCwgIlBhZ2UyIik7IC8vJE5PTi1OTFMtMSQKLQkJc2V0VGl0bGUoIlRpdGxlIGZvciB0ZXN0IHBhZ2UyIik7IC8vJE5PTi1OTFMtMSQKLQkJc2V0RGVzY3JpcHRpb24oIkRlc2NyaXB0aW9uIGZvciB0ZXN0IHBhZ2UgMiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuUGFnZUZpbmlzaCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIElEYXRhTW9kZWxPcGVyYXRpb24gY3JlYXRlT3BlcmF0aW9uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGdyb3VwID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJQnV0dG9uIGJ1dHRvbjEgPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuUFVTSCk7Ci0JCUJ1dHRvbiBidXR0b24yID0gbmV3IEJ1dHRvbihncm91cCwgU1dULlBVU0gpOwotCi0JCWJ1dHRvbjEuc2V0VGV4dCgiUGFnZSAyIGJ1dHRvbjEiKTsgLy8kTk9OLU5MUy0xJAotCQlidXR0b24yLnNldFRleHQoIlBhZ2UgMiBidXR0b24yIik7IC8vJE5PTi1OTFMtMSQKLQkJZ3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlncm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQlyZXR1cm4gZ3JvdXA7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1swXTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL3dpemFyZC9UZXN0UGFnZUdyb3VwMi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS93aXphcmQvVGVzdFBhZ2VHcm91cDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThhODM1NS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL3dpemFyZC9UZXN0UGFnZUdyb3VwMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5TaW1wbGVQYWdlR3JvdXA7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0UGFnZUdyb3VwMiBleHRlbmRzIFNpbXBsZVBhZ2VHcm91cCB7Ci0JcHJpdmF0ZSBJRGF0YU1vZGVsIGRhdGFNb2RlbDsKLQotCXB1YmxpYyBUZXN0UGFnZUdyb3VwMihJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQlzdXBlcigiZ3JvdXAyIiwgZGF0YU1vZGVsLmdldElEKCksIHRydWUsICJUZXN0T3BlcmF0aW9uIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0aGlzLmRhdGFNb2RlbCA9IGRhdGFNb2RlbDsKLQotCQlhZGRQYWdlcyhuZXcgSVdpemFyZFBhZ2VbXXtuZXcgVGVzdFBhZ2UyKHRoaXMuZGF0YU1vZGVsKX0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvd2l6YXJkL1Rlc3RSb290UGFnZUdyb3VwLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL3dpemFyZC9UZXN0Um9vdFBhZ2VHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDI4NWI5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvd2l6YXJkL1Rlc3RSb290UGFnZUdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLlNpbXBsZVBhZ2VHcm91cDsKLQotcHVibGljIGNsYXNzIFRlc3RSb290UGFnZUdyb3VwIGV4dGVuZHMgU2ltcGxlUGFnZUdyb3VwIHsKLQlwcml2YXRlIElEYXRhTW9kZWwgZGF0YU1vZGVsOwotCi0JcHVibGljIFRlc3RSb290UGFnZUdyb3VwKElEYXRhTW9kZWwgZGF0YU1vZGVsKSB7Ci0JCXN1cGVyKGRhdGFNb2RlbC5nZXRJRCgpLCBkYXRhTW9kZWwuZ2V0SUQoKSk7Ci0JCXRoaXMuZGF0YU1vZGVsID0gZGF0YU1vZGVsOwotCi0JCWFkZFBhZ2VzKG5ldyBJV2l6YXJkUGFnZVtde25ldyBUZXN0UGFnZTEodGhpcy5kYXRhTW9kZWwpfSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS93aXphcmQvVGVzdFdpemFyZFRlc3RjYXNlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL3dpemFyZC9UZXN0V2l6YXJkVGVzdGNhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQwNWE5Yi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL3dpemFyZC9UZXN0V2l6YXJkVGVzdGNhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0V2l6YXJkVGVzdGNhc2UgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBUZXN0RGF0YVdpemFyZCB3aXphcmRfOwotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQotCQl3aXphcmRfID0gbmV3IFRlc3REYXRhV2l6YXJkKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpbXBsZVdpemFyZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhudWxsLCB3aXphcmRfKTsKLQotCQlkaWFsb2cub3BlbigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0MkRhdGFNb2RlbFdpemFyZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyggbmV3IFJ1bm5hYmxlKCl7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2cobnVsbCwgbmV3IFRlc3QyRGF0YU1vZGVsV2l6YXJkKCkpOwotCQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi5ndWFyZC8uY2xhc3NwYXRoIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uLmd1YXJkLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNGU4NjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uLmd1YXJkLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uLmd1YXJkLy5wcm9qZWN0IGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uLmd1YXJkLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTI1NWM5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi5ndWFyZC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi5ndWFyZDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24uZ3VhcmQvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uLmd1YXJkLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNlNGI4ZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24uZ3VhcmQvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jU2F0IE1hciAyOSAwNzo1MzozMSBFRFQgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24uZ3VhcmQvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24uZ3VhcmQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNWZlZmUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uLmd1YXJkL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi5ndWFyZDtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMi5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi5ndWFyZC5BY3RpdmF0b3IKLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb247YnVuZGxlLXZlcnNpb249IlsxLjEuMTAzLDEuMy4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uLmd1YXJkL2J1aWxkLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24uZ3VhcmQvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBiMmZjNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24uZ3VhcmQvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi5ndWFyZC9wbHVnaW4ucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi5ndWFyZC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIyMjNlNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24uZ3VhcmQvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLUJ1bmRsZS1OYW1lLjAgPSBWYWxpZGF0aW9uIEZyYW1ld29yayBHdWFyZCBUZXN0IGNhc2VzCi1CdW5kbGUtVmVuZG9yLjAgPSBFY2xpcHNlLm9yZwotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24uZ3VhcmQvcGx1Z2luLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi5ndWFyZC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGRhYTJiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi5ndWFyZC9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTxwbHVnaW4+Ci0gICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRvclYyIgotICAgICAgICAgaWQ9IlQzQSIgbmFtZT0iVDNBIj4KLSAgICAgIDx2YWxpZGF0b3IKLSAgICAgICAgICAgIGJ1aWxkPSJmYWxzZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24uZ3VhcmQuVDNBIgotICAgICAgICAgICAgbWFudWFsPSJmYWxzZSI+Ci0gICAgICA8L3ZhbGlkYXRvcj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi52YWxpZGF0b3JWMiIKLSAgICAgICAgIGlkPSJUM0IiIG5hbWU9IlQzQiI+Ci0gICAgICA8dmFsaWRhdG9yIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24uZ3VhcmQuVDNCIj4KLSAgICAgICAgIDxpbmNsdWRlPgotICAgICAgICAgICAgPHJ1bGVzPgotICAgICAgICAgICAgICAgPGZhY2V0Ci0gICAgICAgICAgICAgICAgICAgICBpZD0iYS5ib2d1cy5mYWNldCI+Ci0gICAgICAgICAgICAgICA8L2ZhY2V0PgotICAgICAgICAgICAgPC9ydWxlcz4KLSAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgIDwvdmFsaWRhdG9yPgotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uLmd1YXJkL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3ZhbGlkYXRpb24vZ3VhcmQvQWN0aXZhdG9yLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24uZ3VhcmQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdmFsaWRhdGlvbi9ndWFyZC9BY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTUxMmFmZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24uZ3VhcmQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdmFsaWRhdGlvbi9ndWFyZC9BY3RpdmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uLmd1YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBwdXJwb3NlIG9mIHRoaXMgcGx1Zy1pbiBpcyB0byBlbnN1cmUgdGhhdCBpdCBuZXZlciBnZXRzIGxvYWRlZC4gSWYgaXQgZG9lcyBpdCBtZWFucyB0aGF0IHdlIGFyZQotICogYWN0aXZhdGluZyB2YWxpZGF0b3JzIHRvbyBlYXJseS4KLSAqLwotcHVibGljIGNsYXNzIEFjdGl2YXRvciBleHRlbmRzIFBsdWdpbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24uZ3VhcmQiOwotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotCXByaXZhdGUgc3RhdGljIEFjdGl2YXRvciBwbHVnaW47Ci0JCi0JcHVibGljIEFjdGl2YXRvcigpIHsKLQkJUnVudGltZUV4Y2VwdGlvbiByZSA9IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGlzIHBsdWctaW4gc2hvdWxkIG5ldmVyIGJlIGxvYWRlZC4gSWYgaXQgaXMgaXQgbWVhbnMgdGhhdCB3ZSBhcmUgbG9hZGluZyAiICsKLQkJCSJ2YWxpZGF0b3JzIHRvbyBlYXJseSwgYW5kIGNhdXNpbmcgdW5uZWNjZXNzYXJ5IHBsdWctaW4gYWN0aXZhdGlvbi4iKTsKLQkJaGFuZGxlRXhjZXB0aW9uKHJlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW5zI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcGx1Z2luID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKgotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQWN0aXZhdG9yIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCQotCS8qKgotCSAqIFdyaXRlIHRoaXMgZXhjZXB0aW9uIHRvIHRoZSBsb2cuCi0JICogPHA+Ci0JICogV2UgYXJlIGluIHRoZSB0cmFuc2l0aW9uIG9mIG1vdmluZyB0byBhIG5ldyBhcHByb2FjaCBmb3IgbG9jYWxpemVkIG1lc3NhZ2VzLiBUaGlzIGlzIHRoZSBuZXcgCi0JICogYXBwcm9hY2ggZm9yIGV4Y2VwdGlvbnMuCi0JICogCi0JICogQHBhcmFtIGUgdGhlIHRocm93YWJsZSwgdGhpcyBjYW4gYmUgbnVsbCBpbiB3aGljaCBjYXNlIGl0IGlzIGEgbm9wLgotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgZSl7Ci0JCWlmIChlID09IG51bGwpcmV0dXJuOwotCQlTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBlKTsKLQkJZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24uZ3VhcmQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdmFsaWRhdGlvbi9ndWFyZC9UM0EuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi5ndWFyZC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy92YWxpZGF0aW9uL2d1YXJkL1QzQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTQ2MTgyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi5ndWFyZC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy92YWxpZGF0aW9uL2d1YXJkL1QzQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24uZ3VhcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uQWJzdHJhY3RWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uU3RhdGU7Ci0KLS8qKgotICogQSB0ZXN0IHZhbGlkYXRvciB0aGF0IHdlIG5ldmVyIGV4cGVjdCB0byBiZSBhY3RpdmF0ZWQuIFRoZSByZWFzb24gd2UgbmV2ZXIgZXhwZWN0IGl0IHRvIGJlIHZhbGlkYXRlZCBpcyB0aGF0IGJ5Ci0gKiBkZWZhdWx0IGl0IGlzIHR1cm5lZCBvZmYuIFRoZSB1c2VyIGNhbiBzdGlsbCBleHBsaWNpdGx5IHR1cm4gaXQgb24sIGluIHdoaWNoIGNhc2UgaXQgd2lsbCBydW4sIGFuZCB0aGF0IHdvdWxkIG5vdAotICogYmUgY29uc2lkZXJlZCBhbiBlcnJvci4KLSAqIEBhdXRob3Iga2FyYXNpdWsKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBUM0EgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRvciB7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIF9pbnZva2VkOwotCQotCXB1YmxpYyBWYWxpZGF0aW9uUmVzdWx0IHZhbGlkYXRlKElSZXNvdXJjZSByZXNvdXJjZSwgaW50IGtpbmQsIFZhbGlkYXRpb25TdGF0ZSBzdGF0ZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKXsKLQkJaWYgKCFfaW52b2tlZCl7Ci0JCQlfaW52b2tlZCA9IHRydWU7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhlIFQzQSB2YWxpZGF0b3Igc2hvdWxkIG5ldmVyIGJlIGFjdGl2YXRlZCBvciBjYWxsZWQuIElmIHRoaXMgdmFsaWRhdG9yIHdhcyBtYW51YWxseSB0dXJuZWQgb24gIiArCi0JCQkJInRob3VnaCB0aGUgcHJlZmVyZW5jZXMsIHRoZW4gdGhpcyBpcyBub3QgYSByZWFsIGVycm9yLiIpOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsJCQotCX0KLQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24uZ3VhcmQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdmFsaWRhdGlvbi9ndWFyZC9UM0IuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi5ndWFyZC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy92YWxpZGF0aW9uL2d1YXJkL1QzQi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjY0OWFlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi5ndWFyZC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy92YWxpZGF0aW9uL2d1YXJkL1QzQi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24uZ3VhcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uQWJzdHJhY3RWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uU3RhdGU7Ci0KLS8qKgotICogQSB0ZXN0IHZhbGlkYXRvciB0aGF0IHdlIG5ldmVyIGV4cGVjdCB0byBiZSBhY3RpdmF0ZWQuIFRoZSByZWFzb24gd2UgbmV2ZXIgZXhwZWN0IGl0IHRvIGJlIHZhbGlkYXRlZCBpcyB0aGF0IGl0IGhhcyBhIGJvZ3VzIGZhY2V0IGZpbHRlci4KLSAqIEBhdXRob3Iga2FyYXNpdWsKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBUM0IgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRvciB7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIF9pbnZva2VkOwotCQotCXB1YmxpYyBWYWxpZGF0aW9uUmVzdWx0IHZhbGlkYXRlKElSZXNvdXJjZSByZXNvdXJjZSwgaW50IGtpbmQsIFZhbGlkYXRpb25TdGF0ZSBzdGF0ZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKXsKLQkJaWYgKCFfaW52b2tlZCl7Ci0JCQlfaW52b2tlZCA9IHRydWU7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhlIFQzQiB2YWxpZGF0b3Igc2hvdWxkIG5ldmVyIGJlIGFjdGl2YXRlZCBvciBjYWxsZWQuIElmIHRoaXMgdmFsaWRhdG9yIHdhcyBtYW51YWxseSBjaG5hZ2VkICIgKwotCQkJCSJ0aG91Z2ggdGhlIHByZWZlcmVuY2VzLCBhbmQgdGhlIGJvZ3VzIGZpbHRlciB3YXMgcmVtb3ZlZCwgdGhlbiB0aGlzIGlzbid0IGEgcmVhbCBlcnJvci4iKTsKLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7CQkKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy8uY2xhc3NwYXRoIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzc5M2Q2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iY29tbW9udGVzdHMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJmcmFtZXdvcmt0ZXN0cyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImFwaXRvb2xzIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLy5jdnNpZ25vcmUgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzNmFjMjUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotdGVtcC5mb2xkZXIKLWNvbW1vbnRlc3RzLmphcgotamF2YUNvbXBpbGVyLmNvbW1vbnRlc3RzLmphci5hcmdzCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLy5wcm9qZWN0IGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhiMDk1MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWYwYTNhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jVGh1IE1heSAxMCAxODozODozMSBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZhMjUwMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHM7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMi4xLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzUGF0aDogY29tbW9udGVzdHMuamFyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmNvbXBhdGliaWxpdHkuUGx1Z2luQWN0aXZhdG9yCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXRvb2xzLmNvbW1vbi50ZXN0LmFwaXRvb2xzLAotIG9yZy5lY2xpcHNlLmV0b29scy5jb21tb24udGVzdHMueG1sLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudGVzdHMsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5leHRyYXMsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmFydGlmYWN0ZWRpdC50ZXN0cywKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuY29tcG9uZW50Y29yZS50ZXN0cywKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuY29tcG9uZW50Y29yZS52aXJ0dWFscGF0aC50ZXN0cywKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuZXh0ZW5kZWQsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnRlc3RzLmJ2dCwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmp1bml0O2J1bmRsZS12ZXJzaW9uPSJbMy44LjIsNC4wLjApIjt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlczt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3M7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24sCi0gb3JnLmVjbGlwc2UuZW1mLmNvbW1vbiwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUsCi0gb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcywKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3I7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuamVtLnV0aWwsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZiwKLSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjtidW5kbGUtdmVyc2lvbj0iMS4yLjAiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotUGx1Z2luLUNsYXNzOiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLkNvbW1vblRlc3RzUGx1Z2luCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9hYm91dC5odG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9hcGl0b29scy9vcmcvZWNsaXBzZS9ldG9vbHMvY29tbW9uL3Rlc3QvYXBpdG9vbHMvUHJvamVjdFVuemlwVXRpbC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9hcGl0b29scy9vcmcvZWNsaXBzZS9ldG9vbHMvY29tbW9uL3Rlc3QvYXBpdG9vbHMvUHJvamVjdFVuemlwVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzY3ZDIxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvYXBpdG9vbHMvb3JnL2VjbGlwc2UvZXRvb2xzL2NvbW1vbi90ZXN0L2FwaXRvb2xzL1Byb2plY3RVbnppcFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmV0b29scy5jb21tb24udGVzdC5hcGl0b29sczsKLQotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuUHJvamVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlByb2plY3REZXNjcmlwdGlvblJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLQotcHVibGljIGNsYXNzIFByb2plY3RVbnppcFV0aWwgewotCi0JcHJpdmF0ZSBJUGF0aCB6aXBMb2NhdGlvbjsKLQlwcml2YXRlIFN0cmluZ1tdIHByb2plY3ROYW1lczsKLQlwcml2YXRlIElQYXRoIHJvb3RMb2NhdGlvbiA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0TG9jYXRpb24oKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQV9QUk9KRUNUX05BTUUgPSAiLnByb2plY3QiOwotCi0KLQotCXB1YmxpYyBQcm9qZWN0VW56aXBVdGlsKElQYXRoIGFaaXBMb2NhdGlvbiwgU3RyaW5nW10gYVByb2plY3ROYW1lcykgewotCQl6aXBMb2NhdGlvbiA9IGFaaXBMb2NhdGlvbjsKLQkJcHJvamVjdE5hbWVzID0gYVByb2plY3ROYW1lczsKLQotCX0KLQotCXB1YmxpYyBib29sZWFuIGNyZWF0ZVByb2plY3RzKCkgewotCQl0cnkgewotCQkJZXhwYW5kWmlwKCk7Ci0JCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsIG51bGwpOwotCQkJYnVpbGRQcm9qZWN0cygpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQotCX0KLQotCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBnZXRQcm9nZXNzTW9uaXRvcigpIHsKLQkJcmV0dXJuIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGV4cGFuZFppcCgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciA9IGdldFByb2dlc3NNb25pdG9yKCk7Ci0JCVppcEZpbGUgemlwRmlsZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl6aXBGaWxlID0gbmV3IFppcEZpbGUoemlwTG9jYXRpb24udG9GaWxlKCkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMSkgewotCQkJdGhyb3cgZTE7Ci0JCX0KLQkJRW51bWVyYXRpb24gZW50cmllcyA9IHppcEZpbGUuZW50cmllcygpOwotCQl3aGlsZSAoZW50cmllcy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJWmlwRW50cnkgZW50cnkgPSAoWmlwRW50cnkpIGVudHJpZXMubmV4dEVsZW1lbnQoKTsKLQkJCW1vbml0b3Iuc3ViVGFzayhlbnRyeS5nZXROYW1lKCkpOwotCQkJRmlsZSBhRmlsZSA9IGNvbXB1dGVMb2NhdGlvbihlbnRyeS5nZXROYW1lKCkpLnRvRmlsZSgpOwotCQkJRmlsZSBwYXJlbnRGaWxlID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJYUZpbGUubWtkaXJzKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcGFyZW50RmlsZSA9IGFGaWxlLmdldFBhcmVudEZpbGUoKTsKLQkJCQkJaWYgKCFwYXJlbnRGaWxlLmV4aXN0cygpKQotCQkJCQkJcGFyZW50RmlsZS5ta2RpcnMoKTsKLQkJCQkJaWYgKCFhRmlsZS5leGlzdHMoKSkKLQkJCQkJCWFGaWxlLmNyZWF0ZU5ld0ZpbGUoKTsKLQkJCQkJY29weSh6aXBGaWxlLmdldElucHV0U3RyZWFtKGVudHJ5KSwgbmV3IEZpbGVPdXRwdXRTdHJlYW0oYUZpbGUpKTsKLQkJCQkJaWYgKGVudHJ5LmdldFRpbWUoKSA+IDApCi0JCQkJCQlhRmlsZS5zZXRMYXN0TW9kaWZpZWQoZW50cnkuZ2V0VGltZSgpKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgZTsKLQkJCX0KLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJUGF0aCBjb21wdXRlTG9jYXRpb24oU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIHJvb3RMb2NhdGlvbi5hcHBlbmQobmFtZSk7Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29weShJbnB1dFN0cmVhbSBpbiwgT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzEwMjRdOwotCQl0cnkgewotCQkJaW50IG4gPSBpbi5yZWFkKGJ1ZmZlcik7Ci0JCQl3aGlsZSAobiA+IDApIHsKLQkJCQlvdXQud3JpdGUoYnVmZmVyLCAwLCBuKTsKLQkJCQluID0gaW4ucmVhZChidWZmZXIpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaW4uY2xvc2UoKTsKLQkJCW91dC5jbG9zZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Um9vdExvY2F0aW9uKElQYXRoIHJvb3RMb2NhdGlvbikgewotCQl0aGlzLnJvb3RMb2NhdGlvbiA9IHJvb3RMb2NhdGlvbjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRQcm9qZWN0cygpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdE5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlQcm9qZWN0RGVzY3JpcHRpb25SZWFkZXIgcGQgPSBuZXcgUHJvamVjdERlc2NyaXB0aW9uUmVhZGVyKCk7Ci0JCQlJUGF0aCBwcm9qZWN0UGF0aCA9IG5ldyBQYXRoKCIvIiArIHByb2plY3ROYW1lc1tpXSArICIvIiArIE1FVEFfUFJPSkVDVF9OQU1FKTsKLQkJCUlQYXRoIHBhdGggPSByb290TG9jYXRpb24uYXBwZW5kKHByb2plY3RQYXRoKTsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWVzW2ldKTsKLQkJCVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbjsKLQkJCXRyeSB7Ci0JCQkJZGVzY3JpcHRpb24gPSBwZC5yZWFkKHBhdGgpOwotCQkJCXByb2plY3QuY3JlYXRlKGRlc2NyaXB0aW9uLCAoZ2V0UHJvZ2Vzc01vbml0b3IoKSkpOwotCQkJCXByb2plY3Qub3BlbihnZXRQcm9nZXNzTW9uaXRvcigpKTsKLQotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCXRocm93IGU7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBlOwotCQkJfQotCQl9Ci0JfQotCi0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGUxZTIwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGNvbW1vbnRlc3RzLmphcixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHRlc3REYXRhLyxcCi0gICAgICAgICAgICAgICB0ZXN0LnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotc291cmNlLmNvbW1vbnRlc3RzLmphciA9IGNvbW1vbnRlc3RzLyxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWV3b3JrdGVzdHMvLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBhcGl0b29scy8KLW91dHB1dC5jb21tb250ZXN0cy5qYXIgPSBiaW4vCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2J1aWxkL2J1aWxkY29udHJvbC5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9idWlsZC9idWlsZGNvbnRyb2wucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRiNWRlZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2J1aWxkL2J1aWxkY29udHJvbC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1DT05UQUNUPWRhbmJlcmdAdXMuaWJtLmNvbQotQ29tcG9uZW50U2hvcnROYW1lPWNvbW1vbnRlc3RzCi1Db21wb25lbnRGdWxsTmFtZT1Db21tb24gVGVzdHMKLUNvbXBvbmVudENvbXBldGVuY3k9Q29tbW9uIFRlc3RzCi1KYXZhQ29tcGlsZS4xPXNyY2phcgotQnVpbGRWZXJpZmljYXRpb24uMT1jYWxsIHdlYmJ2dC5iYXQKLUV4cG9ydC5qYXJGaWxlPWNvbW1vbnRlc3RzLmphcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9idWlsZC9wYWNrYWdlLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvYnVpbGQvcGFja2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1OTg4YzQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9idWlsZC9wYWNrYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMiIGRlZmF1bHQ9InBhY2thZ2luZ1BsdWdpbiIgYmFzZWRpcj0iLi8uLiI+Ci0gICAgPHRhcmdldCBuYW1lPSJpbml0Ij4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InBhY2thZ2VEaXIiIHZhbHVlPSIiLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi5kaXJlY3RvcnkiICB2YWx1ZT0iJHtiYXNlZGlyfSIvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLmlkIiB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cyIvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLnZlcnNpb24iICB2YWx1ZT0iIi8+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPHRhcmdldCBuYW1lPSJwYWNrYWdpbmdQbHVnaW4iIGRlcGVuZHM9ImluaXQiPgotICAgICAgICA8ZWNobyBtZXNzYWdlPSIke3BsdWdpbi5pZH0iLz4KLSAgICAgICAgPGNvcHkgdG9kaXI9IiR7cGFja2FnZURpcn0vcGx1Z2lucy8ke3BsdWdpbi5pZH1fJHtwbHVnaW4udmVyc2lvbn0iPgotICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3BsdWdpbi5kaXJlY3Rvcnl9Ij4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJwbHVnaW4ueG1sIi8+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0icnVudGltZS9jb21tb250ZXN0cy5qYXIiLz4KLSAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPC9jb3B5PgotICAgIDwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9idWlsZC93c0J1aWxkLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvYnVpbGQvd3NCdWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3YzBiODIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9idWlsZC93c0J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCFET0NUWVBFIHByb2plY3QgWwotCTwhRU5USVRZIGJhc2VCdWlsZCBTWVNURU0gImZpbGU6Li4vLi4vd3NCdWlsZERlZi54bWwiPgotXT4KLQotPHByb2plY3QgbmFtZT0iYnVpbGRQbHVnaW4iIGRlZmF1bHQ9ImJ1aWxkIiBiYXNlZGlyPSIuLy4uIj4KLQotPCEtLSBpbmNsdWRlIHRoZSBjb21tb24geG1sIGJ1aWxkIGZpbGUgLS0+Ci0mYmFzZUJ1aWxkOwotCi08dGFyZ2V0IG5hbWU9ImJ1aWxkIiBkZXBlbmRzPSJwcmVwYXJlIiBpZj0icGx1Z2luLmlkIj4KLQk8YW50Y2FsbCB0YXJnZXQ9ImJ1aWxkamFyIj4KLQkJPHBhcmFtIG5hbWU9Imphcm5hbWUiIHZhbHVlPSIke2RlZmF1bHRqYXJuYW1lfSIvPgotCQk8cGFyYW0gbmFtZT0iamFyY2xhc3NwYXRoIiB2YWx1ZT0iJHtwbHVnaW4uY2xhc3NwYXRofSIvPgotCTwvYW50Y2FsbD4KLTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9jb21tb250ZXN0cy9vcmcvZWNsaXBzZS9ldG9vbHMvY29tbW9uL3Rlc3RzL3htbC9Eb21Db21wYXJpdG9yLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2NvbW1vbnRlc3RzL29yZy9lY2xpcHNlL2V0b29scy9jb21tb24vdGVzdHMveG1sL0RvbUNvbXBhcml0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q5ODRkMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2NvbW1vbnRlc3RzL29yZy9lY2xpcHNlL2V0b29scy9jb21tb24vdGVzdHMveG1sL0RvbUNvbXBhcml0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3OSArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMTcsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byAKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmV0b29scy5jb21tb24udGVzdHMueG1sOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkNoYXJhY3RlckRhdGE7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRGcmFnbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uUHJvY2Vzc2luZ0luc3RydWN0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotCi0vKioKLSAqIFRIRSBNQVNURVIgQ09QWSBvZiB0aGlzIGNsYXNzIGlzIGluIGNvbS5pYm0uZXRvb2xzLmNvbW1vbnRlc3RzCi0gKiBQbGVhc2UgdXBkYXRlIHRoZSBjb3B5IGluIGNvbW1vbnRlc3RzIGFuZCB0aGVuIGNvcHkgdGhpcyBjbGFzcyB0bwotICogd2hlcmUgeW91IG5lZWQgaXQgaWYgeW91IGFyZSBsb29raW5nIGF0IGEgZGlmZmVyZW50IGNvcHkKLSAqIAotICogQGF1dGhvciBqc2hvbGwKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byAKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgRG9tQ29tcGFyaXRvciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSGFzaFNldCBhdHRyaWJ1dGVMaXN0OwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcGFyZURvbXMoSW5wdXRTb3VyY2Ugc291cmNlMSwgSW5wdXRTb3VyY2Ugc291cmNlMiwgSGFzaFNldCBpZ25vcmFibGVBdHRzLCBFbnRpdHlSZXNvbHZlciBlbnRpdHlSZXNvbHZlcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLyAgICAgICAgYXR0cmlidXRlTGlzdCA9IGlnbm9yYWJsZUF0dHM7Ci0vLyAgICAgICAgRE9NUGFyc2VyIHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTsKLS8vICAgICAgICBpZiAoZW50aXR5UmVzb2x2ZXIgPT0gbnVsbCkgewotLy8gICAgICAgICAgICBwYXJzZXIuc2V0RW50aXR5UmVzb2x2ZXIobmV3IEVudGl0eVJlc29sdmVyKCkgewotLy8gICAgICAgICAgICAgICAgcHVibGljIElucHV0U291cmNlIHJlc29sdmVFbnRpdHkoU3RyaW5nIGFyZzAsIFN0cmluZyBhcmcxKSB0aHJvd3MgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0vLyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0vLyAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgIH0pOwotLy8gICAgICAgIH0gZWxzZSB7Ci0vLyAgICAgICAgICAgIHBhcnNlci5zZXRFbnRpdHlSZXNvbHZlcihlbnRpdHlSZXNvbHZlcik7Ci0vLyAgICAgICAgfQotLy8gICAgICAgIHBhcnNlci5wYXJzZShzb3VyY2UxKTsKLS8vICAgICAgICBEb2N1bWVudCBkb2MxID0gcGFyc2VyLmdldERvY3VtZW50KCk7Ci0vLyAgICAgICAgcGFyc2VyLnBhcnNlKHNvdXJjZTIpOwotLy8gICAgICAgIERvY3VtZW50IGRvYzIgPSBwYXJzZXIuZ2V0RG9jdW1lbnQoKTsKLS8vICAgICAgICByZXR1cm4gY29tcGFyZU5vZGVzKGRvYzEsIGRvYzIpOwotICAgIAlyZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcGFyZURvbXMoSW5wdXRTb3VyY2Ugc291cmNlMSwgSW5wdXRTb3VyY2Ugc291cmNlMiwgSGFzaFNldCBpZ25vcmFibGVBdHRzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGNvbXBhcmVEb21zKHNvdXJjZTEsIHNvdXJjZTIsIGlnbm9yYWJsZUF0dHMsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbXBhcmVEb21zKElucHV0U291cmNlIHNvdXJjZTEsIElucHV0U291cmNlIHNvdXJjZTIpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gY29tcGFyZURvbXMoc291cmNlMSwgc291cmNlMiwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcGFyZU5vZGVzKE5vZGUgbm9kZTEsIE5vZGUgbm9kZTIpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjaGVja2luZyBBOiIgKyBub2RlMSk7Ci0gICAgICAgIC8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNoZWNraW5nIEI6IiArIG5vZGUyKTsKLSAgICAgICAgLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigibm9kZVR5cGU9IiArIG5vZGUxLmdldE5vZGVUeXBlKCkpOwotICAgICAgICAvLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJnZXROb2RlTmFtZT0iICsgbm9kZTEuZ2V0Tm9kZU5hbWUoKSk7Ci0gICAgICAgIC8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImdldE5vZGVWYWx1ZT0iICsgbm9kZTEuZ2V0Tm9kZVZhbHVlKCkpOwotCi0gICAgICAgIC8vR2VuZXJpYyBOb2RlIFRlc3RpbmcgCi0gICAgICAgIC8vICAgICAgICBpZiAobm9kZTEgPT0gbnVsbCAmJiBub2RlMiA9PSBudWxsKQotICAgICAgICAvLyAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAvLyAgICAgICAgZWxzZSAKLSAgICAgICAgaWYgKChub2RlMSAhPSBudWxsICYmIG5vZGUyID09IG51bGwpIHx8IG5vZGUxID09IG51bGwgJiYgbm9kZTIgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsTm9kZUVuY291bnRlcmVkKG5vZGUxLCBub2RlMik7Ci0gICAgICAgIGVsc2UgaWYgKG5vZGUxLmdldE5vZGVUeXBlKCkgIT0gbm9kZTIuZ2V0Tm9kZVR5cGUoKSkgewotICAgICAgICAgICAgcmV0dXJuIG1pc21hdGNoKCJOb2RlLmdldE5vZGVUeXBlKCkgIiArIG5vZGUxLmdldE5vZGVUeXBlKCkgKyAiICIgKyBub2RlMi5nZXROb2RlVHlwZSgpLCBub2RlMSwgbm9kZTIpOwotICAgICAgICB9IGVsc2UgaWYgKG5vZGUxLmdldE5vZGVOYW1lKCkgIT0gbm9kZTIuZ2V0Tm9kZU5hbWUoKSkgewotICAgICAgICAgICAgcmV0dXJuIG1pc21hdGNoKCJOb2RlLmdldE5vZGVOYW1lKCkgPCIgKyBub2RlMS5nZXROb2RlTmFtZSgpICsgIj4gPCIgKyBub2RlMi5nZXROb2RlTmFtZSgpICsgIj4iLCBub2RlMSwgbm9kZTIpOwotICAgICAgICB9IGVsc2UgaWYgKCEobm9kZTEuZ2V0Tm9kZVZhbHVlKCkgPT0gbnVsbCAmJiBub2RlMi5nZXROb2RlVmFsdWUoKSA9PSBudWxsKSkgewotICAgICAgICAgICAgaWYgKG5vZGUxLmdldE5vZGVWYWx1ZSgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbWlzbWF0Y2goIk5vZGUuZ2V0Tm9kZVZhbHVlKCkgbm9kZSBBIGlzIG51bGwiLCBub2RlMSwgbm9kZTIpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlMi5nZXROb2RlVmFsdWUoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1pc21hdGNoKCJOb2RlLmdldE5vZGVWYWx1ZSgpIG5vZGUgQiBpcyBudWxsIiwgbm9kZTEsIG5vZGUyKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIW5vZGUxLmdldE5vZGVWYWx1ZSgpLnRyaW0oKS5lcXVhbHMobm9kZTIuZ2V0Tm9kZVZhbHVlKCkudHJpbSgpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBtaXNtYXRjaCgiTm9kZS5nZXROb2RlVmFsdWUoKSA8IiArIG5vZGUxLmdldE5vZGVWYWx1ZSgpICsgIj4gPCIgKyBub2RlMi5nZXROb2RlVmFsdWUoKSArICI+Iiwgbm9kZTEsIG5vZGUyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvL1RPRE8gc3RyZW5ndGhlbiBub2RlIGNvbXBhcmlzb25zIGFzIG5lY2Vzc2FyeQotICAgICAgICAvL1NwZWNpYWxpemVkIE5vZGUgVGVzdGluZwotICAgICAgICBzd2l0Y2ggKG5vZGUxLmdldE5vZGVUeXBlKCkpIHsKLSAgICAgICAgICAgIGNhc2UgTm9kZS5URVhUX05PREUgOgotICAgICAgICAgICAgY2FzZSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSA6Ci0gICAgICAgICAgICAgICAgQ2hhcmFjdGVyRGF0YSBjZGF0YTEgPSAoQ2hhcmFjdGVyRGF0YSkgbm9kZTE7Ci0gICAgICAgICAgICAgICAgQ2hhcmFjdGVyRGF0YSBjZGF0YTIgPSAoQ2hhcmFjdGVyRGF0YSkgbm9kZTI7Ci0gICAgICAgICAgICAgICAgaWYgKCFjZGF0YTEuZ2V0RGF0YSgpLnRyaW0oKS5lcXVhbHMoY2RhdGEyLmdldERhdGEoKS50cmltKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtaXNtYXRjaCgiQ2hhcmFjdGVyRGF0YS5nZXREYXRhKCkgIiArIGNkYXRhMS5nZXREYXRhKCkgKyAiICIgKyBjZGF0YTIuZ2V0RGF0YSgpLCBub2RlMSwgbm9kZTIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTm9kZS5BVFRSSUJVVEVfTk9ERSA6Ci0gICAgICAgICAgICAgICAgQXR0ciBhdHRyMSA9IChBdHRyKSBub2RlMTsKLSAgICAgICAgICAgICAgICBBdHRyIGF0dHIyID0gKEF0dHIpIG5vZGUyOwotICAgICAgICAgICAgICAgIGlmICghYXR0cjEuZ2V0TmFtZSgpLmVxdWFscyhhdHRyMi5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtaXNtYXRjaCgiQXR0ci5nZXROYW1lKCkgIiArIGF0dHIxLmdldE5hbWUoKSArICIgIiArIGF0dHIyLmdldE5hbWUoKSwgbm9kZTEsIG5vZGUyKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFhdHRyMS5nZXRWYWx1ZSgpLmVxdWFscyhhdHRyMi5nZXRWYWx1ZSgpKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWlzbWF0Y2goIkF0dHIuZ2V0VmFsdWUoKSAiICsgYXR0cjEuZ2V0VmFsdWUoKSArICIgIiArIGF0dHIyLmdldFZhbHVlKCksIG5vZGUxLCBub2RlMik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhdHRyMS5nZXRTcGVjaWZpZWQoKSAhPSBhdHRyMi5nZXRTcGVjaWZpZWQoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWlzbWF0Y2goIkF0dHIuZ2V0U3BlY2lmaWVkKCkgIiArIGF0dHIxLmdldFNwZWNpZmllZCgpICsgIiAiICsgYXR0cjIuZ2V0U3BlY2lmaWVkKCksIG5vZGUxLCBub2RlMik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBOb2RlLkRPQ1VNRU5UX05PREUgOgotICAgICAgICAgICAgICAgIERvY3VtZW50IGRvYzEgPSAoRG9jdW1lbnQpIG5vZGUxOwotICAgICAgICAgICAgICAgIERvY3VtZW50IGRvYzIgPSAoRG9jdW1lbnQpIG5vZGUyOwotICAgICAgICAgICAgICAgIFN0cmluZyByZXN1bHQgPSBjb21wYXJlTm9kZXMoZG9jMS5nZXREb2N0eXBlKCksIGRvYzIuZ2V0RG9jdHlwZSgpKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFIDoKLSAgICAgICAgICAgICAgICBEb2N1bWVudFR5cGUgZG9jVHlwZTEgPSAoRG9jdW1lbnRUeXBlKSBub2RlMTsKLSAgICAgICAgICAgICAgICBEb2N1bWVudFR5cGUgZG9jVHlwZTIgPSAoRG9jdW1lbnRUeXBlKSBub2RlMjsKLSAgICAgICAgICAgICAgICBpZiAoIWRvY1R5cGUxLmdldFB1YmxpY0lkKCkuZXF1YWxzKGRvY1R5cGUyLmdldFB1YmxpY0lkKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtaXNtYXRjaCgiRG9jdW1lbnRUeXBlLmdldFB1YmxpY0lkKCkgIiArIGRvY1R5cGUxLmdldFB1YmxpY0lkKCkgKyAiICIgKyBkb2NUeXBlMi5nZXRQdWJsaWNJZCgpLCBub2RlMSwgbm9kZTIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgOgotICAgICAgICAgICAgICAgIFByb2Nlc3NpbmdJbnN0cnVjdGlvbiBwSW5zdDEgPSAoUHJvY2Vzc2luZ0luc3RydWN0aW9uKSBub2RlMTsKLSAgICAgICAgICAgICAgICBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gcEluc3QyID0gKFByb2Nlc3NpbmdJbnN0cnVjdGlvbikgbm9kZTI7Ci0gICAgICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIlByb2Nlc3NpbmdJbnN0cnVjdGlvbiB0b2RvIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSA6Ci0gICAgICAgICAgICAgICAgRG9jdW1lbnRGcmFnbWVudCBmcmFnMSA9IChEb2N1bWVudEZyYWdtZW50KSBub2RlMTsKLSAgICAgICAgICAgICAgICBEb2N1bWVudEZyYWdtZW50IGZyYWcyID0gKERvY3VtZW50RnJhZ21lbnQpIG5vZGUyOwotICAgICAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJEb2N1bWVudEZyYWdtZW50IHRvZG8iKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6Ci0gICAgICAgICAgICBjYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDoKLSAgICAgICAgICAgIGNhc2UgTm9kZS5FTlRJVFlfTk9ERSA6Ci0gICAgICAgICAgICBjYXNlIE5vZGUuTk9UQVRJT05fTk9ERSA6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIC8vUmVjdXJzaW9uCi0gICAgICAgIE5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzMSA9IG5vZGUxLmdldEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMyID0gbm9kZTIuZ2V0QXR0cmlidXRlcygpOwotCi0gICAgICAgIGlmIChhdHRyaWJ1dGVzMSAhPSBudWxsICYmIGF0dHJpYnV0ZXMyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlnbm9yZUF0dHJpYnV0ZXMoYXR0cmlidXRlczEsIGF0dHJpYnV0ZXMyKTsKLSAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVzMS5nZXRMZW5ndGgoKSAhPSBhdHRyaWJ1dGVzMi5nZXRMZW5ndGgoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBtaXNtYXRjaCgiZ2V0QXR0cmlidXRlcygpLmdldExlbmd0aCgpICIgKyBhdHRyaWJ1dGVzMS5nZXRMZW5ndGgoKSArICIgIiArIGF0dHJpYnV0ZXMyLmdldExlbmd0aCgpLCBub2RlMSwgbm9kZTIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzMS5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgQXR0ciBhdHRyMSA9IChBdHRyKSBhdHRyaWJ1dGVzMS5pdGVtKGkpOwotICAgICAgICAgICAgICAgIEF0dHIgYXR0cjIgPSAoQXR0cikgYXR0cmlidXRlczIuaXRlbShpKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVzdWx0cyA9IGNvbXBhcmVOb2RlcyhhdHRyMSwgYXR0cjIpOwotCQkJCWlmIChudWxsICE9IHJlc3VsdHMpIHsKLQkJCQkJcmV0dXJuIHJlc3VsdHM7Ci0JCQkJfQotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gZWxzZSBpZiAoYXR0cmlidXRlczEgIT0gbnVsbCB8fCBhdHRyaWJ1dGVzMiAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbWlzbWF0Y2goImdldEF0dHJpYnV0ZXMoKSBudWxsIiwgbm9kZTEsIG5vZGUyKTsKLSAgICAgICAgfQotCi0gICAgICAgIEFycmF5TGlzdCBjaGlsZHJlbjEgPSBnZXRBc0FycmF5TGlzdChub2RlMS5nZXRDaGlsZE5vZGVzKCkpOwotICAgICAgICBBcnJheUxpc3QgY2hpbGRyZW4yID0gZ2V0QXNBcnJheUxpc3Qobm9kZTIuZ2V0Q2hpbGROb2RlcygpKTsKLQotICAgICAgICBpZ25vcmVDb21tZW50cyhjaGlsZHJlbjEpOwotICAgICAgICBpZ25vcmVDb21tZW50cyhjaGlsZHJlbjIpOwotCi0gICAgICAgIGlnbm9yZUVtcHR5VGV4dE5vZGVzKGNoaWxkcmVuMSk7Ci0gICAgICAgIGlnbm9yZUVtcHR5VGV4dE5vZGVzKGNoaWxkcmVuMik7Ci0KLSAgICAgICAgaWYgKGNoaWxkcmVuMS5zaXplKCkgIT0gY2hpbGRyZW4yLnNpemUoKSkgewotICAgICAgICAgICAgcmV0dXJuIG1pc21hdGNoKCJOb2RlLmhhc0NoaWxkTm9kZXMoKSAiICsgY2hpbGRyZW4xLnNpemUoKSArICIgIiArIGNoaWxkcmVuMi5zaXplKCksIG5vZGUxLCBub2RlMik7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuMS5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgTm9kZSBjaGlsZDEgPSAoTm9kZSkgY2hpbGRyZW4xLmdldChpKTsKLSAgICAgICAgICAgIE5vZGUgY2hpbGQyID0gKE5vZGUpIGNoaWxkcmVuMi5nZXQoaSk7Ci0gICAgICAgICAgICBTdHJpbmcgcmVzdWx0cyA9IGNvbXBhcmVOb2RlcyhjaGlsZDEsIGNoaWxkMik7Ci0gICAgICAgICAgICBpZiAobnVsbCAhPSByZXN1bHRzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgQXJyYXlMaXN0IGdldEFzQXJyYXlMaXN0KE5vZGVMaXN0IG9yaWdpbmFsTGlzdCkgewotICAgICAgICBBcnJheUxpc3QgbmV3TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgaWYgKG9yaWdpbmFsTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9yaWdpbmFsTGlzdC5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbmV3TGlzdC5hZGQob3JpZ2luYWxMaXN0Lml0ZW0oaSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXdMaXN0OwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgaWdub3JlQ29tbWVudHMoQXJyYXlMaXN0IGxpc3QpIHsKLSAgICAgICAgQXJyYXlMaXN0IHRvUmVtb3ZlID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIE5vZGUgbm9kZSA9IChOb2RlKSBsaXN0LmdldChpKTsKLSAgICAgICAgICAgIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5DT01NRU5UX05PREUpIHsKLSAgICAgICAgICAgICAgICB0b1JlbW92ZS5hZGQobm9kZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b1JlbW92ZS5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgbGlzdC5yZW1vdmUodG9SZW1vdmUuZ2V0KGkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgaWdub3JlRW1wdHlUZXh0Tm9kZXMoQXJyYXlMaXN0IGxpc3QpIHsKLSAgICAgICAgQXJyYXlMaXN0IHRvUmVtb3ZlID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIE5vZGUgbm9kZSA9IChOb2RlKSBsaXN0LmdldChpKTsKLSAgICAgICAgICAgIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUgJiYgKG5vZGUuZ2V0Tm9kZVZhbHVlKCkgPT0gbnVsbCB8fCBub2RlLmdldE5vZGVWYWx1ZSgpLnRyaW0oKS5lcXVhbHMoIiIpKSkgewotICAgICAgICAgICAgICAgIHRvUmVtb3ZlLmFkZChub2RlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRvUmVtb3ZlLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBsaXN0LnJlbW92ZSh0b1JlbW92ZS5nZXQoaSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGF0dHJpYnV0ZXMxCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBpZ25vcmVBdHRyaWJ1dGVzKE5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzMSwgTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMyKSB7Ci0gICAgICAgIGlmIChhdHRyaWJ1dGVMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGl0ID0gYXR0cmlidXRlTGlzdC5pdGVyYXRvcigpOwotICAgICAgICAgICAgU3RyaW5nIGlnbm9yZTsKLSAgICAgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBpZ25vcmUgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZXMxLmdldE5hbWVkSXRlbShpZ25vcmUpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMxLnJlbW92ZU5hbWVkSXRlbShpZ25vcmUpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVzMi5nZXROYW1lZEl0ZW0oaWdub3JlKSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzMi5yZW1vdmVOYW1lZEl0ZW0oaWdub3JlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIG51bGxOb2RlRW5jb3VudGVyZWQoTm9kZSBub2RlMSwgTm9kZSBub2RlMikgewotICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJOdWxsIG5vZGUgZW5jb3VudGVyZWQiOwotICAgICAgICBOb2RlIG5vbk51bGxOb2RlID0gbm9kZTEgPT0gbnVsbCA/IG5vZGUyIDogbm9kZTE7Ci0gICAgICAgIGNoYXIgc291cmNlID0gbm9kZTEgPT0gbnVsbCA/ICdCJyA6ICdBJzsKLSAgICAgICAgd2hpbGUgKG5vbk51bGxOb2RlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1lc3NhZ2UgKz0gc291cmNlICsgbm9uTnVsbE5vZGUuZ2V0Tm9kZU5hbWUoKSArICJcbiI7Ci0gICAgICAgICAgICBub25OdWxsTm9kZSA9IG5vbk51bGxOb2RlLmdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWVzc2FnZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBub2RlTm90Q29tcGFyZWQoTm9kZSBub2RlKSB7Ci0gICAgICAgIFN0cmluZyBtZXNzYWdlID0gIk5vZGUgbm9kZSBjb21wYXJlZDoiOwotICAgICAgICB3aGlsZSAobm9kZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtZXNzYWdlICs9IG5vZGUuZ2V0Tm9kZU5hbWUoKSArICJcbiI7Ci0gICAgICAgICAgICBub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbWVzc2FnZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBtaXNtYXRjaChTdHJpbmcgbWlzbWF0Y2h0eXBlLCBOb2RlIG5vZGUxLCBOb2RlIG5vZGUyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiTm9kZXMgQSBhbmQgQiBkbyBub3QgbWF0Y2ggYmVjYXVzZSBvZiBub2RlLiIgKyBtaXNtYXRjaHR5cGUgKyAiXG4iOwotICAgICAgICB3aGlsZSAobm9kZTEgIT0gbnVsbCAmJiBub2RlMiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtZXNzYWdlICs9ICJBOiIgKyBub2RlMS5nZXROb2RlTmFtZSgpICsgIlxuIjsKLSAgICAgICAgICAgIG1lc3NhZ2UgKz0gIkI6IiArIG5vZGUyLmdldE5vZGVOYW1lKCkgKyAiXG4iOwotICAgICAgICAgICAgbm9kZTEgPSBub2RlMS5nZXRQYXJlbnROb2RlKCk7Ci0gICAgICAgICAgICBub2RlMiA9IG5vZGUyLmdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtZXNzYWdlOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvY29tbW9udGVzdHMvb3JnL2VjbGlwc2UvZXRvb2xzL2NvbW1vbi90ZXN0cy94bWwvRG9tQ29tcGFyaXRvclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvY29tbW9udGVzdHMvb3JnL2VjbGlwc2UvZXRvb2xzL2NvbW1vbi90ZXN0cy94bWwvRG9tQ29tcGFyaXRvclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcyODA4MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2NvbW1vbnRlc3RzL29yZy9lY2xpcHNlL2V0b29scy9jb21tb24vdGVzdHMveG1sL0RvbUNvbXBhcml0b3JUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBBcHIgMywgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIAotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXRvb2xzLmNvbW1vbi50ZXN0cy54bWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIAotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBEb21Db21wYXJpdG9yVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIFN0cmluZyBiYXNlRGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpICsgamF2YS5pby5GaWxlLnNlcGFyYXRvckNoYXI7Ci0gICAgU3RyaW5nIHRlc3REYXRhID0gYmFzZURpciArICJ0ZXN0RGF0YSIgKyBqYXZhLmlvLkZpbGUuc2VwYXJhdG9yQ2hhcjsKLQotICAgIHB1YmxpYyBEb21Db21wYXJpdG9yVGVzdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxEb21zXzAxKCkgewotICAgICAgICBjaGVja0VxdWFsKCJiYXNlRGF0YV8wMS54bWwiLCAiYmFzZURhdGFfMDEueG1sIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVxdWFsRG9tc18wMV8wMSgpIHsKLSAgICAgICAgY2hlY2tFcXVhbCgiYmFzZURhdGFfMDEueG1sIiwgImVxdWFsVG9fMDFfY2FzZV8wMS54bWwiKTsKLSAgICB9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxEb21zXzAxXzAyKCkgewotCQljaGVja0VxdWFsKCJiYXNlRGF0YV8wMS54bWwiLCAiZXF1YWxUb18wMV9jYXNlXzAyLnhtbCIpOwotCX0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RVbmVxdWFsRG9tXzAxXzAxKCkgewotICAgICAgICBjaGVja1VuZXF1YWwoImJhc2VEYXRhXzAxLnhtbCIsICJ1bmVxdWFsVG9fMDFfY2FzZV8wMS54bWwiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VW5lcXVhbERvbV8wMV8wMigpIHsKLSAgICAgICAgY2hlY2tVbmVxdWFsKCJiYXNlRGF0YV8wMS54bWwiLCAidW5lcXVhbFRvXzAxX2Nhc2VfMDIueG1sIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFVuZXF1YWxEb21fMDFfMDMoKSB7Ci0gICAgICAgIGNoZWNrVW5lcXVhbCgiYmFzZURhdGFfMDEueG1sIiwgInVuZXF1YWxUb18wMV9jYXNlXzAzLnhtbCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RVbmVxdWFsRG9tXzAxXzA0KCkgewotICAgICAgICBjaGVja1VuZXF1YWwoImJhc2VEYXRhXzAxLnhtbCIsICJ1bmVxdWFsVG9fMDFfY2FzZV8wNC54bWwiKTsKLSAgICB9Ci0KLSAgICAvL1RPRE8gZmlndXJlIG91dCBob3cgdG8gY29tcGFyZSBlbmNvZGluZ3MKLSAgICAvLwlwdWJsaWMgdm9pZCB0ZXN0VW5lcXVhbERvbV8wMV8wNSgpIHsKLSAgICAvLwkJY2hlY2tVbmVxdWFsKCJiYXNlRGF0YV8wMS54bWwiLCAidW5lcXVhbFRvXzAxX2Nhc2VfMDUueG1sIik7Ci0gICAgLy8JfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrRXF1YWwoU3RyaW5nIGZpbGVOYW1lMSwgU3RyaW5nIGZpbGVOYW1lMikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgSW5wdXRTb3VyY2Ugc291cmNlMSA9IG5ldyBJbnB1dFNvdXJjZShuZXcgRmlsZVJlYWRlcihuZXcgRmlsZSh0ZXN0RGF0YSArIGZpbGVOYW1lMSkpKTsKLSAgICAgICAgICAgIElucHV0U291cmNlIHNvdXJjZTIgPSBuZXcgSW5wdXRTb3VyY2UobmV3IEZpbGVSZWFkZXIobmV3IEZpbGUodGVzdERhdGEgKyBmaWxlTmFtZTIpKSk7Ci0vLyAgICAgICAgICAgIFN0cmluZyByZXN1bHRzID0gRG9tQ29tcGFyaXRvci5jb21wYXJlRG9tcyhzb3VyY2UxLCBzb3VyY2UyKTsKLS8vICAgICAgICAgICAgaWYgKHJlc3VsdHMgIT0gbnVsbCkgewotLy8gICAgICAgICAgICAgICAgQXNzZXJ0LmZhaWwoIkVxdWFsIGRvbXMgY29tcGFyZWQgYXMgdW5lcXVhbCAiICsgZmlsZU5hbWUxICsgIiAiICsgZmlsZU5hbWUyICsgIlxuY29tcGFyZSByZXN1bHRzID0gIiArIHJlc3VsdHMpOwotLy8gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgQXNzZXJ0LmZhaWwoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrVW5lcXVhbChTdHJpbmcgZmlsZU5hbWUxLCBTdHJpbmcgZmlsZU5hbWUyKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJbnB1dFNvdXJjZSBzb3VyY2UxID0gbmV3IElucHV0U291cmNlKG5ldyBGaWxlUmVhZGVyKG5ldyBGaWxlKHRlc3REYXRhICsgZmlsZU5hbWUxKSkpOwotICAgICAgICAgICAgSW5wdXRTb3VyY2Ugc291cmNlMiA9IG5ldyBJbnB1dFNvdXJjZShuZXcgRmlsZVJlYWRlcihuZXcgRmlsZSh0ZXN0RGF0YSArIGZpbGVOYW1lMikpKTsKLS8vICAgICAgICAgICAgU3RyaW5nIHJlc3VsdHMgPSBEb21Db21wYXJpdG9yLmNvbXBhcmVEb21zKHNvdXJjZTEsIHNvdXJjZTIpOwotLy8gICAgICAgICAgICBpZiAocmVzdWx0cyA9PSBudWxsKSB7Ci0vLyAgICAgICAgICAgICAgICBBc3NlcnQuZmFpbCgiVW5lcXVhbCBkb21zIGNvbXBhcmVkIGFzIGVxdWFsICIgKyBmaWxlTmFtZTEgKyAiICIgKyBmaWxlTmFtZTIpOwotLy8gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIAllLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgQXNzZXJ0LmZhaWwoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2NvbW1vbnRlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZXh0cmFzL01lbW9yeVVzYWdlVGVzdFN1aXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2NvbW1vbnRlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZXh0cmFzL01lbW9yeVVzYWdlVGVzdFN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxZDdjOTYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9jb21tb250ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2V4dHJhcy9NZW1vcnlVc2FnZVRlc3RTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5leHRyYXM7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0UmVzdWx0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0vKgotICogTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0gCi0gKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAyIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCi0gKiBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlIAotICogcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuIAotICovCi1wdWJsaWMgY2xhc3MgTWVtb3J5VXNhZ2VUZXN0U3VpdGUgZXh0ZW5kcyBUZXN0U3VpdGUgewotCS8vcHJvdGVjdGVkIFN0cmluZyBHTE9CQUxfT1VUUFVUX0ZJTEVOQU1FID0gImQ6L2VjbGlwc2UvY29tbW9uX2FyY2hpdmUvbWVtb3J5VXNhZ2UvQ29tbW9uQXJjaGl2ZV9NT0Y1Lm91dCI7Ci0JcHJvdGVjdGVkIFN0cmluZyBHTE9CQUxfT1VUUFVUX0ZJTEVOQU1FID0gIi4vRU1GX0RhdGEudHh0IjsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBUUkFDS19NRU1PUlkgPSB0cnVlOwotCXByb3RlY3RlZCBTdHJpbmcgb3V0cHV0RmlsZU5hbWU7Ci0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE1lbW9yeVVzYWdlVGVzdFN1aXRlLgotCSAqLwotCXB1YmxpYyBNZW1vcnlVc2FnZVRlc3RTdWl0ZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE1lbW9yeVVzYWdlVGVzdFN1aXRlLgotCSAqIEBwYXJhbSB0aGVDbGFzcwotCSAqLwotCXB1YmxpYyBNZW1vcnlVc2FnZVRlc3RTdWl0ZShDbGFzcyB0aGVDbGFzcykgewotCQlzdXBlcih0aGVDbGFzcyk7Ci0JfQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBNZW1vcnlVc2FnZVRlc3RTdWl0ZS4KLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBNZW1vcnlVc2FnZVRlc3RTdWl0ZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCQotCXB1YmxpYyB2b2lkIHJ1bihUZXN0UmVzdWx0IHJlc3VsdCkgewotLy8JCVRpbWVyU3RlcCBzdGVwID0gbnVsbDsKLS8vCQlpZiAoVFJBQ0tfTUVNT1JZKSB7Ci0vLwkJCXN0ZXAgPSBUaW1lclN0ZXAuaW5zdGFuY2UoKTsKLS8vCQkJc3RlcC5zZXRMb2dGaWxlKGdldE91dHB1dE5hbWUoKSk7Ci0vLwkJCWlmICghc3RlcC5pc09uKCkpCi0vLwkJCQlzdGVwLnNldElzT24odHJ1ZSk7Ci0vLwkJCXN0ZXAud3JpdGUoIiIsICJCZWZvcmUgIiArIGdldE1lbW9yeU5hbWUoKSArICIgVGVzdCBSdW4iKTsKLS8vCQkJc3RlcC50b3RhbE1lbW9yeSgwKTsKLS8vCQkJc3RlcC51c2VkTWVtb3J5KDApOwotLy8JCX0KLS8vCQlzdXBlci5ydW4ocmVzdWx0KTsKLS8vCQlpZiAoVFJBQ0tfTUVNT1JZKSB7Ci0vLwkJCXN0ZXAud3JpdGUoIiIsICJBZnRlciAiICsgZ2V0TWVtb3J5TmFtZSgpICsgIiBUZXN0IFJ1biIpOwotLy8JCQlzdGVwLnRvdGFsTWVtb3J5KDApOwotLy8JCQlzdGVwLnVzZWRNZW1vcnkoMCk7Ci0vLwkJfQotCQkKLQkJc3VwZXIucnVuKHJlc3VsdCk7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGdldE91dHB1dE5hbWUuCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRPdXRwdXROYW1lKCkgewotCQlpZiAob3V0cHV0RmlsZU5hbWUgIT0gbnVsbCAmJiBvdXRwdXRGaWxlTmFtZS5sZW5ndGgoKSA+IDApCi0JCQlyZXR1cm4gb3V0cHV0RmlsZU5hbWU7Ci0JCXJldHVybiBHTE9CQUxfT1VUUFVUX0ZJTEVOQU1FOwotCX0KLQotCi0JLyoqCi0JICogTWV0aG9kIGdldE1lbW9yeU5hbWUuCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRNZW1vcnlOYW1lKCkgewotCQlpZiAoZ2V0TmFtZSgpICE9IG51bGwgJiYgZ2V0TmFtZSgpLmxlbmd0aCgpID4gMCkKLQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCWlmIChnZXRDbGFzcygpICE9IG51bGwpCi0JCQlyZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCXJldHVybiAiVW5rbm93biBUZXN0IjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBvdXRwdXRGaWxlTmFtZS4KLQkgKiBAcGFyYW0gb3V0cHV0RmlsZU5hbWUgVGhlIG91dHB1dEZpbGVOYW1lIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE91dHB1dEZpbGVOYW1lKFN0cmluZyBvdXRwdXRGaWxlTmFtZSkgewotCQl0aGlzLm91dHB1dEZpbGVOYW1lID0gb3V0cHV0RmlsZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZ0xPQkFMX09VVFBVVF9GSUxFTkFNRS4KLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0R0xPQkFMX09VVFBVVF9GSUxFTkFNRSgpIHsKLQkJcmV0dXJuIEdMT0JBTF9PVVRQVVRfRklMRU5BTUU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZ0xPQkFMX09VVFBVVF9GSUxFTkFNRS4KLQkgKiBAcGFyYW0gZ0xPQkFMX09VVFBVVF9GSUxFTkFNRSBUaGUgZmlsZU5hbWUgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0R0xPQkFMX09VVFBVVF9GSUxFTkFNRShTdHJpbmcgZmlsZU5hbWUpIHsKLQkJR0xPQkFMX09VVFBVVF9GSUxFTkFNRSA9IGZpbGVOYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHRSQUNLX01FTU9SWS4KLQkgKiBAcGFyYW0gdFJBQ0tfTUVNT1JZIFRoZSBhQm9vbGVhbiB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUUkFDS19NRU1PUlkoYm9vbGVhbiBhQm9vbGVhbikgewotCQlUUkFDS19NRU1PUlkgPSBhQm9vbGVhbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvY29tbW9udGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy9Bc3NlcnRXYXJuLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2NvbW1vbnRlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvQXNzZXJ0V2Fybi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjdlNzlhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvY29tbW9udGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy9Bc3NlcnRXYXJuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnRpb25GYWlsZWRFcnJvcjsKLQotCi1wdWJsaWMgY2xhc3MgQXNzZXJ0V2FybiBleHRlbmRzIEFzc2VydCB7Ci0JcHJpdmF0ZSBzdGF0aWMgTGlzdDxBc3NlcnRpb25GYWlsZWRFcnJvcj4gd2FybmluZ3MgPSBuZXcgQXJyYXlMaXN0PEFzc2VydGlvbkZhaWxlZEVycm9yPigpOwotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCB3YXJuRXF1YWxzKGJvb2xlYW4gZXhwZWN0ZWQsIGJvb2xlYW4gYWN0dWFsKSB7Ci0JCXRyeXsKLQkJCWFzc2VydEVxdWFscyhleHBlY3RlZCwgYWN0dWFsKTsKLQkJfSBjYXRjaChBc3NlcnRpb25GYWlsZWRFcnJvciBlKXsKLQkJCXdhcm5pbmdzLmFkZChlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgd2FybkVxdWFscyhieXRlIGV4cGVjdGVkLCBieXRlIGFjdHVhbCkgewotCQl0cnl7Ci0JCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCk7Ci0JCX0gY2F0Y2goQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSl7Ci0JCQl3YXJuaW5ncy5hZGQoZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHdhcm5FcXVhbHMoY2hhciBleHBlY3RlZCwgY2hhciBhY3R1YWwpIHsKLQkJdHJ5ewotCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpOwotCQl9IGNhdGNoKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpewotCQkJd2FybmluZ3MuYWRkKGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCB3YXJuRXF1YWxzKGRvdWJsZSBleHBlY3RlZCwgZG91YmxlIGFjdHVhbCwgZG91YmxlIGRlbHRhKSB7Ci0JCXRyeXsKLQkJCWFzc2VydEVxdWFscyhleHBlY3RlZCwgYWN0dWFsLCBkZWx0YSk7Ci0JCX0gY2F0Y2goQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSl7Ci0JCQl3YXJuaW5ncy5hZGQoZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHdhcm5FcXVhbHMoZmxvYXQgZXhwZWN0ZWQsIGZsb2F0IGFjdHVhbCwgZmxvYXQgZGVsdGEpIHsKLQkJdHJ5ewotCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwsIGRlbHRhKTsKLQkJfSBjYXRjaChBc3NlcnRpb25GYWlsZWRFcnJvciBlKXsKLQkJCXdhcm5pbmdzLmFkZChlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgd2FybkVxdWFscyhpbnQgZXhwZWN0ZWQsIGludCBhY3R1YWwpIHsKLQkJdHJ5ewotCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpOwotCQl9IGNhdGNoKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpewotCQkJd2FybmluZ3MuYWRkKGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCB3YXJuRXF1YWxzKE9iamVjdCBleHBlY3RlZCwgT2JqZWN0IGFjdHVhbCkgewotCQl0cnl7Ci0JCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCk7Ci0JCX0gY2F0Y2goQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSl7Ci0JCQl3YXJuaW5ncy5hZGQoZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHdhcm5FcXVhbHMobG9uZyBleHBlY3RlZCwgbG9uZyBhY3R1YWwpIHsKLQkJdHJ5ewotCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpOwotCQl9IGNhdGNoKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpewotCQkJd2FybmluZ3MuYWRkKGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCB3YXJuRXF1YWxzKHNob3J0IGV4cGVjdGVkLCBzaG9ydCBhY3R1YWwpIHsKLQkJdHJ5ewotCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpOwotCQl9IGNhdGNoKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpewotCQkJd2FybmluZ3MuYWRkKGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCB3YXJuRXF1YWxzKFN0cmluZyBtZXNzYWdlLCBib29sZWFuIGV4cGVjdGVkLCBib29sZWFuIGFjdHVhbCkgewotCQl0cnl7Ci0JCQlhc3NlcnRFcXVhbHMobWVzc2FnZSwgZXhwZWN0ZWQsIGFjdHVhbCk7Ci0JCX0gY2F0Y2goQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSl7Ci0JCQl3YXJuaW5ncy5hZGQoZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHdhcm5FcXVhbHMoU3RyaW5nIG1lc3NhZ2UsIGJ5dGUgZXhwZWN0ZWQsIGJ5dGUgYWN0dWFsKSB7Ci0JCXRyeXsKLQkJCWFzc2VydEVxdWFscyhtZXNzYWdlLCBleHBlY3RlZCwgYWN0dWFsKTsKLQkJfSBjYXRjaChBc3NlcnRpb25GYWlsZWRFcnJvciBlKXsKLQkJCXdhcm5pbmdzLmFkZChlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgd2FybkVxdWFscyhTdHJpbmcgbWVzc2FnZSwgY2hhciBleHBlY3RlZCwgY2hhciBhY3R1YWwpIHsKLQkJdHJ5ewotCQkJYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIGV4cGVjdGVkLCBhY3R1YWwpOwotCQl9IGNhdGNoKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpewotCQkJd2FybmluZ3MuYWRkKGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCB3YXJuRXF1YWxzKFN0cmluZyBtZXNzYWdlLCBkb3VibGUgZXhwZWN0ZWQsIGRvdWJsZSBhY3R1YWwsIGRvdWJsZSBkZWx0YSkgewotCQl0cnl7Ci0JCQlhc3NlcnRFcXVhbHMobWVzc2FnZSwgZXhwZWN0ZWQsIGFjdHVhbCwgZGVsdGEpOwotCQl9IGNhdGNoKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpewotCQkJd2FybmluZ3MuYWRkKGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCB3YXJuRXF1YWxzKFN0cmluZyBtZXNzYWdlLCBmbG9hdCBleHBlY3RlZCwgZmxvYXQgYWN0dWFsLCBmbG9hdCBkZWx0YSkgewotCQl0cnl7Ci0JCQlhc3NlcnRFcXVhbHMobWVzc2FnZSwgZXhwZWN0ZWQsIGFjdHVhbCwgZGVsdGEpOwotCQl9IGNhdGNoKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpewotCQkJd2FybmluZ3MuYWRkKGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCB3YXJuRXF1YWxzKFN0cmluZyBtZXNzYWdlLCBpbnQgZXhwZWN0ZWQsIGludCBhY3R1YWwpewotCQl0cnl7Ci0JCQlhc3NlcnRFcXVhbHMobWVzc2FnZSwgZXhwZWN0ZWQsIGFjdHVhbCk7Ci0JCX0gY2F0Y2goQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSl7Ci0JCQl3YXJuaW5ncy5hZGQoZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHdhcm5FcXVhbHMoU3RyaW5nIG1lc3NhZ2UsIE9iamVjdCBleHBlY3RlZCwgT2JqZWN0IGFjdHVhbCl7Ci0JCXRyeXsKLQkJCWFzc2VydEVxdWFscyhtZXNzYWdlLCBleHBlY3RlZCwgYWN0dWFsKTsKLQkJfSBjYXRjaChBc3NlcnRpb25GYWlsZWRFcnJvciBlKXsKLQkJCXdhcm5pbmdzLmFkZChlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgd2FybkVxdWFscyhTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgYWN0dWFsKXsKLQkJdHJ5ewotCQkJYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIGV4cGVjdGVkLCBhY3R1YWwpOwotCQl9IGNhdGNoKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpewotCQkJd2FybmluZ3MuYWRkKGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCB3YXJuRXF1YWxzKFN0cmluZyBtZXNzYWdlLCBsb25nIGV4cGVjdGVkLCBsb25nIGFjdHVhbCl7Ci0JCXRyeXsKLQkJCWFzc2VydEVxdWFscyhtZXNzYWdlLCBleHBlY3RlZCwgYWN0dWFsKTsKLQkJfSBjYXRjaChBc3NlcnRpb25GYWlsZWRFcnJvciBlKXsKLQkJCXdhcm5pbmdzLmFkZChlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgd2FybkVxdWFscyhTdHJpbmcgbWVzc2FnZSwgc2hvcnQgZXhwZWN0ZWQsIHNob3J0IGFjdHVhbCl7Ci0JCXRyeXsKLQkJCWFzc2VydEVxdWFscyhtZXNzYWdlLCBleHBlY3RlZCwgYWN0dWFsKTsKLQkJfSBjYXRjaChBc3NlcnRpb25GYWlsZWRFcnJvciBlKXsKLQkJCXdhcm5pbmdzLmFkZChlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgd2FybkZhbHNlKGJvb2xlYW4gY29uZGl0aW9uKXsKLQkJdHJ5ewotCQkJYXNzZXJ0RmFsc2UoY29uZGl0aW9uKTsKLQkJfSBjYXRjaChBc3NlcnRpb25GYWlsZWRFcnJvciBlKXsKLQkJCXdhcm5pbmdzLmFkZChlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgd2FybkZhbHNlKFN0cmluZyBtZXNzYWdlLCBib29sZWFuIGNvbmRpdGlvbil7Ci0JCXRyeXsKLQkJCWFzc2VydEZhbHNlKG1lc3NhZ2UsIGNvbmRpdGlvbik7Ci0JCX0gY2F0Y2goQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSl7Ci0JCQl3YXJuaW5ncy5hZGQoZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHdhcm5Ob3ROdWxsKE9iamVjdCBvYmplY3QpIHsKLQkJdHJ5ewotCQkJYXNzZXJ0Tm90TnVsbChvYmplY3QpOwotCQl9IGNhdGNoKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpewotCQkJd2FybmluZ3MuYWRkKGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCB3YXJuTm90TnVsbChTdHJpbmcgbWVzc2FnZSwgT2JqZWN0IG9iamVjdCkgewotCQl0cnl7Ci0JCQlhc3NlcnROb3ROdWxsKG1lc3NhZ2UsIG9iamVjdCk7Ci0JCX0gY2F0Y2goQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSl7Ci0JCQl3YXJuaW5ncy5hZGQoZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHdhcm5Ob3RTYW1lKE9iamVjdCBleHBlY3RlZCwgT2JqZWN0IGFjdHVhbCkgewotCQl0cnl7Ci0JCQlhc3NlcnROb3RTYW1lKGV4cGVjdGVkLCBhY3R1YWwpOwotCQl9IGNhdGNoKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpewotCQkJd2FybmluZ3MuYWRkKGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCB3YXJuTm90U2FtZShTdHJpbmcgbWVzc2FnZSwgT2JqZWN0IGV4cGVjdGVkLCBPYmplY3QgYWN0dWFsKSB7Ci0JCXRyeXsKLQkJCWFzc2VydE5vdFNhbWUobWVzc2FnZSwgZXhwZWN0ZWQsIGFjdHVhbCk7Ci0JCX0gY2F0Y2goQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSl7Ci0JCQl3YXJuaW5ncy5hZGQoZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHdhcm5OdWxsKE9iamVjdCBvYmplY3QpIHsKLQkJdHJ5ewotCQkJYXNzZXJ0TnVsbChvYmplY3QpOwotCQl9IGNhdGNoKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpewotCQkJd2FybmluZ3MuYWRkKGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCB3YXJuTnVsbChTdHJpbmcgbWVzc2FnZSwgT2JqZWN0IG9iamVjdCkgewotCQl0cnl7Ci0JCQlhc3NlcnROdWxsKG1lc3NhZ2UsIG9iamVjdCk7Ci0JCX0gY2F0Y2goQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSl7Ci0JCQl3YXJuaW5ncy5hZGQoZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHdhcm5TYW1lKE9iamVjdCBleHBlY3RlZCwgT2JqZWN0IGFjdHVhbCkgewotCQl0cnl7Ci0JCQlhc3NlcnRTYW1lKGV4cGVjdGVkLCBhY3R1YWwpOwotCQl9IGNhdGNoKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpewotCQkJd2FybmluZ3MuYWRkKGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCB3YXJuU2FtZShTdHJpbmcgbWVzc2FnZSwgT2JqZWN0IGV4cGVjdGVkLCBPYmplY3QgYWN0dWFsKSB7Ci0JCXRyeXsKLQkJCWFzc2VydFNhbWUobWVzc2FnZSwgZXhwZWN0ZWQsIGFjdHVhbCk7Ci0JCX0gY2F0Y2goQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSl7Ci0JCQl3YXJuaW5ncy5hZGQoZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHdhcm5UcnVlKGJvb2xlYW4gY29uZGl0aW9uKXsKLQkJdHJ5ewotCQkJYXNzZXJ0VHJ1ZShjb25kaXRpb24pOwotCQl9IGNhdGNoKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpewotCQkJd2FybmluZ3MuYWRkKGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCB3YXJuVHJ1ZShTdHJpbmcgbWVzc2FnZSwgYm9vbGVhbiBjb25kaXRpb24pewotCQl0cnl7Ci0JCQlhc3NlcnRUcnVlKG1lc3NhZ2UsIGNvbmRpdGlvbik7Ci0JCX0gY2F0Y2goQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSl7Ci0JCQl3YXJuaW5ncy5hZGQoZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHdhcm4oKSB7Ci0JCXRyeXsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaChBc3NlcnRpb25GYWlsZWRFcnJvciBlKXsKLQkJCXdhcm5pbmdzLmFkZChlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgd2FybihTdHJpbmcgbWVzc2FnZSkgewotCQl0cnl7Ci0JCQlmYWlsKG1lc3NhZ2UpOwotCQl9IGNhdGNoKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpewotCQkJd2FybmluZ3MuYWRkKGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhcldhcm5pbmdzKCl7Ci0JCXdhcm5pbmdzLmNsZWFyKCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTGlzdCA8QXNzZXJ0aW9uRmFpbGVkRXJyb3I+IGdldFdhcm5pbmdzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCh3YXJuaW5ncyk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9jb21tb250ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL0Jhc2VUZXN0Q2FzZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9jb21tb250ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL0Jhc2VUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWMxNTNiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvY29tbW9udGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy9CYXNlVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NSArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBOb3YgMjQsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0aW9uRmFpbGVkRXJyb3I7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0RmFpbHVyZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFJlc3VsdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotCi1wdWJsaWMgY2xhc3MgQmFzZVRlc3RDYXNlIGV4dGVuZHMgVGVzdENhc2UgewotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZkZhaWxPbkxvZ2dlZFN0YXR1cyA9IHRydWU7Ci0JCi0JLyoqCi0JICogCi0JICovIAotCXB1YmxpYyBCYXNlVGVzdENhc2UoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgQmFzZVRlc3RDYXNlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOyAKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVcFRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsgCi0JCXNldFVwKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgdGVhckRvd25UZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7IAotCQl0ZWFyRG93bigpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjcnVuQmFyZSgpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcnVuQ29yZVRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsgCi0JCXJ1blRlc3QoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJCi0JCS8vVE9ETyByZWdpc3RlciBhbnkgcGx1Z2lucyB3aXRoIHRoZSBKVW5pdExvZ0xpc3RlbmVyIGhlcmUgdGhhdCB5b3Ugd2FudCB0byBmYWlsIG9uIHdoZW4gdGhlaXIgbG9nIGlzIHdyaXR0ZW4gdG9vCi0JCS8vRVg6IENvbW1vblRlc3RzUGx1Z2luLmluc3RhbmNlLmdldExvZygpLmFkZExvZ0xpc3RlbmVyKEpVbml0TG9nTGlzdGVuZXIuSU5TVEFOQ0UpOwotCi0JCS8vbGlzdCBvZiBwbHVnaW5zIHdob3MgbG9ncyBpZiB3cml0dGVuIHRvIHdpbGwgY2F1c2UgSlVuaXRzIHRvIGZhaWwKLS8vCQlBcnJheUxpc3Q8U3RyaW5nPiBwbHVnaW5JRHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCi0JCS8vVE9ETyB1bmNvbW1lbnQgdGhlc2UgdG8gbWFrZSB0ZXN0cyBzdGFydCBmYWlsaW5nIG9uIGxvZ2dlZCBlcnJvcnMKLS8vCQlwbHVnaW5JRHMuYWRkKEpFTVV0aWxQbHVnaW4uSUQpOwotLy8JCXBsdWdpbklEcy5hZGQoIm9yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlciIpOwotLy8JCXBsdWdpbklEcy5hZGQoIm9yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZSIpOwotLy8JCXBsdWdpbklEcy5hZGQoIm9yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkiKTsKLS8vCQlwbHVnaW5JRHMuYWRkKENvbW1vbkZyYW1ld29ya3NQbHVnaW4uUExVR0lOX0lEKTsKLS8vCQlwbHVnaW5JRHMuYWRkKEVKQlVJUGx1Z2luLlBMVUdJTl9JRCk7Ci0vLwkJcGx1Z2luSURzLmFkZChKMkVFUGx1Z2luLlBMVUdJTl9JRCk7Ci0vLwkJcGx1Z2luSURzLmFkZChKMkVFQ29yZVBsdWdpbi5QTFVHSU5fSUQpOwotLy8JCXBsdWdpbklEcy5hZGQoRWpiUGx1Z2luLlBMVUdJTl9JRCk7Ci0vLwkJcGx1Z2luSURzLmFkZChNb2RlbFBsdWdpbi5QTFVHSU5JRCk7Ci0vLwkJcGx1Z2luSURzLmFkZCgib3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmFubm90YXRpb25zLmVtaXR0ZXIiKTsKLS8vCQlwbHVnaW5JRHMuYWRkKFhEb2NsZXRBbm5vdGF0aW9uUGx1Z2luLlBMVUdJTklEKTsKLS8vCQlwbHVnaW5JRHMuYWRkKEpjYVBsdWdpbi5QTFVHSU5fSUQpOwotLy8JCXBsdWdpbklEcy5hZGQoSkNBVUlQbHVnaW4uUExVR0lOX0lEKTsKLS8vCQlwbHVnaW5JRHMuYWRkKEoyRUVOYXZpZ2F0b3JQbHVnaW4uUExVR0lOX0lEKTsKLS8vCQlwbHVnaW5JRHMuYWRkKEoyRUVVSVBsdWdpbi5QTFVHSU5fSUQpOwotLy8JCXBsdWdpbklEcy5hZGQoV2ViUGx1Z2luLlBMVUdJTl9JRCk7Ci0vLwkJcGx1Z2luSURzLmFkZChXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCk7Ci0vLwkJcGx1Z2luSURzLmFkZChXZWJTZXJ2aWNlVUlQbHVnaW4uUExVR0lOX0lEKTsKLS8vCQlwbHVnaW5JRHMuYWRkKEpFRVBsdWdpbi5QTFVHSU5fSUQpOwotLy8JCXBsdWdpbklEcy5hZGQoQWN0aXZhdG9yLlBMVUdJTl9JRCk7Ci0vLwkJcGx1Z2luSURzLmFkZChKMkVFVUlQbHVnaW4uUExVR0lOX0lEKTsKLS8vCQlwbHVnaW5JRHMuYWRkKG9yZy5lY2xpcHNlLmpzdC5qZWUud2ViLkFjdGl2YXRvci5QTFVHSU5fSUQpOwotLy8JCXBsdWdpbklEcy5hZGQoU2VydmxldFVJUGx1Z2luLlBMVUdJTl9JRCk7Ci0vLwkJcGx1Z2luSURzLmFkZChQcm9wZXJ0aWVzVmFsaWRhdG9yUGx1Z2luLlBMVUdJTl9JRCk7Ci0vLwkJcGx1Z2luSURzLmFkZChCVlRWYWxpZGF0aW9uUGx1Z2luLlBMVUdJTl9JRCk7Ci0vLwkJcGx1Z2luSURzLmFkZChFY29yZVV0aWxpdGllc1BsdWdpbi5JRCk7Ci0vLwkJcGx1Z2luSURzLmFkZChFTUZXb3JrYmVuY2hFZGl0UGx1Z2luLklEKTsKLS8vCQlwbHVnaW5JRHMuYWRkKFdUUENvbW1vblBsdWdpbi5QTFVHSU5fSUQpOwotLy8JCXBsdWdpbklEcy5hZGQoV1RQVUlQbHVnaW4uUExVR0lOX0lEKTsKLS8vCQlwbHVnaW5JRHMuYWRkKE1vZHVsZWNvcmVQbHVnaW4uUExVR0lOX0lEKTsKLS8vCQlwbHVnaW5JRHMuYWRkKFZhbGlkYXRpb25QbHVnaW4uUExVR0lOX0lEKTsKLS8vCQlwbHVnaW5JRHMuYWRkKFZhbGlkYXRpb25VSVBsdWdpbi5QTFVHSU5fSUQpOwotLy8JCXBsdWdpbklEcy5hZGQoV1NUV2ViUGx1Z2luLlBMVUdJTl9JRCk7Ci0vLwkJcGx1Z2luSURzLmFkZChXU1RXZWJVSVBsdWdpbi5QTFVHSU5fSUQpOwotLy8JCXBsdWdpbklEcy5hZGQoIm9yZy5lY2xpcHNlLndzdC54bWwuY29yZSIpOwotLy8JCXBsdWdpbklEcy5hZGQoIm9yZy5lY2xpcHNlLmplbSIpOwotLy8JCXBsdWdpbklEcy5hZGQoQmVhbmluZm9QbHVnaW4uUElfQkVBTklORk9fUExVR0lOSUQpOwotLy8JCXBsdWdpbklEcy5hZGQoIm9yZy5lY2xpcHNlLmplbS5wcm94eSIpOwotLy8JCXBsdWdpbklEcy5hZGQoIm9yZy5lY2xpcHNlLmplbS51aSIpOwotLy8JCXBsdWdpbklEcy5hZGQoIm9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2giKTsKLS8vCQlwbHVnaW5JRHMuYWRkKCJvcmcuZWNsaXBzZS5qZW0udGVzdHMiKTsKLS8vCQlwbHVnaW5JRHMuYWRkKCJvcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcyIpOwotLy8JCXBsdWdpbklEcy5hZGQoQ29tbW9uVGVzdHNQbHVnaW4uUExVR0lOX0lEKTsKLS8vCQlwbHVnaW5JRHMuYWRkKCJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3RvciIpOwotLy8JCXBsdWdpbklEcy5hZGQoIm9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkiKTsKLS8vCQlwbHVnaW5JRHMuYWRkKCJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzIik7Ci0vLwkJcGx1Z2luSURzLmFkZCgib3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5wZXJmb3JtYW5jZSIpOwotLy8JCXBsdWdpbklEcy5hZGQoIm9yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzIik7Ci0vLwkJcGx1Z2luSURzLmFkZCgib3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2UiKTsKLS8vCQlwbHVnaW5JRHMuYWRkKCJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cyIpOwkKLQotLy8JCWZvcihTdHJpbmcgcGx1Z2luSUQgOiBwbHVnaW5JRHMpIHsKLS8vCQkJSW50ZXJuYWxQbGF0Zm9ybS5nZXREZWZhdWx0KCkuZ2V0TG9nKEludGVybmFsUGxhdGZvcm0uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZShwbHVnaW5JRCkpLmFkZExvZ0xpc3RlbmVyKEpVbml0TG9nTGlzdGVuZXIuSU5TVEFOQ0UpOwotLy8JCX0KLQl9Ci0JCi0JLyoqCi0JICogU2V0IHdlYXRoZXIgdG8gZmFpbCBqdW5pdCB0ZXN0cyBvbiBzdGF0dXMgbG9nZ2VkIHRvIHBsdWdpbnMgcmVnaXN0ZXJlZCB3aXRoIHRoZSA8Y29kZT5KVW5pdExvZ0xpc3RlbmVyPC9jb2RlPgotCSAqIERlZmF1bHQgdmFsdWUgaXMgc2V0IHRvIHRydWUuCi0JICogCi0JICogQHBhcmFtIGZhaWxPbkxvZ2dlZFN0YXR1cwotCSAqIAkJCWlmIDxjb2RlPnRydWU8L2NvZGU+IHRoZW4gZmFpbCB0ZXN0cyB3aGVuIHN0YXR1c2VzIGxvZ2dlZCB0byBwbHVnaW5zIHJlZ2lzdGVyZWQgd2l0aCA8Y29kZT5KVW5pdExvZ0xpc3RlbmVyPC9jb2RlPiwKLQkgKiAJCQlpZiA8Y29kZT5mYWxzZTwvY29kZT4gdGhlbiBkb250IGZhaWwgb24gbG9nZ2VkIHN0YXR1c2VzLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBmYWlsT25Mb2dnZWRTdGF0dXMoYm9vbGVhbiBmYWlsT25Mb2dnZWRTdGF0dXMpIHsKLQkJZkZhaWxPbkxvZ2dlZFN0YXR1cyA9IGZhaWxPbkxvZ2dlZFN0YXR1czsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBydW4oVGVzdFJlc3VsdCByZXN1bHQpIHsKLQkJdHJ5ewotCQkJQXNzZXJ0V2Fybi5jbGVhcldhcm5pbmdzKCk7Ci0JCQlzdXBlci5ydW4ocmVzdWx0KTsKLQkJCQotCQl9IGZpbmFsbHkgewotCQkJTGlzdCA8U3RhY2tUcmFjZUVsZW1lbnQ+IHN0YWNrVHJhY2UgPSBuZXcgQXJyYXlMaXN0PFN0YWNrVHJhY2VFbGVtZW50PigpOwotCQkJCi0JCQkvL2NoZWNrIHRvIHNlZSBpZiB0aGlzIHRlc3QgYWxyZWFkeSBmYWlsZWQgd2l0aCBhbiBlcnJvcgotCQkJLy9pZiBzbyBhZGQgZXJyb3IgdG8gc3RhY2sgdHJhY2UKLQkJCUVudW1lcmF0aW9uIGVycm9yc0VudW0gPSByZXN1bHQuZXJyb3JzKCk7Ci0JCQlUZXN0RmFpbHVyZSBlcnJvck9yRmFpbHVyZSA9IG51bGw7Ci0JCQlib29sZWFuIGhhZEVycm9yID0gZmFsc2U7Ci0JCQlmb3IoaW50IGkgPSAwOyBlcnJvcnNFbnVtLmhhc01vcmVFbGVtZW50cygpICYmICFoYWRFcnJvcjsgaSsrKSB7Ci0JCQkJT2JqZWN0IG8gPSBlcnJvcnNFbnVtLm5leHRFbGVtZW50KCk7Ci0JCQkJZXJyb3JPckZhaWx1cmUgPSAoVGVzdEZhaWx1cmUpbzsKLQkJCQlpZihlcnJvck9yRmFpbHVyZS5mYWlsZWRUZXN0KCkgPT0gdGhpcykgewotCQkJCQloYWRFcnJvciA9IHRydWU7Ci0JCQkJCQotCQkJCQlUaHJvd2FibGUgdGhyb3duID0gZXJyb3JPckZhaWx1cmUudGhyb3duRXhjZXB0aW9uKCk7Ci0JCQkJCUxpc3Q8U3RhY2tUcmFjZUVsZW1lbnQ+IGVycm9yVHJhY2UgPSBBcnJheXMuYXNMaXN0KHRocm93bi5nZXRTdGFja1RyYWNlKCkpOwotCQkJCQlzdGFja1RyYWNlLmFkZEFsbChlcnJvclRyYWNlKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8vY2hlY2sgdG8gc2VlIGlmIHRoaXMgdGVzdCBhbHJlYWR5IGZhaWxlZCB3aXRoIGEgZmFpbHVyZSBpZiBpdCBkaWRuJ3QKLQkJCS8vIGZhaWwgd2l0aCBhbiBlcnJvci4gaWYgc28gYWRkIGZhaWx1cmUgdG8gc3RhY2sgdHJhY2UKLQkJCWJvb2xlYW4gaGFkRmFpbHVyZSA9IGZhbHNlOwotCQkJaWYoIWhhZEVycm9yKSB7Ci0JCQkJRW51bWVyYXRpb24gZmFpbHVyZXNFbnVtID0gcmVzdWx0LmZhaWx1cmVzKCk7Ci0JCQkJZm9yKGludCBpID0gMDsgZmFpbHVyZXNFbnVtLmhhc01vcmVFbGVtZW50cygpICYmICFoYWRGYWlsdXJlOyBpKyspIHsKLQkJCQkJT2JqZWN0IG8gPSBmYWlsdXJlc0VudW0ubmV4dEVsZW1lbnQoKTsKLQkJCQkJZXJyb3JPckZhaWx1cmUgPSAoVGVzdEZhaWx1cmUpbzsKLQkJCQkJaWYoZXJyb3JPckZhaWx1cmUuZmFpbGVkVGVzdCgpID09IHRoaXMpIHsKLQkJCQkJCWhhZEZhaWx1cmUgPSB0cnVlOwotCQkJCQkJCi0JCQkJCQlUaHJvd2FibGUgdGhyb3duID0gZXJyb3JPckZhaWx1cmUudGhyb3duRXhjZXB0aW9uKCk7Ci0JCQkJCQlMaXN0PFN0YWNrVHJhY2VFbGVtZW50PiBmYWlsdXJlVHJhY2UgPSBBcnJheXMuYXNMaXN0KHRocm93bi5nZXRTdGFja1RyYWNlKCkpOwotCQkJCQkJc3RhY2tUcmFjZS5hZGRBbGwoZmFpbHVyZVRyYWNlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQkJLy9hZGQgYW55IHdhcm5pbmdzIHRvIHRoZSBzdGFjayB0cmFjZSBhbmQgZGVhbCB3aXRoIGlmIHRoaXMgdGVzdCBhbHJlYWR5IGZhaWxlZAotCQkJTGlzdCA8QXNzZXJ0aW9uRmFpbGVkRXJyb3I+IHdhcm5pbmdzID0gQXNzZXJ0V2Fybi5nZXRXYXJuaW5ncygpOwotCQkJYm9vbGVhbiBoYWRXYXJuaW5ncyA9IHdhcm5pbmdzLnNpemUoKSAhPSAwOwotCQkJaWYoaGFkV2FybmluZ3MpIHsKLQkJCQlpbnQgd2FybmluZ051bSA9IDE7Ci0JCQkJTGlzdDxTdGFja1RyYWNlRWxlbWVudD4gd2FybmluZ1RyYWNlID0gbnVsbDsKLQkJCQlmb3IoQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSA6IHdhcm5pbmdzKXsKLQkJCQkJc3RhY2tUcmFjZS5hZGQobmV3IFN0YWNrVHJhY2VFbGVtZW50KCItLS0tLS0tLS0tPiIsIiIsICJXQVJOSU5HIE1FU1NBR0U6ICIgKyBlLmdldE1lc3NhZ2UoKSArICIpICAoV0FSTklORyBOVU1CRVIiLCB3YXJuaW5nTnVtKyspKTsKLQkJCQkJCi0JCQkJCXdhcm5pbmdUcmFjZSA9IEFycmF5cy5hc0xpc3QoZS5nZXRTdGFja1RyYWNlKCkpOwotCQkJCQlzdGFja1RyYWNlLmFkZEFsbCh3YXJuaW5nVHJhY2UpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJLy9hZGQgYW55IGxvZ2dlZCBzdGF0dXNlcyB0byB0aGUgc3RhY2sgdHJhY2UsIGFzIGxvbmcgYXMgZkZhaWxPbkxvZ2dlZFN0YXR1cyA9PSB0cnVlCi0JCQlIYXNoTWFwPElTdGF0dXMsU3RyaW5nPiBsb2dnZWRTdGF0dXNlcyA9IEpVbml0TG9nTGlzdGVuZXIuSU5TVEFOQ0UuZ2V0TG9nZ2VkU3RhdHVzZXMoKTsKLQkJCWJvb2xlYW4gaGFkTG9nZ2VkU3RhdHVzZXMgPSBsb2dnZWRTdGF0dXNlcy5zaXplKCkgIT0gMDsKLQkJCWlmKGhhZExvZ2dlZFN0YXR1c2VzICYmIGZGYWlsT25Mb2dnZWRTdGF0dXMpIHsKLQkJCQlpbnQgbG9nZ2VkTWVzc2FnZU51bSA9IDE7Ci0JCQkJTGlzdDxTdGFja1RyYWNlRWxlbWVudD4gbG9nZ2VkTWVzc2FnZVRyYWNlID0gbnVsbDsKLQkJCQkKLQkJCQlTZXQ8SVN0YXR1cz4gbG9nZ2VkU3RhdHVzZXNLZXlzID0gbG9nZ2VkU3RhdHVzZXMua2V5U2V0KCk7Ci0JCQkJU3RyaW5nIHN0YXR1c1R5cGU7Ci0JCQkJZm9yKElTdGF0dXMgc3RhdHVzIDogbG9nZ2VkU3RhdHVzZXNLZXlzKSB7Ci0JCQkJCXN0YWNrVHJhY2UuYWRkKG5ldyBTdGFja1RyYWNlRWxlbWVudCgiLS0tLS0tLS0tLT4iLCIiLCAiTE9HR0VEICIgKyBzdGF0dXNUeXBlVG9TdHJpbmcoc3RhdHVzLmdldFNldmVyaXR5KCkpICsgIiBTVEFUVVM6ICIgKyBsb2dnZWRTdGF0dXNlcy5nZXQoc3RhdHVzKSArICI6ICIgKyBzdGF0dXMuZ2V0TWVzc2FnZSgpICsgIikgIChMT0dHRUQgU1RBVFVTIE5VTUJFUiIsIGxvZ2dlZE1lc3NhZ2VOdW0rKykpOwotCQkJCQkKLQkJCQkJaWYoc3RhdHVzLmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCQkJCWxvZ2dlZE1lc3NhZ2VUcmFjZSA9IEFycmF5cy5hc0xpc3Qoc3RhdHVzLmdldEV4Y2VwdGlvbigpLmdldFN0YWNrVHJhY2UoKSk7Ci0JCQkJCQlzdGFja1RyYWNlLmFkZEFsbChsb2dnZWRNZXNzYWdlVHJhY2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0JCQkvL2RlYWwgd2l0aCBtYWtpbmcgYSBuZXcgZm9ybWF0ZWQgZmFpbHVyZSBhbmQgYWRkZWQgaXQgdG8gdGhlIHJlc3VsdAotCQkJU3RyaW5nIG1lc3NhZ2UgPSAiIjsKLQkJCVN0cmluZyB3YXJuaW5nc01lc3NhZ2UgPSAiVGVzdCBoYWQgIiArIHdhcm5pbmdzLnNpemUoKSArICIgd2FybmluZ3Mgb2NjdXIiOwotCQkJU3RyaW5nIGxvZ2dlZFN0YXR1c2VzTWVzc2FnZSA9ICJUZXN0IGxvZ2dlZCAiICsgbG9nZ2VkU3RhdHVzZXMuc2l6ZSgpICsgIiBzdGF0dXNlcyI7Ci0JCQlpZihoYWRFcnJvciB8fCBoYWRGYWlsdXJlKSB7Ci0JCQkJbWVzc2FnZSA9IGVycm9yT3JGYWlsdXJlLmV4Y2VwdGlvbk1lc3NhZ2UoKTsKLQkJCQkKLQkJCQlpZihoYWRXYXJuaW5ncykgewotCQkJCQltZXNzYWdlICs9ICIgICgiICsgd2FybmluZ3NNZXNzYWdlICsgIikiOwotCQkJCX0KLQkJCQkKLQkJCQlpZihoYWRMb2dnZWRTdGF0dXNlcyAmJiBmRmFpbE9uTG9nZ2VkU3RhdHVzKSB7Ci0JCQkJCW1lc3NhZ2UgKz0gIiAgKCIgKyBsb2dnZWRTdGF0dXNlc01lc3NhZ2UgKyAiKSI7Ci0JCQkJfQotCQkJfSBlbHNlIGlmKGhhZFdhcm5pbmdzKSB7Ci0JCQkJbWVzc2FnZSA9IHdhcm5pbmdzTWVzc2FnZTsKLQkJCQkKLQkJCQlpZihoYWRMb2dnZWRTdGF0dXNlcyAmJiBmRmFpbE9uTG9nZ2VkU3RhdHVzKSB7Ci0JCQkJCW1lc3NhZ2UgKz0gIiAgKCIgKyBsb2dnZWRTdGF0dXNlc01lc3NhZ2UgKyAiKSI7Ci0JCQkJfQotCQkJfSBlbHNlIGlmKGhhZExvZ2dlZFN0YXR1c2VzICYmIGZGYWlsT25Mb2dnZWRTdGF0dXMpIHsKLQkJCQltZXNzYWdlID0gbG9nZ2VkU3RhdHVzZXNNZXNzYWdlOwotCQkJfQotCQkJCi0JCQlpZihoYWRFcnJvciB8fCBoYWRGYWlsdXJlIHx8IGhhZFdhcm5pbmdzIHx8IChoYWRMb2dnZWRTdGF0dXNlcyAmJiBmRmFpbE9uTG9nZ2VkU3RhdHVzKSkgewotCQkJCUFzc2VydGlvbkZhaWxlZEVycm9yIGVycm9yID0gbmV3IEFzc2VydGlvbkZhaWxlZEVycm9yKG1lc3NhZ2UpOwotCQkJCVN0YWNrVHJhY2VFbGVtZW50W10gc3RhY2tUcmFjZUFycmF5ID0gc3RhY2tUcmFjZS50b0FycmF5KG5ldyBTdGFja1RyYWNlRWxlbWVudFtzdGFja1RyYWNlLnNpemUoKV0pOwotCQkJCWVycm9yLnNldFN0YWNrVHJhY2Uoc3RhY2tUcmFjZUFycmF5KTsKLQotCQkJCWlmKGhhZEVycm9yKSB7Ci0JCQkJCXJlc3VsdC5hZGRFcnJvcih0aGlzLCBlcnJvcik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmVzdWx0LmFkZEZhaWx1cmUodGhpcywgZXJyb3IpOwotCQkJCX0KLQkJCX0KLQotCi0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgc3RhdHVzVHlwZVRvU3RyaW5nKGludCBzdGF0dXNUeXBlKSB7Ci0JCVN0cmluZyBzU3RhdHVzVHlwZSA9ICIiOwotCQlzd2l0Y2ggKHN0YXR1c1R5cGUpIHsKLQkJCWNhc2UgSVN0YXR1cy5FUlJPUiA6Ci0JCQkJc1N0YXR1c1R5cGUgPSAiRVJST1IiOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJU3RhdHVzLkNBTkNFTCA6Ci0JCQkJc1N0YXR1c1R5cGUgPSAiQ0FOQ0VMIjsKLQkJCQlicmVhazsKLQkJCWNhc2UgSVN0YXR1cy5XQVJOSU5HIDogCi0JCQkJc1N0YXR1c1R5cGUgPSAiV0FSTklORyI7Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJCi0JCXJldHVybiBzU3RhdHVzVHlwZTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2NvbW1vbnRlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvQ29tbW9uVGVzdHNQbHVnaW4uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvY29tbW9udGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy9Db21tb25UZXN0c1BsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDEyNzZiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvY29tbW9udGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy9Db21tb25UZXN0c1BsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gTm92IDMsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tb25UZXN0c1BsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMiOwotCXB1YmxpYyBzdGF0aWMgQ29tbW9uVGVzdHNQbHVnaW4gaW5zdGFuY2UgPSBudWxsOwotCXB1YmxpYyBJRXh0ZW5zaW9uUG9pbnQgZGF0YU1vZGVsVmVyaWZpZXJFeHQgPSBudWxsOwotCQotCS8qKgotCSAqIEBwYXJhbSBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIENvbW1vblRlc3RzUGx1Z2luKElQbHVnaW5EZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJc3VwZXIoZGVzY3JpcHRvcik7Ci0JCWluc3RhbmNlID0gdGhpczsKLQkJZGF0YU1vZGVsVmVyaWZpZXJFeHQgPSBkZXNjcmlwdG9yLmdldEV4dGVuc2lvblBvaW50KCJEYXRhTW9kZWxWZXJpZmllciIpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvY29tbW9udGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy9EYXRhTW9kZWxWZXJpZmllci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9jb21tb250ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL0RhdGFNb2RlbFZlcmlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMDNkNTMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9jb21tb250ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL0RhdGFNb2RlbFZlcmlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBKYW4gNSwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0czsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi0vKioKLSAqIEBhdXRob3IgQWRtaW5pc3RyYXRvcgotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIERhdGFNb2RlbFZlcmlmaWVyIHsKLQotICAgIHB1YmxpYyB2b2lkIHZlcmlmeShJRGF0YU1vZGVsIG1vZGVsKSB0aHJvd3MgRXhjZXB0aW9uIHsgICAgICAKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2NvbW1vbnRlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvRGF0YU1vZGVsVmVyaWZpZXJGYWN0b3J5LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2NvbW1vbnRlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvRGF0YU1vZGVsVmVyaWZpZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5YjY1MDEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9jb21tb250ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL0RhdGFNb2RlbFZlcmlmaWVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEphbiA1LCAyMDA0Ci0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZQotICogR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLS8qKgotICogQGF1dGhvciBBZG1pbmlzdHJhdG9yCi0gKiBAYXV0aG9yIElhbiBUZXdrc2J1cnkgKGljdGV3a3NiQHVzLmlibS5jb20pCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLQotICogUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIERhdGFNb2RlbFZlcmlmaWVyRmFjdG9yeSBleHRlbmRzIFJlZ2lzdHJ5UmVhZGVyewotCXN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9NT0RFTF9WRVJJRklFUl9MSVNUX0VYVCA9ICJkYXRhTW9kZWxWZXJpZmllckxpc3QiOwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgTElTVF9DTEFTUyA9ICJsaXN0Q2xhc3MiOwotCXByaXZhdGUgTWFwIGRhdGFNb2RlbFZlcmlmaWVyc01hcCA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgRGF0YU1vZGVsVmVyaWZpZXJGYWN0b3J5IGluc3RhbmNlID0gbnVsbDsKLQlwcml2YXRlIERhdGFNb2RlbFZlcmlmaWVyIGRlZmF1bHREYXRhTW9kZWxWZXJpZmllciA9IG5ldyBEYXRhTW9kZWxWZXJpZmllcigpOwotCQotCXB1YmxpYyBEYXRhTW9kZWxWZXJpZmllckZhY3RvcnkoKSB7Ci0JCXN1cGVyKENvbW1vblRlc3RzUGx1Z2luLlBMVUdJTl9JRCwgIkRhdGFNb2RlbFZlcmlmaWVyIik7Ly8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgc3RhdGljIERhdGFNb2RlbFZlcmlmaWVyRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpewotCQkJaW5zdGFuY2UgPSBuZXcgRGF0YU1vZGVsVmVyaWZpZXJGYWN0b3J5KCk7Ci0JCQlpbnN0YW5jZS5yZWFkUmVnaXN0cnkoKTsKLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLlJlZ2lzdHJ5UmVhZGVyI3JlYWRFbGVtZW50KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKCFlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoREFUQV9NT0RFTF9WRVJJRklFUl9MSVNUX0VYVCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlEYXRhTW9kZWxWZXJpZmllckxpc3QgbGlzdCA9IChEYXRhTW9kZWxWZXJpZmllckxpc3QpZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKExJU1RfQ0xBU1MpOwotCQkJYWRkVG9EYXRhTW9kZWxWZXJpZmllcnNNYXAobGlzdC5nZXREYXRhTW9kZWxWZXJpZmllcnMoKSk7Ci0JCX0KLQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKXsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0KLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkVG9EYXRhTW9kZWxWZXJpZmllcnNNYXAoTWFwIGRhdGFNb2RlbFZlcmlmaWVycyl7Ci0JCWlmIChkYXRhTW9kZWxWZXJpZmllcnNNYXAgPT0gbnVsbCkKLQkJCWRhdGFNb2RlbFZlcmlmaWVyc01hcCA9IGluaXREYXRhTW9kZWxWZXJpZmllcnNNYXAoKTsKLQkJZGF0YU1vZGVsVmVyaWZpZXJzTWFwLnB1dEFsbChkYXRhTW9kZWxWZXJpZmllcnMpOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGRhdGFNb2RlbFZlcmlmaWVyc01hcC4KLQkgKi8KLQlwdWJsaWMgTWFwIGdldERhdGFNb2RlbFZlcmlmaWVyc01hcCgpIHsKLQkJaWYgKGRhdGFNb2RlbFZlcmlmaWVyc01hcCA9PSBudWxsKSB7Ci0JCQlkYXRhTW9kZWxWZXJpZmllcnNNYXAgPSBpbml0RGF0YU1vZGVsVmVyaWZpZXJzTWFwKCk7Ci0JCX0KLQkJcmV0dXJuIGRhdGFNb2RlbFZlcmlmaWVyc01hcDsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWFwIGluaXREYXRhTW9kZWxWZXJpZmllcnNNYXAoKSB7Ci0JCXJldHVybiBuZXcgSGFzaE1hcCgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZGVmYXVsdERhdGFNb2RlbFZlcmlmaWVyLgotCSAqLwotCXByb3RlY3RlZCBEYXRhTW9kZWxWZXJpZmllciBnZXREZWZhdWx0RGF0YU1vZGVsVmVyaWZpZXIoKSB7Ci0JCXJldHVybiBkZWZhdWx0RGF0YU1vZGVsVmVyaWZpZXI7Ci0JfQotCQotCSAgLypwcml2YXRlIHZvaWQgbG9hZENvbmZpZ3VyYXRpb24oKSB7Ci0gICAgICAgIC8vVGVzdENvbGxlY3RvclBsdWdpbiBwbHVnaW4gPSBUZXN0Q29sbGVjdG9yUGx1Z2luLmluc3RhbmNlOwotCSAgCUNvbW1vblRlc3RzUGx1Z2luIHBsdWdpbiA9IENvbW1vblRlc3RzUGx1Z2luLmluc3RhbmNlOwotICAgICAgICBJRXh0ZW5zaW9uW10gZGF0YU1vZGVsVmVyaWZpZXJFeHRzID0gcGx1Z2luLmRhdGFNb2RlbFZlcmlmaWVyRXh0LmdldEV4dGVuc2lvbnMoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRhdGFNb2RlbFZlcmlmaWVyRXh0cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgSUV4dGVuc2lvbiBleHRlbnNpb24gPSBkYXRhTW9kZWxWZXJpZmllckV4dHNbaV07Ci0gICAgICAgICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBmYWN0b3JpZXMgPSBleHRlbnNpb24uZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGZhY3Rvcmllcy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gZmFjdG9yaWVzW2pdOwotICAgICAgICAgICAgICAgICAgICBEYXRhTW9kZWxWZXJpZmllckxpc3QgbGlzdCA9IChEYXRhTW9kZWxWZXJpZmllckxpc3QpZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJsaXN0Q2xhc3MiKTsKLSAgICAgICAgICAgICAgICAgICAgLy9DbGFzc0xvYWRlciBjbGFzc0xvYWRlciA9IChDbGFzc0xvYWRlcikgZXh0ZW5zaW9uLmdldERlY2xhcmluZ1BsdWdpbkRlc2NyaXB0b3IoKS5nZXRQbHVnaW5DbGFzc0xvYWRlcigpOwotICAgICAgICAgICAgICAgICAgICAvL0RhdGFNb2RlbFZlcmlmaWVyTGlzdCBsaXN0ID0gKERhdGFNb2RlbFZlcmlmaWVyTGlzdCkgY2xhc3NMb2FkZXIubG9hZENsYXNzKGZhY3RvcnlDbGFzcykubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkVG9EYXRhTW9kZWxWZXJpZmllcnNNYXAobGlzdC5nZXREYXRhTW9kZWxWZXJpZmllcnMoKSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ki8KLQkKLQlwdWJsaWMgRGF0YU1vZGVsVmVyaWZpZXIgY3JlYXRlVmVyaWZpZXIoSURhdGFNb2RlbCBtb2RlbCkgIHsKLQkJRGF0YU1vZGVsVmVyaWZpZXIgdmVyaWZpZXIgPSBnZXREZWZhdWx0RGF0YU1vZGVsVmVyaWZpZXIoKTsKLQkJCi0JCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQlPYmplY3QgdmVyaWZpZXJPYmplY3QgPSBnZXREYXRhTW9kZWxWZXJpZmllcnNNYXAoKS5nZXQobW9kZWwuZ2V0SUQoKSk7Ci0JCQlpZih2ZXJpZmllck9iamVjdCAhPSBudWxsKXsKLQkJCQl0cnkgewotCQkJCQlpZih2ZXJpZmllck9iamVjdCBpbnN0YW5jZW9mIENsYXNzKXsKLQkJCQkJCXJldHVybiAoRGF0YU1vZGVsVmVyaWZpZXIpKChDbGFzcyl2ZXJpZmllck9iamVjdCkubmV3SW5zdGFuY2UoKTsKLQkJCQkJfSBlbHNlIGlmKHZlcmlmaWVyT2JqZWN0IGluc3RhbmNlb2YgU3RyaW5nKXsKLQkJCQkJCUNsYXNzIHZlcmlmaWVyQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKChTdHJpbmcpdmVyaWZpZXJPYmplY3QpOwotCQkJCQkJdmVyaWZpZXIgPSAoRGF0YU1vZGVsVmVyaWZpZXIpIHZlcmlmaWVyQ2xhc3MubmV3SW5zdGFuY2UoKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7IAotCQkJCQl2ZXJpZmllciA9IGdldERlZmF1bHREYXRhTW9kZWxWZXJpZmllcigpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdmVyaWZpZXI7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvY29tbW9udGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy9EYXRhTW9kZWxWZXJpZmllckxpc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvY29tbW9udGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy9EYXRhTW9kZWxWZXJpZmllckxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM4MjJlMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2NvbW1vbnRlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvRGF0YU1vZGVsVmVyaWZpZXJMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBEZWMgNiwgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBldGVyYXRpb24KLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEYXRhTW9kZWxWZXJpZmllckxpc3QgewotCQotCXB1YmxpYyBhYnN0cmFjdCBNYXAgZ2V0RGF0YU1vZGVsVmVyaWZpZXJzKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvY29tbW9udGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy9KVW5pdExvZ0xpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2NvbW1vbnRlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvSlVuaXRMb2dMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjNmOWYyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvY29tbW9udGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy9KVW5pdExvZ0xpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JTG9nTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci0KLS8qKgotICogQGF1dGhvciBpdGV3awotICoKLSAqLwotcHVibGljIGNsYXNzIEpVbml0TG9nTGlzdGVuZXIgaW1wbGVtZW50cyBJTG9nTGlzdGVuZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBKVW5pdExvZ0xpc3RlbmVyIElOU1RBTkNFID0gbmV3IEpVbml0TG9nTGlzdGVuZXIoKTsKLQlwcml2YXRlIEhhc2hNYXA8SVN0YXR1cywgU3RyaW5nPiBsb2dnZWRTdGF0dXNlcyA9IG5ldyBIYXNoTWFwPElTdGF0dXMsIFN0cmluZz4oKTsKLQkKLQlwcml2YXRlIEpVbml0TG9nTGlzdGVuZXIoKSB7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JTG9nTGlzdGVuZXIjbG9nZ2luZyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2dnaW5nKElTdGF0dXMgc3RhdHVzLCBTdHJpbmcgcGx1Z2luKSB7Ci0JCWludCBzZXZlcml0eSA9IHN0YXR1cy5nZXRTZXZlcml0eSgpOwotCQlpZihzZXZlcml0eSA9PSBJU3RhdHVzLkNBTkNFTCB8fCBzZXZlcml0eSA9PSBJU3RhdHVzLkVSUk9SIHx8IHNldmVyaXR5ID09IElTdGF0dXMuV0FSTklORykgewotCQkJbG9nZ2VkU3RhdHVzZXMucHV0KHN0YXR1cywgcGx1Z2luKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjdXJyZW50IGxpc3Qgb2YgbG9nZ2VkIHN0YXR1c2VzLCBjbGVhcnMgbGlzdCBhZnRlciByZXR1cm4uCi0JICovCi0JcHVibGljIEhhc2hNYXA8SVN0YXR1cyxTdHJpbmc+IGdldExvZ2dlZFN0YXR1c2VzKCkgewotCQlIYXNoTWFwPElTdGF0dXMsU3RyaW5nPiByZXR1cm5TdGF0dXNlcyA9IG5ldyBIYXNoTWFwPElTdGF0dXMsU3RyaW5nPihsb2dnZWRTdGF0dXNlcyk7Ci0JCWxvZ2dlZFN0YXR1c2VzLmNsZWFyKCk7Ci0JCXJldHVybiByZXR1cm5TdGF0dXNlczsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2NvbW1vbnRlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvTG9nVXRpbGl0eS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9jb21tb250ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL0xvZ1V0aWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNkMDI4ZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2NvbW1vbnRlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvTG9nVXRpbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gSnVuIDMwLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUxvZ0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotCi0vKioKLSAqIEBhdXRob3IganNob2xsCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIExvZ1V0aWxpdHkgaW1wbGVtZW50cyBJTG9nTGlzdGVuZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nVXRpbGl0eSBpbnN0YW5jZSA9IG5ldyBMb2dVdGlsaXR5KCk7Ci0gICAgcHJpdmF0ZSBBcnJheUxpc3QgbG9nZ2VkTWVzc2FnZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGxvZ2dpbmcgPSBmYWxzZTsKLQotICAgIHByaXZhdGUgTG9nVXRpbGl0eSgpIHsKLSAgICAgICAgcmVnaXN0ZXJQbHVnaW5zKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyUGx1Z2lucygpIHsKLS8vICAgICAgVE9ETyBEQ0IgRGlzYWJsZSBmb3Igbm93IGR1ZSB0byBvdGhlciBwbHVnaW5zIGZhaWxpbmcuCi0vLyAgICAgICAgSVBsdWdpblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0UGx1Z2luUmVnaXN0cnkoKTsKLS8vICAgICAgICBJUGx1Z2luRGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gcmVnaXN0cnkuZ2V0UGx1Z2luRGVzY3JpcHRvcnMoKTsKLS8vICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0vLyAgICAgICAgICAgIHRyeSB7Ci0vLyAgICAgICAgICAgICAgICBQbHVnaW4gcGx1Z2luID0gZGVzY3JpcHRvcnNbaV0uZ2V0UGx1Z2luKCk7Ci0vLyAgICAgICAgICAgICAgICBJTG9nIGxvZyA9IHBsdWdpbi5nZXRMb2coKTsKLS8vICAgICAgICAgICAgICAgIGxvZy5hZGRMb2dMaXN0ZW5lcih0aGlzKTsKLS8vICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLS8vICAgICAgICAgICAgfQotLy8gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIExvZ1V0aWxpdHkgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiBpbnN0YW5jZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbGVhckxvZ3MoKSB7Ci0gICAgICAgIGxvZ2dlZE1lc3NhZ2VzLmNsZWFyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVzZXRMb2dnaW5nKCkgewotICAgICAgICBzdG9wTG9nZ2luZygpOwotICAgICAgICBjbGVhckxvZ3MoKTsKLSAgICAgICAgc3RhcnRMb2dnaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnRMb2dnaW5nKCkgewotICAgICAgICBsb2dnaW5nID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdG9wTG9nZ2luZygpIHsKLSAgICAgICAgbG9nZ2luZyA9IGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZlcmlmeU5vV2FybmluZ3MoKSB7Ci0gICAgCS8vVE9ETyBEQ0IgRGlzYWJsZSBmb3Igbm93IGR1ZSB0byBvdGhlciBwbHVnaW5zIGZhaWxpbmcuCi0vLyAgICAgICAgU3RyaW5nIHdhcm5pbmdzID0gIiI7Ci0vLyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsb2dnZWRNZXNzYWdlcy5zaXplKCk7IGkrKykgewotLy8gICAgICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IChJU3RhdHVzKSBsb2dnZWRNZXNzYWdlcy5nZXQoaSk7Ci0vLyAgICAgICAgICAgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLldBUk5JTkcgfHwgc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikgewotLy8gICAgICAgICAgICAgICAgd2FybmluZ3MgKz0gIlxuTG9nVXRpbGl0eTogIiArICgoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5XQVJOSU5HKSA/ICJXQVJOSU5HICIgOiAiRVJST1IgIik7Ci0vLyAgICAgICAgICAgICAgICB3YXJuaW5ncyArPSAiXG5Gcm9tIHBsdWdpbjogIiArICgobnVsbCAhPSBzdGF0dXMuZ2V0UGx1Z2luKCkpID8gc3RhdHVzLmdldFBsdWdpbigpIDogIm51bGwiKTsKLS8vICAgICAgICAgICAgICAgIHdhcm5pbmdzICs9ICJcbk1lc3NhZ2U6ICIgKyAoKG51bGwgIT0gc3RhdHVzLmdldE1lc3NhZ2UoKSkgPyBzdGF0dXMuZ2V0TWVzc2FnZSgpIDogIm51bGwiKTsKLS8vICAgICAgICAgICAgICAgIHdhcm5pbmdzICs9ICJcblN0YWNrOlxuIjsKLS8vICAgICAgICAgICAgICAgIHRyeSB7Ci0vLyAgICAgICAgICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLS8vICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZ2V0RXhjZXB0aW9uKCkucHJpbnRTdGFja1RyYWNlKG5ldyBQcmludFN0cmVhbShvdXRwdXRTdHJlYW0pKTsKLS8vICAgICAgICAgICAgICAgICAgICB3YXJuaW5ncyArPSBvdXRwdXRTdHJlYW0udG9TdHJpbmcoKTsKLS8vICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0vLyAgICAgICAgICAgICAgICAgICAgd2FybmluZ3MgKz0gIiBTdGFjayBub3QgYXZhaWxhYmxlIjsKLS8vICAgICAgICAgICAgICAgIH0KLS8vCi0vLyAgICAgICAgICAgIH0KLS8vICAgICAgICB9Ci0vLyAgICAgICAgaWYgKCF3YXJuaW5ncy5lcXVhbHMoIiIpKSB7Ci0vLyAgICAgICAgICAgIEFzc2VydC5mYWlsKHdhcm5pbmdzKTsKLS8vICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbG9nZ2luZyhJU3RhdHVzIHN0YXR1cywgU3RyaW5nIHBsdWdpbikgewotICAgICAgICBpZiAobG9nZ2luZykgewotICAgICAgICAgICAgbG9nZ2VkTWVzc2FnZXMuYWRkKHN0YXR1cyk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2NvbW1vbnRlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvT3BlcmF0aW9uVGVzdENhc2UuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvY29tbW9udGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy9PcGVyYXRpb25UZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjg4YmEzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvY29tbW9udGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy9PcGVyYXRpb25UZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcxICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIE5vdiA2LCAyMDAzCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8gV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kCi0gKiBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLklXb3Jrc3BhY2VSdW5uYWJsZVdpdGhTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuVmFsaWRhdGlvbkJ1aWxkZXI7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICogQGF1dGhvciBpdGV3awotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgT3BlcmF0aW9uVGVzdENhc2UgZXh0ZW5kcyBCYXNlVGVzdENhc2UgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVE9SX0pPQl9GQU1JTFkgPSAidmFsaWRhdG9ycyI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmlsZVNlcCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiZmlsZS5zZXBhcmF0b3IiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBPS19TVEFUVVMgPSBuZXcgU3RhdHVzKElTdGF0dXMuT0ssICJvcmcuZWNsaXBzZS5qZW0udXRpbCIsIDAsICJPSyIsIG51bGwpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0cnl7IAotCQkJZGVsZXRlQWxsUHJvamVjdHMoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCVJlbmRlcmVyRmFjdG9yeS5nZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCkuc2V0VmFsaWRhdGluZyhmYWxzZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZUFsbFByb2plY3RzKCkgewotCQl0cnkgewotCQkJd2FpdE9uSm9icygpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlMSkgewotCQkJCi0JCX0KLQkJSVdvcmtzcGFjZVJ1bm5hYmxlV2l0aFN0YXR1cyB3b3Jrc3BhY2VSdW5uYWJsZSA9IG5ldyBJV29ya3NwYWNlUnVubmFibGVXaXRoU3RhdHVzKG51bGwpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJdHJ5IHsKLQkJCQkJUHJvamVjdFV0aWxpdHkuZGVsZXRlQWxsUHJvamVjdHMoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJfTsKLQkJdHJ5IHsKLQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5ydW4od29ya3NwYWNlUnVubmFibGUsIG51bGwpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQotCQl9Ci0JfQotCi0JcHVibGljIE9wZXJhdGlvblRlc3RDYXNlKCkgewotCQlzdXBlcigiT3BlcmF0aW9uc1Rlc3RDYXNlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgT3BlcmF0aW9uVGVzdENhc2UoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJ1bkFuZFZlcmlmeShJRGF0YU1vZGVsIGRhdGFNb2RlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9wZXJhdGlvblRlc3RDYXNlLnJ1bkFuZFZlcmlmeShkYXRhTW9kZWwsIHRydWUsIHRydWUpOwotCX0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcnVuRGF0YU1vZGVsKElEYXRhTW9kZWwgZGF0YU1vZGVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3BlcmF0aW9uVGVzdENhc2UucnVuRGF0YU1vZGVsKGRhdGFNb2RlbCwgdHJ1ZSwgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJ1bkRhdGFNb2RlbChJRGF0YU1vZGVsIGRhdGFNb2RlbCwgYm9vbGVhbiBjaGVja1Rhc2tzLCBib29sZWFuIGNoZWNrTG9nKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3BlcmF0aW9uVGVzdENhc2UucnVuRGF0YU1vZGVsKGRhdGFNb2RlbCwgY2hlY2tUYXNrcywgY2hlY2tMb2csIG51bGwsIHRydWUsIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcnVuQW5kVmVyaWZ5KElEYXRhTW9kZWwgZGF0YU1vZGVsLCBib29sZWFuIGNoZWNrVGFza3MsIGJvb2xlYW4gY2hlY2tMb2cpIHRocm93cyBFeGNlcHRpb24gewotCQlydW5BbmRWZXJpZnkoZGF0YU1vZGVsLCBjaGVja1Rhc2tzLCBjaGVja0xvZywgbnVsbCwgdHJ1ZSwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBydW5BbmRWZXJpZnkoSURhdGFNb2RlbCBkYXRhTW9kZWwsIGJvb2xlYW4gY2hlY2tUYXNrcywgYm9vbGVhbiBjaGVja0xvZywgYm9vbGVhbiB3YWl0Rm9yQnVpbGRUb0NvbXBsZXRlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcnVuQW5kVmVyaWZ5KGRhdGFNb2RlbCwgY2hlY2tUYXNrcywgY2hlY2tMb2csIG51bGwsIHRydWUsIHdhaXRGb3JCdWlsZFRvQ29tcGxldGUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBydW5BbmRWZXJpZnkoSURhdGFNb2RlbCBkYXRhTW9kZWwsIGJvb2xlYW4gY2hlY2tUYXNrcywgYm9vbGVhbiBjaGVja0xvZywgTGlzdCBlcnJvck9LTGlzdCwgYm9vbGVhbiByZXBvcnRJZkV4cGVjdGVkRXJyb3JOb3RGb3VuZCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJ1bkFuZFZlcmlmeShkYXRhTW9kZWwsIGNoZWNrVGFza3MsIGNoZWNrTG9nLCBlcnJvck9LTGlzdCwgcmVwb3J0SWZFeHBlY3RlZEVycm9yTm90Rm91bmQsIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcnVuQW5kVmVyaWZ5KElEYXRhTW9kZWwgZGF0YU1vZGVsLCBib29sZWFuIGNoZWNrVGFza3MsIGJvb2xlYW4gY2hlY2tMb2csIExpc3QgZXJyb3JPS0xpc3QsIGJvb2xlYW4gcmVwb3J0SWZFeHBlY3RlZEVycm9yTm90Rm91bmQsIGJvb2xlYW4gd2FpdEZvckJ1aWxkVG9Db21wbGV0ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJ1bkFuZFZlcmlmeShkYXRhTW9kZWwsIGNoZWNrVGFza3MsIGNoZWNrTG9nLCBlcnJvck9LTGlzdCwgcmVwb3J0SWZFeHBlY3RlZEVycm9yTm90Rm91bmQsIHdhaXRGb3JCdWlsZFRvQ29tcGxldGUsIGZhbHNlKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHJ1bkRhdGFNb2RlbChJRGF0YU1vZGVsIGRhdGFNb2RlbCwgYm9vbGVhbiBjaGVja1Rhc2tzLCBib29sZWFuIGNoZWNrTG9nLCBMaXN0IGVycm9yT0tMaXN0LCBib29sZWFuIHJlcG9ydElmRXhwZWN0ZWRFcnJvck5vdEZvdW5kLCBib29sZWFuIHdhaXRGb3JCdWlsZFRvQ29tcGxldGUpIHRocm93cyBFeGNlcHRpb24gewotCQlydW5EYXRhTW9kZWwoZGF0YU1vZGVsLCBjaGVja1Rhc2tzLCBjaGVja0xvZywgZXJyb3JPS0xpc3QsIHJlcG9ydElmRXhwZWN0ZWRFcnJvck5vdEZvdW5kLCB3YWl0Rm9yQnVpbGRUb0NvbXBsZXRlLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogR3VhcmFudGVlZCB0byBjbG9zZSB0aGUgZGF0YU1vZGVsCi0JICogCi0JICogQHBhcmFtIGRhdGFNb2RlbAotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJ1bkFuZFZlcmlmeShJRGF0YU1vZGVsIGRhdGFNb2RlbCwgYm9vbGVhbiBjaGVja1Rhc2tzLCBib29sZWFuIGNoZWNrTG9nLCBMaXN0IGVycm9yT0tMaXN0LCBib29sZWFuIHJlcG9ydElmRXhwZWN0ZWRFcnJvck5vdEZvdW5kLCBib29sZWFuIHdhaXRGb3JCdWlsZFRvQ29tcGxldGUsIGJvb2xlYW4gcmVtb3ZlQWxsU2FtZVR5cGVzT2ZFcnJvcnMpIHRocm93cyBFeGNlcHRpb24gewotCQlQb3N0QnVpbGRMaXN0ZW5lciBsaXN0ZW5lciA9IG51bGw7Ci0JCUlXb3Jrc3BhY2VEZXNjcmlwdGlvbiBkZXNjID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmICh3YWl0Rm9yQnVpbGRUb0NvbXBsZXRlKSB7Ci0JCQkJbGlzdGVuZXIgPSBuZXcgUG9zdEJ1aWxkTGlzdGVuZXIoKTsKLQkJCQlkZXNjID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldERlc2NyaXB0aW9uKCk7Ci0JCQkJZGVzYy5zZXRBdXRvQnVpbGRpbmcoZmFsc2UpOwotCQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5zZXREZXNjcmlwdGlvbihkZXNjKTsKLQkJCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lciwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9CVUlMRCk7Ci0JCQl9Ci0JCQkKLQkJCS8vZGVhbCB3aXRoIHdlYXRoZXIgdG8gZmFpbCBvbiBsb2dnZWQgc3RhdHVzZXMgb3Igbm90Ci0JCQlCYXNlVGVzdENhc2UuZmFpbE9uTG9nZ2VkU3RhdHVzKGNoZWNrTG9nKTsKLQkJCQotCQkJSVN0YXR1cyBvcGVyYXRpb25TdGF0dXMgPSBkYXRhTW9kZWwuZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgbnVsbCk7Ci0JCQkKLQkJCWlmICh3YWl0Rm9yQnVpbGRUb0NvbXBsZXRlKSB7Ci0JCQkJZGVzYy5zZXRBdXRvQnVpbGRpbmcodHJ1ZSk7Ci0JCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnNldERlc2NyaXB0aW9uKGRlc2MpOwotCQkJCXdoaWxlICghbGlzdGVuZXIuaXNCdWlsZENvbXBsZXRlKCkpIHsKLQkJCQkJVGhyZWFkLnNsZWVwKDMwMDApOy8vIGRvIG5vdGhpbmcgdGlsbCBhbGwgdGhlIGpvYnMgYXJlIGNvbXBsZXRlZAotCQkJCX0KLQkJCX0KLQkJCQotCQkJLy8gYnVnIDE3MzkzMyAtIHJ1bkFuZFZlcmlmeSgpIGZhaWxzIHRvIGNoZWNrIHJldHVybiBJU3RhdHVzIAotCQkJaWYgKG9wZXJhdGlvblN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpIHsKLQkJCQlUaHJvd2FibGUgdGhyb3dhYmxlID0gb3BlcmF0aW9uU3RhdHVzLmdldEV4Y2VwdGlvbigpOwotCQkJCVN0cmluZyB0aHJvd2FibGVTdHIgPSBudWxsOwotCQkJCWlmKHRocm93YWJsZSAhPSBudWxsKXsKLQkJCQkJdGhyb3dhYmxlLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl0aHJvd2FibGVTdHIgPSBnZXRTdGFja1RyYWNlKHRocm93YWJsZSk7Ci0JCQkJfQotCQkJCWlmKHRocm93YWJsZVN0ciA9PSBudWxsKXsKLQkJCQkJdGhyb3dhYmxlU3RyID0gIm5vIG1lc3NhZ2UiOwotCQkJCX0KLQkJCQlBc3NlcnQuZmFpbChvcGVyYXRpb25TdGF0dXMuZ2V0TWVzc2FnZSgpKyJcbiAgICBjYXVzZWQgYnk6ICIrdGhyb3dhYmxlU3RyKTsKLQkJCX0KLQkJCQotCQkJLy9ydW4gZGF0YSBtb2RlbCB2ZXJpZmljYXRpb25zCi0JCQlEYXRhTW9kZWxWZXJpZmllckZhY3RvcnkgdmVyaWZpZXJGYWN0b3J5ID0gRGF0YU1vZGVsVmVyaWZpZXJGYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0JCQlEYXRhTW9kZWxWZXJpZmllciB2ZXJpZmllciA9IHZlcmlmaWVyRmFjdG9yeS5jcmVhdGVWZXJpZmllcihkYXRhTW9kZWwpOwotCQkJdmVyaWZpZXIudmVyaWZ5KGRhdGFNb2RlbCk7Ci0KLQkJCWlmIChjaGVja1Rhc2tzICYmIChlcnJvck9LTGlzdCA9PSBudWxsIHx8IGVycm9yT0tMaXN0LmlzRW1wdHkoKSkpIHsKLQkJCQljaGVja1Rhc2tzTGlzdCgpOwotCQkJfSBlbHNlIGlmIChjaGVja1Rhc2tzICYmIGVycm9yT0tMaXN0ICE9IG51bGwgJiYgIWVycm9yT0tMaXN0LmlzRW1wdHkoKSkgewotCQkJCVRhc2tWaWV3VXRpbGl0eS52ZXJpZnlFcnJvcnMoZXJyb3JPS0xpc3QsIHJlcG9ydElmRXhwZWN0ZWRFcnJvck5vdEZvdW5kLCByZW1vdmVBbGxTYW1lVHlwZXNPZkVycm9ycyk7Ci0JCQl9Ci0JCQkKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChsaXN0ZW5lciAhPSBudWxsKQotCQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCWRhdGFNb2RlbC5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RhY2tUcmFjZShUaHJvd2FibGUgdGhyb3dhYmxlKXsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIodGhyb3dhYmxlLnRvU3RyaW5nKCkrIlxuIik7Ci0JCVN0YWNrVHJhY2VFbGVtZW50W10gc3RhY2sgPSB0aHJvd2FibGUuZ2V0U3RhY2tUcmFjZSgpOwotCQlmb3IgKGludCBpPTA7IGk8c3RhY2subGVuZ3RoOyBpKyspCi0JCQlidWZmZXIuYXBwZW5kKCJcdGF0ICIgKyBzdGFja1tpXSsiXG4iKTsKLQotCQlTdGFja1RyYWNlRWxlbWVudFtdIHBhcmVudFN0YWNrID0gc3RhY2s7Ci0JCXRocm93YWJsZSA9IHRocm93YWJsZS5nZXRDYXVzZSgpOwotCQl3aGlsZSAodGhyb3dhYmxlICE9IG51bGwpIHsKLQkJCWJ1ZmZlci5hcHBlbmQoIkNhdXNlZCBieTogIik7Ci0JCQlidWZmZXIuYXBwZW5kKHRocm93YWJsZSk7Ci0JCQlidWZmZXIuYXBwZW5kKCJcbiIpOwotCQkJU3RhY2tUcmFjZUVsZW1lbnRbXSBjdXJyZW50U3RhY2sgPSB0aHJvd2FibGUuZ2V0U3RhY2tUcmFjZSgpOwotCQkJcGFyZW50U3RhY2sgPSBjdXJyZW50U3RhY2s7Ci0JCQl0aHJvd2FibGUgPSB0aHJvd2FibGUuZ2V0Q2F1c2UoKTsKLQkJfQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCS8qKgotCSAqIEd1YXJhbnRlZWQgdG8gY2xvc2UgdGhlIGRhdGFNb2RlbAotCSAqIAotCSAqIEBwYXJhbSBkYXRhTW9kZWwKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBydW5EYXRhTW9kZWwoSURhdGFNb2RlbCBkYXRhTW9kZWwsIGJvb2xlYW4gY2hlY2tUYXNrcywgYm9vbGVhbiBjaGVja0xvZywgTGlzdCBlcnJvck9LTGlzdCwgYm9vbGVhbiByZXBvcnRJZkV4cGVjdGVkRXJyb3JOb3RGb3VuZCwgYm9vbGVhbiB3YWl0Rm9yQnVpbGRUb0NvbXBsZXRlLCBib29sZWFuIHJlbW92ZUFsbFNhbWVUeXBlc09mRXJyb3JzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUG9zdEJ1aWxkTGlzdGVuZXIgbGlzdGVuZXIgPSBudWxsOwotCQlJV29ya3NwYWNlRGVzY3JpcHRpb24gZGVzYyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAod2FpdEZvckJ1aWxkVG9Db21wbGV0ZSkgewotCQkJCWxpc3RlbmVyID0gbmV3IFBvc3RCdWlsZExpc3RlbmVyKCk7Ci0JCQkJZGVzYyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXREZXNjcmlwdGlvbigpOwotCQkJCWRlc2Muc2V0QXV0b0J1aWxkaW5nKGZhbHNlKTsKLQkJCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuc2V0RGVzY3JpcHRpb24oZGVzYyk7Ci0JCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIsIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQlVJTEQpOwotCQkJfQotCQkJCi0JCQkvL2RlYWwgd2l0aCB3ZWF0aGVyIHRvIGZhaWwgb24gbG9nZ2VkIHN0YXR1c2VzIG9yIG5vdAotCQkJQmFzZVRlc3RDYXNlLmZhaWxPbkxvZ2dlZFN0YXR1cyhjaGVja0xvZyk7Ci0JCQkKLQkJCWRhdGFNb2RlbC5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCBudWxsKTsKLQkJCQotCQkJaWYgKHdhaXRGb3JCdWlsZFRvQ29tcGxldGUpIHsKLQkJCQlkZXNjLnNldEF1dG9CdWlsZGluZyh0cnVlKTsKLQkJCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuc2V0RGVzY3JpcHRpb24oZGVzYyk7Ci0JCQkJd2hpbGUgKCFsaXN0ZW5lci5pc0J1aWxkQ29tcGxldGUoKSkgewotCQkJCQlUaHJlYWQuc2xlZXAoMzAwMCk7Ly8gZG8gbm90aGluZyB0aWxsIGFsbCB0aGUgam9icyBhcmUgY29tcGxldGVsZWQKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoY2hlY2tUYXNrcyAmJiAoZXJyb3JPS0xpc3QgPT0gbnVsbCB8fCBlcnJvck9LTGlzdC5pc0VtcHR5KCkpKSB7Ci0JCQkJY2hlY2tUYXNrc0xpc3QoKTsKLQkJCX0gZWxzZSBpZiAoY2hlY2tUYXNrcyAmJiBlcnJvck9LTGlzdCAhPSBudWxsICYmICFlcnJvck9LTGlzdC5pc0VtcHR5KCkpIHsKLQkJCQlUYXNrVmlld1V0aWxpdHkudmVyaWZ5RXJyb3JzKGVycm9yT0tMaXN0LCByZXBvcnRJZkV4cGVjdGVkRXJyb3JOb3RGb3VuZCwgcmVtb3ZlQWxsU2FtZVR5cGVzT2ZFcnJvcnMpOwotCQkJfQotCi0JCX0gZmluYWxseSB7Ci0JCQlpZiAobGlzdGVuZXIgIT0gbnVsbCkKLQkJCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQlkYXRhTW9kZWwuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgY2hlY2tUYXNrc0xpc3QoKSB7Ci0JCS8vVGFza1ZpZXdVdGlsaXR5LnZlcmlmeU5vRXJyb3JzKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHZlcmlmeVZhbGlkRGF0YU1vZGVsKElEYXRhTW9kZWwgZGF0YU1vZGVsKSB7Ci0JCUlTdGF0dXMgc3RhdHVzID0gZGF0YU1vZGVsLnZhbGlkYXRlKCk7Ci0KLQkJaWYgKCFzdGF0dXMuaXNPSygpICYmIHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpIHsKLQkJCUFzc2VydC5hc3NlcnRUcnVlKCJEYXRhTW9kZWwgaXMgaW52YWxpZCBvcGVyYXRpb24gd2lsbCBub3QgcnVuOiIgKyBzdGF0dXMudG9TdHJpbmcoKSwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdmVyaWZ5SW52YWxpZERhdGFNb2RlbChJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQlJU3RhdHVzIHN0YXR1cyA9IGRhdGFNb2RlbC52YWxpZGF0ZSgpOwotCQlpZiAoc3RhdHVzLmlzT0soKSkgewotCQkJQXNzZXJ0LmFzc2VydFRydWUoIkRhdGFNb2RlbCBzaG91bGQgYmUgaW52YWxpZDoiICsgc3RhdHVzLmdldE1lc3NhZ2UoKSwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVhckRvd24oKTsKLQkJLy8gV2FpdCBmb3IgYWxsIHZhbGlkYXRpb24gam9icyB0byBlbmQgYmVmb3JlIGVuZGluZyB0ZXN0Li4uLgotCQl3YWl0T25Kb2JzKCk7Ci0JCQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB3YWl0T25Kb2JzKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IFByb2plY3RVdGlsaXR5LmdldEFsbFByb2plY3RzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBwcm9qZWN0c1tpXTsKLQkJCUpvYi5nZXRKb2JNYW5hZ2VyKCkuam9pbihwcm9qZWN0LmdldE5hbWUoKSArIFZBTElEQVRPUl9KT0JfRkFNSUxZLG51bGwpOwotCQl9Ci0JCUpvYi5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX01BTlVBTF9CVUlMRCxudWxsKTsKLQkJSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCxudWxsKTsKLQkJSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFZhbGlkYXRpb25CdWlsZGVyLkZBTUlMWV9WQUxJREFUSU9OX0pPQixudWxsKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2NvbW1vbnRlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvUGxhdGZvcm1Nb2R1bGVVUkxUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2NvbW1vbnRlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvUGxhdGZvcm1Nb2R1bGVVUkxUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmYmJkYjMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9jb21tb250ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL1BsYXRmb3JtTW9kdWxlVVJMVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gSmFuIDIxLCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLlBsYXRmb3JtVVJMTW9kdWxlQ29ubmVjdGlvbjsKLQotcHVibGljIGNsYXNzIFBsYXRmb3JtTW9kdWxlVVJMVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyBQbGF0Zm9ybU1vZHVsZVVSTFRlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotICAgIAotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoUGxhdGZvcm1Nb2R1bGVVUkxUZXN0LmNsYXNzKTsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geyAKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgUGxhdGZvcm1VUkxNb2R1bGVDb25uZWN0aW9uLnN0YXJ0dXAoKTsKLSAgICB9Ci0gICAgICAgIAotICAgIC8qKgotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RVUkxSZXNvbHZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKCJwbGF0Zm9ybTovbW9kdWxlOi9NeU1vZHVsZS9NRVRBLUlORi9lamItamFyLnhtbCIpOwotICAgICAgICBVUkxDb25uZWN0aW9uIGNvbnggPSB1cmwub3BlbkNvbm5lY3Rpb24oKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGNvbnguZ2V0VVJMKCkpOwotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9jb21tb250ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL1Bvc3RCdWlsZExpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2NvbW1vbnRlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvUG9zdEJ1aWxkTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RiNDY1Ny4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2NvbW1vbnRlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvUG9zdEJ1aWxkTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIE9jdCAyMCwgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotCi0vKioKLSAqIEBhdXRob3IgbmlyYXYKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBQb3N0QnVpbGRMaXN0ZW5lciBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHsKLSAgICBwcml2YXRlIGJvb2xlYW4gYnVpbGRDb21wbGV0ZSA9IGZhbHNlOwotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyI3Jlc291cmNlQ2hhbmdlZChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaWYgKGV2ZW50LmdldFR5cGUoKSA9PSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0JVSUxEKXsKLSAgICAgICAgICBidWlsZENvbXBsZXRlID0gdHJ1ZTsgIAotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNCdWlsZENvbXBsZXRlKCkgewotICAgICAgICByZXR1cm4gYnVpbGRDb21wbGV0ZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdENvbXBsZXRlKCkgewotICAgICAgICBidWlsZENvbXBsZXRlID0gZmFsc2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9jb21tb250ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL1Byb2plY3RVdGlsaXR5LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2NvbW1vbnRlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvUHJvamVjdFV0aWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhmZWJlYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2NvbW1vbnRlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvUHJvamVjdFV0aWxpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHM7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqIAotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZWRpdCB0aGUgdGVtcGxhdGUgdmFyaWFibGUgInR5cGVjb21tZW50IjogV2luZG93PlByZWZlcmVuY2VzPkphdmE+VGVtcGxhdGVzLiBUbwotICogZW5hYmxlIGFuZCBkaXNhYmxlIHRoZSBjcmVhdGlvbiBvZiB0eXBlIGNvbW1lbnRzIGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFByb2plY3RVdGlsaXR5IHsKLSAgICBwdWJsaWMgc3RhdGljIElQcm9qZWN0W10gZ2V0QWxsUHJvamVjdHMoKSB7Ci0gICAgCUlQcm9qZWN0W10gcHJvamVjdHMgPSBuZXcgSVByb2plY3RbMF07Ci0gICAgCXRyeSB7Ci0gICAgICAgIHByb2plY3RzID0gIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLSAgICAJfSBjYXRjaCAoQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uIGV4KSB7Ci0gICAgCQkvLyBDYXRjaCBNYWxmb3JtZWQgdHJlZSBleGNlcHRpb24gdGhhdCBvY2N1cnMgZnJvbSB0aW1lIHRvIHRpbWUuLi4KLSAgICAJfQotICAgIAlyZXR1cm4gcHJvamVjdHM7Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwcm9qZWN0RXhpc3RzKFN0cmluZyBwcm9qZWN0TmFtZSkgewotICAgICAgICByZXR1cm4gZ2V0UHJvamVjdChwcm9qZWN0TmFtZSkgIT0gbnVsbDsKLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyBJUHJvamVjdCB2ZXJpZnlBbmRSZXR1cm5Qcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSwgYm9vbGVhbiBleGlzdHMpIHsKLSAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QocHJvamVjdE5hbWUpOwotICAgICAgICBpZiAoZXhpc3RzKSB7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiUHJvamVjdCBEb2VzIE5vdCBFeGlzdDoiICsgcHJvamVjdE5hbWUsIHByb2plY3QuZXhpc3RzKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIlByb2plY3QgRXhpc3RzOiIgKyBwcm9qZWN0TmFtZSwgIXByb2plY3QuZXhpc3RzKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwcm9qZWN0OwotICAgIH0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmVyaWZ5UHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUsIGJvb2xlYW4gZXhpc3RzKSB7Ci0gICAgICAgIElQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICAgICAgaWYgKGV4aXN0cykgewotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIlByb2plY3QgRG9lcyBOb3QgRXhpc3Q6IiArIHByb2plY3ROYW1lLCBwcm9qZWN0LmV4aXN0cygpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJQcm9qZWN0IEV4aXN0czoiICsgcHJvamVjdE5hbWUsICFwcm9qZWN0LmV4aXN0cygpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBwdWJsaWMgc3RhdGljIElQcm9qZWN0IGdldFByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lKSB7Ci0gICAgICAgIElXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotICAgICAgICBTdHJpbmcgcGF0aFN0cmluZyA9IHByb2plY3ROYW1lOwotICAgICAgICBpZiAoISh3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldFByb2plY3QocGF0aFN0cmluZykgPT0gbnVsbCkpCi0gICAgICAgICAgICByZXR1cm4gd29ya3NwYWNlLmdldFJvb3QoKS5nZXRQcm9qZWN0KHBhdGhTdHJpbmcpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIHZlcmlmeU5vUHJvamVjdHMoKSB7Ci0gICAgICAgIElQcm9qZWN0W10gcHJvamVjdHMgPSBnZXRBbGxQcm9qZWN0cygpOwotICAgICAgICBTdHJpbmcgcHJvamVjdE5hbWVzID0gIiI7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHByb2plY3ROYW1lcyArPSAiICIgKyBwcm9qZWN0c1tpXS5nZXROYW1lKCk7Ci0gICAgICAgIH0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkFsbCBwcm9qZWN0cyBub3QgZGVsZXRlZCIgKyBwcm9qZWN0TmFtZXMsIHByb2plY3RzLmxlbmd0aCA9PSAwKTsKLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZVByb2plY3RJZkV4aXN0cyhTdHJpbmcgcHJvamVjdE5hbWUpIHsKLSAgICAgICAgaWYgKHByb2plY3ROYW1lID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIElQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCAmJiBwcm9qZWN0LmlzQWNjZXNzaWJsZSgpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHByb2plY3QuY2xvc2UobnVsbCk7Ci0gICAgICAgICAgICAgICAgcHJvamVjdC5kZWxldGUodHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBudWxsKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LmZhaWwoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVBbGxQcm9qZWN0cygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvL2Nsb3NpbmcgcHJvamVjdHMgYW5kIHRyZWFkIHdvcmsgaW4gaGVyZSBpcyBhIGhhY2sgYmVjYXVzZSBvZiBhIEJlYW5JbmZvIGJ1ZyBob2xkaW5nCi0gICAgICAgIC8vb250byBqYXJzIGxvYWRlZCBpbiBhbm90aGVyIFZNCi0gICAgICAgIAotLy8gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLS8vICAgICAgICAgICAgaWYgKHByb2plY3RzW2ldLmV4aXN0cygpKSB7Ci0vLyAgICAgICAgICAgICAgICBwcm9qZWN0c1tpXS5jbG9zZShudWxsKTsgLy8gVGhpcyBzaG91bGQgc2lnbmFsIHRoZSBleHRyYSBWTSB0byBraWxsIGl0c2VsZgotLy8gICAgICAgICAgICB9Ci0vLyAgICAgICAgfQotIC8vICAgICAgIFRocmVhZC55aWVsZCgpOyAvLyBnaXZlIHRoZSBWTSBhIGNoYW5jZSB0byBkaWUKLSAgICAgICAgSVdvcmtzcGFjZVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCUlQcm9qZWN0W10gcHJvamVjdHMgPSBnZXRBbGxQcm9qZWN0cygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSVByb2plY3QgcHJvamVjdCA9IHByb2plY3RzW2ldOwotCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBmYWxzZTsKLQkJCQkJRXhjZXB0aW9uIGxhc3RFeGNlcHRpb24gPSBudWxsOwotCQkJCQkvLyBEb24ndCBtYWtlIDJeMTIgaXMgYWJvdXQgNCBzZWNvbmRzIHdoaWNoIGlzIHRoZSBtYXggd2UKLQkJCQkJLy8gd2lsbCB3YWl0IGZvciB0aGUgVk0gdG8gZGllCi0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgMTMgJiYgIXN1Y2Nlc3M7IGorKykgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlpZiAocHJvamVjdC5leGlzdHMoKSkgewotCQkJCQkJCQlwcm9qZWN0LmRlbGV0ZSh0cnVlLCB0cnVlLCBudWxsKTsKLQkJCQkJCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBudWxsKTsKLQkJCQkJCQl9Ci0JCQkJCQkJc3VjY2VzcyA9IHRydWU7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCWxhc3RFeGNlcHRpb24gPSBlOwotCQkJCQkJCWlmIChwcm9qZWN0LmV4aXN0cygpKSB7Ci0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQlwcm9qZWN0LmNsb3NlKG51bGwpOwotCQkJCQkJCQkJcHJvamVjdC5vcGVuKG51bGwpOwotCQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZTIpIHsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQl0cnkgewotCQkJCQkJCQlUaHJlYWQuc2xlZXAoKGludCkgTWF0aC5wb3coMiwgaikpOwotCQkJCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUxKSB7Ci0JCQkJCQkJfSAvLyBpZiB0aGUgVk0KLQkJCQkJCQkJCQkJCQkJCQkvLyBpc24ndCBkZWFkLAotCQkJCQkJCQkJCQkJCQkJCS8vIHRyeSBzbGVlcGluZwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmICghc3VjY2VzcyAmJiBsYXN0RXhjZXB0aW9uICE9IG51bGwpIHsKLQkJCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2coIlByb2JsZW0gd2hpbGUgZGVsZXRpbmc6ICIgKyBsYXN0RXhjZXB0aW9uLmdldE1lc3NhZ2UoKSk7Ci0JCQkJCQkvLyBBc3NlcnQuZmFpbCgiQ2F1Z2h0IEV4Y2VwdGlvbj0iICsKLQkJCQkJCS8vIGxhc3RFeGNlcHRpb24uZ2V0TWVzc2FnZSgpICsgIiB3aGVuIGRlbGV0aW5nCi0JCQkJCQkvLyBwcm9qZWN0PSIgKyBwcm9qZWN0LmdldE5hbWUoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCXRyeSB7Ci0JCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKHJ1bm5hYmxlLCBudWxsKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQl9Ci0gICAgICAgIC8vdmVyaWZ5Tm9Qcm9qZWN0cygpOwotICAgIH0KLSAgICAvKioKLQkgKiBSZXR1cm4gdGhlIGFic29sdXRlIHBhdGggU3RyaW5ncyB0byB0aGUgZmlsZXMgYmFzZWQgb24gdGhlIGZpbGVTdWZmaXggYW5kCi0JICogcGF0aCB3aXRoaW4gdGhlIHBsdWdpbi4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqIEBwYXJhbSBmaWxlU3VmZml4Ci0JICogICAgICAgICAgICB0aGUgZmlsZSBlbmRpbmcgd2l0aCB0aGUgIi4iIGlmIHJlcXVpcmVkICh0aGUgc3VmZml4IHdpbGwgYmUKLQkgKiAgICAgICAgICAgIHVzZWQgYXMgaXMpCi0JICogQHJldHVybgotCSAqLwotICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRTcGVjaWZpY0ZpbGVzSW5EaXJlY3RvcnkoUGx1Z2luIHBsdWdpbiwgU3RyaW5nIHBhdGgsIGZpbmFsIFN0cmluZyBmaWxlU3VmZml4KSB7Ci0gICAgICAgIFVSTCBlbnRyeSA9IG51bGw7IAotICAgICAgICAgICAgZW50cnkgPSBwbHVnaW4uZ2V0QnVuZGxlKCkuZ2V0RW50cnkocGF0aCk7IAotICAgICAgICBMaXN0IHJlc3VsdCA9IG51bGw7Ci0gICAgICAgIEZpbGUgZm9sZGVyID0gbnVsbDsKLSAgICAgICAgaWYgKGVudHJ5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZW50cnkgPSBQbGF0Zm9ybS5hc0xvY2FsVVJMKGVudHJ5KTsKLSAgICAgICAgICAgICAgICBmb2xkZXIgPSBuZXcgRmlsZShuZXcgVVJJKGVudHJ5LnRvU3RyaW5nKCkpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgICAgIGUxLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTGlzdCBmaWxlcyA9IEFycmF5cy5hc0xpc3QoZm9sZGVyLmxpc3QoKSk7Ci0gICAgICAgICAgICBpZiAoIWZpbGVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBmb2xkZXJQYXRoID0gZm9sZGVyLmdldEFic29sdXRlUGF0aCgpICsgRmlsZS5zZXBhcmF0b3I7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gKFN0cmluZykgZmlsZXMuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIWZpbGVOYW1lLmVuZHNXaXRoKGZpbGVTdWZmaXgpKQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoZm9sZGVyUGF0aCArIGZpbGVOYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgcmVzdWx0ID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyBMaXN0IGdldEphcnNJbkRpcmVjdG9yeShQbHVnaW4gcGx1Z2luLCBTdHJpbmcgcGF0aCkgewotICAgICAgICByZXR1cm4gZ2V0U3BlY2lmaWNGaWxlc0luRGlyZWN0b3J5KHBsdWdpbiwgcGF0aCwgIi5qYXIiKTsKLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyBMaXN0IGdldFJhcnNJbkRpcmVjdG9yeShQbHVnaW4gcGx1Z2luLCBTdHJpbmcgcGF0aCkgewotICAgICAgICByZXR1cm4gZ2V0U3BlY2lmaWNGaWxlc0luRGlyZWN0b3J5KHBsdWdpbiwgcGF0aCwgIi5yYXIiKTsKLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyBMaXN0IGdldEVhcnNJbkRpcmVjdG9yeShQbHVnaW4gcGx1Z2luLCBTdHJpbmcgcGF0aCkgewotICAgICAgICByZXR1cm4gZ2V0U3BlY2lmaWNGaWxlc0luRGlyZWN0b3J5KHBsdWdpbiwgcGF0aCwgIi5lYXIiKTsKLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyBMaXN0IGdldFdhcnNJbkRpcmVjdG9yeShQbHVnaW4gcGx1Z2luLCBTdHJpbmcgcGF0aCkgewotICAgICAgICByZXR1cm4gZ2V0U3BlY2lmaWNGaWxlc0luRGlyZWN0b3J5KHBsdWdpbiwgcGF0aCwgIi53YXIiKTsKLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RnVsbEZpbGVOYW1lKFBsdWdpbiBwbHVnaW4sIFN0cmluZyBwbHVnaW5SZWxhdGl2ZUZpbGVOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBJUGF0aCBwYXRoID0gbmV3IFBhdGgocGx1Z2luUmVsYXRpdmVGaWxlTmFtZSk7Ci0gICAgICAgIGlmIChwYXRoLmdldERldmljZSgpICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gcGx1Z2luUmVsYXRpdmVGaWxlTmFtZTsKLSAgICAgICAgVVJMIHVybCA9IHBsdWdpbi5nZXRCdW5kbGUoKS5nZXRFbnRyeShwbHVnaW5SZWxhdGl2ZUZpbGVOYW1lKTsKLSAgICAgICAgaWYgKHVybCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB1cmwgPSBQbGF0Zm9ybS5hc0xvY2FsVVJMKHVybCk7Ci0gICAgICAgICAgICBJUGF0aCBpUGF0aCA9IG5ldyBQYXRoKHVybC5nZXRQYXRoKCkpOwotICAgICAgICAgICAgcmV0dXJuIGlQYXRoLnRvT1NTdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9jb21tb250ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL1NpbXBsZVRlc3RTdWl0ZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9jb21tb250ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL1NpbXBsZVRlc3RTdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmUxNmU2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvY29tbW9udGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy9TaW1wbGVUZXN0U3VpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEZlYiAyLCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZVRlc3RTdWl0ZSBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0KLSAgICBwdWJsaWMgU2ltcGxlVGVzdFN1aXRlKENsYXNzIHRoZUNsYXNzKSB7Ci0gICAgICAgIHN1cGVyKHRoZUNsYXNzLCBnZXRTaG9ydE5hbWUodGhlQ2xhc3MpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTaG9ydE5hbWUoQ2xhc3MgYyl7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gYy5nZXROYW1lKCk7Ci0gICAgICAgIGlmKG5hbWUubGFzdEluZGV4T2YoJy4nKSA+IDApewotICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKG5hbWUubGFzdEluZGV4T2YoJy4nKSsxKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2NvbW1vbnRlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvVGFza1ZpZXdVdGlsaXR5LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2NvbW1vbnRlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvVGFza1ZpZXdVdGlsaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMTM1NWMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9jb21tb250ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL1Rhc2tWaWV3VXRpbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGVkaXQgdGhlIHRlbXBsYXRlIHZhcmlhYmxlICJ0eXBlY29tbWVudCI6Ci0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5UZW1wbGF0ZXMuCi0gKiBUbyBlbmFibGUgYW5kIGRpc2FibGUgdGhlIGNyZWF0aW9uIG9mIHR5cGUgY29tbWVudHMgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFRhc2tWaWV3VXRpbGl0eSB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIElSZXNvdXJjZSBnZXRXb3Jrc3BhY2VSb290KCkgewotICAgICAgICByZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmVyaWZ5Tm9OZXdUYXNrcyhIYXNoU2V0IGhhc2hTZXQpIHsKLSAgICAgICAgdmVyaWZ5Tm9OZXdUYXNrcyhudWxsLCBoYXNoU2V0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmVyaWZ5Tm9OZXdUYXNrcyhJUmVzb3VyY2UgcmVzb3VyY2UsIEhhc2hTZXQgaGFzaFNldCkgewotICAgICAgICB2ZXJpZnlOb05ld1Rhc2tzSW1wbChyZXNvdXJjZSwgaGFzaFNldCwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB2ZXJpZnlOb05ld1Rhc2tzSW1wbChJUmVzb3VyY2UgcmVzb3VyY2UsIEhhc2hTZXQgaGFzaFNldCwgYm9vbGVhbiBmYWlsT25GYWlsdXJlKSB7Ci0gICAgICAgIElSZXNvdXJjZSBtYXJrZXJTb3VyY2UgPSByZXNvdXJjZSA9PSBudWxsID8gZ2V0V29ya3NwYWNlUm9vdCgpIDogcmVzb3VyY2U7Ci0gICAgICAgIElNYXJrZXJbXSBtYXJrZXJzID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1hcmtlcnMgPSBtYXJrZXJTb3VyY2UuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCB0cnVlLCBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUxKSB7Ci0gICAgICAgICAgICBlMS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIEFzc2VydC5mYWlsKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IG1hcmtlcnMgIT0gbnVsbCAmJiBqIDwgbWFya2Vycy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBtYXJrZXJzW2pdLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAoU3RyaW5nKSBtYXJrZXJzW2pdLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG51bGwgPT0gaGFzaFNldCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBmYWlsTXNnID0gIlRhc2sgaW4gVGFza3MgTGlzdDogIiArIG1lc3NhZ2U7Ci0gICAgICAgICAgICAgICAgaWYgKGZhaWxPbkZhaWx1cmUpIHsKLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmZhaWwoZmFpbE1zZyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGZhaWxNc2cpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIWhhc2hTZXQuY29udGFpbnMobWFya2Vyc1tqXSkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZmFpbE1zZyA9ICJOZXcgVGFzayBpbiBUYXNrcyBMaXN0OiAiICsgbWVzc2FnZTsKLSAgICAgICAgICAgICAgICBpZiAoZmFpbE9uRmFpbHVyZSkgewotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuZmFpbChmYWlsTXNnKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZmFpbE1zZyk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmVyaWZ5Tm9FcnJvcnMoKSB7Ci0gICAgICAgIHZlcmlmeU5vRXJyb3JzKG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2ZXJpZnlOb0Vycm9ycyhJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLSAgICAgICAgTGlzdCBtYXJrZXJzID0gZ2V0RXJyb3JzKHJlc291cmNlKTsKLSAgICAgICAgaWYgKG51bGwgIT0gbWFya2VycyAmJiBtYXJrZXJzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIGludCBzaXplID0gbWFya2Vycy5zaXplKCk7Ci0gICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICIiICsgc2l6ZSArICIgZXJyb3JzIGluIHRhc2tzIHZpZXc6IjsKLSAgICAgICAgICAgIElNYXJrZXIgbWFya2VyOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBtYXJrZXIgPSAoSU1hcmtlcikgbWFya2Vycy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSArPSAiXG4iICsgaSArICIgIiArIChTdHJpbmcpIG1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFzc2VydC5mYWlsKG1lc3NhZ2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRFcnJvcnMoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCUlSZXNvdXJjZSBtYXJrZXJTb3VyY2UgPSByZXNvdXJjZSA9PSBudWxsID8gZ2V0V29ya3NwYWNlUm9vdCgpIDogcmVzb3VyY2U7Ci0gICAgICAgIExpc3QgbWFya2VycyA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtYXJrZXJzID0gZmluZFNldmVyaXR5TWFya2VycyhtYXJrZXJTb3VyY2UsIElNYXJrZXIuU0VWRVJJVFlfRVJST1IpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUxKSB7Ci0gICAgICAgICAgICBlMS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotCQlyZXR1cm4gbWFya2VyczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBMaXN0IGZpbmRTZXZlcml0eU1hcmtlcnMoSVJlc291cmNlIG1hcmtlclNvdXJjZSwgaW50IHNldmVyaXR5TGV2ZWwpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgSU1hcmtlcltdIG1hcmtlcnMgPSBtYXJrZXJTb3VyY2UuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCB0cnVlLCBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotICAgICAgICBMaXN0IHJlc3VsdHMgPSBudWxsOwotICAgICAgICBJbnRlZ2VyIHNldmVyaXR5OwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHNldmVyaXR5ID0gKEludGVnZXIpIG1hcmtlcnNbaV0uZ2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFkpOwotICAgICAgICAgICAgaWYgKHNldmVyaXR5LmludFZhbHVlKCkgPT0gc2V2ZXJpdHlMZXZlbCkgewotICAgICAgICAgICAgICAgIGlmIChyZXN1bHRzID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0cy5hZGQobWFya2Vyc1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlc3VsdHMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJlc3VsdHMgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotICAgICAgICByZXR1cm4gcmVzdWx0czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmVyaWZ5Tm9XYXJuaW5ncygpIHsKLQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2ZXJpZnlOb1Rhc2tzKCkgewotICAgICAgICB2ZXJpZnlOb1Rhc2tzKG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2ZXJpZnlOb1Rhc2tzKElSZXNvdXJjZSByZXNvdXJjZSkgewotICAgICAgICB2ZXJpZnlOb05ld1Rhc2tzSW1wbChyZXNvdXJjZSwgbnVsbCwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHZlcmlmeU5vVGFza3MoYm9vbGVhbiBmYWlsT25GYWlsdXJlKSB7Ci0gICAgICAgIHZlcmlmeU5vVGFza3MobnVsbCwgZmFpbE9uRmFpbHVyZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHZlcmlmeU5vVGFza3MoSVJlc291cmNlIHJlc291cmNlLCBib29sZWFuIGZhaWxPbkZhaWx1cmUpIHsKLSAgICAgICAgdmVyaWZ5Tm9OZXdUYXNrc0ltcGwocmVzb3VyY2UsIG51bGwsIGZhaWxPbkZhaWx1cmUpOwotICAgIH0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmVyaWZ5RXJyb3JzKExpc3QgbWFya2VyRGVzY3JpcHRpb25zRXhwZWN0ZWQpIHsKLSAgICAgICAgdmVyaWZ5RXJyb3JzKG1hcmtlckRlc2NyaXB0aW9uc0V4cGVjdGVkLHRydWUsZmFsc2UpOwotICAgIH0KLQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2ZXJpZnlFcnJvcnMoTGlzdCBtYXJrZXJEZXNjcmlwdGlvbnNFeHBlY3RlZCwgYm9vbGVhbiByZXBvcnRJZkV4cGVjdGVkRXJyb3JOb3RGb3VuZCwgYm9vbGVhbiByZW1vdmVBbGxTYW1lVHlwZXNPZkVycm9yKSB7Ci0gICAgICAgIExpc3QgbWFya2VyRGVzY3JpcHRpb25zRm91bmQgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgTGlzdCBtYXJrZXJzRm91bmQgPSBmaW5kU2V2ZXJpdHlNYXJrZXJzKGdldFdvcmtzcGFjZVJvb3QoKSwgSU1hcmtlci5TRVZFUklUWV9FUlJPUik7Ci0gICAgICAgICAgICBtYXJrZXJEZXNjcmlwdGlvbnNGb3VuZCA9IG5ldyBBcnJheUxpc3QobWFya2Vyc0ZvdW5kLnNpemUoKSk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlcnNGb3VuZC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIG1hcmtlckRlc2NyaXB0aW9uc0ZvdW5kLmFkZCgoKElNYXJrZXIpIG1hcmtlcnNGb3VuZC5nZXQoaSkpLmdldEF0dHJpYnV0ZSgibWVzc2FnZSIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgZTEucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBBc3NlcnQuZmFpbCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQXJyYXlMaXN0IG1hcmtlckRlc2NyaXB0aW9uc05vdEZvdW5kID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBMaXN0IG1hcmtlcnNEZXNjcmlwdGlvbnNUb1JlbW92ZSA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJEZXNjcmlwdGlvbnNFeHBlY3RlZC5zaXplKCk7IGkrKykgewotICAgICAgICAJU3RyaW5nIG1lc3NhZ2VUb0ZpbmQgPSAoU3RyaW5nKW1hcmtlckRlc2NyaXB0aW9uc0V4cGVjdGVkLmdldChpKTsKLSAgICAgICAgCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLSAgICAgICAgCWZvcihpbnQgaj0wO2o8bWFya2VyRGVzY3JpcHRpb25zRm91bmQuc2l6ZSgpICYmKCFmb3VuZCB8fCByZW1vdmVBbGxTYW1lVHlwZXNPZkVycm9yKTtqKyspewotICAgICAgICAJCWlmKG1lc3NhZ2VUb0ZpbmQuZXF1YWxzKG1hcmtlckRlc2NyaXB0aW9uc0ZvdW5kLmdldChqKSkpewotICAgICAgICAJCQlmb3VuZCA9IHRydWU7Ci0gICAgICAgIAkJCW1hcmtlcnNEZXNjcmlwdGlvbnNUb1JlbW92ZS5hZGQobWFya2VyRGVzY3JpcHRpb25zRm91bmQuZ2V0KGopKTsKLSAgICAgICAgCQl9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIAlpZiAoIWZvdW5kKSB7Ci0gICAgICAgICAgICAgICAgbWFya2VyRGVzY3JpcHRpb25zTm90Rm91bmQuYWRkKG1lc3NhZ2VUb0ZpbmQpOwotICAgICAgICAgICAgfSAKLSAgICAgICAgfQotICAgICAgICBtYXJrZXJEZXNjcmlwdGlvbnNGb3VuZC5yZW1vdmVBbGwobWFya2Vyc0Rlc2NyaXB0aW9uc1RvUmVtb3ZlKTsKLSAgICAgICAgaWYgKG1hcmtlckRlc2NyaXB0aW9uc05vdEZvdW5kLnNpemUoKSA+IDAgfHwgbWFya2VyRGVzY3JpcHRpb25zRm91bmQuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2VzID0gIiI7Ci0gICAgICAgICAgICBpZiAocmVwb3J0SWZFeHBlY3RlZEVycm9yTm90Rm91bmQpewotCSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFya2VyRGVzY3JpcHRpb25zTm90Rm91bmQuc2l6ZSgpOyBpKyspIHsKLQkgICAgICAgICAgICAgICAgbWVzc2FnZXMgKz0gIlxuRXJyb3Igbm90IGZvdW5kOlwiIiArIG1hcmtlckRlc2NyaXB0aW9uc05vdEZvdW5kLmdldChpKSsiXCIiOwotCSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFya2VyRGVzY3JpcHRpb25zRm91bmQuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBtZXNzYWdlcyArPSAiXG5VbmV4cGVjdGVkIGVycm9yIGZvdW5kOlwiIiArIG1hcmtlckRlc2NyaXB0aW9uc0ZvdW5kLmdldChpKSsiXCIiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFtZXNzYWdlcy5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICAgIEFzc2VydC5mYWlsKG1lc3NhZ2VzKTsKLSAgICAgICAgfQotCi0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvY29tbW9udGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy9XaW5kb3dVdGlsaXR5LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2NvbW1vbnRlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvV2luZG93VXRpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWRjNzc5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvY29tbW9udGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy9XaW5kb3dVdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBKdW4gNSwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHM7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBXaW5kb3dVdGlsaXR5IHsKLQotLy8gICAgcHVibGljIHN0YXRpYyB2b2lkIGNsb3NlQWxsT3BlbldpbmRvd3MoKSB7Ci0vLyAgICAgICAgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpOwotLy8gICAgICAgIElXb3JrYmVuY2hXaW5kb3dbXSB3aW5kb3dzID0gd29ya2JlbmNoLmdldFdvcmtiZW5jaFdpbmRvd3MoKTsKLS8vCi0vLyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3aW5kb3dzLmxlbmd0aDsgaSsrKSB7Ci0vLyAgICAgICAgICAgIGZpbmFsIElXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gd2luZG93c1tpXTsKLS8vICAgICAgICAgICAgZmluYWwgU2hlbGwgc2hlbGwgPSB3aW5kb3cuZ2V0U2hlbGwoKTsKLS8vICAgICAgICAgICAgc2hlbGwuZ2V0RGlzcGxheSgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLS8vICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLS8vICAgICAgICAgICAgICAgICAgICBTaGVsbFtdIG90aGVyU2hlbGxzID0gc2hlbGwuZ2V0RGlzcGxheSgpLmdldFNoZWxscygpOwotLy8gICAgICAgICAgICAgICAgICAgIC8vdGhpcyBjYW4gYmUgaW1wb3JvdmVkLCBidXQgYmFzaWNhbGx5IHRoaXMgaXMgdG8gd29yayBvdXQgc2hlbGwgZGVwZW5kZW5jaWVzLgotLy8gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgb3RoZXJTaGVsbHMubGVuZ3RoOyBqKyspIHsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgLy9zdGVwIHRocm91Z2ggc2hlbGxzIGJhY2t3YXJkcyBpbiBjYXNlIG9uZSBzaGVsbCBvcGVucyBhbm90aGVyIC0tIHRoaXMgaXMgaG93IHRoZXkgYXJlIHVzdWFsbHkgb2RlcmVkCi0vLyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBvdGhlclNoZWxscy5sZW5ndGggLSAxOyBpID4gMDsgaS0tKSB7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgIAlpbnQgaW5kZXggPSAoaStqKSAlIG90aGVyU2hlbGxzLmxlbmd0aDsgLy8gbWl4IHRoaW5ncyB1cCBhIGxpdHRsZSB0byB3b3JrIG91dCBzaGVsbCBkZXBlbmRlbmNpZXMKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvdGhlclNoZWxsc1tpbmRleF0gIT0gc2hlbGwgJiYgb3RoZXJTaGVsbHNbaW5kZXhdLmlzVmlzaWJsZSgpICYmICFvdGhlclNoZWxsc1tpbmRleF0uaXNEaXNwb3NlZCgpKSB7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJTaGVsbHNbaW5kZXhdLmNsb3NlKCk7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgIH0pOwotLy8gICAgICAgIH0KLS8vICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3Rlc3RzL0VjbGlwc2VTY2hlbWVUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3Rlc3RzL0VjbGlwc2VTY2hlbWVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjJmZjBiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC90ZXN0cy9FY2xpcHNlU2NoZW1lVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudGVzdHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LkVudmlyb25tZW50U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUklTY2hlbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuVVJJRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZVNjaGVtZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcHJvamVjdE5hbWVfID0gIlRlc3RQcm9qZWN0IjsKLSAgCi0gIHB1YmxpYyBFY2xpcHNlU2NoZW1lVGVzdHMoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBzdXBlcihuYW1lKTsKLSAgfQotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQotICB7Ci0gICAgaWYgKGFyZ3MubGVuZ3RoID09IDApCi0gICAgewotICAgICAgcnVuQWxsKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09IDEpCi0gICAgewotICAgICAgU3RyaW5nIG1ldGhvZFRvUnVuID0gYXJnc1swXS50cmltKCk7Ci0gICAgICBydW5PbmUobWV0aG9kVG9SdW4pOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShFY2xpcHNlU2NoZW1lVGVzdHMuY2xhc3MpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHJ1bkFsbCgpCi0gIHsKLSAgICBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgcnVuT25lKFN0cmluZyBtZXRob2ROYW1lKQotICB7Ci0gICAgVGVzdFN1aXRlIHRlc3RTdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLSAgICBUZXN0Q2FzZSB0ZXN0ID0gbmV3IEVjbGlwc2VTY2hlbWVUZXN0cyhtZXRob2ROYW1lKTsKLSAgICB0ZXN0U3VpdGUuYWRkVGVzdCh0ZXN0KTsKLSAgICBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5ydW4odGVzdFN1aXRlKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBzZWUgVGVzdENhc2Ujc2V0VXAoKQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLSAgICBzdXBlci5zZXRVcCgpOwotICAgIAotICAgIC8vIENyZWF0ZSBhIHRlc3QgcHJvamVjdCBpbiB0aGUgd29ya2JlbmNoCi0gICAgSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0gICAgSVByb2plY3QgICAgICAgcHJvamVjdCAgICAgICA9IHdvcmtzcGFjZVJvb3QuZ2V0UHJvamVjdCggcHJvamVjdE5hbWVfICk7Ci0gICAgCi0gICAgaWYoIHByb2plY3QgIT0gbnVsbCAmJiBwcm9qZWN0LmV4aXN0cygpICkKLSAgICB7Ci0gICAgICBwcm9qZWN0LmRlbGV0ZSggdHJ1ZSwgbnVsbCApOwotICAgIH0KLSAgICAKLSAgICAvLyBDcmVhdGUgdGhlIHByb2plY3QKLSAgICBJUHJvamVjdERlc2NyaXB0aW9uIGRlc2MgPSB3b3Jrc3BhY2VSb290LmdldFdvcmtzcGFjZSgpLm5ld1Byb2plY3REZXNjcmlwdGlvbiggcHJvamVjdE5hbWVfICk7Ci0gICAgcHJvamVjdC5jcmVhdGUoIGRlc2MsIG51bGwgKTsKLSAgICBwcm9qZWN0Lm9wZW4oIG51bGwgKTsKLSAgfQotICAvKioKLSAgICogQHNlZSBUZXN0Q2FzZSN0ZWFyRG93bigpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24KLSAgewotICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gICAgCi0gICAgLy8gQ3JlYXRlIGEgdGVzdCBwcm9qZWN0IGluIHRoZSB3b3JrYmVuY2gKLSAgICBJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLSAgICBJUHJvamVjdCAgICAgICBwcm9qZWN0ICAgICAgID0gd29ya3NwYWNlUm9vdC5nZXRQcm9qZWN0KCBwcm9qZWN0TmFtZV8gKTsKLSAgICAKLSAgICBwcm9qZWN0LmRlbGV0ZSggdHJ1ZSwgbnVsbCApOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFRlc3QgZ2V0VGVzdCgpCi0gIHsKLSAgICByZXR1cm4gbmV3IEVjbGlwc2VTY2hlbWVUZXN0cygiRWNsaXBzZVNjaGVtZVRlc3RzIik7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RCYWRVUklzKCkgCi0gIHsKLSAgICBJVVJJU2NoZW1lIHNjaGVtZSAgPSBFbnZpcm9ubWVudFNlcnZpY2UuZ2V0RWNsaXBzZVNjaGVtZSgpOwotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIElVUkkgbmV3VVJJID0gc2NoZW1lLm5ld1VSSSggImJvZ3VzOi9zb21lZm9sZGVyL3NvbWVmaWxlLnR4dCIpOwotICAgICAgYXNzZXJ0VHJ1ZSggIk5vbiBwbGF0Zm9ybSBwcm90b2NvbCBzaG91bGQgY2F1c2UgYW4gZXhjZXB0aW9uIiwgZmFsc2UgKTsKLSAgICAgIAotICAgICAgLy8gVGhpcyBjb2RlIHNob3VsZCBuZXZlciBydW4uCi0gICAgICBuZXdVUkkuYXNGaWxlKCk7Ci0gICAgfQotICAgIGNhdGNoKCBVUklFeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgfSAgIAotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIElVUkkgbmV3VVJJID0gc2NoZW1lLm5ld1VSSSggIjovc29tZWZvbGRlci9zb21lZmlsZS50eHQiKTsKLSAgICAgIGFzc2VydFRydWUoICJOb24gcGxhdGZvcm0gcHJvdG9jb2wgc2hvdWxkIGNhdXNlIGFuIGV4Y2VwdGlvbiIsIGZhbHNlICk7Ci0gICAgICAKLSAgICAgIC8vIFRoaXMgY29kZSBzaG91bGQgbmV2ZXIgcnVuLgotICAgICAgbmV3VVJJLmFzRmlsZSgpOwotICAgIH0KLSAgICBjYXRjaCggVVJJRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgIH0gICAgICAgCi0gCi0gIAotICAgIHRyeQotICAgIHsKLSAgICAgIElVUkkgbmV3VVJJID0gc2NoZW1lLm5ld1VSSSggIChTdHJpbmcpbnVsbCApOwotICAgICAgYXNzZXJ0VHJ1ZSggIk5vbiBwbGF0Zm9ybSBwcm90b2NvbCBzaG91bGQgY2F1c2UgYW4gZXhjZXB0aW9uIiwgZmFsc2UgKTsKLSAgICAKLSAgICAgIC8vIFRoaXMgY29kZSBzaG91bGQgbmV2ZXIgcnVuLgotICAgICAgbmV3VVJJLmFzRmlsZSgpOwotICAgIH0KLSAgICBjYXRjaCggVVJJRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgIH0gICAKLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJVVJJIG5ld1VSSSA9IHNjaGVtZS5uZXdVUkkoIChVUkwpbnVsbCApOwotICAgICAgYXNzZXJ0VHJ1ZSggIk5vbiBwbGF0Zm9ybSBwcm90b2NvbCBzaG91bGQgY2F1c2UgYW4gZXhjZXB0aW9uIiwgZmFsc2UgKTsKLSAgICAKLSAgICAgIC8vIFRoaXMgY29kZSBzaG91bGQgbmV2ZXIgcnVuLgotICAgICAgbmV3VVJJLmFzRmlsZSgpOwotICAgIH0KLSAgICBjYXRjaCggVVJJRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgIH0gIAotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIElVUkkgbmV3VVJJID0gc2NoZW1lLm5ld1VSSSggKElVUkkpbnVsbCApOwotICAgICAgYXNzZXJ0VHJ1ZSggIk5vbiBwbGF0Zm9ybSBwcm90b2NvbCBzaG91bGQgY2F1c2UgYW4gZXhjZXB0aW9uIiwgZmFsc2UgKTsKLSAgICAKLSAgICAgIC8vIFRoaXMgY29kZSBzaG91bGQgbmV2ZXIgcnVuLgotICAgICAgbmV3VVJJLmFzRmlsZSgpOwotICAgIH0KLSAgICBjYXRjaCggVVJJRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgIH0gICAgICAgCi0gIH0gCi0gIAotICBwdWJsaWMgdm9pZCB0ZXN0TmV3VVJJKCkKLSAgewotICAgIElVUklTY2hlbWUgICBzY2hlbWUgICAgICA9IEVudmlyb25tZW50U2VydmljZS5nZXRFY2xpcHNlU2NoZW1lKCkgOwotICAgIAotICAgIHRyeQotICAgIHsgICAgICAKLSAgICAgIElVUkkgdXJpMSA9IHNjaGVtZS5uZXdVUkkoICJwbGF0Zm9ybTovcmVzb3VyY2UvIiArIHByb2plY3ROYW1lXyArICAiL215ZmlsZSIgKTsKLSAgICAgIElVUkkgdXJpMiA9IHNjaGVtZS5uZXdVUkkoICJyZWxhdGl2ZWRpcmVjdG9yeS9yZWxhdGl2ZWZpbGUiICk7Ci0gICAgICBJVVJJIHVyaTMgPSBzY2hlbWUubmV3VVJJKCB1cmkxICk7Ci0gICAgICBJVVJJIHVyaTQgPSBzY2hlbWUubmV3VVJJKCB1cmkyICk7Ci0gICAgICBJVVJJIHVyaTUgPSBzY2hlbWUubmV3VVJJKCBuZXcgVVJMKCB1cmkxLmFzU3RyaW5nKCkgKSApOyAgICAgCi0gICAgICAKLSAgICAgIEZpbGUgZmlsZTEgPSB1cmkxLmFzRmlsZSgpOwotICAgICAgCi0gICAgICB1cmkxLnRvdWNoTGVhZigpOwotICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAiSXMgYSBmaWxlIiwgZmlsZTEuaXNGaWxlKCkgKTsKLSAgICAgIGFzc2VydFRydWUoICJGaWxlIG5hbWVzIG5vdCB0aGUgc2FtZSIsIHVyaTEuYXNTdHJpbmcoKS5lcXVhbHMoIHVyaTMudG9TdHJpbmcoKSApKTsKLSAgICAgIGFzc2VydFRydWUoICJGaWxlIG5hbWVzIG5vdCB0aGUgc2FtZSIsIHVyaTIuYXNTdHJpbmcoKS5lcXVhbHMoIHVyaTQudG9TdHJpbmcoKSApKTsKLSAgICAgIGFzc2VydFRydWUoICJGaWxlIG5hbWVzIG5vdCB0aGUgc2FtZSIsIHVyaTEuYXNTdHJpbmcoKS5lcXVhbHMoIHVyaTUudG9TdHJpbmcoKSApKTsKLSAgICAgIGFzc2VydFRydWUoICJQcm90b2NvbCBub3QgcGxhdGZvcm0iLCB1cmkxLmdldFVSSVNjaGVtZSgpLnRvU3RyaW5nKCkuZXF1YWxzKCJwbGF0Zm9ybSIpKTsKLSAgICAgIGFzc2VydFRydWUoICJQcm90b2NvbCBub3QgcGxhdGZvcm0iLCB1cmkzLmdldFVSSVNjaGVtZSgpLnRvU3RyaW5nKCkuZXF1YWxzKCJwbGF0Zm9ybSIpKTsKLSAgICAgIGFzc2VydFRydWUoICJQcm90b2NvbCBub3QgcGxhdGZvcm0iLCB1cmk1LmdldFVSSVNjaGVtZSgpLnRvU3RyaW5nKCkuZXF1YWxzKCJwbGF0Zm9ybSIpKTsKLSAgICAgIGFzc2VydFRydWUoICJQcm90b2NvbCBub3QgcmVsYXRpdmUiLCB1cmkyLmdldFVSSVNjaGVtZSgpLnRvU3RyaW5nKCkuZXF1YWxzKCJyZWxhdGl2ZSIpKTsKLSAgICAgIGFzc2VydFRydWUoICJQcm90b2NvbCBub3QgcmVsYXRpdmUiLCB1cmk0LmdldFVSSVNjaGVtZSgpLnRvU3RyaW5nKCkuZXF1YWxzKCJyZWxhdGl2ZSIpKTsKLSAgICAgIAotICAgICAgdXJpMS5lcmFzZSgpOwotICAgIH0KLSAgICBjYXRjaCggVVJJRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgYXNzZXJ0VHJ1ZSggIkV4Y2VwdGlvbiB0aHJvdzoiICsgZXhjLmdldE1lc3NhZ2UoKSwgZmFsc2UgKTsKLSAgICB9ICAgICAKLSAgICBjYXRjaCggTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgYXNzZXJ0VHJ1ZSggIkV4Y2VwdGlvbiB0aHJvdzoiICsgZXhjLmdldE1lc3NhZ2UoKSwgZmFsc2UgKTsgICAgICAKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RIaWVyYXJjaGljYWwoKQotICB7Ci0gICAgSVVSSVNjaGVtZSBzY2hlbWUgPSBFbnZpcm9ubWVudFNlcnZpY2UuZ2V0RWNsaXBzZVNjaGVtZSgpIDsKLSAgICAKLSAgICBhc3NlcnRUcnVlKCAiTm90IGhpZXJhcmNoaWNhbCIsIHNjaGVtZS5pc0hpZXJhcmNoaWNhbCgpID09IHRydWUgKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdFZhbGlkVVJJcygpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJVVJJU2NoZW1lIHNjaGVtZSA9IEVudmlyb25tZW50U2VydmljZS5nZXRFY2xpcHNlU2NoZW1lKCk7Ci0gICAgICBJVVJJICAgICAgIHVyaTEgICA9IHNjaGVtZS5uZXdVUkkoICJwbGF0Zm9ybTovcmVzb3VyY2Uvc29tZWRpci9zb21lZmlsZSIgKTsKLSAgICAgIElVUkkgICAgICAgdXJpMiAgID0gc2NoZW1lLm5ld1VSSSggInBsYXRmb3JtOi9yZXNvdXJjZS9zb21lZGlyIiApOwotICAgICAgSVVSSSAgICAgICB1cmkzICAgPSBzY2hlbWUubmV3VVJJKCAic29tZXJlbCIgKTsKLSAgICAgIElVUkkgICAgICAgdXJpNCAgID0gc2NoZW1lLm5ld1VSSSggInNvbWVyZWwvc29tZW1vcmVyZWwiICk7Ci0gICAgICBJVVJJICAgICAgIHVyaTUgICA9IHNjaGVtZS5uZXdVUkkoICIuL3NvbWVyZWwvc29tZW1vcmUiICk7Ci0gICAgCi0gICAgICBhc3NlcnRUcnVlKCAiVVJJIG5vdCB2YWxpZCIsIHNjaGVtZS5pc1ZhbGlkKCB1cmkxICkgKTsKLSAgICAgIGFzc2VydFRydWUoICJVUkkgbm90IHZhbGlkIiwgc2NoZW1lLmlzVmFsaWQoIHVyaTIgKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggIlVSSSBub3QgdmFsaWQiLCBzY2hlbWUuaXNWYWxpZCggdXJpMyApICk7Ci0gICAgICBhc3NlcnRUcnVlKCAiVVJJIG5vdCB2YWxpZCIsIHNjaGVtZS5pc1ZhbGlkKCB1cmk0ICkgKTsKLSAgICAgIGFzc2VydFRydWUoICJVUkkgbm90IHZhbGlkIiwgc2NoZW1lLmlzVmFsaWQoIHVyaTUgKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggIlVSSSBoYXMgbm90IHZhbGlkIHN0YXR1cyIsIHNjaGVtZS52YWxpZGF0ZSggdXJpMSApLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5PSyApOwotICAgICAgYXNzZXJ0VHJ1ZSggIlVSSSBoYXMgbm90IHZhbGlkIHN0YXR1cyIsIHNjaGVtZS52YWxpZGF0ZSggdXJpMiApLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5PSyApOwotICAgICAgYXNzZXJ0VHJ1ZSggIlVSSSBoYXMgbm90IHZhbGlkIHN0YXR1cyIsIHNjaGVtZS52YWxpZGF0ZSggdXJpMyApLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5PSyApOwotICAgICAgYXNzZXJ0VHJ1ZSggIlVSSSBoYXMgbm90IHZhbGlkIHN0YXR1cyIsIHNjaGVtZS52YWxpZGF0ZSggdXJpNCApLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5PSyApOwotICAgICAgYXNzZXJ0VHJ1ZSggIlVSSSBoYXMgbm90IHZhbGlkIHN0YXR1cyIsIHNjaGVtZS52YWxpZGF0ZSggdXJpNSApLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5PSyApOwotICAgIH0KLSAgICBjYXRjaCggVVJJRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgYXNzZXJ0VHJ1ZSggIkV4Y2VwdGlvbiB0aHJvdzoiICsgZXhjLmdldE1lc3NhZ2UoKSwgZmFsc2UgKTsgICAgICAKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkVVJJcygpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJVVJJU2NoZW1lIGVjbGlwc2VTY2hlbWUgPSBFbnZpcm9ubWVudFNlcnZpY2UuZ2V0RWNsaXBzZVNjaGVtZSgpOwotICAgICAgSVVSSVNjaGVtZSBmaWxlU2NoZW1lICAgID0gRW52aXJvbm1lbnRTZXJ2aWNlLmdldEZpbGVTY2hlbWUoKTsKLSAgICAgIAotICAgICAgSVVSSSAgICAgICB1cmkxICAgPSBmaWxlU2NoZW1lLm5ld1VSSSggImZpbGU6L2M6L3RlbXAvc29tZWRpci9zb21lZmlsZSIgKTsKLSAgICAKLSAgICAgIGFzc2VydFRydWUoICJVUkkgdmFsaWQiLCAhZWNsaXBzZVNjaGVtZS5pc1ZhbGlkKCB1cmkxICkgKTsKLSAgICAgIGFzc2VydFRydWUoICJVUkkgaGFzIGEgdmFsaWQgc3RhdHVzIiwgZWNsaXBzZVNjaGVtZS52YWxpZGF0ZSggdXJpMSApLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUiApOwotICAgIH0KLSAgICBjYXRjaCggVVJJRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgYXNzZXJ0VHJ1ZSggIkV4Y2VwdGlvbiB0aHJvdzoiICsgZXhjLmdldE1lc3NhZ2UoKSwgZmFsc2UgKTsgICAgICAKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC90ZXN0cy9FY2xpcHNlVVJJVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC90ZXN0cy9FY2xpcHNlVVJJVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk2YmQ1Zi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdGVzdHMvRWNsaXBzZVVSSVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwMjE3ICAgMTI4NDU2IHBtb29na0BjYS5pYm0uY29tIC0gUGV0ZXIgTW9vZ2sKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnRlc3RzOwotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LkVudmlyb25tZW50U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUklGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSVNjaGVtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5VUklFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlVVJJVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQotewotICBwcml2YXRlIGZpbmFsIFN0cmluZyBwcm9qZWN0TmFtZV8gPSAiVGVzdFByb2plY3QiOwotICBwcml2YXRlIEZpbGUgIHRlbXBGaWxlOwotICBwcml2YXRlIEZpbGUgIHRlbXBEaXI7Ci0gIAotICBwdWJsaWMgRWNsaXBzZVVSSVRlc3RzKFN0cmluZyBuYW1lKQotICB7Ci0gICAgc3VwZXIobmFtZSk7Ci0gIH0KLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKLSAgewotICAgIGlmIChhcmdzLmxlbmd0aCA9PSAwKQotICAgIHsKLSAgICAgIHJ1bkFsbCgpOwotICAgIH0KLSAgICBlbHNlIGlmIChhcmdzLmxlbmd0aCA9PSAxKQotICAgIHsKLSAgICAgIFN0cmluZyBtZXRob2RUb1J1biA9IGFyZ3NbMF0udHJpbSgpOwotICAgICAgcnVuT25lKG1ldGhvZFRvUnVuKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoRWNsaXBzZVVSSVRlc3RzLmNsYXNzKTsKLSAgfQotCi0gIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBydW5BbGwoKQotICB7Ci0gICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIHJ1bk9uZShTdHJpbmcgbWV0aG9kTmFtZSkKLSAgewotICAgIFRlc3RTdWl0ZSB0ZXN0U3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0gICAgVGVzdENhc2UgdGVzdCA9IG5ldyBFY2xpcHNlVVJJVGVzdHMobWV0aG9kTmFtZSk7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCJDYWxsaW5nIEVjbGlwc2VVUklUZXN0cy4iK21ldGhvZE5hbWUpOwotICAgIHRlc3RTdWl0ZS5hZGRUZXN0KHRlc3QpOwotICAgIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLnJ1bih0ZXN0U3VpdGUpOwotICB9Ci0gIAotICAvKioKLSAgICogQHNlZSBUZXN0Q2FzZSNzZXRVcCgpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24KLSAgewotICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgCi0gICAgdGVtcEZpbGUgID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgidG1wIiwgInRtcCIsIG51bGwgKTsKLSAgICB0ZW1wRGlyICAgPSBuZXcgRmlsZSggdGVtcEZpbGUuZ2V0UGFyZW50RmlsZSgpLCAidG1wRGlyIiApOwotICAgIHRlbXBEaXIubWtkaXIoKTsKLSAgICAKLSAgICAvLyBDcmVhdGUgYSB0ZXN0IHByb2plY3QgaW4gdGhlIHdvcmtiZW5jaAotICAgIElXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotICAgIElQcm9qZWN0ICAgICAgIHByb2plY3QgICAgICAgPSB3b3Jrc3BhY2VSb290LmdldFByb2plY3QoIHByb2plY3ROYW1lXyApOwotICAgIAotICAgIGlmKCBwcm9qZWN0ICE9IG51bGwgJiYgcHJvamVjdC5leGlzdHMoKSApCi0gICAgewotICAgICAgcHJvamVjdC5kZWxldGUoIHRydWUsIG51bGwgKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gQ3JlYXRlIHRoZSBwcm9qZWN0Ci0gICAgSVByb2plY3REZXNjcmlwdGlvbiBkZXNjID0gd29ya3NwYWNlUm9vdC5nZXRXb3Jrc3BhY2UoKS5uZXdQcm9qZWN0RGVzY3JpcHRpb24oIHByb2plY3ROYW1lXyApOwotICAgIHByb2plY3QuY3JlYXRlKCBkZXNjLCBudWxsICk7Ci0gICAgcHJvamVjdC5vcGVuKCBudWxsICk7Ci0gIH0KLSAgLyoqCi0gICAqIEBzZWUgVGVzdENhc2UjdGVhckRvd24oKQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLSAgICBzdXBlci50ZWFyRG93bigpOwotICAgIAotICAgIC8vIENyZWF0ZSBhIHRlc3QgcHJvamVjdCBpbiB0aGUgd29ya2JlbmNoCi0gICAgSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0gICAgSVByb2plY3QgICAgICAgcHJvamVjdCAgICAgICA9IHdvcmtzcGFjZVJvb3QuZ2V0UHJvamVjdCggcHJvamVjdE5hbWVfICk7Ci0gICAgCi0gICAgcHJvamVjdC5kZWxldGUoIHRydWUsIG51bGwgKTsKLSAgICB0ZW1wRmlsZS5kZWxldGUoKTsKLSAgICBkZWxldGVEaXIoIHRlbXBEaXIgKTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBUZXN0IGdldFRlc3QoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBFY2xpcHNlVVJJVGVzdHMoIkVjbGlwc2VVUklUZXN0cyIpOwotICB9Ci0gIHB1YmxpYyB2b2lkIHRlc3RBdmFpbGFibGUoKSAKLSAgewotICAgIElFbnZpcm9ubWVudCBlbnZpcm9ubWVudCA9IEVudmlyb25tZW50U2VydmljZS5nZXRFY2xpcHNlQ29uc29sZUVudmlyb25tZW50KCk7Ci0gICAgSVVSSUZhY3RvcnkgIGZhY3RvcnkgICAgID0gZW52aXJvbm1lbnQuZ2V0VVJJRmFjdG9yeSgpOwotICAgIAotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRWNsaXBzZVVSSVRlc3RzLnRlc3RBdmFpbGFibGUoKSIpOwotICAgIAotICAgIHRyeQotICAgIHsgICAgICAKLSAgICAgIElVUkkgdXJpMSA9IGZhY3RvcnkubmV3VVJJKCAicGxhdGZvcm06L3Jlc291cmNlLyIgKyBwcm9qZWN0TmFtZV8gKyAgIi9teWZpbGUiICk7Ci0gICAgICBJVVJJIHVyaTIgPSBmYWN0b3J5Lm5ld1VSSSggZ2V0VG1wRmlsZVVSTCggInNvbWVmaWxlIiApICk7Ci0gICAgICBJVVJJIHVyaTMgPSBmYWN0b3J5Lm5ld1VSSSggInJlbGF0aXZlZGlyZWN0b3J5L3JlbGF0aXZlZmlsZSIgKTsKLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggIk5vdCBhdmFpbGFibGUgYXMgVVJMIiwgdXJpMS5pc0F2YWlsYWJsZUFzVVJMKCkgKTsKLSAgICAgIGFzc2VydFRydWUoICJOb3QgYXZhaWxhYmxlIGFzIFVSTCIsIHVyaTIuaXNBdmFpbGFibGVBc1VSTCgpICk7Ci0gICAgICBhc3NlcnRUcnVlKCAiQXZhaWxhYmxlIGFzIFVSTCIsICF1cmkzLmlzQXZhaWxhYmxlQXNVUkwoKSApOwotICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAiTm90IGF2YWlsYWJsZSBhcyBGaWxlIiwgdXJpMS5pc0F2YWlsYWJsZUFzRmlsZSgpICk7Ci0gICAgICBhc3NlcnRUcnVlKCAiTm90IGF2YWlsYWJsZSBhcyBGaWxlIiwgdXJpMi5pc0F2YWlsYWJsZUFzRmlsZSgpICk7Ci0gICAgICBhc3NlcnRUcnVlKCAiQXZhaWxhYmxlIGFzIEZpbGUiLCAhdXJpMy5pc0F2YWlsYWJsZUFzRmlsZSgpICk7Ci0gICAgICAKLSAgICAgIEZpbGUgZmlsZTEgPSB1cmkxLmFzRmlsZSgpOwotICAgICAgRmlsZSBmaWxlMiA9IHVyaTIuYXNGaWxlKCk7Ci0gICAgICBVUkwgIHVybDEgID0gdXJpMS5hc1VSTCgpOwotICAgICAgVVJMICB1cmwyICA9IHVyaTIuYXNVUkwoKTsKLSAgICAgIAotICAgICAgdXJpMS50b3VjaExlYWYoKTsKLSAgICAgIHVyaTIudG91Y2hMZWFmKCk7Ci0gICAgICAKLSAgICAgIGFzc2VydFRydWUoICJJcyBhIGZpbGUiLCBmaWxlMS5pc0ZpbGUoKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggIklzIGEgZmlsZSIsIGZpbGUyLmlzRmlsZSgpICk7Ci0gICAgICBhc3NlcnRUcnVlKCAiV3JvbmcgcHJvdG9jb2wiLCB1cmwxLmdldFByb3RvY29sKCkuZXF1YWxzKCAicGxhdGZvcm0iICkpOwotICAgICAgYXNzZXJ0VHJ1ZSggIldyb25nIHByb3RvY29sIiwgdXJsMi5nZXRQcm90b2NvbCgpLmVxdWFscyggImZpbGUiICkpOwotICAgICAgYXNzZXJ0VHJ1ZSggdXJpMS5hc1N0cmluZygpLmxlbmd0aCgpID4gNSApOwotICAgICAgYXNzZXJ0VHJ1ZSggdXJpMi5hc1N0cmluZygpLmxlbmd0aCgpID4gNSApOwotICAgICAgYXNzZXJ0VHJ1ZSggdXJpMS50b1N0cmluZygpLmxlbmd0aCgpID4gNSApOwotICAgICAgYXNzZXJ0VHJ1ZSggdXJpMi50b1N0cmluZygpLmxlbmd0aCgpID4gNSApOwotICAgICAgdXJpMS5lcmFzZSgpOwotICAgICAgdXJpMi5lcmFzZSgpOwotICAgIH0KLSAgICBjYXRjaCggVVJJRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgYXNzZXJ0VHJ1ZSggIkV4Y2VwdGlvbiB0aHJvdzoiICsgZXhjLmdldE1lc3NhZ2UoKSwgZmFsc2UgKTsKLSAgICB9Ci0gIH0gICAgICAKLSAgICAgIAotICBwdWJsaWMgdm9pZCB0ZXN0RmFjdG9yeSgpIAotICB7Ci0gICAgSUVudmlyb25tZW50IGVudmlyb25tZW50ID0gRW52aXJvbm1lbnRTZXJ2aWNlLmdldEVjbGlwc2VDb25zb2xlRW52aXJvbm1lbnQoKTsKLSAgICBJVVJJRmFjdG9yeSAgZmFjdG9yeSAgICAgPSBlbnZpcm9ubWVudC5nZXRVUklGYWN0b3J5KCk7Ci0gICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCJFY2xpcHNlVVJJVGVzdHMudGVzdEZhY3RvcnkoKSIpOwotICAgIHRyeQotICAgIHsKLSAgICAgIGZhY3RvcnkubmV3VVJJU2NoZW1lKCBudWxsICk7Ci0gICAgICBhc3NlcnRUcnVlKCAiTnVsbCBVUkkgc2NoZW1lIHNob3VsZCBjYXVzZSBhbiBleGNlcHRpb24iLCBmYWxzZSApOwotICAgIH0KLSAgICBjYXRjaCggVVJJRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgIH0KLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBmYWN0b3J5Lm5ld1VSSVNjaGVtZSggImJvZ3VzUHJvdG9jb2w6L3NvbWVmb2xkZXIvc29tZWZpbGUudHh0IiApOwotICAgICAgYXNzZXJ0VHJ1ZSggIkFuIHVuZGVmaW5lZCBwcm90b2NvbCBzaG91bGQgY2F1c2UgYW4gZXhjZXB0aW9uIiwgZmFsc2UgKTsKLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICB9Ci0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgZmFjdG9yeS5uZXdVUklTY2hlbWUoICIvc29tZWZvbGRlci9zb21lZmlsZS50eHQiICk7Ci0gICAgICBhc3NlcnRUcnVlKCAiQWJzb2x1dGUgcGF0aCB3aXRoIG5vIHByb3RvY29sIHNob3VsZCBjYXVzZSBhbiBleGNlcHRpb24iLCBmYWxzZSApOwotICAgIH0KLSAgICBjYXRjaCggVVJJRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgIH0KLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJVVJJU2NoZW1lIHNjaGVtZTEgPSBmYWN0b3J5Lm5ld1VSSVNjaGVtZSggInBsYXRmb3JtOi9yZXNvdXJjZS9teXByb2ovbXlmaWxlIiApOwotICAgICAgSVVSSVNjaGVtZSBzY2hlbWUyID0gZmFjdG9yeS5uZXdVUklTY2hlbWUoIGdldFRtcEZpbGVVUkwoICJzb21lZmlsZTIiICkgKTsKLSAgICAgIElVUklTY2hlbWUgc2NoZW1lMyA9IGZhY3RvcnkubmV3VVJJU2NoZW1lKCAicGxhdGZvcm0iICk7Ci0gICAgICBJVVJJU2NoZW1lIHNjaGVtZTQgPSBmYWN0b3J5Lm5ld1VSSVNjaGVtZSggImZpbGUiICk7Ci0gICAgICBJVVJJU2NoZW1lIHNjaGVtZTUgPSBmYWN0b3J5Lm5ld1VSSSggInJlbDEvcmVsMiIgKS5nZXRVUklTY2hlbWUoKTsKLSAgICAgIAotICAgICAgSVVSSSB1cmkxID0gZmFjdG9yeS5uZXdVUkkoICJwbGF0Zm9ybTovcmVzb3VyY2UvbXlwcm9qL215ZmlsZSIgKTsKLSAgICAgIElVUkkgdXJpMiA9IGZhY3RvcnkubmV3VVJJKCBnZXRUbXBGaWxlVVJMKCAic29tZWZpbGUzIiApICk7Ci0gICAgICBJVVJJIHVyaTMgPSBmYWN0b3J5Lm5ld1VSSSggInJlbGF0aXZlZGlyZWN0b3J5L3JlbGF0aXZlZmlsZSIgKTsKLSAgICAgIAotICAgICAgSVVSSSB1cmk0ID0gZmFjdG9yeS5uZXdVUkkoIG5ldyBVUkwoICJwbGF0Zm9ybTovcmVzb3VyY2UvbXlwcm9qL215ZmlsZSIgKSk7Ci0gICAgICBJVVJJIHVyaTUgPSBmYWN0b3J5Lm5ld1VSSSggbmV3IFVSTCggZ2V0VG1wRmlsZVVSTCggInNvbWVmaWxlNCIgKSApICk7Ci0gIAotICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAiU2NoZW1lIG5vdCBwbGF0Zm9ybSBwcm90b2NvbCIsIHNjaGVtZTEudG9TdHJpbmcoKS5lcXVhbHMoInBsYXRmb3JtIikgKTsKLSAgICAgIGFzc2VydFRydWUoICJTY2hlbWUgbm90IGZpbGUgcHJvdG9jb2wiLCBzY2hlbWUyLnRvU3RyaW5nKCkuZXF1YWxzKCJmaWxlIikgKTsKLSAgICAgIGFzc2VydFRydWUoICJTY2hlbWUgbm90IHBsYXRmb3JtIiwgc2NoZW1lMy50b1N0cmluZygpLmVxdWFscygicGxhdGZvcm0iKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggIlNjaGVtZSBub3QgZmlsZSIsIHNjaGVtZTQudG9TdHJpbmcoKS5lcXVhbHMoImZpbGUiKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggIlNjaGVtZSBub3QgcmVsYXRpdmUiLCBzY2hlbWU1LnRvU3RyaW5nKCkuZXF1YWxzKCJyZWxhdGl2ZSIpICk7Ci0gICAgICAKLSAgICAgIGFzc2VydFRydWUoICJTY2hlbWUgbm90IHBsYXRmb3JtIHByb3RvY29sIiwgdXJpMS5nZXRVUklTY2hlbWUoKS50b1N0cmluZygpLmVxdWFscygicGxhdGZvcm0iKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggIlNjaGVtZSBub3QgZmlsZSBwcm90b2NvbCIsIHVyaTIuZ2V0VVJJU2NoZW1lKCkudG9TdHJpbmcoKS5lcXVhbHMoImZpbGUiKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggIlNjaGVtZSBub3QgcmVsYXRpdmUiLCB1cmkzLmdldFVSSVNjaGVtZSgpLnRvU3RyaW5nKCkuZXF1YWxzKCJyZWxhdGl2ZSIpICk7Ci0gICAgICAKLSAgICAgIGFzc2VydFRydWUoICJTY2hlbWUgbm90IHBsYXRmb3JtIHByb3RvY29sIiwgdXJpNC5nZXRVUklTY2hlbWUoKS50b1N0cmluZygpLmVxdWFscygicGxhdGZvcm0iKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggIlNjaGVtZSBub3QgZmlsZSBwcm90b2NvbCIsIHVyaTUuZ2V0VVJJU2NoZW1lKCkudG9TdHJpbmcoKS5lcXVhbHMoImZpbGUiKSApOwotICAgIH0KLSAgICBjYXRjaCggVVJJRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgYXNzZXJ0VHJ1ZSggIkV4Y2VwdGlvbiB0aHJvdzoiICsgZXhjLmdldE1lc3NhZ2UoKSwgZmFsc2UgKTsKLSAgICB9Ci0gICAgY2F0Y2goIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICAgIGFzc2VydFRydWUoICJFeGNlcHRpb24gdGhyb3c6IiArIGV4Yy5nZXRNZXNzYWdlKCksIGZhbHNlICk7ICAgICAgCi0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0VG91Y2hGb2xkZXIoKSAKLSAgewotICAgIElFbnZpcm9ubWVudCBlbnZpcm9ubWVudCA9IEVudmlyb25tZW50U2VydmljZS5nZXRFY2xpcHNlQ29uc29sZUVudmlyb25tZW50KCk7Ci0gICAgSVVSSUZhY3RvcnkgIGZhY3RvcnkgICAgID0gZW52aXJvbm1lbnQuZ2V0VVJJRmFjdG9yeSgpOwotICAgIAotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRWNsaXBzZVVSSVRlc3RzLnRlc3RUb3VjaEZvbGRlcigpIik7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgSVBhdGggZm9sZGVyUGF0aCAgPSBuZXcgUGF0aCggcHJvamVjdE5hbWVfICkuYXBwZW5kKCAidG9wRm9sZGVyIiApLm1ha2VBYnNvbHV0ZSgpOwotICAgICAgSVBhdGggZm9sZGVyUGF0aDIgPSBmb2xkZXJQYXRoLmFwcGVuZCggInNwYWNlIGZvbGRlciIgKTsKLSAgICAgIElVUkkgICB1cmkgICAgICAgICAgPSBmYWN0b3J5Lm5ld1VSSSggZ2V0VVJMRnJvbVBhdGgoIGZvbGRlclBhdGggKS50b1N0cmluZygpICk7Ci0gICAgICBJVVJJICAgdXJpMiAgICAgICAgID0gZmFjdG9yeS5uZXdVUkkoIGdldFVSTEZyb21QYXRoKCBmb2xkZXJQYXRoMiApLnRvU3RyaW5nKCkgKTsKLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggInRvcEZvbGRlciBzaG91bGQgbm90IGV4aXN0IiwgIXVyaS5pc1ByZXNlbnQoKSApOwotICAgICAgCi0gICAgICB1cmkudG91Y2hGb2xkZXIoKTsKLSAgIAotICAgICAgYXNzZXJ0VHJ1ZSggInRvcEZvbGRlciBzaG91bGQgZXhpc3QiLCB1cmkuaXNQcmVzZW50KCkgKTsKLSAgICAgIAotICAgICAgSVBhdGggbmVzdGVkUGF0aCA9IGZvbGRlclBhdGguYXBwZW5kKCAibGV2ZWwxIiApLmFwcGVuZCggImxldmVsMiIgKTsKLSAgICAgIElVUkkgICBuZXN0ZWR1cmkgID0gZmFjdG9yeS5uZXdVUkkoIGdldFVSTEZyb21QYXRoKCBuZXN0ZWRQYXRoICkudG9TdHJpbmcoKSApOwotICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAibmVzdGVkRm9sZGVyIHNob3VsZCBub3QgZXhpc3QiLCAhbmVzdGVkdXJpLmlzUHJlc2VudCgpICk7Ci0gICAgICAKLSAgICAgIG5lc3RlZHVyaS50b3VjaEZvbGRlcigpOwotICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAibmVzdGVkRm9sZGVyIHNob3VsZCBleGlzdCIsIG5lc3RlZHVyaS5pc1ByZXNlbnQoKSApOwotICAgICAgCi0gICAgICBJVVJJIGNoaWxkMSA9IHVyaTIuYXBwZW5kKCBmYWN0b3J5Lm5ld1VSSSggImNoaWxkMSIgKSApOwotICAgICAgSVVSSSBjaGlsZDIgPSB1cmkyLmFwcGVuZCggZmFjdG9yeS5uZXdVUkkoICJjaGlsZDIiICkgKTsKLSAgICAgIAotICAgICAgY2hpbGQxLnRvdWNoTGVhZigpOwotICAgICAgY2hpbGQyLnRvdWNoTGVhZigpOwotICAgICAgCi0gICAgICBhc3NlcnRUcnVlICggIkNoaWxkIDEgaW4gYmxhbmsgZm9sZGVyIHNob3VsZCBleGlzdCAiLCBjaGlsZDEuaXNQcmVzZW50KCkgKTsKLSAgICAgIGFzc2VydFRydWUgKCAiQ2hpbGQgMiBpbiBibGFuayBmb2xkZXIgc2hvdWxkIGV4aXN0ICIsIGNoaWxkMi5pc1ByZXNlbnQoKSApOwotICAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICAgIGFzc2VydFRydWUoICJFeGNlcHRpb24gdGhyb3c6IiArIGV4Yy5nZXRNZXNzYWdlKCksIGZhbHNlICk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0TGlzdCgpIAotICB7Ci0gICAgSUVudmlyb25tZW50ICBlbnZpcm9ubWVudCA9IEVudmlyb25tZW50U2VydmljZS5nZXRFY2xpcHNlQ29uc29sZUVudmlyb25tZW50KCk7Ci0gICAgSVVSSUZhY3RvcnkgICBmYWN0b3J5ICAgICA9IGVudmlyb25tZW50LmdldFVSSUZhY3RvcnkoKTsKLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVjbGlwc2VVUklUZXN0cy50ZXN0TGlzdCgpIik7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgSVBhdGggZm9sZGVyUGF0aDAgPSBuZXcgUGF0aCggcHJvamVjdE5hbWVfICkuYXBwZW5kKCAidG9wRm9sZGVyMiIgKS5tYWtlQWJzb2x1dGUoKTsKLSAgICAgIElQYXRoIGZvbGRlclBhdGgxID0gbmV3IFBhdGgoIHByb2plY3ROYW1lXyApLmFwcGVuZCggInRvcEZvbGRlcjIiICkuYXBwZW5kKCAibGVhZjEiICkubWFrZUFic29sdXRlKCk7Ci0gICAgICBJUGF0aCBmb2xkZXJQYXRoMiA9IG5ldyBQYXRoKCBwcm9qZWN0TmFtZV8gKS5hcHBlbmQoICJ0b3BGb2xkZXIyIiApLmFwcGVuZCggImxlYWYyIiApLm1ha2VBYnNvbHV0ZSgpOwotICAgICAgSVBhdGggZm9sZGVyUGF0aDMgPSBuZXcgUGF0aCggcHJvamVjdE5hbWVfICkuYXBwZW5kKCAidG9wRm9sZGVyMiIgKS5hcHBlbmQoICJsZWFmMyIgKS5tYWtlQWJzb2x1dGUoKTsKLSAgICAgIElVUkkgICB1cmkwICAgICAgICA9IGZhY3RvcnkubmV3VVJJKCBnZXRVUkxGcm9tUGF0aCggZm9sZGVyUGF0aDAgKS50b1N0cmluZygpICk7Ci0gICAgICBJVVJJICAgdXJpMSAgICAgICAgPSBmYWN0b3J5Lm5ld1VSSSggZ2V0VVJMRnJvbVBhdGgoIGZvbGRlclBhdGgxICkudG9TdHJpbmcoKSApOwotICAgICAgSVVSSSAgIHVyaTIgICAgICAgID0gZmFjdG9yeS5uZXdVUkkoIGdldFVSTEZyb21QYXRoKCBmb2xkZXJQYXRoMiApLnRvU3RyaW5nKCkgKTsKLSAgICAgIElVUkkgICB1cmkzICAgICAgICA9IGZhY3RvcnkubmV3VVJJKCBnZXRVUkxGcm9tUGF0aCggZm9sZGVyUGF0aDMgKS50b1N0cmluZygpICk7Ci0gICAgICAKLSAgICAgIHVyaTEudG91Y2hGb2xkZXIoKTsKLSAgICAgIHVyaTIudG91Y2hGb2xkZXIoKTsKLSAgICAgIHVyaTMudG91Y2hGb2xkZXIoKTsKLSAgICAgIAotICAgICAgSVVSSVtdIGJhYmllcyA9IHVyaTAubGlzdCgpOwotICAgICAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggImZvbGRlciBwYXRoIHNob3VsZCBoYXZlIDMgY2hpbGRyZW4iLCBiYWJpZXMubGVuZ3RoID09IDMgKTsKLSAgICAgIAotICAgICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IGJhYmllcy5sZW5ndGg7IGluZGV4KysgKQotICAgICAgewotICAgICAgICBTdHJpbmcgIGZvbGRlck5hbWUgPSBiYWJpZXNbaW5kZXhdLnRvU3RyaW5nKCk7Ci0gICAgICAgIFN0cmluZyAgbGVhZk5hbWUgICA9IGZvbGRlck5hbWUuc3Vic3RyaW5nKCBmb2xkZXJOYW1lLmxlbmd0aCgpIC0gNSwgZm9sZGVyTmFtZS5sZW5ndGgoKSApOwotICAgICAgICBib29sZWFuIE9rICAgICAgICAgPSBsZWFmTmFtZS5lcXVhbHMoICJsZWFmMSIpIHx8IGxlYWZOYW1lLmVxdWFscyggImxlYWYyIiApIHx8IGxlYWZOYW1lLmVxdWFscyggImxlYWYzIiApOwotICAgICAgICBhc3NlcnRUcnVlKCAiV3JvbmcgbGVhZiBiYWJ5IHVyaToiICsgZm9sZGVyTmFtZSArICIsIiArIGxlYWZOYW1lLCBPayApOwotICAgICAgfQotICAgICAgCi0gICAgICBJVVJJW10gYmFiaWVzMiA9IHVyaTAubGlzdCggbmV3IElVUklGaWx0ZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHRzKCBJVVJJIHVyaSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIXVyaS50b1N0cmluZygpLmVuZHNXaXRoKCAibGVhZjIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSApOwotICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAiZm9sZGVyIHBhdGggc2hvdWxkIGhhdmUgMiBmaWx0ZXJlZCBjaGlsZHJlbiIsIGJhYmllczIubGVuZ3RoID09IDIgKTsKLSAgICAgIAotICAgICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IGJhYmllczIubGVuZ3RoOyBpbmRleCsrICkKLSAgICAgICB7Ci0gICAgICAgIFN0cmluZyAgZm9sZGVyTmFtZSA9IGJhYmllczJbaW5kZXhdLnRvU3RyaW5nKCk7Ci0gICAgICAgIFN0cmluZyAgbGVhZk5hbWUgICA9IGZvbGRlck5hbWUuc3Vic3RyaW5nKCBmb2xkZXJOYW1lLmxlbmd0aCgpIC0gNSwgZm9sZGVyTmFtZS5sZW5ndGgoKSApOwotICAgICAgICBib29sZWFuIE9rICAgICAgICAgPSBsZWFmTmFtZS5lcXVhbHMoICJsZWFmMSIpIHx8IGxlYWZOYW1lLmVxdWFscyggImxlYWYzIiApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0VHJ1ZSggIldyb25nIGxlYWYgYmFieSB1cmk6IiArIGZvbGRlck5hbWUgKyAiLCIgKyBsZWFmTmFtZSwgT2sgKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICAgIGFzc2VydFRydWUoICJFeGNlcHRpb24gdGhyb3c6IiArIGV4Yy5nZXRNZXNzYWdlKCksIGZhbHNlICk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0R2V0VVJJU2NoZW1lKCkKLSAgewotICAgIElFbnZpcm9ubWVudCBlbnZpcm9ubWVudCA9IEVudmlyb25tZW50U2VydmljZS5nZXRFY2xpcHNlQ29uc29sZUVudmlyb25tZW50KCk7Ci0gICAgSVVSSUZhY3RvcnkgIGZhY3RvcnkgICAgID0gZW52aXJvbm1lbnQuZ2V0VVJJRmFjdG9yeSgpOwotICAgCi0gICAgdHJ5Ci0gICAgeyAKLSAgICAgIElQYXRoICAgICAgZm9sZGVyUGF0aDAgID0gbmV3IFBhdGgoIHByb2plY3ROYW1lXyApLmFwcGVuZCggInRlc3RHZXRTY2hlbWUiICkubWFrZUFic29sdXRlKCk7Ci0gICAgICBJVVJJICAgICAgIHVyaTAgICAgICAgICA9IGZhY3RvcnkubmV3VVJJKCBnZXRVUkxGcm9tUGF0aCggZm9sZGVyUGF0aDAgKS50b1N0cmluZygpICk7Ci0gICAgICBJVVJJU2NoZW1lIHNjaGVtZSAgICAgICA9IHVyaTAuZ2V0VVJJU2NoZW1lKCk7Ci0gICAgICAKLSAgICAgIGFzc2VydFRydWUoICJTY2hlbWUgbmFtZSBpcyBub3QgcGxhdGZvcm0iLCBzY2hlbWUudG9TdHJpbmcoKS5lcXVhbHMoICJwbGF0Zm9ybSIgKSApOwotICAgIH0KLSAgICBjYXRjaCggVVJJRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgYXNzZXJ0VHJ1ZSggIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIiwgZmFsc2UgKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RBcHBlbmQoKSAKLSAgewotICAgIElFbnZpcm9ubWVudCBlbnZpcm9ubWVudCA9IEVudmlyb25tZW50U2VydmljZS5nZXRFY2xpcHNlQ29uc29sZUVudmlyb25tZW50KCk7Ci0gICAgSVVSSUZhY3RvcnkgIGZhY3RvcnkgICAgID0gZW52aXJvbm1lbnQuZ2V0VVJJRmFjdG9yeSgpOwotICAgIAotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRWNsaXBzZVVSSVRlc3RzLnRlc3RBcHBlbmQoKSIpOwotICAgIHRyeQotICAgIHsKLSAgICAgIElQYXRoIGZvbGRlclBhdGgwICA9IG5ldyBQYXRoKCBwcm9qZWN0TmFtZV8gKS5hcHBlbmQoICJ0b3BGb2xkZXIzIiApLm1ha2VBYnNvbHV0ZSgpOwotICAgICAgSVVSSSAgIHVyaTAgICAgICAgICA9IGZhY3RvcnkubmV3VVJJKCBnZXRVUkxGcm9tUGF0aCggZm9sZGVyUGF0aDAgKS50b1N0cmluZygpICk7Ci0gICAgICBJVVJJICAgdXJpUmVsYXRpdmUxID0gZmFjdG9yeS5uZXdVUkkoICJsZXZlbDEiKTsKLSAgICAgIElVUkkgICB1cmlSZWxhdGl2ZTIgPSBmYWN0b3J5Lm5ld1VSSSggImxldmVsMiIpOwotICAgICAgCi0gICAgICBJVVJJICAgbmV3VVJJICAgICAgID0gdXJpMC5hcHBlbmQoIHVyaVJlbGF0aXZlMSApLmFwcGVuZCggdXJpUmVsYXRpdmUyICk7Ci0gICAgICAKLSAgICAgIGFzc2VydFRydWUoICJuZXdVUkkgc2hvdWxkIG5vdCBleGlzdCIsICFuZXdVUkkuaXNQcmVzZW50KCkgKTsKLSAgICAgIAotICAgICAgbmV3VVJJLnRvdWNoRm9sZGVyKCk7Ci0gICAgICAKLSAgICAgIGFzc2VydFRydWUoICJuZXdVUkkgc2hvdWxkIGV4aXN0IiwgbmV3VVJJLmlzUHJlc2VudCgpICk7Ci0gICAgICBhc3NlcnRUcnVlKCAibmV3VVJJIHNob3VsZCBub3QgYmUgYSBsZWFmIiwgIW5ld1VSSS5pc0xlYWYoKSApOwotICAgICAgCi0gICAgICAvLyBFbnN1cmUgdGhhdCBhcHBlbmQgcGFyYW1ldGVyIGlzIHJlbGF0aXZlLgotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIElVUkkgbmV3VVJJMiA9IHVyaTAuYXBwZW5kKCB1cmkwICk7ICAKLSAgICAgICAgYXNzZXJ0VHJ1ZSggIkFwcGVuZGluZyB1c2luZyBhIG5vbi1yZWxhdGl2ZSBzaG91bGQgdGhyb3cgYW5kIGV4Y2VwdGlvbiIsIHRydWUgKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRoaXMgY29kZSBzaG91bGQgbmV2ZXIgcnVuLgotICAgICAgICBuZXdVUkkyLmFzRmlsZSgpOyAKLSAgICAgIH0KLSAgICAgIGNhdGNoKCBVUklFeGNlcHRpb24gZXhjICkKLSAgICAgIHsKLSAgICAgIH0KLSAgICAgIAotICAgIH0KLSAgICBjYXRjaCggVVJJRXhjZXB0aW9uIGV4YyApCi0gICAgeyAgIAotICAgICAgYXNzZXJ0VHJ1ZSggIkV4Y2VwdGlvbiB0aHJvdzoiICsgZXhjLmdldE1lc3NhZ2UoKSwgZmFsc2UgKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RUb3VjaExlYWYoKQotICB7Ci0gICAgSUVudmlyb25tZW50IGVudmlyb25tZW50ID0gRW52aXJvbm1lbnRTZXJ2aWNlLmdldEVjbGlwc2VDb25zb2xlRW52aXJvbm1lbnQoKTsKLSAgICBJVVJJRmFjdG9yeSAgZmFjdG9yeSAgICAgPSBlbnZpcm9ubWVudC5nZXRVUklGYWN0b3J5KCk7Ci0gICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCJFY2xpcHNlVVJJVGVzdHMudGVzdFRvdWNoTGVhZigpIik7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgSVBhdGggZm9sZGVyUGF0aDAgID0gbmV3IFBhdGgoIHByb2plY3ROYW1lXyApLmFwcGVuZCggInRvcEZvbGRlcjQiICkubWFrZUFic29sdXRlKCk7Ci0gICAgICBJVVJJICAgdXJpMCAgICAgICAgID0gZmFjdG9yeS5uZXdVUkkoIGdldFVSTEZyb21QYXRoKCBmb2xkZXJQYXRoMCApLnRvU3RyaW5nKCkgKTsKLSAgICAgIElVUkkgICB1cmlSZWxhdGl2ZTEgPSBmYWN0b3J5Lm5ld1VSSSggImxldmVsMSIpOwotICAgICAgSVVSSSAgIHVyaVJlbGF0aXZlMiA9IGZhY3RvcnkubmV3VVJJKCAibGVhZkZpbGUudHh0Iik7Ci0gICAgICBJVVJJICAgbmV3VVJJICAgICAgID0gdXJpMC5hcHBlbmQoIHVyaVJlbGF0aXZlMSApLmFwcGVuZCggdXJpUmVsYXRpdmUyICk7Ci0gICAgICAKLSAgICAgIGFzc2VydFRydWUoICJuZXdVUkkgc2hvdWxkIG5vdCBleGlzdCIsICFuZXdVUkkuaXNQcmVzZW50KCkgKTsKLSAgICAgIAotICAgICAgbmV3VVJJLnRvdWNoTGVhZigpOwotICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAibmV3VVJJIHNob3VsZCBleGlzdCIsIG5ld1VSSS5pc1ByZXNlbnQoKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggIm5ld1VSSSBzaG91bGQgYmUgYSBsZWFmIiwgbmV3VVJJLmlzTGVhZigpICk7Ci0gICAgICAKLSAgICAgIElucHV0U3RyZWFtIHN0cmVhbSAgID0gbmV3VVJJLmdldElucHV0U3RyZWFtKCk7Ci0gICAgICBpbnQgICAgICAgICBieXRlUmVhZCA9IDA7Ci0gICAgICAKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBieXRlUmVhZCA9IHN0cmVhbS5yZWFkKCk7IC8vIFJldHVybnMgYSAtMSBpZiBubyBieXRlcyBhcmUgcmVhZCwgd2hpY2ggc2hvdWxkIGJlIHRoZSBjYXNlIGhlcmUuIAotICAgICAgfQotICAgICAgY2F0Y2goIElPRXhjZXB0aW9uIGV4YyApCi0gICAgICB7Ci0gICAgICAgIGFzc2VydFRydWUoICJFeGNlcHRpb24gdGhyb3c6IiArIGV4Yy5nZXRNZXNzYWdlKCksIGZhbHNlICk7Ci0gICAgICB9Ci0gICAgICBmaW5hbGx5Ci0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgc3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIElPRXhjZXB0aW9uIGV4YyApCi0gICAgICAgIHsKLSAgICAgICAgICBhc3NlcnRUcnVlKCAiRXhjZXB0aW9uIHRocm93OiIgKyBleGMuZ2V0TWVzc2FnZSgpLCBmYWxzZSApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGFzc2VydFRydWUoICJUaGVyZSBzaG91bGQgYmUgbm8gYnl0ZXMgaW4gdGhpcyBzdHJlYW0iLCAgYnl0ZVJlYWQgPT0gLTEgKTsKLSAgICAgIAotICAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICAgIGFzc2VydFRydWUoICJFeGNlcHRpb24gdGhyb3c6IiArIGV4Yy5nZXRNZXNzYWdlKCksIGZhbHNlICk7Ci0gICAgfSAgICAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RJT09wZXJhdGlvbnMoKQotICB7Ci0gICAgSUVudmlyb25tZW50IGVudmlyb25tZW50ID0gRW52aXJvbm1lbnRTZXJ2aWNlLmdldEVjbGlwc2VDb25zb2xlRW52aXJvbm1lbnQoKTsKLSAgICBJVVJJRmFjdG9yeSAgZmFjdG9yeSAgICAgPSBlbnZpcm9ubWVudC5nZXRVUklGYWN0b3J5KCk7Ci0gICAgT3V0cHV0U3RyZWFtV3JpdGVyICAgICAgIHN0cmVhbSAgICAgID0gbnVsbDsKLSAgICBQcmludFdyaXRlciAgICAgICAgICAgICAgd3JpdGVyICAgICAgPSBudWxsOwotICAgIElucHV0U3RyZWFtUmVhZGVyICAgICAgICBpbnB1dFN0cmVhbSA9IG51bGw7Ci0gICAgQnVmZmVyZWRSZWFkZXIgICAgICAgICAgIHJlYWRlciAgICAgID0gbnVsbDsKLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVjbGlwc2VVUklUZXN0cy50ZXN0SU9PcGVyYXRpb25zKCkiKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJUGF0aCBmb2xkZXJQYXRoMCAgPSBuZXcgUGF0aCggcHJvamVjdE5hbWVfICkuYXBwZW5kKCAidG9wRm9sZGVyNSIgKS5tYWtlQWJzb2x1dGUoKTsKLSAgICAgIElVUkkgICB1cmkwICAgICAgICAgPSBmYWN0b3J5Lm5ld1VSSSggZ2V0VVJMRnJvbVBhdGgoIGZvbGRlclBhdGgwICkudG9TdHJpbmcoKSApOwotICAgICAgSVVSSSAgIHVyaVJlbGF0aXZlMSA9IGZhY3RvcnkubmV3VVJJKCAibGV2ZWwxIik7Ci0gICAgICBJVVJJICAgdXJpUmVsYXRpdmUyID0gZmFjdG9yeS5uZXdVUkkoICJsZWFmRmlsZS50eHQiKTsKLSAgICAgIElVUkkgICBuZXdVUkkgICAgICAgPSB1cmkwLmFwcGVuZCggdXJpUmVsYXRpdmUxICkuYXBwZW5kKCB1cmlSZWxhdGl2ZTIgKTsKLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggIm5ld1VSSSBzaG91bGQgbm90IGV4aXN0IiwgIW5ld1VSSS5pc1ByZXNlbnQoKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggIm5ld1VSSSBzaG91bGQgbm90IGJlIHJlYWRhYmxlIiwgIW5ld1VSSS5pc1JlYWRhYmxlKCkgKTsKLSAgICAgIGFzc2VydFRydWUoICJuZXdVUkkgc2hvdWxkIGJlIHdyaXRhYmxlIiwgIW5ld1VSSS5pc1dyaXRhYmxlKCkgKTsKLSAgICAgIAotICAgICAgc3RyZWFtID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlciggbmV3VVJJLmdldE91dHB1dFN0cmVhbSgpICk7Ci0gICAgICB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoIHN0cmVhbSApOwotICAgICAgCi0gICAgICB3cml0ZXIucHJpbnRsbiggIlRoaXMgaXMgbGluZSAxIG9mIHRoZSBmaWxlLiIgKTsgCi0gICAgICB3cml0ZXIucHJpbnRsbiggIlRoaXMgaXMgbGluZSAyIG9mIHRoZSBmaWxlLiIgKTsKLSAgICAgIHdyaXRlci5wcmludGxuKCAiVGhpcyBpcyB0aGUgZW5kIG9mIHRoZSBmaWxlLiIgKTsKLSAgICAgIAotICAgICAgd3JpdGVyLmNsb3NlKCk7Ci0gICAgICBzdHJlYW0uY2xvc2UoKTsKLSAgICAgIHdyaXRlciA9IG51bGw7Ci0gICAgICBzdHJlYW0gPSBudWxsOwotICAgICAKLSAgICAgIGFzc2VydFRydWUoICJuZXdVUkkgc2hvdWxkIGJlIHJlYWRhYmxlIiwgbmV3VVJJLmlzUmVhZGFibGUoKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggIm5ld1VSSSBzaG91bGQgYmUgd3JpdGFibGUiLCBuZXdVUkkuaXNXcml0YWJsZSgpICk7Ci0gICAgICAKLSAgICAgIC8vIE5vdyByZWFkIGJhY2sgdGhpcyBuZXcgZmlsZS4KLSAgICAgIGlucHV0U3RyZWFtID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKCBuZXdVUkkuZ2V0SW5wdXRTdHJlYW0oKSApOwotICAgICAgcmVhZGVyICAgICAgPSBuZXcgQnVmZmVyZWRSZWFkZXIoIGlucHV0U3RyZWFtICk7Ci0gICAgICAKLSAgICAgIGFzc2VydFRydWUoICJCYWQgZmlyc3QgbGluZSBvZiBmaWxlIiwgcmVhZGVyLnJlYWRMaW5lKCkuZXF1YWxzKCJUaGlzIGlzIGxpbmUgMSBvZiB0aGUgZmlsZS4iKSApOyAKLSAgICAgIGFzc2VydFRydWUoICJCYWQgc2Vjb25kIGxpbmUgb2YgZmlsZSIsIHJlYWRlci5yZWFkTGluZSgpLmVxdWFscygiVGhpcyBpcyBsaW5lIDIgb2YgdGhlIGZpbGUuIikgKTsgCi0gICAgICBhc3NlcnRUcnVlKCAiQmFkIGxhc3QgbGluZSBvZiBmaWxlIiwgcmVhZGVyLnJlYWRMaW5lKCkuZXF1YWxzKCJUaGlzIGlzIHRoZSBlbmQgb2YgdGhlIGZpbGUuIikgKTsKLSAgICAgIGFzc2VydFRydWUoICJFeHRyYSBsaW5lcyBmb3VuZCBpbiBmaWxlIiwgcmVhZGVyLnJlYWRMaW5lKCkgPT0gbnVsbCApOwotICAgICAgCi0gICAgICByZWFkZXIuY2xvc2UoKTsKLSAgICAgIAotICAgICAgLy9Ob3cgcmVuYW1lIHRoZSBmb2xkZXIuCi0gICAgICBJVVJJIGxldmVsMSAgID0gdXJpMC5hcHBlbmQoIHVyaVJlbGF0aXZlMSApOwotICAgICAgSVVSSSBuZXdMZXZlbCA9IHVyaTAuYXBwZW5kKCBmYWN0b3J5Lm5ld1VSSSgibmV3TGV2ZWwxIikgKTsKLSAgICAgIElVUkkgb2xkRmlsZSAgPSBuZXdMZXZlbC5hcHBlbmQoIHVyaVJlbGF0aXZlMiApOwotICAgICAgSVVSSSBuZXdGaWxlICA9IG5ld0xldmVsLmFwcGVuZCggZmFjdG9yeS5uZXdVUkkoICJuZXdGaWxlIiApICk7Ci0gICAgICAKLSAgICAgIGFzc2VydFRydWUoICJVUkkgaXMgbm90IHByZXNlbnQiLCBuZXdVUkkuaXNQcmVzZW50KCkgKTsKLSAgICAgIGFzc2VydFRydWUoICJVUkkgaXMgcHJlc2VudCIsICFuZXdMZXZlbC5hcHBlbmQodXJpUmVsYXRpdmUyKS5pc1ByZXNlbnQoKSApOwotICAgICAgCi0gICAgICBsZXZlbDEucmVuYW1lKCBuZXdMZXZlbCApOwotICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAiVVJJIGlzIHByZXNlbnQiLCAhbmV3VVJJLmlzUHJlc2VudCgpICk7Ci0gICAgICBhc3NlcnRUcnVlKCAiVVJJIGlzIG5vdCBwcmVzZW50IiwgbmV3TGV2ZWwuYXBwZW5kKHVyaVJlbGF0aXZlMikuaXNQcmVzZW50KCkgKTsKLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggIlVSSSBpcyBwcmVzZW50IiwgIW5ld0ZpbGUuaXNQcmVzZW50KCkgKTsKLSAgICAgIGFzc2VydFRydWUoICJVUkkgaXMgbm90IHByZXNlbnQiLCBvbGRGaWxlLmlzUHJlc2VudCgpICk7Ci0gICAgICAKLSAgICAgIG9sZEZpbGUucmVuYW1lKCBuZXdGaWxlICk7Ci0gICAgICAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggIlVSSSBpcyBub3QgcHJlc2VudCIsIG5ld0ZpbGUuaXNQcmVzZW50KCkgKTsKLSAgICAgIGFzc2VydFRydWUoICJVUkkgaXMgcHJlc2VudCIsICFvbGRGaWxlLmlzUHJlc2VudCgpICk7ICAgICAgCi0gICAgfQotICAgIGNhdGNoKCBVUklFeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgICBhc3NlcnRUcnVlKCAiRXhjZXB0aW9uIHRocm93OiIgKyBleGMuZ2V0TWVzc2FnZSgpLCBmYWxzZSApOwotICAgIH0KLSAgICBjYXRjaCggSU9FeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgICBhc3NlcnRUcnVlKCAiRXhjZXB0aW9uIHRocm93OiIgKyBleGMuZ2V0TWVzc2FnZSgpLCBmYWxzZSApOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgaWYoIHN0cmVhbSAhPSBudWxsICkKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICB3cml0ZXIuY2xvc2UoKTsKLSAgICAgICAgICBzdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggSU9FeGNlcHRpb24gZXhjICkKLSAgICAgICAgewotICAgICAgICAgIGFzc2VydFRydWUoICJFeGNlcHRpb24gdGhyb3c6IiArIGV4Yy5nZXRNZXNzYWdlKCksIGZhbHNlICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgICAgaWYoIGlucHV0U3RyZWFtICE9IG51bGwgKQotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIGlucHV0U3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgcmVhZGVyLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIElPRXhjZXB0aW9uIGV4YyApCi0gICAgICAgIHsKLSAgICAgICAgICBhc3NlcnRUcnVlKCAiRXhjZXB0aW9uIHRocm93OiIgKyBleGMuZ2V0TWVzc2FnZSgpLCBmYWxzZSApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0UmVsYXRpdmUoKQotICB7Ci0gICAgSUVudmlyb25tZW50IGVudmlyb25tZW50ID0gRW52aXJvbm1lbnRTZXJ2aWNlLmdldEVjbGlwc2VDb25zb2xlRW52aXJvbm1lbnQoKTsKLSAgICBJVVJJRmFjdG9yeSAgZmFjdG9yeSAgICAgPSBlbnZpcm9ubWVudC5nZXRVUklGYWN0b3J5KCk7Ci0gICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCJFY2xpcHNlVVJJVGVzdHMudGVzdFJlbGF0aXZlKCkiKTsKLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJUGF0aCBmb2xkZXJQYXRoMCAgID0gbmV3IFBhdGgoIHByb2plY3ROYW1lXyApLmFwcGVuZCggInJlbGF0aXZlUHJvaiIgKS5tYWtlQWJzb2x1dGUoKTsKLSAgICAgIElVUkkgICB1cmkwICAgICAgICAgPSBmYWN0b3J5Lm5ld1VSSSggZ2V0VVJMRnJvbVBhdGgoIGZvbGRlclBhdGgwICkudG9TdHJpbmcoKSApOwotICAgICAgSVVSSSAgIHVyaVJlbGF0aXZlMSA9IGZhY3RvcnkubmV3VVJJKCAibGV2ZWwxIik7Ci0gICAgICBJVVJJICAgbGV2ZWwxVVJJICAgID0gdXJpMC5hcHBlbmQoIHVyaVJlbGF0aXZlMSApOwotICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAiVXJpIGlzIHJlbGF0aXZlIiwgIXVyaTAuaXNSZWxhdGl2ZSgpICk7Ci0gICAgICBhc3NlcnRUcnVlKCAiVXJpIGlzIG5vdCByZWxhdGl2ZSIsIHVyaVJlbGF0aXZlMS5pc1JlbGF0aXZlKCkgKTsKLSAgICAgIGFzc2VydFRydWUoICJVcmkgaXMgcmVsYXRpdmUiLCAhbGV2ZWwxVVJJLmlzUmVsYXRpdmUoKSApOwotICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAiVXJpIGlzIG5vdCBoaWVyYXJjaGljYWwiLCB1cmkwLmlzSGllcmFyY2hpY2FsKCkgKTsKLSAgICAgIGFzc2VydFRydWUoICJVcmkgaXMgbm90IGhpZXJhcmNoaWNhbCIsIHVyaVJlbGF0aXZlMS5pc0hpZXJhcmNoaWNhbCgpICk7Ci0gICAgICBhc3NlcnRUcnVlKCAiVXJpIGlzIG5vdCBoaWVyYXJjaGljYWwiLCBsZXZlbDFVUkkuaXNIaWVyYXJjaGljYWwoKSApOyAKLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMpCi0gICAgewotICAgICAgYXNzZXJ0VHJ1ZSggIkV4Y2VwdGlvbiB0aHJvdzoiICsgZXhjLmdldE1lc3NhZ2UoKSwgZmFsc2UgKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RFcmFzZTEoKQotICB7Ci0gICAgSUVudmlyb25tZW50IGVudmlyb25tZW50ID0gRW52aXJvbm1lbnRTZXJ2aWNlLmdldEVjbGlwc2VDb25zb2xlRW52aXJvbm1lbnQoKTsKLSAgICBJVVJJRmFjdG9yeSAgZmFjdG9yeSAgICAgPSBlbnZpcm9ubWVudC5nZXRVUklGYWN0b3J5KCk7Ci0gICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCJFY2xpcHNlVVJJVGVzdHMudGVzdEVyYXNlMSgpIik7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgSVBhdGggZm9sZGVyUGF0aDAgID0gbmV3IFBhdGgoIHByb2plY3ROYW1lXyApLmFwcGVuZCggInRvcEZvbGRlcjYiICkubWFrZUFic29sdXRlKCk7Ci0gICAgICBJVVJJICAgdXJpMCAgICAgICAgID0gZmFjdG9yeS5uZXdVUkkoIGdldFVSTEZyb21QYXRoKCBmb2xkZXJQYXRoMCApLnRvU3RyaW5nKCkgKTsKLSAgICAgIElVUkkgICB1cmlSZWxhdGl2ZTEgPSBmYWN0b3J5Lm5ld1VSSSggImxldmVsMSIpOwotICAgICAgSVVSSSAgIHVyaVJlbGF0aXZlMiA9IGZhY3RvcnkubmV3VVJJKCAibGVhZkZpbGUudHh0Iik7Ci0gICAgICBJVVJJICAgbmV3VVJJICAgICAgID0gdXJpMC5hcHBlbmQoIHVyaVJlbGF0aXZlMSApLmFwcGVuZCggdXJpUmVsYXRpdmUyICk7Ci0gICAgICBJVVJJICAgbGV2ZWwxVVJJICAgID0gdXJpMC5hcHBlbmQoIHVyaVJlbGF0aXZlMSApOwotICAgICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAibmV3VVJJIHNob3VsZCBub3QgZXhpc3QiLCAhbmV3VVJJLmlzUHJlc2VudCgpICk7Ci0gICAgICAKLSAgICAgIG5ld1VSSS50b3VjaExlYWYoKTsKLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggIm5ld1VSSSBzaG91bGQgZXhpc3QiLCBuZXdVUkkuaXNQcmVzZW50KCkgKTsKLSAgICAgIAotICAgICAgbmV3VVJJLmVyYXNlKCk7Ci0gICAgICAKLSAgICAgIGFzc2VydFRydWUoICJuZXdVUkkgc2hvdWxkIG5vdCBleGlzdCIsICFuZXdVUkkuaXNQcmVzZW50KCkgKTsKLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggImZvbGRlciByb290IHNob3VsZCBleGlzdCIsIHVyaTAuaXNQcmVzZW50KCkgKTsKLSAgICAgIGFzc2VydFRydWUoICJmb2xkZXIgbGV2ZWwxIHNob3VsZCBleGlzdCIsIGxldmVsMVVSSS5pc1ByZXNlbnQoKSApOwotICAgICAgCi0gICAgICB1cmkwLmVyYXNlKCk7Ci0gICAgICAKLSAgICAgIGFzc2VydFRydWUoICJmb2xkZXIgcm9vdCBzaG91bGQgbm90IGV4aXN0IiwgIXVyaTAuaXNQcmVzZW50KCkgKTsKLSAgICAgIGFzc2VydFRydWUoICJmb2xkZXIgbGV2ZWwxIHNob3VsZCBub3QgZXhpc3QiLCAhbGV2ZWwxVVJJLmlzUHJlc2VudCgpICk7Ci0gICAgICAKLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMpCi0gICAgewotICAgICAgYXNzZXJ0VHJ1ZSggIkV4Y2VwdGlvbiB0aHJvdzoiICsgZXhjLmdldE1lc3NhZ2UoKSwgZmFsc2UgKTsKLSAgICB9Ci0gIH0KLSAgCi0gIAotICBwdWJsaWMgdm9pZCB0ZXN0SXNMZWFmKCkKLSAgewotICAgIElFbnZpcm9ubWVudCBlbnZpcm9ubWVudCA9IEVudmlyb25tZW50U2VydmljZS5nZXRFY2xpcHNlQ29uc29sZUVudmlyb25tZW50KCk7Ci0gICAgSVVSSUZhY3RvcnkgIGZhY3RvcnkgICAgID0gZW52aXJvbm1lbnQuZ2V0VVJJRmFjdG9yeSgpOwotICAgIAotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRWNsaXBzZVVSSVRlc3RzLnRlc3RJc0xlYWYoKSIpOwotICAgIHRyeQotICAgIHsKLSAgICAgIElQYXRoIGZvbGRlclBhdGgwICA9IG5ldyBQYXRoKCBwcm9qZWN0TmFtZV8gKS5hcHBlbmQoICJ0b3BGb2xkZXI3IiApLm1ha2VBYnNvbHV0ZSgpOwotICAgICAgSVVSSSAgIHVyaTAgICAgICAgICA9IGZhY3RvcnkubmV3VVJJKCBnZXRVUkxGcm9tUGF0aCggZm9sZGVyUGF0aDAgKS50b1N0cmluZygpICk7Ci0gICAgICBJVVJJICAgdXJpUmVsYXRpdmUxID0gZmFjdG9yeS5uZXdVUkkoICJsZXZlbDEiKTsKLSAgICAgIElVUkkgICB1cmlSZWxhdGl2ZTIgPSBmYWN0b3J5Lm5ld1VSSSggImxlYWZGaWxlLnR4dCIpOwotICAgICAgSVVSSSAgIG5ld1VSSSAgICAgICA9IHVyaTAuYXBwZW5kKCB1cmlSZWxhdGl2ZTEgKS5hcHBlbmQoIHVyaVJlbGF0aXZlMiApOwotICAgICAgSVVSSSAgIHBhcmVudCAgICAgICA9IG5ld1VSSS5wYXJlbnQoKTsKLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggIm5ld1VSSSBzaG91bGQgbm90IGV4aXN0IiwgIW5ld1VSSS5pc1ByZXNlbnQoKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggInBhcmVudCBzaG91bGQgbm90IGV4aXN0IiwgIXBhcmVudC5pc1ByZXNlbnQoKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggIm5ld1VSSSBzaG91bGQgbm90IGJlIGEgbGVhZiB5ZXQiLCAhbmV3VVJJLmlzTGVhZigpICk7Ci0gICAgICBhc3NlcnRUcnVlKCAicGFyZW50IHNob3VsZCBub3QgYmUgYSBsZWFmIiwgIXBhcmVudC5pc0xlYWYoKSApOwotICAgICAgCi0gICAgICBuZXdVUkkudG91Y2hMZWFmKCk7Ci0gICAgICAKLSAgICAgIGFzc2VydFRydWUoICJuZXdVUkkgc2hvdWxkIGV4aXN0IiwgbmV3VVJJLmlzUHJlc2VudCgpICk7Ci0gICAgICBhc3NlcnRUcnVlKCAicGFyZW50IHNob3VsZCBleGlzdCIsIHBhcmVudC5pc1ByZXNlbnQoKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggIm5ld1VSSSBzaG91bGQgYmUgYSBsZWFmIiwgbmV3VVJJLmlzTGVhZigpICk7Ci0gICAgICBhc3NlcnRUcnVlKCAicGFyZW50IHNob3VsZCBub3QgYmUgYSBsZWFmIiwgIXBhcmVudC5pc0xlYWYoKSApOwotICAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMpCi0gICAgewotICAgICAgYXNzZXJ0VHJ1ZSggIkV4Y2VwdGlvbiB0aHJvdzoiICsgZXhjLmdldE1lc3NhZ2UoKSwgZmFsc2UgKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RWaXNpdCgpCi0gIHsKLSAgICBJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgPSBFbnZpcm9ubWVudFNlcnZpY2UuZ2V0RWNsaXBzZUNvbnNvbGVFbnZpcm9ubWVudCgpOwotICAgIElVUklGYWN0b3J5ICBmYWN0b3J5ICAgICA9IGVudmlyb25tZW50LmdldFVSSUZhY3RvcnkoKTsKLSAgICBJVVJJU2NoZW1lICAgc2NoZW1lICAgICAgPSBFbnZpcm9ubWVudFNlcnZpY2UuZ2V0RWNsaXBzZVNjaGVtZSgpOwotICAgIAotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRWNsaXBzZVVSSVRlc3RzLnRlc3RWaXNpdCgpIik7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgSVBhdGggZm9sZGVyUGF0aDAgID0gbmV3IFBhdGgoIHByb2plY3ROYW1lXyApLmFwcGVuZCggInJvb3QiICkubWFrZUFic29sdXRlKCk7Ci0gICAgICBJVVJJICAgdXJpMCAgICAgICAgID0gZmFjdG9yeS5uZXdVUkkoIGdldFVSTEZyb21QYXRoKCBmb2xkZXJQYXRoMCApLnRvU3RyaW5nKCkgKTsKLSAgICAgIAotICAgICAgSGFzaHRhYmxlIHRhYmxlID0gYnVpbGRUZXN0RW50cmllcyggc2NoZW1lLCB1cmkwICk7Ci0gICAgICAKLSAgICAgIHVyaTAudmlzaXQoIG5ldyBUZXN0VmlzaXRvciggdGFibGUgKSApOyAgICAgIAotICAgICAgdmVyaWZ5VGFibGUoIHRhYmxlICk7Ci0gICAgICAKLSAgICAgIHJlc2V0VGFibGVGb3JUZXN0MiggdGFibGUgKTsKLSAgICAgIHVyaTAudmlzaXQoIG5ldyBUZXN0VmlzaXRvciggdGFibGUgKSApOwotICAgICAgdmVyaWZ5VGFibGUoIHRhYmxlICk7Ci0gICAgICAKLSAgICAgIHJlc2V0VGFibGUoIHRhYmxlICk7Ci0gICAgICB1cmkwLnZpc2l0KCBuZXcgVGVzdFZpc2l0b3IoIHRhYmxlICksIG5ldyBUZXN0RmlsdGVyKCB0YWJsZSApICk7Ci0gICAgICB2ZXJpZnlUYWJsZSggdGFibGUgKTsKLSAgICAgIAotICAgICAgcmVzZXRUYWJsZUZvclRlc3QzKCB0YWJsZSApOwotICAgICAgdXJpMC52aXNpdCggbmV3IFRlc3RWaXNpdG9yKCB0YWJsZSApLCBuZXcgVGVzdEZpbHRlciggdGFibGUgKSApOwotICAgICAgdmVyaWZ5VGFibGUoIHRhYmxlICk7ICAgICAKLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMpCi0gICAgewotICAgICAgYXNzZXJ0VHJ1ZSggIkV4Y2VwdGlvbiB0aHJvdzoiICsgZXhjLmdldE1lc3NhZ2UoKSwgZmFsc2UgKTsKLSAgICB9Ci0gIH0KLSAKLSAgcHJpdmF0ZSBjbGFzcyBUZXN0VmlzaXRvciBpbXBsZW1lbnRzIElVUklWaXNpdG9yCi0gIHsKLSAgICBwcml2YXRlIEhhc2h0YWJsZSB0YWJsZV87Ci0gICAgCi0gICAgcHVibGljIFRlc3RWaXNpdG9yKCBIYXNodGFibGUgdGFibGUpCi0gICAgewotICAgICAgdGFibGVfID0gdGFibGU7ICAKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gdmlzaXQoIElVUkkgdXJpICkKLSAgICB7Ci0gICAgICBOb2RlRW50cnkgZW50cnkgPSAoTm9kZUVudHJ5KXRhYmxlXy5nZXQoIGdldE5hbWUoIHVyaSApICk7Ci0gICAgICBlbnRyeS53YXNWaXNpdGVkXyA9IHRydWU7Ci0gICAgICByZXR1cm4gIWVudHJ5LnN0b3BUcmF2ZXJzaW5nXzsKLSAgICB9IAotICB9Ci0gIAotICBwcml2YXRlIGNsYXNzIFRlc3RGaWx0ZXIgaW1wbGVtZW50cyBJVVJJRmlsdGVyCi0gIHsKLSAgICBwcml2YXRlIEhhc2h0YWJsZSB0YWJsZV87Ci0gICAgCi0gICAgcHVibGljIFRlc3RGaWx0ZXIoIEhhc2h0YWJsZSB0YWJsZSkKLSAgICB7Ci0gICAgICB0YWJsZV8gPSB0YWJsZTsgIAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHRzKCBJVVJJIHVyaSApCi0gICAgewotICAgICAgTm9kZUVudHJ5IGVudHJ5ID0gKE5vZGVFbnRyeSl0YWJsZV8uZ2V0KCBnZXROYW1lKCB1cmkgKSApOwotICAgICAgcmV0dXJuIGVudHJ5LnZpc2l0Tm9kZV87Ci0gICAgfSAKLSAgfQotICAKLSAgcHJpdmF0ZSBIYXNodGFibGUgYnVpbGRUZXN0RW50cmllcyggSVVSSVNjaGVtZSBzY2hlbWUsIElVUkkgcm9vdFVSSSApCi0gIHsKLSAgICBIYXNodGFibGUgdGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIElVUkkgcm9vdGMxID0gcm9vdFVSSS5hcHBlbmQoIHNjaGVtZS5uZXdVUkkoICJyb290YzEiKSApOwotICAgICAgSVVSSSByb290YzIgPSByb290VVJJLmFwcGVuZCggc2NoZW1lLm5ld1VSSSggInJvb3RjMiIpICk7Ci0gICAgICBJVVJJIHJvb3RjMyA9IHJvb3RVUkkuYXBwZW5kKCBzY2hlbWUubmV3VVJJKCAicm9vdGMzIikgKTsKLSAgICAgIAotICAgICAgSVVSSSByb290YzJjMSA9IHJvb3RjMi5hcHBlbmQoIHNjaGVtZS5uZXdVUkkoICJyb290YzJjMSIpICk7Ci0gICAgICBJVVJJIHJvb3RjMmMyID0gcm9vdGMyLmFwcGVuZCggc2NoZW1lLm5ld1VSSSggInJvb3RjMmMyIikgKTsKLSAgICAgIElVUkkgcm9vdGMyYzMgPSByb290YzIuYXBwZW5kKCBzY2hlbWUubmV3VVJJKCAicm9vdGMyYzMiKSApOwotICAgICAgCi0gICAgICBJVVJJIHJvb3RjMmMyYzEgPSByb290YzJjMi5hcHBlbmQoIHNjaGVtZS5uZXdVUkkoICJyb290YzJjMmMxIikgKTsKLSAgICAgIElVUkkgcm9vdGMyYzJjMiA9IHJvb3RjMmMyLmFwcGVuZCggc2NoZW1lLm5ld1VSSSggInJvb3RjMmMyYzIiKSApOwotICAgICAgCi0gICAgICBJVVJJIHJvb3RjM2MxID0gcm9vdGMzLmFwcGVuZCggc2NoZW1lLm5ld1VSSSggInJvb3RjM2MxIikgKTsKLSAgICAgIElVUkkgcm9vdGMzYzIgPSByb290YzMuYXBwZW5kKCBzY2hlbWUubmV3VVJJKCAicm9vdGMzYzIiKSApOwotICAgICAgCi0gICAgICAvLyBOb3cgdGhhdCB0aGUgVVJJJ3MgYXJlIGNyZWF0ZWQgd2UgbmVlZCB0byBjcmVhdGUgcGh5c2ljYWwgZm9sZGVycwotICAgICAgLy8gYW5kIGZpbGVzIHRvIHJlcHJlc2VudCB0aGVtLgotICAgICAgcm9vdGMzYzEudG91Y2hMZWFmKCk7Ci0gICAgICByb290YzNjMi50b3VjaExlYWYoKTsgICAgCi0gICAgICAKLSAgICAgIHJvb3RjMmMyYzEudG91Y2hMZWFmKCk7Ci0gICAgICByb290YzJjMmMyLnRvdWNoTGVhZigpOwotICAgICAgCi0gICAgICByb290YzJjMS50b3VjaExlYWYoKTsKLSAgICAgIHJvb3RjMmMzLnRvdWNoTGVhZigpOwotICAgICAgCi0gICAgICByb290YzEudG91Y2hGb2xkZXIoKTsKLSAgICAgIAotICAgICAgLy8gTm93IGNyZWF0ZSB0aGUgdGhlIHRhYmxlIGVudHJpZXMgdGhhdCB3aWxsIGJlIHVzZWQgdG8gdmlzaXQKLSAgICAgIC8vIHRoZSBVUkkgbm9kZXMuCi0gICAgICB0YWJsZS5wdXQoICJyb290IiwgbmV3IE5vZGVFbnRyeSgpICk7Ci0gICAgICB0YWJsZS5wdXQoICJyb290YzEiLCBuZXcgTm9kZUVudHJ5KCkgKTsKLSAgICAgIHRhYmxlLnB1dCggInJvb3RjMiIsIG5ldyBOb2RlRW50cnkoKSApOwotICAgICAgdGFibGUucHV0KCAicm9vdGMzIiwgbmV3IE5vZGVFbnRyeSgpICk7Ci0gICAgICB0YWJsZS5wdXQoICJyb290YzJjMSIsIG5ldyBOb2RlRW50cnkoKSApOwotICAgICAgdGFibGUucHV0KCAicm9vdGMyYzIiLCBuZXcgTm9kZUVudHJ5KCkgKTsKLSAgICAgIHRhYmxlLnB1dCggInJvb3RjMmMzIiwgbmV3IE5vZGVFbnRyeSgpICk7Ci0gICAgICB0YWJsZS5wdXQoICJyb290YzJjMmMxIiwgbmV3IE5vZGVFbnRyeSgpICk7Ci0gICAgICB0YWJsZS5wdXQoICJyb290YzJjMmMyIiwgbmV3IE5vZGVFbnRyeSgpICk7Ci0gICAgICB0YWJsZS5wdXQoICJyb290YzNjMSIsIG5ldyBOb2RlRW50cnkoKSApOwotICAgICAgdGFibGUucHV0KCAicm9vdGMzYzIiLCBuZXcgTm9kZUVudHJ5KCkgKTsKLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMpCi0gICAgewotICAgICAgYXNzZXJ0VHJ1ZSggIkV4Y2VwdGlvbiB0aHJvdzoiICsgZXhjLmdldE1lc3NhZ2UoKSwgZmFsc2UgKTsKLSAgICB9ICAKLSAgICAgIAotICAgIHJldHVybiB0YWJsZTsKLSAgfQotICAKLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0TmFtZSggSVVSSSB1cmkgKQotICB7IAotICAgIFN0cmluZyAgICBmdWxsTmFtZSAgPSB1cmkudG9TdHJpbmcoKTsKLSAgICBpbnQgICAgICAgc2xhc2ggICAgID0gZnVsbE5hbWUubGFzdEluZGV4T2YoICcvJyApOwotICAgIFN0cmluZyAgICBuYW1lICAgICAgPSBmdWxsTmFtZS5zdWJzdHJpbmcoIHNsYXNoICsgMSwgZnVsbE5hbWUubGVuZ3RoKCkgKTsKLSAgICAKLSAgICByZXR1cm4gbmFtZTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHZlcmlmeVRhYmxlKCBIYXNodGFibGUgdGFibGUgKQotICB7Ci0gICAgSXRlcmF0b3IgZW50cmllcyA9IHRhYmxlLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAKLSAgICB3aGlsZSggZW50cmllcy5oYXNOZXh0KCkgKQotICAgIHsKLSAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpZW50cmllcy5uZXh0KCk7Ci0gICAgICAKLSAgICAgIFN0cmluZyAgICBrZXkgID0gKFN0cmluZyllbnRyeS5nZXRLZXkoKTsKLSAgICAgIE5vZGVFbnRyeSBub2RlID0gKE5vZGVFbnRyeSllbnRyeS5nZXRWYWx1ZSgpOyAKLSAKLSAgICAgIGFzc2VydFRydWUoICJCYWQgdGFibGUgcmVzdWx0IGZvciBrZXk6IiArIGtleSArICIgdmlzaXRlZD0iICsgbm9kZS53YXNWaXNpdGVkXwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBzaG91bGRiZT0iICsgbm9kZS5zaG91bGRCZVZpc2l0ZWRfLAotICAgICAgICAgICAgICAgICAgbm9kZS53YXNWaXNpdGVkXyA9PSBub2RlLnNob3VsZEJlVmlzaXRlZF8gKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCByZXNldFRhYmxlRm9yVGVzdDIoIEhhc2h0YWJsZSB0YWJsZSApCi0gIHsKLSAgICByZXNldFRhYmxlKCB0YWJsZSApOwotICAgIAotICAgIE5vZGVFbnRyeSByb290YzIgPSAoTm9kZUVudHJ5KXRhYmxlLmdldCggInJvb3RjMiIgKTsKLSAgICByb290YzIuc3RvcFRyYXZlcnNpbmdfID0gdHJ1ZTsKLSAgICAKLSAgICBOb2RlRW50cnkgcm9vdGMyYzEgPSAoTm9kZUVudHJ5KXRhYmxlLmdldCggInJvb3RjMmMxIiApOwotICAgIHJvb3RjMmMxLnNob3VsZEJlVmlzaXRlZF8gPSBmYWxzZTsKLSAgICAKLSAgICBOb2RlRW50cnkgcm9vdGMyYzIgPSAoTm9kZUVudHJ5KXRhYmxlLmdldCggInJvb3RjMmMyIiApOwotICAgIHJvb3RjMmMyLnNob3VsZEJlVmlzaXRlZF8gPSBmYWxzZTsKLSAgICAKLSAgICBOb2RlRW50cnkgcm9vdGMyYzMgPSAoTm9kZUVudHJ5KXRhYmxlLmdldCggInJvb3RjMmMzIiApOwotICAgIHJvb3RjMmMzLnNob3VsZEJlVmlzaXRlZF8gPSBmYWxzZTsKLSAgICAKLSAgICBOb2RlRW50cnkgcm9vdGMyYzJjMSA9IChOb2RlRW50cnkpdGFibGUuZ2V0KCAicm9vdGMyYzJjMSIgKTsKLSAgICByb290YzJjMmMxLnNob3VsZEJlVmlzaXRlZF8gPSBmYWxzZTsKLSAgICAKLSAgICBOb2RlRW50cnkgcm9vdGMyYzJjMiA9IChOb2RlRW50cnkpdGFibGUuZ2V0KCAicm9vdGMyYzJjMiIgKTsKLSAgICByb290YzJjMmMyLnNob3VsZEJlVmlzaXRlZF8gPSBmYWxzZTsgICAKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHJlc2V0VGFibGVGb3JUZXN0MyggSGFzaHRhYmxlIHRhYmxlICkKLSAgewotICAgIHJlc2V0VGFibGUoIHRhYmxlICk7ICAKLSAgICAKLSAgICBOb2RlRW50cnkgcm9vdGMzID0gKE5vZGVFbnRyeSl0YWJsZS5nZXQoICJyb290YzMiICk7Ci0gICAgcm9vdGMzLnZpc2l0Tm9kZV8gPSBmYWxzZTsKLSAgICByb290YzMuc2hvdWxkQmVWaXNpdGVkXyA9IGZhbHNlOwotICAgIAotICAgIE5vZGVFbnRyeSByb290YzJjMiA9IChOb2RlRW50cnkpdGFibGUuZ2V0KCAicm9vdGMyYzIiICk7Ci0gICAgcm9vdGMyYzIudmlzaXROb2RlXyA9IGZhbHNlOwotICAgIHJvb3RjMmMyLnNob3VsZEJlVmlzaXRlZF8gPSBmYWxzZTsKLSAgICAKLSAgICBOb2RlRW50cnkgcm9vdGMzYzEgPSAoTm9kZUVudHJ5KXRhYmxlLmdldCggInJvb3RjM2MxIiApOwotICAgIHJvb3RjM2MxLnZpc2l0Tm9kZV8gPSBmYWxzZTsKLSAgICByb290YzNjMS5zaG91bGRCZVZpc2l0ZWRfID0gZmFsc2U7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCByZXNldFRhYmxlKCBIYXNodGFibGUgdGFibGUgKQotICB7Ci0gICAgSXRlcmF0b3IgZW50cmllcyA9IHRhYmxlLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgCi0gICAgd2hpbGUoIGVudHJpZXMuaGFzTmV4dCgpICkKLSAgICB7Ci0gICAgICBOb2RlRW50cnkgZW50cnkgPSAoTm9kZUVudHJ5KWVudHJpZXMubmV4dCgpOwotICAgICAgZW50cnkud2FzVmlzaXRlZF8gPSBmYWxzZTsKLSAgICAgIGVudHJ5LnNob3VsZEJlVmlzaXRlZF89dHJ1ZTsKLSAgICAgIGVudHJ5LnN0b3BUcmF2ZXJzaW5nXz1mYWxzZTsKLSAgICAgIGVudHJ5LnZpc2l0Tm9kZV89dHJ1ZTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgU3RyaW5nIGdldFVSTEZyb21QYXRoKCBJUGF0aCBhYnNvbHV0ZVBhdGggKQotICB7Ci0gICAgcmV0dXJuICJwbGF0Zm9ybTovcmVzb3VyY2UiICsgYWJzb2x1dGVQYXRoOwotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBnZXRUbXBGaWxlVVJMKCBTdHJpbmcgZmlsZU5hbWUgKQotICB7Ci0gICAgRmlsZSBuZXdGaWxlID0gbmV3IEZpbGUoIHRlbXBEaXIsIGZpbGVOYW1lICk7ICAKLSAgICAKLSAgICByZXR1cm4gImZpbGU6LyIgKyBuZXdGaWxlLmdldEFic29sdXRlUGF0aCgpOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgZGVsZXRlRGlyKCBGaWxlIGZpbGVPckRpcmVjdG9yeSApCi0gIHsKLSAgICBGaWxlW10gY2hpbGRGaWxlcyA9IGZpbGVPckRpcmVjdG9yeS5saXN0RmlsZXMoKTsKLSAgICAKLSAgICBpZiggY2hpbGRGaWxlcyAhPSBudWxsICkKLSAgICB7Ci0gICAgICAvLyBEZWxldGUgYWxsIHRoZSBjaGlsZCBmaWxlcyBvciBkaXJlY3RvcmllcyBmaXJzdCBiZWZvcmUgdGhpcyBvbmUuCi0gICAgICBmb3IoIGludCBpbmRleCA9IDA7IGluZGV4IDwgY2hpbGRGaWxlcy5sZW5ndGg7IGluZGV4KysgKQotICAgICAgewotICAgICAgICBkZWxldGVEaXIoIGNoaWxkRmlsZXNbaW5kZXhdICk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIGZpbGVPckRpcmVjdG9yeS5kZWxldGUoKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBjbGFzcyBOb2RlRW50cnkKLSAgewotICAgIHB1YmxpYyBOb2RlRW50cnkoKQotICAgIHsKLSAgICAgIHRoaXMoIHRydWUsIGZhbHNlLCB0cnVlICk7IAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgTm9kZUVudHJ5KCBib29sZWFuIHZpc2l0Tm9kZSwgYm9vbGVhbiBzdG9wLCBib29sZWFuIHNob3VsZEJlVmlzaXRlZCApCi0gICAgewotICAgICAgdmlzaXROb2RlXyAgICAgICA9IHZpc2l0Tm9kZTsKLSAgICAgIHN0b3BUcmF2ZXJzaW5nXyAgPSBzdG9wOwotICAgICAgc2hvdWxkQmVWaXNpdGVkXyA9IHNob3VsZEJlVmlzaXRlZDsKLSAgICAgIHdhc1Zpc2l0ZWRfICAgICAgPSBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gdmlzaXROb2RlXzsKLSAgICBwdWJsaWMgYm9vbGVhbiBzdG9wVHJhdmVyc2luZ187Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gd2FzVmlzaXRlZF87Ci0gICAgcHVibGljIGJvb2xlYW4gc2hvdWxkQmVWaXNpdGVkXzsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3Rlc3RzL0Vudmlyb25tZW50VGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC90ZXN0cy9FbnZpcm9ubWVudFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZTg2NDEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3Rlc3RzL0Vudmlyb25tZW50VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC50ZXN0czsKLQotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgRW52aXJvbm1lbnRUZXN0cyBleHRlbmRzIFRlc3RTdWl0ZSAKLXsJCi0JCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgCi0gIHsKLQkJcmV0dXJuIG5ldyBFbnZpcm9ubWVudFRlc3RzKCk7Ci0JfQotCi0gIHB1YmxpYyBFbnZpcm9ubWVudFRlc3RzKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgCi0gICAgYWRkVGVzdCggRWNsaXBzZVNjaGVtZVRlc3RzLnN1aXRlKCkgKTsKLSAgICBhZGRUZXN0KCBFY2xpcHNlVVJJVGVzdHMuc3VpdGUoKSApOwotICAgIGFkZFRlc3QoIEZpbGVTY2hlbWVUZXN0cy5zdWl0ZSgpICk7Ci0gICAgYWRkVGVzdCggRmlsZVVSSVRlc3RzLnN1aXRlKCkgKTsKLSAgICBhZGRUZXN0KCBTdGF0dXNIYW5kbGVyVGVzdHMuc3VpdGUoKSApOwotICAgIGFkZFRlc3QoIExvZ2dlclRlc3RzLnN1aXRlKCkgKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3Rlc3RzL0ZpbGVTY2hlbWVUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3Rlc3RzL0ZpbGVTY2hlbWVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGQ3YzE0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC90ZXN0cy9GaWxlU2NoZW1lVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudGVzdHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LkVudmlyb25tZW50U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUklTY2hlbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuVVJJRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgRmlsZVNjaGVtZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcHJvamVjdE5hbWVfID0gIlRlc3RQcm9qZWN0IjsKLSAgCi0gIHB1YmxpYyBGaWxlU2NoZW1lVGVzdHMoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBzdXBlcihuYW1lKTsKLSAgfQotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQotICB7Ci0gICAgaWYgKGFyZ3MubGVuZ3RoID09IDApCi0gICAgewotICAgICAgcnVuQWxsKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09IDEpCi0gICAgewotICAgICAgU3RyaW5nIG1ldGhvZFRvUnVuID0gYXJnc1swXS50cmltKCk7Ci0gICAgICBydW5PbmUobWV0aG9kVG9SdW4pOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShGaWxlU2NoZW1lVGVzdHMuY2xhc3MpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHJ1bkFsbCgpCi0gIHsKLSAgICBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgcnVuT25lKFN0cmluZyBtZXRob2ROYW1lKQotICB7Ci0gICAgVGVzdFN1aXRlIHRlc3RTdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLSAgICBUZXN0Q2FzZSB0ZXN0ID0gbmV3IEZpbGVTY2hlbWVUZXN0cyhtZXRob2ROYW1lKTsKLSAgICB0ZXN0U3VpdGUuYWRkVGVzdCh0ZXN0KTsKLSAgICBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5ydW4odGVzdFN1aXRlKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBzZWUgVGVzdENhc2Ujc2V0VXAoKQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLSAgICBzdXBlci5zZXRVcCgpOwotICAgIAotICAgIC8vIENyZWF0ZSBhIHRlc3QgcHJvamVjdCBpbiB0aGUgd29ya2JlbmNoCi0gICAgSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0gICAgSVByb2plY3QgICAgICAgcHJvamVjdCAgICAgICA9IHdvcmtzcGFjZVJvb3QuZ2V0UHJvamVjdCggcHJvamVjdE5hbWVfICk7Ci0gICAgCi0gICAgaWYoIHByb2plY3QgIT0gbnVsbCAmJiBwcm9qZWN0LmV4aXN0cygpICkKLSAgICB7Ci0gICAgICBwcm9qZWN0LmRlbGV0ZSggdHJ1ZSwgbnVsbCApOwotICAgIH0KLSAgICAKLSAgICAvLyBDcmVhdGUgdGhlIHByb2plY3QKLSAgICBJUHJvamVjdERlc2NyaXB0aW9uIGRlc2MgPSB3b3Jrc3BhY2VSb290LmdldFdvcmtzcGFjZSgpLm5ld1Byb2plY3REZXNjcmlwdGlvbiggcHJvamVjdE5hbWVfICk7Ci0gICAgcHJvamVjdC5jcmVhdGUoIGRlc2MsIG51bGwgKTsKLSAgICBwcm9qZWN0Lm9wZW4oIG51bGwgKTsKLSAgfQotICAvKioKLSAgICogQHNlZSBUZXN0Q2FzZSN0ZWFyRG93bigpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24KLSAgewotICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gICAgCi0gICAgLy8gQ3JlYXRlIGEgdGVzdCBwcm9qZWN0IGluIHRoZSB3b3JrYmVuY2gKLSAgICBJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLSAgICBJUHJvamVjdCAgICAgICBwcm9qZWN0ICAgICAgID0gd29ya3NwYWNlUm9vdC5nZXRQcm9qZWN0KCBwcm9qZWN0TmFtZV8gKTsKLSAgICAKLSAgICBwcm9qZWN0LmRlbGV0ZSggdHJ1ZSwgbnVsbCApOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFRlc3QgZ2V0VGVzdCgpCi0gIHsKLSAgICByZXR1cm4gbmV3IEZpbGVTY2hlbWVUZXN0cygiRmlsZVNjaGVtZVRlc3RzIik7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RCYWRVUklzKCkgCi0gIHsKLSAgICBJVVJJU2NoZW1lIHNjaGVtZSAgPSBFbnZpcm9ubWVudFNlcnZpY2UuZ2V0RmlsZVNjaGVtZSgpOwotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIElVUkkgbmV3VVJJID0gc2NoZW1lLm5ld1VSSSggImJvZ3VzOi9zb21lZm9sZGVyL3NvbWVmaWxlLnR4dCIpOwotICAgICAgYXNzZXJ0VHJ1ZSggIk5vbiBmaWxlIHByb3RvY29sIHNob3VsZCBjYXVzZSBhbiBleGNlcHRpb24iLCBmYWxzZSApOwotICAgICAgCi0gICAgICAvLyBUaGlzIGNvZGUgc2hvdWxkIG5ldmVyIHJ1bi4KLSAgICAgIG5ld1VSSS5hc0ZpbGUoKTsKLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICB9ICAgCi0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgSVVSSSBuZXdVUkkgPSBzY2hlbWUubmV3VVJJKCAiOi9zb21lZm9sZGVyL3NvbWVmaWxlLnR4dCIpOwotICAgICAgYXNzZXJ0VHJ1ZSggIk5vbiBmaWxlIHByb3RvY29sIHNob3VsZCBjYXVzZSBhbiBleGNlcHRpb24iLCBmYWxzZSApOwotICAgICAgCi0gICAgICAvLyBUaGlzIGNvZGUgc2hvdWxkIG5ldmVyIHJ1bi4KLSAgICAgIG5ld1VSSS5hc0ZpbGUoKTsKLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICB9ICAgICAgIAotIAotICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJVVJJIG5ld1VSSSA9IHNjaGVtZS5uZXdVUkkoICAoU3RyaW5nKW51bGwgKTsKLSAgICAgIGFzc2VydFRydWUoICJOb24gZmlsZSBwcm90b2NvbCBzaG91bGQgY2F1c2UgYW4gZXhjZXB0aW9uIiwgZmFsc2UgKTsKLSAgICAKLSAgICAgIC8vIFRoaXMgY29kZSBzaG91bGQgbmV2ZXIgcnVuLgotICAgICAgbmV3VVJJLmFzRmlsZSgpOwotICAgIH0KLSAgICBjYXRjaCggVVJJRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgIH0gICAKLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJVVJJIG5ld1VSSSA9IHNjaGVtZS5uZXdVUkkoIChVUkwpbnVsbCApOwotICAgICAgYXNzZXJ0VHJ1ZSggIk5vbiBmaWxlIHByb3RvY29sIHNob3VsZCBjYXVzZSBhbiBleGNlcHRpb24iLCBmYWxzZSApOwotICAgIAotICAgICAgLy8gVGhpcyBjb2RlIHNob3VsZCBuZXZlciBydW4uCi0gICAgICBuZXdVUkkuYXNGaWxlKCk7Ci0gICAgfQotICAgIGNhdGNoKCBVUklFeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgfSAgCi0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgSVVSSSBuZXdVUkkgPSBzY2hlbWUubmV3VVJJKCAoSVVSSSludWxsICk7Ci0gICAgICBhc3NlcnRUcnVlKCAiTm9uIGZpbGUgcHJvdG9jb2wgc2hvdWxkIGNhdXNlIGFuIGV4Y2VwdGlvbiIsIGZhbHNlICk7Ci0gICAgCi0gICAgICAvLyBUaGlzIGNvZGUgc2hvdWxkIG5ldmVyIHJ1bi4KLSAgICAgIG5ld1VSSS5hc0ZpbGUoKTsKLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICB9ICAgICAgIAotICB9IAotICAKLSAgcHVibGljIHZvaWQgdGVzdE5ld1VSSSgpCi0gIHsKLSAgICBJVVJJU2NoZW1lIHNjaGVtZSA9IEVudmlyb25tZW50U2VydmljZS5nZXRGaWxlU2NoZW1lKCkgOwotICAgIAotICAgIHRyeQotICAgIHsgICAgICAKLSAgICAgIElVUkkgdXJpMSA9IHNjaGVtZS5uZXdVUkkoICJmaWxlOi90bXAvbXlmaWxlIiApOwotICAgICAgSVVSSSB1cmkyID0gc2NoZW1lLm5ld1VSSSggInJlbGF0aXZlZGlyZWN0b3J5L3JlbGF0aXZlZmlsZSIgKTsKLSAgICAgIElVUkkgdXJpMyA9IHNjaGVtZS5uZXdVUkkoIHVyaTEgKTsKLSAgICAgIElVUkkgdXJpNCA9IHNjaGVtZS5uZXdVUkkoIHVyaTIgKTsKLSAgICAgIElVUkkgdXJpNSA9IHNjaGVtZS5uZXdVUkkoIG5ldyBVUkwoIHVyaTEuYXNTdHJpbmcoKSApICk7ICAgICAKLSAgICAgIAotICAgICAgRmlsZSBmaWxlMSA9IHVyaTEuYXNGaWxlKCk7Ci0gICAgICAKLSAgICAgIHVyaTEudG91Y2hMZWFmKCk7Ci0gICAgICAKLSAgICAgIGFzc2VydFRydWUoICJJcyBhIGZpbGUiLCBmaWxlMS5pc0ZpbGUoKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggIkZpbGUgbmFtZXMgbm90IHRoZSBzYW1lIiwgdXJpMS5hc1N0cmluZygpLmVxdWFscyggdXJpMy50b1N0cmluZygpICkpOwotICAgICAgYXNzZXJ0VHJ1ZSggIkZpbGUgbmFtZXMgbm90IHRoZSBzYW1lIiwgdXJpMi5hc1N0cmluZygpLmVxdWFscyggdXJpNC50b1N0cmluZygpICkpOwotICAgICAgYXNzZXJ0VHJ1ZSggIkZpbGUgbmFtZXMgbm90IHRoZSBzYW1lIiwgdXJpMS5hc1N0cmluZygpLmVxdWFscyggdXJpNS50b1N0cmluZygpICkpOwotICAgICAgYXNzZXJ0VHJ1ZSggIlByb3RvY29sIG5vdCBmaWxlIiwgdXJpMS5nZXRVUklTY2hlbWUoKS50b1N0cmluZygpLmVxdWFscygiZmlsZSIpKTsKLSAgICAgIGFzc2VydFRydWUoICJQcm90b2NvbCBub3QgZmlsZSIsIHVyaTMuZ2V0VVJJU2NoZW1lKCkudG9TdHJpbmcoKS5lcXVhbHMoImZpbGUiKSk7Ci0gICAgICBhc3NlcnRUcnVlKCAiUHJvdG9jb2wgbm90IGZpbGUiLCB1cmk1LmdldFVSSVNjaGVtZSgpLnRvU3RyaW5nKCkuZXF1YWxzKCJmaWxlIikpOwotICAgICAgYXNzZXJ0VHJ1ZSggIlByb3RvY29sIG5vdCByZWxhdGl2ZSIsIHVyaTIuZ2V0VVJJU2NoZW1lKCkudG9TdHJpbmcoKS5lcXVhbHMoInJlbGF0aXZlIikpOwotICAgICAgYXNzZXJ0VHJ1ZSggIlByb3RvY29sIG5vdCByZWxhdGl2ZSIsIHVyaTQuZ2V0VVJJU2NoZW1lKCkudG9TdHJpbmcoKS5lcXVhbHMoInJlbGF0aXZlIikpOwotICAgICAgCi0gICAgICB1cmkxLmVyYXNlKCk7Ci0gICAgfQotICAgIGNhdGNoKCBVUklFeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgICBhc3NlcnRUcnVlKCAiRXhjZXB0aW9uIHRocm93OiIgKyBleGMuZ2V0TWVzc2FnZSgpLCBmYWxzZSApOwotICAgIH0gICAgIAotICAgIGNhdGNoKCBNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgICBhc3NlcnRUcnVlKCAiRXhjZXB0aW9uIHRocm93OiIgKyBleGMuZ2V0TWVzc2FnZSgpLCBmYWxzZSApOyAgICAgIAotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdEhpZXJhcmNoaWNhbCgpCi0gIHsKLSAgICBJVVJJU2NoZW1lIHNjaGVtZSA9IEVudmlyb25tZW50U2VydmljZS5nZXRGaWxlU2NoZW1lKCkgOwotICAgIAotICAgIGFzc2VydFRydWUoICJOb3QgaGllcmFyY2hpY2FsIiwgc2NoZW1lLmlzSGllcmFyY2hpY2FsKCkgPT0gdHJ1ZSApOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRVUklzKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIElVUklTY2hlbWUgc2NoZW1lID0gRW52aXJvbm1lbnRTZXJ2aWNlLmdldEZpbGVTY2hlbWUoKTsKLSAgICAgIElVUkkgICAgICAgdXJpMSAgID0gc2NoZW1lLm5ld1VSSSggImZpbGU6L3RtcC9zb21lZGlyL3NvbWVmaWxlIiApOwotICAgICAgSVVSSSAgICAgICB1cmkyICAgPSBzY2hlbWUubmV3VVJJKCAiZmlsZTovdG1wIiApOwotICAgICAgSVVSSSAgICAgICB1cmkzICAgPSBzY2hlbWUubmV3VVJJKCAic29tZXJlbCIgKTsKLSAgICAgIElVUkkgICAgICAgdXJpNCAgID0gc2NoZW1lLm5ld1VSSSggInNvbWVyZWwvc29tZW1vcmVyZWwiICk7Ci0gICAgICBJVVJJICAgICAgIHVyaTUgICA9IHNjaGVtZS5uZXdVUkkoICIuL3NvbWVyZWwvc29tZW1vcmUiICk7Ci0gICAgCi0gICAgICBhc3NlcnRUcnVlKCAiVVJJIG5vdCB2YWxpZCIsIHNjaGVtZS5pc1ZhbGlkKCB1cmkxICkgKTsKLSAgICAgIGFzc2VydFRydWUoICJVUkkgbm90IHZhbGlkIiwgc2NoZW1lLmlzVmFsaWQoIHVyaTIgKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggIlVSSSBub3QgdmFsaWQiLCBzY2hlbWUuaXNWYWxpZCggdXJpMyApICk7Ci0gICAgICBhc3NlcnRUcnVlKCAiVVJJIG5vdCB2YWxpZCIsIHNjaGVtZS5pc1ZhbGlkKCB1cmk0ICkgKTsKLSAgICAgIGFzc2VydFRydWUoICJVUkkgbm90IHZhbGlkIiwgc2NoZW1lLmlzVmFsaWQoIHVyaTUgKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggIlVSSSBoYXMgbm90IHZhbGlkIHN0YXR1cyIsIHNjaGVtZS52YWxpZGF0ZSggdXJpMSApLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5PSyApOwotICAgICAgYXNzZXJ0VHJ1ZSggIlVSSSBoYXMgbm90IHZhbGlkIHN0YXR1cyIsIHNjaGVtZS52YWxpZGF0ZSggdXJpMiApLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5PSyApOwotICAgICAgYXNzZXJ0VHJ1ZSggIlVSSSBoYXMgbm90IHZhbGlkIHN0YXR1cyIsIHNjaGVtZS52YWxpZGF0ZSggdXJpMyApLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5PSyApOwotICAgICAgYXNzZXJ0VHJ1ZSggIlVSSSBoYXMgbm90IHZhbGlkIHN0YXR1cyIsIHNjaGVtZS52YWxpZGF0ZSggdXJpNCApLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5PSyApOwotICAgICAgYXNzZXJ0VHJ1ZSggIlVSSSBoYXMgbm90IHZhbGlkIHN0YXR1cyIsIHNjaGVtZS52YWxpZGF0ZSggdXJpNSApLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5PSyApOwotICAgIH0KLSAgICBjYXRjaCggVVJJRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgYXNzZXJ0VHJ1ZSggIkV4Y2VwdGlvbiB0aHJvdzoiICsgZXhjLmdldE1lc3NhZ2UoKSwgZmFsc2UgKTsgICAgICAKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkVVJJcygpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJVVJJU2NoZW1lIGVjbGlwc2VTY2hlbWUgPSBFbnZpcm9ubWVudFNlcnZpY2UuZ2V0RWNsaXBzZVNjaGVtZSgpOwotICAgICAgSVVSSVNjaGVtZSBmaWxlU2NoZW1lICAgID0gRW52aXJvbm1lbnRTZXJ2aWNlLmdldEZpbGVTY2hlbWUoKTsKLSAgICAgIAotICAgICAgSVVSSSAgICAgICB1cmkxICAgPSBlY2xpcHNlU2NoZW1lLm5ld1VSSSggInBsYXRmb3JtOi9yZXNvdXJjZS9zb21lZGlyL3NvbWVmaWxlIiApOwotICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggIlVSSSB2YWxpZCIsICFmaWxlU2NoZW1lLmlzVmFsaWQoIHVyaTEgKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggIlVSSSBoYXMgYSB2YWxpZCBzdGF0dXMiLCBmaWxlU2NoZW1lLnZhbGlkYXRlKCB1cmkxICkuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SICk7Ci0gICAgfQotICAgIGNhdGNoKCBVUklFeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgICBhc3NlcnRUcnVlKCAiRXhjZXB0aW9uIHRocm93OiIgKyBleGMuZ2V0TWVzc2FnZSgpLCBmYWxzZSApOyAgICAgIAotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3Rlc3RzL0ZpbGVVUklUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3Rlc3RzL0ZpbGVVUklUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWYwNWIxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC90ZXN0cy9GaWxlVVJJVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjAyMTcgICAxMjg0NTYgcG1vb2drQGNhLmlibS5jb20gLSBQZXRlciBNb29nawotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudGVzdHM7Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5FbnZpcm9ubWVudFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUklTY2hlbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuVVJJRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgRmlsZVVSSVRlc3RzIGV4dGVuZHMgVGVzdENhc2UKLXsgIAotICBwcml2YXRlIEZpbGUgIHRlbXBGaWxlOwotICBwcml2YXRlIEZpbGUgIHRlbXBEaXI7Ci0gIAotICBwdWJsaWMgRmlsZVVSSVRlc3RzKFN0cmluZyBuYW1lKQotICB7Ci0gICAgc3VwZXIobmFtZSk7Ci0gIH0KLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKLSAgewotICAgIGlmIChhcmdzLmxlbmd0aCA9PSAwKQotICAgIHsKLSAgICAgIHJ1bkFsbCgpOwotICAgIH0KLSAgICBlbHNlIGlmIChhcmdzLmxlbmd0aCA9PSAxKQotICAgIHsKLSAgICAgIFN0cmluZyBtZXRob2RUb1J1biA9IGFyZ3NbMF0udHJpbSgpOwotICAgICAgcnVuT25lKG1ldGhvZFRvUnVuKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoRmlsZVVSSVRlc3RzLmNsYXNzKTsKLSAgfQotCi0gIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBydW5BbGwoKQotICB7Ci0gICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIHJ1bk9uZShTdHJpbmcgbWV0aG9kTmFtZSkKLSAgewotICAgIFRlc3RTdWl0ZSB0ZXN0U3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0gICAgVGVzdENhc2UgdGVzdCA9IG5ldyBGaWxlVVJJVGVzdHMobWV0aG9kTmFtZSk7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCJDYWxsaW5nIEZpbGVVUklUZXN0cy4iK21ldGhvZE5hbWUpOwotICAgIHRlc3RTdWl0ZS5hZGRUZXN0KHRlc3QpOwotICAgIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLnJ1bih0ZXN0U3VpdGUpOwotICB9Ci0gIAotICAvKioKLSAgICogQHNlZSBUZXN0Q2FzZSNzZXRVcCgpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24KLSAgewotICAgIHN1cGVyLnNldFVwKCk7ICAKLSAgICAKLSAgICB0ZW1wRmlsZSAgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJ0bXAiLCAidG1wIiwgbnVsbCApOwotICAgIHRlbXBEaXIgICA9IG5ldyBGaWxlKCB0ZW1wRmlsZS5nZXRQYXJlbnRGaWxlKCksICJ0bXBEaXIiICk7Ci0gICAgdGVtcERpci5ta2RpcigpOwotICB9Ci0gIAotICAvKioKLSAgICogQHNlZSBUZXN0Q2FzZSN0ZWFyRG93bigpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24KLSAgewotICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gICAgCi0gICAgZGVsZXRlRmlsZXMoIHRlbXBEaXIgKTsKLSAgICB0ZW1wRmlsZS5kZWxldGUoKTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGRlbGV0ZUZpbGVzKCBGaWxlIGRpcmVjdG9yeSApCi0gIHsKLQlpZiAoZGlyZWN0b3J5ICE9IG51bGwpIHsKLQkJCUZpbGVbXSBjaGlsZHJlbiA9IGRpcmVjdG9yeS5saXN0RmlsZXMoKTsKLQotCQkJLyoKLQkJCSAqIElmICdkaXJlY3RvcnknIGlzIG5vdCBhIGRpcmVjdG9yeSwgZGlyZWN0b3J5Lmxpc3RGaWxlcyBjYW4KLQkJCSAqIHJldHVybiBudWxsLgotCQkJICovCi0JCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBjaGlsZHJlbi5sZW5ndGg7IGluZGV4KyspIHsKLQkJCQkJRmlsZSBjaGlsZCA9IGNoaWxkcmVuW2luZGV4XTsKLQotCQkJCQlpZiAoY2hpbGQuaXNEaXJlY3RvcnkoKSkgewotCQkJCQkJZGVsZXRlRmlsZXMoY2hpbGQpOwotCQkJCQl9Ci0KLQkJCQkJY2hpbGQuZGVsZXRlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0gIH0KLSAgCi0gIHByaXZhdGUgU3RyaW5nIGdldFRtcEZpbGVVUkwoIFN0cmluZyBmaWxlTmFtZSApCi0gIHsKLSAgICBGaWxlIG5ld0ZpbGUgPSBuZXcgRmlsZSggdGVtcERpciwgZmlsZU5hbWUgKTsgIAotICAgIAotICAgIHJldHVybiAiZmlsZTovIiArIG5ld0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgVGVzdCBnZXRUZXN0KCkKLSAgewotICAgIHJldHVybiBuZXcgRmlsZVVSSVRlc3RzKCJGaWxlVVJJVGVzdHMiKTsKLSAgfQotICBwdWJsaWMgdm9pZCB0ZXN0QXZhaWxhYmxlKCkgCi0gIHsKLSAgICBJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgPSBFbnZpcm9ubWVudFNlcnZpY2UuZ2V0RWNsaXBzZUNvbnNvbGVFbnZpcm9ubWVudCgpOwotICAgIElVUklGYWN0b3J5ICBmYWN0b3J5ICAgICA9IGVudmlyb25tZW50LmdldFVSSUZhY3RvcnkoKTsKLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZpbGVVUklUZXN0cy50ZXN0QXZhaWxhYmxlKCkiKTsKLSAgICAKLSAgICB0cnkKLSAgICB7ICAgICAgCi0gICAgICBJVVJJIHVyaTIgPSBmYWN0b3J5Lm5ld1VSSSggZ2V0VG1wRmlsZVVSTCggInNvbWVmaWxlIiApICk7Ci0gICAgICBJVVJJIHVyaTMgPSBmYWN0b3J5Lm5ld1VSSSggInJlbGF0aXZlZGlyZWN0b3J5L3JlbGF0aXZlZmlsZSIgKTsKLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggIk5vdCBhdmFpbGFibGUgYXMgVVJMIiwgdXJpMi5pc0F2YWlsYWJsZUFzVVJMKCkgKTsKLSAgICAgIGFzc2VydFRydWUoICJBdmFpbGFibGUgYXMgVVJMIiwgIXVyaTMuaXNBdmFpbGFibGVBc1VSTCgpICk7Ci0gICAgICAKLSAgICAgIGFzc2VydFRydWUoICJOb3QgYXZhaWxhYmxlIGFzIEZpbGUiLCB1cmkyLmlzQXZhaWxhYmxlQXNGaWxlKCkgKTsKLSAgICAgIGFzc2VydFRydWUoICJBdmFpbGFibGUgYXMgRmlsZSIsICF1cmkzLmlzQXZhaWxhYmxlQXNGaWxlKCkgKTsKLSAgICAgIAotICAgICAgRmlsZSBmaWxlMiA9IHVyaTIuYXNGaWxlKCk7Ci0gICAgICBVUkwgIHVybDIgID0gdXJpMi5hc1VSTCgpOwotICAgICAgCi0gICAgICB1cmkyLnRvdWNoTGVhZigpOwotICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAiSXMgYSBmaWxlIiwgZmlsZTIuaXNGaWxlKCkgKTsKLSAgICAgIGFzc2VydFRydWUoICJXcm9uZyBwcm90b2NvbCIsIHVybDIuZ2V0UHJvdG9jb2woKS5lcXVhbHMoICJmaWxlIiApKTsKLSAgICAgIGFzc2VydFRydWUoIHVyaTIuYXNTdHJpbmcoKS5sZW5ndGgoKSA+IDUgKTsKLSAgICAgIGFzc2VydFRydWUoIHVyaTIudG9TdHJpbmcoKS5sZW5ndGgoKSA+IDUgKTsKLSAgICAgIHVyaTIuZXJhc2UoKTsKLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICAgIGFzc2VydFRydWUoICJFeGNlcHRpb24gdGhyb3c6IiArIGV4Yy5nZXRNZXNzYWdlKCksIGZhbHNlICk7Ci0gICAgfQotICB9ICAgICAgCi0gICAgICAgIAotICBwdWJsaWMgdm9pZCB0ZXN0VG91Y2hGb2xkZXIoKSAKLSAgewotICAgIElFbnZpcm9ubWVudCBlbnZpcm9ubWVudCA9IEVudmlyb25tZW50U2VydmljZS5nZXRFY2xpcHNlQ29uc29sZUVudmlyb25tZW50KCk7Ci0gICAgSVVSSUZhY3RvcnkgIGZhY3RvcnkgICAgID0gZW52aXJvbm1lbnQuZ2V0VVJJRmFjdG9yeSgpOwotICAgIAotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmlsZVVSSVRlc3RzLnRlc3RUb3VjaEZvbGRlcigpIik7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgRmlsZSAgZm9sZGVyUGF0aCAgPSBuZXcgRmlsZSggdGVtcERpciwgInRvcEZvbGRlciIgKTsKLSAgICAgIEZpbGUgIGZvbGRlclBhdGgyID0gbmV3IEZpbGUoIGZvbGRlclBhdGgsICJzcGFjZSBmb2xkZXIiICk7Ci0gICAgICBJVVJJICAgdXJpICAgICAgICA9IGZhY3RvcnkubmV3VVJJKCBmb2xkZXJQYXRoLnRvVVJMKCkudG9TdHJpbmcoKSApOwotICAgICAgSVVSSSAgIHVyaTIgICAgICAgPSBmYWN0b3J5Lm5ld1VSSSggZm9sZGVyUGF0aDIudG9VUkwoKS50b1N0cmluZygpICApOwotICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAidG9wRm9sZGVyIHNob3VsZCBub3QgZXhpc3QiLCAhdXJpLmlzUHJlc2VudCgpICk7Ci0gICAgICAKLSAgICAgIHVyaS50b3VjaEZvbGRlcigpOwotICAgCi0gICAgICBhc3NlcnRUcnVlKCAidG9wRm9sZGVyIHNob3VsZCBleGlzdCIsIHVyaS5pc1ByZXNlbnQoKSApOwotICAgICAgCi0gICAgICBGaWxlIG5lc3RlZFBhdGggPSBuZXcgRmlsZSggbmV3IEZpbGUoIGZvbGRlclBhdGgsICJsZXZlbDEiICksICJsZXZlbDIiICk7Ci0gICAgICBJVVJJIG5lc3RlZHVyaSAgPSBmYWN0b3J5Lm5ld1VSSSggbmVzdGVkUGF0aC50b1VSTCgpLnRvU3RyaW5nKCkgKTsKLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggIm5lc3RlZEZvbGRlciBzaG91bGQgbm90IGV4aXN0IiwgIW5lc3RlZHVyaS5pc1ByZXNlbnQoKSApOwotICAgICAgCi0gICAgICBuZXN0ZWR1cmkudG91Y2hGb2xkZXIoKTsKLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggIm5lc3RlZEZvbGRlciBzaG91bGQgZXhpc3QiLCBuZXN0ZWR1cmkuaXNQcmVzZW50KCkgKTsKLSAgICAgIAotICAgICAgSVVSSSBjaGlsZDEgPSB1cmkyLmFwcGVuZCggZmFjdG9yeS5uZXdVUkkoICJjaGlsZDEiICkgKTsKLSAgICAgIElVUkkgY2hpbGQyID0gdXJpMi5hcHBlbmQoIGZhY3RvcnkubmV3VVJJKCAiY2hpbGQyIiApICk7Ci0gICAgICAKLSAgICAgIGNoaWxkMS50b3VjaExlYWYoKTsKLSAgICAgIGNoaWxkMi50b3VjaExlYWYoKTsKLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSAoICJDaGlsZCAxIGluIGJsYW5rIGZvbGRlciBzaG91bGQgZXhpc3QgIiwgY2hpbGQxLmlzUHJlc2VudCgpICk7Ci0gICAgICBhc3NlcnRUcnVlICggIkNoaWxkIDIgaW4gYmxhbmsgZm9sZGVyIHNob3VsZCBleGlzdCAiLCBjaGlsZDIuaXNQcmVzZW50KCkgKTsKLSAgICAgfQotICAgIGNhdGNoKCBVUklFeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgICBhc3NlcnRUcnVlKCAiRXhjZXB0aW9uIHRocm93OiIgKyBleGMuZ2V0TWVzc2FnZSgpLCBmYWxzZSApOwotICAgIH0KLSAgICBjYXRjaCggTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgYXNzZXJ0VHJ1ZSggIkV4Y2VwdGlvbiB0aHJvdzoiICsgZXhjLmdldE1lc3NhZ2UoKSwgZmFsc2UgKTsgIAotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdExpc3QoKSAKLSAgewotICAgIElFbnZpcm9ubWVudCAgZW52aXJvbm1lbnQgPSBFbnZpcm9ubWVudFNlcnZpY2UuZ2V0RWNsaXBzZUNvbnNvbGVFbnZpcm9ubWVudCgpOwotICAgIElVUklGYWN0b3J5ICAgZmFjdG9yeSAgICAgPSBlbnZpcm9ubWVudC5nZXRVUklGYWN0b3J5KCk7Ci0gICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCJGaWxlVVJJVGVzdHMudGVzdExpc3QoKSIpOwotICAgIHRyeQotICAgIHsKLSAgICAgIEZpbGUgZm9sZGVyUGF0aDAgPSBuZXcgRmlsZSggdGVtcERpciwgInRvcEZvbGRlcjIiICk7Ci0gICAgICBGaWxlIGZvbGRlclBhdGgxID0gbmV3IEZpbGUoIG5ldyBGaWxlKCB0ZW1wRGlyLCAidG9wRm9sZGVyMiIgKSwgImxlYWYxIiApOwotICAgICAgRmlsZSBmb2xkZXJQYXRoMiA9IG5ldyBGaWxlKCBuZXcgRmlsZSggdGVtcERpciwgInRvcEZvbGRlcjIiICksICJsZWFmMiIgKTsKLSAgICAgIEZpbGUgZm9sZGVyUGF0aDMgPSBuZXcgRmlsZSggbmV3IEZpbGUoIHRlbXBEaXIsICJ0b3BGb2xkZXIyIiApLCAibGVhZjMiICk7Ci0gICAgICBJVVJJICAgdXJpMCAgICAgICAgPSBmYWN0b3J5Lm5ld1VSSSggZm9sZGVyUGF0aDAudG9VUkwoKS50b1N0cmluZygpICk7Ci0gICAgICBJVVJJICAgdXJpMSAgICAgICAgPSBmYWN0b3J5Lm5ld1VSSSggZm9sZGVyUGF0aDEudG9VUkwoKS50b1N0cmluZygpICk7Ci0gICAgICBJVVJJICAgdXJpMiAgICAgICAgPSBmYWN0b3J5Lm5ld1VSSSggZm9sZGVyUGF0aDIudG9VUkwoKS50b1N0cmluZygpICk7Ci0gICAgICBJVVJJICAgdXJpMyAgICAgICAgPSBmYWN0b3J5Lm5ld1VSSSggZm9sZGVyUGF0aDMudG9VUkwoKS50b1N0cmluZygpICk7Ci0gICAgICAKLSAgICAgIHVyaTEudG91Y2hGb2xkZXIoKTsKLSAgICAgIHVyaTIudG91Y2hGb2xkZXIoKTsKLSAgICAgIHVyaTMudG91Y2hGb2xkZXIoKTsKLSAgICAgIAotICAgICAgSVVSSVtdIGJhYmllcyA9IHVyaTAubGlzdCgpOwotICAgICAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggImZvbGRlciBwYXRoIHNob3VsZCBoYXZlIDMgY2hpbGRyZW4iLCBiYWJpZXMubGVuZ3RoID09IDMgKTsKLSAgICAgIAotICAgICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IGJhYmllcy5sZW5ndGg7IGluZGV4KysgKQotICAgICAgewotICAgICAgICBTdHJpbmcgIGZvbGRlck5hbWUgPSBiYWJpZXNbaW5kZXhdLnRvU3RyaW5nKCk7Ci0gICAgICAgIFN0cmluZyAgbGVhZk5hbWUgICA9IGZvbGRlck5hbWUuc3Vic3RyaW5nKCBmb2xkZXJOYW1lLmxlbmd0aCgpIC0gNSwgZm9sZGVyTmFtZS5sZW5ndGgoKSApOwotICAgICAgICBib29sZWFuIE9rICAgICAgICAgPSBsZWFmTmFtZS5lcXVhbHMoICJsZWFmMSIpIHx8IGxlYWZOYW1lLmVxdWFscyggImxlYWYyIiApIHx8IGxlYWZOYW1lLmVxdWFscyggImxlYWYzIiApOwotICAgICAgICBhc3NlcnRUcnVlKCAiV3JvbmcgbGVhZiBiYWJ5IHVyaToiICsgZm9sZGVyTmFtZSArICIsIiArIGxlYWZOYW1lLCBPayApOwotICAgICAgfQotICAgICAgCi0gICAgICBJVVJJW10gYmFiaWVzMiA9IHVyaTAubGlzdCggbmV3IElVUklGaWx0ZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHRzKCBJVVJJIHVyaSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIXVyaS50b1N0cmluZygpLmVuZHNXaXRoKCAibGVhZjIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSApOwotICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAiZm9sZGVyIHBhdGggc2hvdWxkIGhhdmUgMiBmaWx0ZXJlZCBjaGlsZHJlbiIsIGJhYmllczIubGVuZ3RoID09IDIgKTsKLSAgICAgIAotICAgICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IGJhYmllczIubGVuZ3RoOyBpbmRleCsrICkKLSAgICAgICB7Ci0gICAgICAgIFN0cmluZyAgZm9sZGVyTmFtZSA9IGJhYmllczJbaW5kZXhdLnRvU3RyaW5nKCk7Ci0gICAgICAgIFN0cmluZyAgbGVhZk5hbWUgICA9IGZvbGRlck5hbWUuc3Vic3RyaW5nKCBmb2xkZXJOYW1lLmxlbmd0aCgpIC0gNSwgZm9sZGVyTmFtZS5sZW5ndGgoKSApOwotICAgICAgICBib29sZWFuIE9rICAgICAgICAgPSBsZWFmTmFtZS5lcXVhbHMoICJsZWFmMSIpIHx8IGxlYWZOYW1lLmVxdWFscyggImxlYWYzIiApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0VHJ1ZSggIldyb25nIGxlYWYgYmFieSB1cmk6IiArIGZvbGRlck5hbWUgKyAiLCIgKyBsZWFmTmFtZSwgT2sgKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICAgIGFzc2VydFRydWUoICJFeGNlcHRpb24gdGhyb3c6IiArIGV4Yy5nZXRNZXNzYWdlKCksIGZhbHNlICk7Ci0gICAgfQotICAgIGNhdGNoKCBNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgICBhc3NlcnRUcnVlKCAiRXhjZXB0aW9uIHRocm93OiIgKyBleGMuZ2V0TWVzc2FnZSgpLCBmYWxzZSApOyAgCi0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0R2V0VVJJU2NoZW1lKCkKLSAgewotICAgIElFbnZpcm9ubWVudCBlbnZpcm9ubWVudCA9IEVudmlyb25tZW50U2VydmljZS5nZXRFY2xpcHNlQ29uc29sZUVudmlyb25tZW50KCk7Ci0gICAgSVVSSUZhY3RvcnkgIGZhY3RvcnkgICAgID0gZW52aXJvbm1lbnQuZ2V0VVJJRmFjdG9yeSgpOwotICAgCi0gICAgdHJ5Ci0gICAgeyAKLSAgICAgIEZpbGUgICAgICAgZm9sZGVyUGF0aDAgID0gbmV3IEZpbGUoIHRlbXBEaXIsICJ0ZXN0R2V0U2NoZW1lIiApOwotICAgICAgSVVSSSAgICAgICB1cmkwICAgICAgICAgPSBmYWN0b3J5Lm5ld1VSSSggZm9sZGVyUGF0aDAudG9VUkwoKS50b1N0cmluZygpICk7Ci0gICAgICBJVVJJU2NoZW1lIHNjaGVtZSAgICAgICA9IHVyaTAuZ2V0VVJJU2NoZW1lKCk7Ci0gICAgICAKLSAgICAgIGFzc2VydFRydWUoICJTY2hlbWUgbmFtZSBpcyBub3QgZmlsZSIsIHNjaGVtZS50b1N0cmluZygpLmVxdWFscyggImZpbGUiICkgKTsKLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICAgIGFzc2VydFRydWUoICJVbmV4cGVjdGVkIGV4Y2VwdGlvbiIsIGZhbHNlICk7Ci0gICAgfQotICAgIGNhdGNoKCBNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgICBhc3NlcnRUcnVlKCAiRXhjZXB0aW9uIHRocm93OiIgKyBleGMuZ2V0TWVzc2FnZSgpLCBmYWxzZSApOyAgCi0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0QXBwZW5kKCkgCi0gIHsKLSAgICBJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgPSBFbnZpcm9ubWVudFNlcnZpY2UuZ2V0RWNsaXBzZUNvbnNvbGVFbnZpcm9ubWVudCgpOwotICAgIElVUklGYWN0b3J5ICBmYWN0b3J5ICAgICA9IGVudmlyb25tZW50LmdldFVSSUZhY3RvcnkoKTsKLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZpbGVVUklUZXN0cy50ZXN0QXBwZW5kKCkiKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBGaWxlIGZvbGRlclBhdGgwICA9IG5ldyBGaWxlKCB0ZW1wRGlyLCAidG9wRm9sZGVyMyIgKTsKLSAgICAgIElVUkkgICB1cmkwICAgICAgICAgPSBmYWN0b3J5Lm5ld1VSSSggZm9sZGVyUGF0aDAudG9VUkwoKS50b1N0cmluZygpICk7Ci0gICAgICBJVVJJICAgdXJpUmVsYXRpdmUxID0gZmFjdG9yeS5uZXdVUkkoICJsZXZlbDEiKTsKLSAgICAgIElVUkkgICB1cmlSZWxhdGl2ZTIgPSBmYWN0b3J5Lm5ld1VSSSggImxldmVsMiIpOwotICAgICAgCi0gICAgICBJVVJJICAgbmV3VVJJICAgICAgID0gdXJpMC5hcHBlbmQoIHVyaVJlbGF0aXZlMSApLmFwcGVuZCggdXJpUmVsYXRpdmUyICk7Ci0gICAgICAKLSAgICAgIGFzc2VydFRydWUoICJuZXdVUkkgc2hvdWxkIG5vdCBleGlzdCIsICFuZXdVUkkuaXNQcmVzZW50KCkgKTsKLSAgICAgIAotICAgICAgbmV3VVJJLnRvdWNoRm9sZGVyKCk7Ci0gICAgICAKLSAgICAgIGFzc2VydFRydWUoICJuZXdVUkkgc2hvdWxkIGV4aXN0IiwgbmV3VVJJLmlzUHJlc2VudCgpICk7Ci0gICAgICBhc3NlcnRUcnVlKCAibmV3VVJJIHNob3VsZCBub3QgYmUgYSBsZWFmIiwgIW5ld1VSSS5pc0xlYWYoKSApOwotICAgICAgCi0gICAgICAvLyBFbnN1cmUgdGhhdCBhcHBlbmQgcGFyYW1ldGVyIGlzIHJlbGF0aXZlLgotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIElVUkkgbmV3VVJJMiA9IHVyaTAuYXBwZW5kKCB1cmkwICk7ICAKLSAgICAgICAgYXNzZXJ0VHJ1ZSggIkFwcGVuZGluZyB1c2luZyBhIG5vbi1yZWxhdGl2ZSBzaG91bGQgdGhyb3cgYW5kIGV4Y2VwdGlvbiIsIHRydWUgKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRoaXMgY29kZSBzaG91bGQgbmV2ZXIgcnVuLgotICAgICAgICBuZXdVUkkyLmFzRmlsZSgpOyAKLSAgICAgIH0KLSAgICAgIGNhdGNoKCBVUklFeGNlcHRpb24gZXhjICkKLSAgICAgIHsKLSAgICAgIH0KLSAgICAgIAotICAgIH0KLSAgICBjYXRjaCggVVJJRXhjZXB0aW9uIGV4YyApCi0gICAgeyAgIAotICAgICAgYXNzZXJ0VHJ1ZSggIkV4Y2VwdGlvbiB0aHJvdzoiICsgZXhjLmdldE1lc3NhZ2UoKSwgZmFsc2UgKTsKLSAgICB9Ci0gICAgY2F0Y2goIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICAgIGFzc2VydFRydWUoICJFeGNlcHRpb24gdGhyb3c6IiArIGV4Yy5nZXRNZXNzYWdlKCksIGZhbHNlICk7ICAKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RUb3VjaExlYWYoKQotICB7Ci0gICAgSUVudmlyb25tZW50IGVudmlyb25tZW50ID0gRW52aXJvbm1lbnRTZXJ2aWNlLmdldEVjbGlwc2VDb25zb2xlRW52aXJvbm1lbnQoKTsKLSAgICBJVVJJRmFjdG9yeSAgZmFjdG9yeSAgICAgPSBlbnZpcm9ubWVudC5nZXRVUklGYWN0b3J5KCk7Ci0gICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCJGaWxlVVJJVGVzdHMudGVzdFRvdWNoTGVhZigpIik7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgRmlsZSAgIGZvbGRlclBhdGgwICA9IG5ldyBGaWxlKCB0ZW1wRGlyLCAidG9wRm9sZGVyNCIgKTsKLSAgICAgIElVUkkgICB1cmkwICAgICAgICAgPSBmYWN0b3J5Lm5ld1VSSSggZm9sZGVyUGF0aDAudG9VUkwoKS50b1N0cmluZygpICk7Ci0gICAgICBJVVJJICAgdXJpUmVsYXRpdmUxID0gZmFjdG9yeS5uZXdVUkkoICJsZXZlbDEiKTsKLSAgICAgIElVUkkgICB1cmlSZWxhdGl2ZTIgPSBmYWN0b3J5Lm5ld1VSSSggImxlYWZGaWxlLnR4dCIpOwotICAgICAgSVVSSSAgIG5ld1VSSSAgICAgICA9IHVyaTAuYXBwZW5kKCB1cmlSZWxhdGl2ZTEgKS5hcHBlbmQoIHVyaVJlbGF0aXZlMiApOwotICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAibmV3VVJJIHNob3VsZCBub3QgZXhpc3QiLCAhbmV3VVJJLmlzUHJlc2VudCgpICk7Ci0gICAgICAKLSAgICAgIG5ld1VSSS50b3VjaExlYWYoKTsKLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggIm5ld1VSSSBzaG91bGQgZXhpc3QiLCBuZXdVUkkuaXNQcmVzZW50KCkgKTsKLSAgICAgIGFzc2VydFRydWUoICJuZXdVUkkgc2hvdWxkIGJlIGEgbGVhZiIsIG5ld1VSSS5pc0xlYWYoKSApOwotICAgICAgCi0gICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gICA9IG5ld1VSSS5nZXRJbnB1dFN0cmVhbSgpOwotICAgICAgaW50ICAgICAgICAgYnl0ZVJlYWQgPSAwOwotICAgICAgCi0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgYnl0ZVJlYWQgPSBzdHJlYW0ucmVhZCgpOyAvLyBSZXR1cm5zIGEgLTEgaWYgbm8gYnl0ZXMgYXJlIHJlYWQsIHdoaWNoIHNob3VsZCBiZSB0aGUgY2FzZSBoZXJlLiAKLSAgICAgIH0KLSAgICAgIGNhdGNoKCBJT0V4Y2VwdGlvbiBleGMgKQotICAgICAgewotICAgICAgICBhc3NlcnRUcnVlKCAiRXhjZXB0aW9uIHRocm93OiIgKyBleGMuZ2V0TWVzc2FnZSgpLCBmYWxzZSApOwotICAgICAgfQotICAgICAgZmluYWxseQotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIHN0cmVhbS5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBJT0V4Y2VwdGlvbiBleGMgKQotICAgICAgICB7Ci0gICAgICAgICAgYXNzZXJ0VHJ1ZSggIkV4Y2VwdGlvbiB0aHJvdzoiICsgZXhjLmdldE1lc3NhZ2UoKSwgZmFsc2UgKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAiVGhlcmUgc2hvdWxkIGJlIG5vIGJ5dGVzIGluIHRoaXMgc3RyZWFtIiwgIGJ5dGVSZWFkID09IC0xICk7Ci0gICAgICAKLSAgICAgfQotICAgIGNhdGNoKCBVUklFeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgICBhc3NlcnRUcnVlKCAiRXhjZXB0aW9uIHRocm93OiIgKyBleGMuZ2V0TWVzc2FnZSgpLCBmYWxzZSApOwotICAgIH0gICAgIAotICAgIGNhdGNoKCBNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgICBhc3NlcnRUcnVlKCAiRXhjZXB0aW9uIHRocm93OiIgKyBleGMuZ2V0TWVzc2FnZSgpLCBmYWxzZSApOyAgCi0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0SU9PcGVyYXRpb25zKCkKLSAgewotICAgIElFbnZpcm9ubWVudCBlbnZpcm9ubWVudCA9IEVudmlyb25tZW50U2VydmljZS5nZXRFY2xpcHNlQ29uc29sZUVudmlyb25tZW50KCk7Ci0gICAgSVVSSUZhY3RvcnkgIGZhY3RvcnkgICAgID0gZW52aXJvbm1lbnQuZ2V0VVJJRmFjdG9yeSgpOwotICAgIE91dHB1dFN0cmVhbVdyaXRlciAgICAgICBzdHJlYW0gICAgICA9IG51bGw7Ci0gICAgUHJpbnRXcml0ZXIgICAgICAgICAgICAgIHdyaXRlciAgICAgID0gbnVsbDsKLSAgICBJbnB1dFN0cmVhbVJlYWRlciAgICAgICAgaW5wdXRTdHJlYW0gPSBudWxsOwotICAgIEJ1ZmZlcmVkUmVhZGVyICAgICAgICAgICByZWFkZXIgICAgICA9IG51bGw7Ci0gICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCJGaWxlVVJJVGVzdHMudGVzdElPT3BlcmF0aW9ucygpIik7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgRmlsZSBmb2xkZXJQYXRoMCAgICA9IG5ldyBGaWxlKCB0ZW1wRGlyLCAidG9wRm9sZGVyNSIgKTsKLSAgICAgIElVUkkgICB1cmkwICAgICAgICAgPSBmYWN0b3J5Lm5ld1VSSSggZm9sZGVyUGF0aDAudG9VUkwoKS50b1N0cmluZygpICk7Ci0gICAgICBJVVJJICAgdXJpUmVsYXRpdmUxID0gZmFjdG9yeS5uZXdVUkkoICJsZXZlbDEiKTsKLSAgICAgIElVUkkgICB1cmlSZWxhdGl2ZTIgPSBmYWN0b3J5Lm5ld1VSSSggImxlYWZGaWxlLnR4dCIpOwotICAgICAgSVVSSSAgIG5ld1VSSSAgICAgICA9IHVyaTAuYXBwZW5kKCB1cmlSZWxhdGl2ZTEgKS5hcHBlbmQoIHVyaVJlbGF0aXZlMiApOwotICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAibmV3VVJJIHNob3VsZCBub3QgZXhpc3QiLCAhbmV3VVJJLmlzUHJlc2VudCgpICk7Ci0gICAgICBhc3NlcnRUcnVlKCAibmV3VVJJIHNob3VsZCBub3QgYmUgcmVhZGFibGUiLCAhbmV3VVJJLmlzUmVhZGFibGUoKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggIm5ld1VSSSBzaG91bGQgYmUgd3JpdGFibGUiLCAhbmV3VVJJLmlzV3JpdGFibGUoKSApOwotICAgICAgCi0gICAgICBzdHJlYW0gPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKCBuZXdVUkkuZ2V0T3V0cHV0U3RyZWFtKCkgKTsKLSAgICAgIHdyaXRlciA9IG5ldyBQcmludFdyaXRlciggc3RyZWFtICk7Ci0gICAgICAKLSAgICAgIHdyaXRlci5wcmludGxuKCAiVGhpcyBpcyBsaW5lIDEgb2YgdGhlIGZpbGUuIiApOyAKLSAgICAgIHdyaXRlci5wcmludGxuKCAiVGhpcyBpcyBsaW5lIDIgb2YgdGhlIGZpbGUuIiApOwotICAgICAgd3JpdGVyLnByaW50bG4oICJUaGlzIGlzIHRoZSBlbmQgb2YgdGhlIGZpbGUuIiApOwotICAgICAgCi0gICAgICB3cml0ZXIuY2xvc2UoKTsKLSAgICAgIHN0cmVhbS5jbG9zZSgpOwotICAgICAgd3JpdGVyID0gbnVsbDsKLSAgICAgIHN0cmVhbSA9IG51bGw7Ci0gICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggIm5ld1VSSSBzaG91bGQgYmUgcmVhZGFibGUiLCBuZXdVUkkuaXNSZWFkYWJsZSgpICk7Ci0gICAgICBhc3NlcnRUcnVlKCAibmV3VVJJIHNob3VsZCBiZSB3cml0YWJsZSIsIG5ld1VSSS5pc1dyaXRhYmxlKCkgKTsKLSAgICAgIAotICAgICAgLy8gTm93IHJlYWQgYmFjayB0aGlzIG5ldyBmaWxlLgotICAgICAgaW5wdXRTdHJlYW0gPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoIG5ld1VSSS5nZXRJbnB1dFN0cmVhbSgpICk7Ci0gICAgICByZWFkZXIgICAgICA9IG5ldyBCdWZmZXJlZFJlYWRlciggaW5wdXRTdHJlYW0gKTsKLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggIkJhZCBmaXJzdCBsaW5lIG9mIGZpbGUiLCByZWFkZXIucmVhZExpbmUoKS5lcXVhbHMoIlRoaXMgaXMgbGluZSAxIG9mIHRoZSBmaWxlLiIpICk7IAotICAgICAgYXNzZXJ0VHJ1ZSggIkJhZCBzZWNvbmQgbGluZSBvZiBmaWxlIiwgcmVhZGVyLnJlYWRMaW5lKCkuZXF1YWxzKCJUaGlzIGlzIGxpbmUgMiBvZiB0aGUgZmlsZS4iKSApOyAKLSAgICAgIGFzc2VydFRydWUoICJCYWQgbGFzdCBsaW5lIG9mIGZpbGUiLCByZWFkZXIucmVhZExpbmUoKS5lcXVhbHMoIlRoaXMgaXMgdGhlIGVuZCBvZiB0aGUgZmlsZS4iKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggIkV4dHJhIGxpbmVzIGZvdW5kIGluIGZpbGUiLCByZWFkZXIucmVhZExpbmUoKSA9PSBudWxsICk7Ci0gICAgICAKLSAgICAgIHJlYWRlci5jbG9zZSgpOwotICAgICAgCi0gICAgICAvL05vdyByZW5hbWUgdGhlIGZvbGRlci4KLSAgICAgIElVUkkgbGV2ZWwxICAgPSB1cmkwLmFwcGVuZCggdXJpUmVsYXRpdmUxICk7Ci0gICAgICBJVVJJIG5ld0xldmVsID0gdXJpMC5hcHBlbmQoIGZhY3RvcnkubmV3VVJJKCJuZXdMZXZlbDEiKSApOwotICAgICAgSVVSSSBvbGRGaWxlICA9IG5ld0xldmVsLmFwcGVuZCggdXJpUmVsYXRpdmUyICk7Ci0gICAgICBJVVJJIG5ld0ZpbGUgID0gbmV3TGV2ZWwuYXBwZW5kKCBmYWN0b3J5Lm5ld1VSSSggIm5ld0ZpbGUiICkgKTsKLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggIlVSSSBpcyBub3QgcHJlc2VudCIsIG5ld1VSSS5pc1ByZXNlbnQoKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggIlVSSSBpcyBwcmVzZW50IiwgIW5ld0xldmVsLmFwcGVuZCh1cmlSZWxhdGl2ZTIpLmlzUHJlc2VudCgpICk7Ci0gICAgICAKLSAgICAgIGxldmVsMS5yZW5hbWUoIG5ld0xldmVsICk7Ci0gICAgICAKLSAgICAgIGFzc2VydFRydWUoICJVUkkgaXMgcHJlc2VudCIsICFuZXdVUkkuaXNQcmVzZW50KCkgKTsKLSAgICAgIGFzc2VydFRydWUoICJVUkkgaXMgbm90IHByZXNlbnQiLCBuZXdMZXZlbC5hcHBlbmQodXJpUmVsYXRpdmUyKS5pc1ByZXNlbnQoKSApOwotICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAiVVJJIGlzIHByZXNlbnQiLCAhbmV3RmlsZS5pc1ByZXNlbnQoKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggIlVSSSBpcyBub3QgcHJlc2VudCIsIG9sZEZpbGUuaXNQcmVzZW50KCkgKTsKLSAgICAgIAotICAgICAgb2xkRmlsZS5yZW5hbWUoIG5ld0ZpbGUgKTsKLSAgICAgICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAiVVJJIGlzIG5vdCBwcmVzZW50IiwgbmV3RmlsZS5pc1ByZXNlbnQoKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggIlVSSSBpcyBwcmVzZW50IiwgIW9sZEZpbGUuaXNQcmVzZW50KCkgKTsgICAgICAKLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICAgIGFzc2VydFRydWUoICJFeGNlcHRpb24gdGhyb3c6IiArIGV4Yy5nZXRNZXNzYWdlKCksIGZhbHNlICk7Ci0gICAgfQotICAgIGNhdGNoKCBJT0V4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICAgIGFzc2VydFRydWUoICJFeGNlcHRpb24gdGhyb3c6IiArIGV4Yy5nZXRNZXNzYWdlKCksIGZhbHNlICk7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBpZiggc3RyZWFtICE9IG51bGwgKQotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIHdyaXRlci5jbG9zZSgpOwotICAgICAgICAgIHN0cmVhbS5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBJT0V4Y2VwdGlvbiBleGMgKQotICAgICAgICB7Ci0gICAgICAgICAgYXNzZXJ0VHJ1ZSggIkV4Y2VwdGlvbiB0aHJvdzoiICsgZXhjLmdldE1lc3NhZ2UoKSwgZmFsc2UgKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgCi0gICAgICBpZiggaW5wdXRTdHJlYW0gIT0gbnVsbCApCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgaW5wdXRTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggSU9FeGNlcHRpb24gZXhjICkKLSAgICAgICAgewotICAgICAgICAgIGFzc2VydFRydWUoICJFeGNlcHRpb24gdGhyb3c6IiArIGV4Yy5nZXRNZXNzYWdlKCksIGZhbHNlICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RSZWxhdGl2ZSgpCi0gIHsKLSAgICBJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgPSBFbnZpcm9ubWVudFNlcnZpY2UuZ2V0RWNsaXBzZUNvbnNvbGVFbnZpcm9ubWVudCgpOwotICAgIElVUklGYWN0b3J5ICBmYWN0b3J5ICAgICA9IGVudmlyb25tZW50LmdldFVSSUZhY3RvcnkoKTsKLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZpbGVVUklUZXN0cy50ZXN0UmVsYXRpdmUoKSIpOwotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIEZpbGUgICBmb2xkZXJQYXRoMCA9IG5ldyBGaWxlKCB0ZW1wRGlyLCAicmVsYXRpdmVQcm9qIiApOwotICAgICAgSVVSSSAgIHVyaTAgICAgICAgICA9IGZhY3RvcnkubmV3VVJJKCBmb2xkZXJQYXRoMC50b1VSTCgpLnRvU3RyaW5nKCkgKTsKLSAgICAgIElVUkkgICB1cmlSZWxhdGl2ZTEgPSBmYWN0b3J5Lm5ld1VSSSggImxldmVsMSIpOwotICAgICAgSVVSSSAgIGxldmVsMVVSSSAgICA9IHVyaTAuYXBwZW5kKCB1cmlSZWxhdGl2ZTEgKTsKLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggIlVyaSBpcyByZWxhdGl2ZSIsICF1cmkwLmlzUmVsYXRpdmUoKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggIlVyaSBpcyBub3QgcmVsYXRpdmUiLCB1cmlSZWxhdGl2ZTEuaXNSZWxhdGl2ZSgpICk7Ci0gICAgICBhc3NlcnRUcnVlKCAiVXJpIGlzIHJlbGF0aXZlIiwgIWxldmVsMVVSSS5pc1JlbGF0aXZlKCkgKTsKLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggIlVyaSBpcyBub3QgaGllcmFyY2hpY2FsIiwgdXJpMC5pc0hpZXJhcmNoaWNhbCgpICk7Ci0gICAgICBhc3NlcnRUcnVlKCAiVXJpIGlzIG5vdCBoaWVyYXJjaGljYWwiLCB1cmlSZWxhdGl2ZTEuaXNIaWVyYXJjaGljYWwoKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggIlVyaSBpcyBub3QgaGllcmFyY2hpY2FsIiwgbGV2ZWwxVVJJLmlzSGllcmFyY2hpY2FsKCkgKTsgCi0gICAgfQotICAgIGNhdGNoKCBVUklFeGNlcHRpb24gZXhjKQotICAgIHsKLSAgICAgIGFzc2VydFRydWUoICJFeGNlcHRpb24gdGhyb3c6IiArIGV4Yy5nZXRNZXNzYWdlKCksIGZhbHNlICk7Ci0gICAgfQotICAgIGNhdGNoKCBNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgICBhc3NlcnRUcnVlKCAiRXhjZXB0aW9uIHRocm93OiIgKyBleGMuZ2V0TWVzc2FnZSgpLCBmYWxzZSApOyAgCi0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0RXJhc2UxKCkKLSAgewotICAgIElFbnZpcm9ubWVudCBlbnZpcm9ubWVudCA9IEVudmlyb25tZW50U2VydmljZS5nZXRFY2xpcHNlQ29uc29sZUVudmlyb25tZW50KCk7Ci0gICAgSVVSSUZhY3RvcnkgIGZhY3RvcnkgICAgID0gZW52aXJvbm1lbnQuZ2V0VVJJRmFjdG9yeSgpOwotICAgIAotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmlsZVVSSVRlc3RzLnRlc3RFcmFzZTEoKSIpOwotICAgIHRyeQotICAgIHsKLSAgICAgIEZpbGUgICBmb2xkZXJQYXRoMCAgPSBuZXcgRmlsZSggdGVtcERpciwgInRvcEZvbGRlcjYiICk7Ci0gICAgICBJVVJJICAgdXJpMCAgICAgICAgID0gZmFjdG9yeS5uZXdVUkkoIGZvbGRlclBhdGgwLnRvVVJMKCkudG9TdHJpbmcoKSApOwotICAgICAgSVVSSSAgIHVyaVJlbGF0aXZlMSA9IGZhY3RvcnkubmV3VVJJKCAibGV2ZWwxIik7Ci0gICAgICBJVVJJICAgdXJpUmVsYXRpdmUyID0gZmFjdG9yeS5uZXdVUkkoICJsZWFmRmlsZS50eHQiKTsKLSAgICAgIElVUkkgICBuZXdVUkkgICAgICAgPSB1cmkwLmFwcGVuZCggdXJpUmVsYXRpdmUxICkuYXBwZW5kKCB1cmlSZWxhdGl2ZTIgKTsKLSAgICAgIElVUkkgICBsZXZlbDFVUkkgICAgPSB1cmkwLmFwcGVuZCggdXJpUmVsYXRpdmUxICk7Ci0gICAgICAgICAKLSAgICAgIGFzc2VydFRydWUoICJuZXdVUkkgc2hvdWxkIG5vdCBleGlzdCIsICFuZXdVUkkuaXNQcmVzZW50KCkgKTsKLSAgICAgIAotICAgICAgbmV3VVJJLnRvdWNoTGVhZigpOwotICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAibmV3VVJJIHNob3VsZCBleGlzdCIsIG5ld1VSSS5pc1ByZXNlbnQoKSApOwotICAgICAgCi0gICAgICBuZXdVUkkuZXJhc2UoKTsKLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggIm5ld1VSSSBzaG91bGQgbm90IGV4aXN0IiwgIW5ld1VSSS5pc1ByZXNlbnQoKSApOwotICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAiZm9sZGVyIHJvb3Qgc2hvdWxkIGV4aXN0IiwgdXJpMC5pc1ByZXNlbnQoKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggImZvbGRlciBsZXZlbDEgc2hvdWxkIGV4aXN0IiwgbGV2ZWwxVVJJLmlzUHJlc2VudCgpICk7Ci0gICAgICAKLSAgICAgIHVyaTAuZXJhc2UoKTsKLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggImZvbGRlciByb290IHNob3VsZCBub3QgZXhpc3QiLCAhdXJpMC5pc1ByZXNlbnQoKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggImZvbGRlciBsZXZlbDEgc2hvdWxkIG5vdCBleGlzdCIsICFsZXZlbDFVUkkuaXNQcmVzZW50KCkgKTsKLSAgICAgIAotICAgIH0KLSAgICBjYXRjaCggVVJJRXhjZXB0aW9uIGV4YykKLSAgICB7Ci0gICAgICBhc3NlcnRUcnVlKCAiRXhjZXB0aW9uIHRocm93OiIgKyBleGMuZ2V0TWVzc2FnZSgpLCBmYWxzZSApOwotICAgIH0KLSAgICBjYXRjaCggTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgYXNzZXJ0VHJ1ZSggIkV4Y2VwdGlvbiB0aHJvdzoiICsgZXhjLmdldE1lc3NhZ2UoKSwgZmFsc2UgKTsgIAotICAgIH0KLSAgfQotICAKLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RJc0xlYWYoKQotICB7Ci0gICAgSUVudmlyb25tZW50IGVudmlyb25tZW50ID0gRW52aXJvbm1lbnRTZXJ2aWNlLmdldEVjbGlwc2VDb25zb2xlRW52aXJvbm1lbnQoKTsKLSAgICBJVVJJRmFjdG9yeSAgZmFjdG9yeSAgICAgPSBlbnZpcm9ubWVudC5nZXRVUklGYWN0b3J5KCk7Ci0gICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCJGaWxlVVJJVGVzdHMudGVzdElzTGVhZigpIik7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgRmlsZSAgIGZvbGRlclBhdGgwICA9IG5ldyBGaWxlKCB0ZW1wRGlyLCAidG9wRm9sZGVyNyIgKTsKLSAgICAgIElVUkkgICB1cmkwICAgICAgICAgPSBmYWN0b3J5Lm5ld1VSSSggZm9sZGVyUGF0aDAudG9VUkwoKS50b1N0cmluZygpICk7Ci0gICAgICBJVVJJICAgdXJpUmVsYXRpdmUxID0gZmFjdG9yeS5uZXdVUkkoICJsZXZlbDEiKTsKLSAgICAgIElVUkkgICB1cmlSZWxhdGl2ZTIgPSBmYWN0b3J5Lm5ld1VSSSggImxlYWZGaWxlLnR4dCIpOwotICAgICAgSVVSSSAgIG5ld1VSSSAgICAgICA9IHVyaTAuYXBwZW5kKCB1cmlSZWxhdGl2ZTEgKS5hcHBlbmQoIHVyaVJlbGF0aXZlMiApOwotICAgICAgSVVSSSAgIHBhcmVudCAgICAgICA9IG5ld1VSSS5wYXJlbnQoKTsKLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggIm5ld1VSSSBzaG91bGQgbm90IGV4aXN0IiwgIW5ld1VSSS5pc1ByZXNlbnQoKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggInBhcmVudCBzaG91bGQgbm90IGV4aXN0IiwgIXBhcmVudC5pc1ByZXNlbnQoKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggIm5ld1VSSSBzaG91bGQgbm90IGJlIGEgbGVhZiB5ZXQiLCAhbmV3VVJJLmlzTGVhZigpICk7Ci0gICAgICBhc3NlcnRUcnVlKCAicGFyZW50IHNob3VsZCBub3QgYmUgYSBsZWFmIiwgIXBhcmVudC5pc0xlYWYoKSApOwotICAgICAgCi0gICAgICBuZXdVUkkudG91Y2hMZWFmKCk7Ci0gICAgICAKLSAgICAgIGFzc2VydFRydWUoICJuZXdVUkkgc2hvdWxkIGV4aXN0IiwgbmV3VVJJLmlzUHJlc2VudCgpICk7Ci0gICAgICBhc3NlcnRUcnVlKCAicGFyZW50IHNob3VsZCBleGlzdCIsIHBhcmVudC5pc1ByZXNlbnQoKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggIm5ld1VSSSBzaG91bGQgYmUgYSBsZWFmIiwgbmV3VVJJLmlzTGVhZigpICk7Ci0gICAgICBhc3NlcnRUcnVlKCAicGFyZW50IHNob3VsZCBub3QgYmUgYSBsZWFmIiwgIXBhcmVudC5pc0xlYWYoKSApOwotICAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMpCi0gICAgewotICAgICAgYXNzZXJ0VHJ1ZSggIkV4Y2VwdGlvbiB0aHJvdzoiICsgZXhjLmdldE1lc3NhZ2UoKSwgZmFsc2UgKTsKLSAgICB9Ci0gICAgY2F0Y2goIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICAgIGFzc2VydFRydWUoICJFeGNlcHRpb24gdGhyb3c6IiArIGV4Yy5nZXRNZXNzYWdlKCksIGZhbHNlICk7ICAKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RWaXNpdCgpCi0gIHsKLSAgICBJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgPSBFbnZpcm9ubWVudFNlcnZpY2UuZ2V0RWNsaXBzZUNvbnNvbGVFbnZpcm9ubWVudCgpOwotICAgIElVUklGYWN0b3J5ICBmYWN0b3J5ICAgICA9IGVudmlyb25tZW50LmdldFVSSUZhY3RvcnkoKTsKLSAgICBJVVJJU2NoZW1lICAgc2NoZW1lICAgICAgPSBFbnZpcm9ubWVudFNlcnZpY2UuZ2V0RmlsZVNjaGVtZSgpOwotICAgIAotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmlsZVVSSVRlc3RzLnRlc3RWaXNpdCgpIik7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgRmlsZSBmb2xkZXJQYXRoMCA9IG5ldyBGaWxlKCB0ZW1wRGlyLCAicm9vdCIgKTsKLSAgICAgIElVUkkgdXJpMCAgICAgICAgPSBmYWN0b3J5Lm5ld1VSSSggZm9sZGVyUGF0aDAudG9VUkwoKS50b1N0cmluZygpICk7Ci0gICAgICAKLSAgICAgIEhhc2h0YWJsZSB0YWJsZSA9IGJ1aWxkVGVzdEVudHJpZXMoIHNjaGVtZSwgdXJpMCApOwotICAgICAgCi0gICAgICB1cmkwLnZpc2l0KCBuZXcgVGVzdFZpc2l0b3IoIHRhYmxlICkgKTsgICAgICAKLSAgICAgIHZlcmlmeVRhYmxlKCB0YWJsZSApOwotICAgICAgCi0gICAgICByZXNldFRhYmxlRm9yVGVzdDIoIHRhYmxlICk7Ci0gICAgICB1cmkwLnZpc2l0KCBuZXcgVGVzdFZpc2l0b3IoIHRhYmxlICkgKTsKLSAgICAgIHZlcmlmeVRhYmxlKCB0YWJsZSApOwotICAgICAgCi0gICAgICByZXNldFRhYmxlKCB0YWJsZSApOwotICAgICAgdXJpMC52aXNpdCggbmV3IFRlc3RWaXNpdG9yKCB0YWJsZSApLCBuZXcgVGVzdEZpbHRlciggdGFibGUgKSApOwotICAgICAgdmVyaWZ5VGFibGUoIHRhYmxlICk7Ci0gICAgICAKLSAgICAgIHJlc2V0VGFibGVGb3JUZXN0MyggdGFibGUgKTsKLSAgICAgIHVyaTAudmlzaXQoIG5ldyBUZXN0VmlzaXRvciggdGFibGUgKSwgbmV3IFRlc3RGaWx0ZXIoIHRhYmxlICkgKTsKLSAgICAgIHZlcmlmeVRhYmxlKCB0YWJsZSApOyAgICAgCi0gICAgfQotICAgIGNhdGNoKCBVUklFeGNlcHRpb24gZXhjKQotICAgIHsKLSAgICAgIGFzc2VydFRydWUoICJFeGNlcHRpb24gdGhyb3c6IiArIGV4Yy5nZXRNZXNzYWdlKCksIGZhbHNlICk7Ci0gICAgfQotICAgIGNhdGNoKCBNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgICBhc3NlcnRUcnVlKCAiRXhjZXB0aW9uIHRocm93OiIgKyBleGMuZ2V0TWVzc2FnZSgpLCBmYWxzZSApOyAgCi0gICAgfQotICB9Ci0gCi0gIHByaXZhdGUgY2xhc3MgVGVzdFZpc2l0b3IgaW1wbGVtZW50cyBJVVJJVmlzaXRvcgotICB7Ci0gICAgcHJpdmF0ZSBIYXNodGFibGUgdGFibGVfOwotICAgIAotICAgIHB1YmxpYyBUZXN0VmlzaXRvciggSGFzaHRhYmxlIHRhYmxlKQotICAgIHsKLSAgICAgIHRhYmxlXyA9IHRhYmxlOyAgCi0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIHZpc2l0KCBJVVJJIHVyaSApCi0gICAgewotICAgICAgTm9kZUVudHJ5IGVudHJ5ID0gKE5vZGVFbnRyeSl0YWJsZV8uZ2V0KCBnZXROYW1lKCB1cmkgKSApOwotICAgICAgZW50cnkud2FzVmlzaXRlZF8gPSB0cnVlOwotICAgICAgcmV0dXJuICFlbnRyeS5zdG9wVHJhdmVyc2luZ187Ci0gICAgfSAKLSAgfQotICAKLSAgcHJpdmF0ZSBjbGFzcyBUZXN0RmlsdGVyIGltcGxlbWVudHMgSVVSSUZpbHRlcgotICB7Ci0gICAgcHJpdmF0ZSBIYXNodGFibGUgdGFibGVfOwotICAgIAotICAgIHB1YmxpYyBUZXN0RmlsdGVyKCBIYXNodGFibGUgdGFibGUpCi0gICAgewotICAgICAgdGFibGVfID0gdGFibGU7ICAKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gYWNjZXB0cyggSVVSSSB1cmkgKQotICAgIHsKLSAgICAgIE5vZGVFbnRyeSBlbnRyeSA9IChOb2RlRW50cnkpdGFibGVfLmdldCggZ2V0TmFtZSggdXJpICkgKTsKLSAgICAgIHJldHVybiBlbnRyeS52aXNpdE5vZGVfOwotICAgIH0gCi0gIH0KLSAgCi0gIHByaXZhdGUgSGFzaHRhYmxlIGJ1aWxkVGVzdEVudHJpZXMoIElVUklTY2hlbWUgc2NoZW1lLCBJVVJJIHJvb3RVUkkgKQotICB7Ci0gICAgSGFzaHRhYmxlIHRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotICAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJVVJJIHJvb3RjMSA9IHJvb3RVUkkuYXBwZW5kKCBzY2hlbWUubmV3VVJJKCAicm9vdGMxIikgKTsKLSAgICAgIElVUkkgcm9vdGMyID0gcm9vdFVSSS5hcHBlbmQoIHNjaGVtZS5uZXdVUkkoICJyb290YzIiKSApOwotICAgICAgSVVSSSByb290YzMgPSByb290VVJJLmFwcGVuZCggc2NoZW1lLm5ld1VSSSggInJvb3RjMyIpICk7Ci0gICAgICAKLSAgICAgIElVUkkgcm9vdGMyYzEgPSByb290YzIuYXBwZW5kKCBzY2hlbWUubmV3VVJJKCAicm9vdGMyYzEiKSApOwotICAgICAgSVVSSSByb290YzJjMiA9IHJvb3RjMi5hcHBlbmQoIHNjaGVtZS5uZXdVUkkoICJyb290YzJjMiIpICk7Ci0gICAgICBJVVJJIHJvb3RjMmMzID0gcm9vdGMyLmFwcGVuZCggc2NoZW1lLm5ld1VSSSggInJvb3RjMmMzIikgKTsKLSAgICAgIAotICAgICAgSVVSSSByb290YzJjMmMxID0gcm9vdGMyYzIuYXBwZW5kKCBzY2hlbWUubmV3VVJJKCAicm9vdGMyYzJjMSIpICk7Ci0gICAgICBJVVJJIHJvb3RjMmMyYzIgPSByb290YzJjMi5hcHBlbmQoIHNjaGVtZS5uZXdVUkkoICJyb290YzJjMmMyIikgKTsKLSAgICAgIAotICAgICAgSVVSSSByb290YzNjMSA9IHJvb3RjMy5hcHBlbmQoIHNjaGVtZS5uZXdVUkkoICJyb290YzNjMSIpICk7Ci0gICAgICBJVVJJIHJvb3RjM2MyID0gcm9vdGMzLmFwcGVuZCggc2NoZW1lLm5ld1VSSSggInJvb3RjM2MyIikgKTsKLSAgICAgIAotICAgICAgLy8gTm93IHRoYXQgdGhlIFVSSSdzIGFyZSBjcmVhdGVkIHdlIG5lZWQgdG8gY3JlYXRlIHBoeXNpY2FsIGZvbGRlcnMKLSAgICAgIC8vIGFuZCBmaWxlcyB0byByZXByZXNlbnQgdGhlbS4KLSAgICAgIHJvb3RjM2MxLnRvdWNoTGVhZigpOwotICAgICAgcm9vdGMzYzIudG91Y2hMZWFmKCk7ICAgIAotICAgICAgCi0gICAgICByb290YzJjMmMxLnRvdWNoTGVhZigpOwotICAgICAgcm9vdGMyYzJjMi50b3VjaExlYWYoKTsKLSAgICAgIAotICAgICAgcm9vdGMyYzEudG91Y2hMZWFmKCk7Ci0gICAgICByb290YzJjMy50b3VjaExlYWYoKTsKLSAgICAgIAotICAgICAgcm9vdGMxLnRvdWNoRm9sZGVyKCk7Ci0gICAgICAKLSAgICAgIC8vIE5vdyBjcmVhdGUgdGhlIHRoZSB0YWJsZSBlbnRyaWVzIHRoYXQgd2lsbCBiZSB1c2VkIHRvIHZpc2l0Ci0gICAgICAvLyB0aGUgVVJJIG5vZGVzLgotICAgICAgdGFibGUucHV0KCAicm9vdCIsIG5ldyBOb2RlRW50cnkoKSApOwotICAgICAgdGFibGUucHV0KCAicm9vdGMxIiwgbmV3IE5vZGVFbnRyeSgpICk7Ci0gICAgICB0YWJsZS5wdXQoICJyb290YzIiLCBuZXcgTm9kZUVudHJ5KCkgKTsKLSAgICAgIHRhYmxlLnB1dCggInJvb3RjMyIsIG5ldyBOb2RlRW50cnkoKSApOwotICAgICAgdGFibGUucHV0KCAicm9vdGMyYzEiLCBuZXcgTm9kZUVudHJ5KCkgKTsKLSAgICAgIHRhYmxlLnB1dCggInJvb3RjMmMyIiwgbmV3IE5vZGVFbnRyeSgpICk7Ci0gICAgICB0YWJsZS5wdXQoICJyb290YzJjMyIsIG5ldyBOb2RlRW50cnkoKSApOwotICAgICAgdGFibGUucHV0KCAicm9vdGMyYzJjMSIsIG5ldyBOb2RlRW50cnkoKSApOwotICAgICAgdGFibGUucHV0KCAicm9vdGMyYzJjMiIsIG5ldyBOb2RlRW50cnkoKSApOwotICAgICAgdGFibGUucHV0KCAicm9vdGMzYzEiLCBuZXcgTm9kZUVudHJ5KCkgKTsKLSAgICAgIHRhYmxlLnB1dCggInJvb3RjM2MyIiwgbmV3IE5vZGVFbnRyeSgpICk7Ci0gICAgfQotICAgIGNhdGNoKCBVUklFeGNlcHRpb24gZXhjKQotICAgIHsKLSAgICAgIGFzc2VydFRydWUoICJFeGNlcHRpb24gdGhyb3c6IiArIGV4Yy5nZXRNZXNzYWdlKCksIGZhbHNlICk7Ci0gICAgfSAgCi0gICAgICAKLSAgICByZXR1cm4gdGFibGU7Ci0gIH0KLSAgCi0gIHByaXZhdGUgU3RyaW5nIGdldE5hbWUoIElVUkkgdXJpICkKLSAgeyAKLSAgICBTdHJpbmcgICAgZnVsbE5hbWUgID0gdXJpLnRvU3RyaW5nKCk7Ci0gICAgaW50ICAgICAgIHNsYXNoICAgICA9IGZ1bGxOYW1lLmxhc3RJbmRleE9mKCAnLycgKTsKLSAgICAKLSAgICBpZiggc2xhc2ggPT0gLTEgKSBzbGFzaCA9IGZ1bGxOYW1lLmxhc3RJbmRleE9mKCAnXFwnICk7Ci0gICAgCi0gICAgU3RyaW5nIG5hbWUgPSBmdWxsTmFtZS5zdWJzdHJpbmcoIHNsYXNoICsgMSwgZnVsbE5hbWUubGVuZ3RoKCkgKTsKLSAgICAKLSAgICByZXR1cm4gbmFtZTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHZlcmlmeVRhYmxlKCBIYXNodGFibGUgdGFibGUgKQotICB7Ci0gICAgSXRlcmF0b3IgZW50cmllcyA9IHRhYmxlLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAKLSAgICB3aGlsZSggZW50cmllcy5oYXNOZXh0KCkgKQotICAgIHsKLSAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpZW50cmllcy5uZXh0KCk7Ci0gICAgICAKLSAgICAgIFN0cmluZyAgICBrZXkgID0gKFN0cmluZyllbnRyeS5nZXRLZXkoKTsKLSAgICAgIE5vZGVFbnRyeSBub2RlID0gKE5vZGVFbnRyeSllbnRyeS5nZXRWYWx1ZSgpOyAKLSAKLSAgICAgIGFzc2VydFRydWUoICJCYWQgdGFibGUgcmVzdWx0IGZvciBrZXk6IiArIGtleSArICIgdmlzaXRlZD0iICsgbm9kZS53YXNWaXNpdGVkXwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBzaG91bGRiZT0iICsgbm9kZS5zaG91bGRCZVZpc2l0ZWRfLAotICAgICAgICAgICAgICAgICAgbm9kZS53YXNWaXNpdGVkXyA9PSBub2RlLnNob3VsZEJlVmlzaXRlZF8gKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCByZXNldFRhYmxlRm9yVGVzdDIoIEhhc2h0YWJsZSB0YWJsZSApCi0gIHsKLSAgICByZXNldFRhYmxlKCB0YWJsZSApOwotICAgIAotICAgIE5vZGVFbnRyeSByb290YzIgPSAoTm9kZUVudHJ5KXRhYmxlLmdldCggInJvb3RjMiIgKTsKLSAgICByb290YzIuc3RvcFRyYXZlcnNpbmdfID0gdHJ1ZTsKLSAgICAKLSAgICBOb2RlRW50cnkgcm9vdGMyYzEgPSAoTm9kZUVudHJ5KXRhYmxlLmdldCggInJvb3RjMmMxIiApOwotICAgIHJvb3RjMmMxLnNob3VsZEJlVmlzaXRlZF8gPSBmYWxzZTsKLSAgICAKLSAgICBOb2RlRW50cnkgcm9vdGMyYzIgPSAoTm9kZUVudHJ5KXRhYmxlLmdldCggInJvb3RjMmMyIiApOwotICAgIHJvb3RjMmMyLnNob3VsZEJlVmlzaXRlZF8gPSBmYWxzZTsKLSAgICAKLSAgICBOb2RlRW50cnkgcm9vdGMyYzMgPSAoTm9kZUVudHJ5KXRhYmxlLmdldCggInJvb3RjMmMzIiApOwotICAgIHJvb3RjMmMzLnNob3VsZEJlVmlzaXRlZF8gPSBmYWxzZTsKLSAgICAKLSAgICBOb2RlRW50cnkgcm9vdGMyYzJjMSA9IChOb2RlRW50cnkpdGFibGUuZ2V0KCAicm9vdGMyYzJjMSIgKTsKLSAgICByb290YzJjMmMxLnNob3VsZEJlVmlzaXRlZF8gPSBmYWxzZTsKLSAgICAKLSAgICBOb2RlRW50cnkgcm9vdGMyYzJjMiA9IChOb2RlRW50cnkpdGFibGUuZ2V0KCAicm9vdGMyYzJjMiIgKTsKLSAgICByb290YzJjMmMyLnNob3VsZEJlVmlzaXRlZF8gPSBmYWxzZTsgICAKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHJlc2V0VGFibGVGb3JUZXN0MyggSGFzaHRhYmxlIHRhYmxlICkKLSAgewotICAgIHJlc2V0VGFibGUoIHRhYmxlICk7ICAKLSAgICAKLSAgICBOb2RlRW50cnkgcm9vdGMzID0gKE5vZGVFbnRyeSl0YWJsZS5nZXQoICJyb290YzMiICk7Ci0gICAgcm9vdGMzLnZpc2l0Tm9kZV8gPSBmYWxzZTsKLSAgICByb290YzMuc2hvdWxkQmVWaXNpdGVkXyA9IGZhbHNlOwotICAgIAotICAgIE5vZGVFbnRyeSByb290YzJjMiA9IChOb2RlRW50cnkpdGFibGUuZ2V0KCAicm9vdGMyYzIiICk7Ci0gICAgcm9vdGMyYzIudmlzaXROb2RlXyA9IGZhbHNlOwotICAgIHJvb3RjMmMyLnNob3VsZEJlVmlzaXRlZF8gPSBmYWxzZTsKLSAgICAKLSAgICBOb2RlRW50cnkgcm9vdGMzYzEgPSAoTm9kZUVudHJ5KXRhYmxlLmdldCggInJvb3RjM2MxIiApOwotICAgIHJvb3RjM2MxLnZpc2l0Tm9kZV8gPSBmYWxzZTsKLSAgICByb290YzNjMS5zaG91bGRCZVZpc2l0ZWRfID0gZmFsc2U7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCByZXNldFRhYmxlKCBIYXNodGFibGUgdGFibGUgKQotICB7Ci0gICAgSXRlcmF0b3IgZW50cmllcyA9IHRhYmxlLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgCi0gICAgd2hpbGUoIGVudHJpZXMuaGFzTmV4dCgpICkKLSAgICB7Ci0gICAgICBOb2RlRW50cnkgZW50cnkgPSAoTm9kZUVudHJ5KWVudHJpZXMubmV4dCgpOwotICAgICAgZW50cnkud2FzVmlzaXRlZF8gPSBmYWxzZTsKLSAgICAgIGVudHJ5LnNob3VsZEJlVmlzaXRlZF89dHJ1ZTsKLSAgICAgIGVudHJ5LnN0b3BUcmF2ZXJzaW5nXz1mYWxzZTsKLSAgICAgIGVudHJ5LnZpc2l0Tm9kZV89dHJ1ZTsKLSAgICB9Ci0gIH0KLSAgICAKLSAgcHJpdmF0ZSBjbGFzcyBOb2RlRW50cnkKLSAgewotICAgIHB1YmxpYyBOb2RlRW50cnkoKQotICAgIHsKLSAgICAgIHRoaXMoIHRydWUsIGZhbHNlLCB0cnVlICk7IAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgTm9kZUVudHJ5KCBib29sZWFuIHZpc2l0Tm9kZSwgYm9vbGVhbiBzdG9wLCBib29sZWFuIHNob3VsZEJlVmlzaXRlZCApCi0gICAgewotICAgICAgdmlzaXROb2RlXyAgICAgICA9IHZpc2l0Tm9kZTsKLSAgICAgIHN0b3BUcmF2ZXJzaW5nXyAgPSBzdG9wOwotICAgICAgc2hvdWxkQmVWaXNpdGVkXyA9IHNob3VsZEJlVmlzaXRlZDsKLSAgICAgIHdhc1Zpc2l0ZWRfICAgICAgPSBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gdmlzaXROb2RlXzsKLSAgICBwdWJsaWMgYm9vbGVhbiBzdG9wVHJhdmVyc2luZ187Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gd2FzVmlzaXRlZF87Ci0gICAgcHVibGljIGJvb2xlYW4gc2hvdWxkQmVWaXNpdGVkXzsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3Rlc3RzL0xvZ2dlclRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdGVzdHMvTG9nZ2VyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk1Yzc3Ny4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdGVzdHMvTG9nZ2VyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5FbnZpcm9ubWVudFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuU3RhdHVzRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgTG9nZ2VyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQotewotICBwdWJsaWMgTG9nZ2VyVGVzdHMoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBzdXBlcihuYW1lKTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKLSAgewotICAgIGlmIChhcmdzLmxlbmd0aCA9PSAwKQotICAgIHsKLSAgICAgIHJ1bkFsbCgpOwotICAgIH0KLSAgICBlbHNlIGlmIChhcmdzLmxlbmd0aCA9PSAxKQotICAgIHsKLSAgICAgIFN0cmluZyBtZXRob2RUb1J1biA9IGFyZ3NbMF0udHJpbSgpOwotICAgICAgcnVuT25lKG1ldGhvZFRvUnVuKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoTG9nZ2VyVGVzdHMuY2xhc3MpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHJ1bkFsbCgpCi0gIHsKLSAgICBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgcnVuT25lKFN0cmluZyBtZXRob2ROYW1lKQotICB7Ci0gICAgVGVzdFN1aXRlIHRlc3RTdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLSAgICBUZXN0Q2FzZSB0ZXN0ID0gbmV3IExvZ2dlclRlc3RzKG1ldGhvZE5hbWUpOwotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ2FsbGluZyBMb2dnZXJUZXN0cy4iK21ldGhvZE5hbWUpOwotICAgIHRlc3RTdWl0ZS5hZGRUZXN0KHRlc3QpOwotICAgIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLnJ1bih0ZXN0U3VpdGUpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0TG9nZ2VyKCkKLSAgewotICAgIElFbnZpcm9ubWVudCBlbnZpcm9ubWVudCA9IEVudmlyb25tZW50U2VydmljZS5nZXRFY2xpcHNlQ29uc29sZUVudmlyb25tZW50KCk7Ci0gICAgSUxvZyAgICAgICAgIGxvZ2dlciAgICAgID0gZW52aXJvbm1lbnQuZ2V0TG9nKCk7Ci0gICAgCi0JLy9hc3NlcnRUcnVlKCJMb2dnaW5nIGVuYWJsZWQiLCAhbG9nZ2VyLmlzRW5hYmxlZCgpKTsKLQkvLyBXZSBtYXkgb3IgbWF5IG5vdCBiZSBjYWxsZWQgd2l0aCB0aGUgLWRlYnVnIG9wdGlvbiwgCi0JLy8gc28gd2UgY2FuIG5vdCB0ZXN0IGZvciBpdCwgYnV0IHdlIGNhbiB3cml0ZSBhbiBhcHByb3ByaWF0ZSAKLQkvLyBtZXNzYWdlLCB0byBoZWxwIGludGVycHJldCByZXN1bHRzLCBpZiBuZWVkZWQuCi0JaWYgKGxvZ2dlci5pc0VuYWJsZWQoKSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIiBMb2dnaW5nIGlzIGVuYWJsZWQiKTsKLQl9IGVsc2UgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIiBMb2dnaW5nIGlzIGlzIG5vdCBlbmFibGVkIik7CQkJCi0JfQotICAgIGFzc2VydFRydWUoICJMb2dnaW5nIGZlYXR1cmUgZW5hYmxlZCIsICFsb2dnZXIuaXNFbmFibGVkKCAiYmFkIG9wdGlvbiIgKSApOwotICAgIAotICAgIGxvZ2dlci5sb2coIElMb2cuRVJST1IsIDAsIHRoaXMsICJ0ZXN0IGxvZ2dlciIsIFN0YXR1cy5DQU5DRUxfU1RBVFVTICk7Ci0gICAgbG9nZ2VyLmxvZyggSUxvZy5JTkZPLCAxLCB0aGlzLCAiYW5vdGhlciBtZXRob2QiLCAib2JqZWN0IiApOwotICAgIGxvZ2dlci5sb2coIElMb2cuV0FSTklORywgMywgdGhpcywgIm9uZSBtb3JlIG1ldGhvZCIsIG5ldyBTdGF0dXNFeGNlcHRpb24oIFN0YXR1cy5PS19TVEFUVVMgKSk7Ci0gICAgbG9nZ2VyLmxvZyggSUxvZy5FUlJPUiwgIm9wdGlvbjEiLCAwLCB0aGlzLCAidGVzdCBsb2dnZXIiLCBTdGF0dXMuQ0FOQ0VMX1NUQVRVUyApOwotICAgIGxvZ2dlci5sb2coIElMb2cuSU5GTywgIm9wdGlvbjIiLCAxLCB0aGlzLCAiYW5vdGhlciBtZXRob2QiLCAib2JqZWN0IiApOwotICAgIGxvZ2dlci5sb2coIElMb2cuV0FSTklORywgIm9wdGlvbjMiLCAzLCB0aGlzLCAib25lIG1vcmUgbWV0aG9kIiwgbmV3IFN0YXR1c0V4Y2VwdGlvbiggU3RhdHVzLk9LX1NUQVRVUyApKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3Rlc3RzL1N0YXR1c0hhbmRsZXJUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3Rlc3RzL1N0YXR1c0hhbmRsZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjhiOTg4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC90ZXN0cy9TdGF0dXNIYW5kbGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudGVzdHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuQ2hvaWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuRW52aXJvbm1lbnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSVN0YXR1c0hhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5TdGF0dXNFeGNlcHRpb247Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBTdGF0dXNIYW5kbGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQotewotICBwcml2YXRlIElTdGF0dXMgZXJyb3I7Ci0gIHByaXZhdGUgSVN0YXR1cyBpbmZvOwotICBwcml2YXRlIElTdGF0dXMgd2FybmluZzsKLSAgCi0gIHB1YmxpYyBTdGF0dXNIYW5kbGVyVGVzdHMoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBzdXBlcihuYW1lKTsKLSAgICAKLSAgICBlcnJvciAgID0gbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwgImlkIiwgMCwgImVycm9yIG1lc3NhZ2UiLCBudWxsICk7Ci0gICAgaW5mbyAgICA9IG5ldyBTdGF0dXMoIElTdGF0dXMuSU5GTywgImlkIiwgMCwgImluZm8gbWVzc2FnZSIsIG51bGwgKTsKLSAgICB3YXJuaW5nID0gbmV3IFN0YXR1cyggSVN0YXR1cy5XQVJOSU5HLCAiaWQiLCAwLCAid2FybmluZyBtZXNzYWdlIiwgbnVsbCApOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQotICB7Ci0gICAgaWYgKGFyZ3MubGVuZ3RoID09IDApCi0gICAgewotICAgICAgcnVuQWxsKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09IDEpCi0gICAgewotICAgICAgU3RyaW5nIG1ldGhvZFRvUnVuID0gYXJnc1swXS50cmltKCk7Ci0gICAgICBydW5PbmUobWV0aG9kVG9SdW4pOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShTdGF0dXNIYW5kbGVyVGVzdHMuY2xhc3MpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHJ1bkFsbCgpCi0gIHsKLSAgICBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgcnVuT25lKFN0cmluZyBtZXRob2ROYW1lKQotICB7Ci0gICAgVGVzdFN1aXRlIHRlc3RTdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLSAgICBUZXN0Q2FzZSB0ZXN0ID0gbmV3IFN0YXR1c0hhbmRsZXJUZXN0cyhtZXRob2ROYW1lKTsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNhbGxpbmcgU3RhdHVzSGFuZGxlclRlc3RzLiIrbWV0aG9kTmFtZSk7Ci0gICAgdGVzdFN1aXRlLmFkZFRlc3QodGVzdCk7Ci0gICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKHRlc3RTdWl0ZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RFbnZpcm9ubWVudFN0YXR1c0hhbmRsZXIoKQotICB7Ci0gICAgSUVudmlyb25tZW50ICAgZW52aXJvbm1lbnQgPSBFbnZpcm9ubWVudFNlcnZpY2UuZ2V0RWNsaXBzZUNvbnNvbGVFbnZpcm9ubWVudCgpOwotICAgIElTdGF0dXNIYW5kbGVyIGhhbmRsZXIgICAgID0gZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpOwotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIENob2ljZSBjaG9pY2UxID0gbmV3IENob2ljZSgpOwotICAgICAgQ2hvaWNlIGNob2ljZTIgPSBuZXcgQ2hvaWNlKCAnbycsICJPayIsICJkZXNjcmlwdGlvbiIgKTsKLSAgICAgIAotICAgICAgU3RhdHVzRXhjZXB0aW9uIHNvbWVFeGNlcHRpb24gPSBuZXcgU3RhdHVzRXhjZXB0aW9uKCBlcnJvciApOwotICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAiU3RhdHVzIG5vdCB0aGUgc2FtZSAiLCBzb21lRXhjZXB0aW9uLmdldFN0YXR1cygpID09IGVycm9yICk7Ci0gICAgICAKLSAgICAgIGhhbmRsZXIucmVwb3J0KCBTdGF0dXMuT0tfU1RBVFVTICk7Ci0gICAgICBoYW5kbGVyLnJlcG9ydCggZXJyb3IgKTsKLSAgICAgIGhhbmRsZXIucmVwb3J0KCB3YXJuaW5nICk7Ci0gICAgICBoYW5kbGVyLnJlcG9ydCggaW5mbyApOwotICAgICAgY2hvaWNlMS5zZXRTaG9ydGN1dCggJ2MnICk7Ci0gICAgICBjaG9pY2UxLnNldExhYmVsKCAiY2FuY2VsIiApOwotICAgICAgY2hvaWNlMS5zZXREZXNjcmlwdGlvbiggImNhbmNlbCBkZXNjcmlwdGlvbiIgKTsKLSAgICAgIAotICAgICAgQ2hvaWNlIHJlc3VsdCA9IGhhbmRsZXIucmVwb3J0KCBlcnJvciwgbnVsbCApOwotICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAicmVzdWx0IG5vdCBudWxsICIsIHJlc3VsdCA9PSBudWxsICk7Ci0gICAgICAKLSAgICAgIHJlc3VsdCA9IGhhbmRsZXIucmVwb3J0KCBlcnJvciwgbmV3IENob2ljZVswXSApOwotICAgICAgYXNzZXJ0VHJ1ZSggInJlc3VsdCBub3QgbnVsbCAiLCByZXN1bHQgPT0gbnVsbCApOwotICAgICAgCi0gICAgICByZXN1bHQgPSBoYW5kbGVyLnJlcG9ydCggZXJyb3IsIG5ldyBDaG9pY2VbXXsgY2hvaWNlMiwgY2hvaWNlMSB9ICk7Ci0gICAgICBhc3NlcnRUcnVlKCAiRmlyc3QgY2hvaWNlIHNob3J0Y3V0IG5vdCB0aGUgc2FtZSIsIHJlc3VsdC5nZXRTaG9ydGN1dCgpID09IGNob2ljZTIuZ2V0U2hvcnRjdXQoKSk7Ci0gICAgICBhc3NlcnRUcnVlKCAiRmlyc3QgY2hvaWNlIGxhYmVsIG5vdCB0aGUgc2FtZSIsIHJlc3VsdC5nZXRMYWJlbCgpLmVxdWFscyggY2hvaWNlMi5nZXRMYWJlbCgpKSk7Ci0gICAgICBhc3NlcnRUcnVlKCAiRmlyc3QgY2hvaWNlIGRlc2NyaXB0aW9uIG5vdCB0aGUgc2FtZSIsIHJlc3VsdC5nZXREZXNjcmlwdGlvbigpLmVxdWFscyggY2hvaWNlMi5nZXREZXNjcmlwdGlvbigpKSk7Ci0gICAgICAKLSAgICAgIGhhbmRsZXIucmVwb3J0RXJyb3IoIGVycm9yICk7Ci0gICAgICBoYW5kbGVyLnJlcG9ydEluZm8oIGluZm8gKTsKLSAgICAgIAotICAgIH0KLSAgICBjYXRjaCggU3RhdHVzRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgYXNzZXJ0VHJ1ZSggInVuZXhwZWN0ZWQgZXhjZXB0aW9uOiIsIGZhbHNlICk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9hcnRpZmFjdGVkaXQvdGVzdHMvQXJ0aWZhY3RFZGl0QVBJVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2FydGlmYWN0ZWRpdC90ZXN0cy9BcnRpZmFjdEVkaXRBUElUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDJkNDIwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2FydGlmYWN0ZWRpdC90ZXN0cy9BcnRpZmFjdEVkaXRBUElUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDMxLCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuYXJ0aWZhY3RlZGl0LnRlc3RzOwotCi0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBBcnRpZmFjdEVkaXRBUElUZXN0cyBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0JCi0JCi0JCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IEFydGlmYWN0RWRpdEFQSVRlc3RzKCk7Ci0JfQotCi0JcHVibGljIEFydGlmYWN0RWRpdEFQSVRlc3RzKCkgewotCQlzdXBlcigpOwotCQkvL2FkZFRlc3QobmV3IFNpbXBsZVRlc3RTdWl0ZShBcnRpZmFjdEVkaXRUZXN0LmNsYXNzKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9hcnRpZmFjdGVkaXQvdGVzdHMvQXJ0aWZhY3RFZGl0VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvYXJ0aWZhY3RlZGl0L3Rlc3RzL0FydGlmYWN0RWRpdFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc5YWQ5MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9hcnRpZmFjdGVkaXQvdGVzdHMvQXJ0aWZhY3RFZGl0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTA3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmFydGlmYWN0ZWRpdC50ZXN0czsKLQotCi0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXRvb2xzLmNvbW1vbi50ZXN0LmFwaXRvb2xzLlByb2plY3RVbnppcFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQXJ0aWZhY3RFZGl0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlN0cnVjdHVyZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9ucy5JT3BlcmF0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZXb3JrYmVuY2hDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuQ29tbW9uVGVzdHNQbHVnaW47Ci0KLQotCi1wdWJsaWMgY2xhc3MgQXJ0aWZhY3RFZGl0VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaWxlU2VwID0gU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLnNlcGFyYXRvciIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfTkFNRSA9ICJUZXN0QXJ0aWZhY3RFZGl0IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfTU9EVUxFX05BTUUgPSAiV2ViTW9kdWxlMSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBVUkkgbW9kdWxlVVJJID0gVVJJLmNyZWF0ZVVSSSgibW9kdWxlOi9yZXNvdXJjZS9UZXN0QXJ0aWZhY3RFZGl0L1dlYk1vZHVsZTEiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUX01PREVMX0lEID0gImpzdC53ZWIiOwotCXByaXZhdGUgQXJ0aWZhY3RFZGl0TW9kZWwgYXJ0aWZhY3RFZGl0TW9kZWxGb3JSZWFkOwotCXByaXZhdGUgQXJ0aWZhY3RFZGl0TW9kZWwgYXJ0aWZhY3RFZGl0TW9kZWxGb3JXcml0ZTsKLQlwcml2YXRlIEFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXRGb3JSZWFkOwotCXByaXZhdGUgQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdEZvcldyaXRlOwotCXByaXZhdGUgRWRpdE1vZGVsTGlzdGVuZXIgZW1MaXN0ZW5lcjsKLQlwcml2YXRlIFBhdGggemlwRmlsZVBhdGggPSBuZXcgUGF0aCgiVGVzdERhdGEiICsgZmlsZVNlcCArICJUZXN0QXJ0aWZhY3RFZGl0LnppcCIpOwotCXByaXZhdGUgSVByb2plY3QgcHJvamVjdDsKLQotCi0KLQlwcml2YXRlIElPcGVyYXRpb25IYW5kbGVyIGhhbmRsZXIgPSBuZXcgSU9wZXJhdGlvbkhhbmRsZXIoKSB7Ci0KLQotCQlwdWJsaWMgYm9vbGVhbiBjYW5Db250aW51ZShTdHJpbmcgbWVzc2FnZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQotCQlwdWJsaWMgYm9vbGVhbiBjYW5Db250aW51ZShTdHJpbmcgbWVzc2FnZSwgU3RyaW5nW10gaXRlbXMpIHsKLQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIGludCBjYW5Db250aW51ZVdpdGhBbGxDaGVjayhTdHJpbmcgbWVzc2FnZSkgewotCi0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCXB1YmxpYyBpbnQgY2FuQ29udGludWVXaXRoQWxsQ2hlY2tBbGxvd0NhbmNlbChTdHJpbmcgbWVzc2FnZSkgewotCi0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGVycm9yKFN0cmluZyBtZXNzYWdlKSB7Ci0KLQotCQl9Ci0KLQkJcHVibGljIHZvaWQgaW5mb3JtKFN0cmluZyBtZXNzYWdlKSB7Ci0KLQotCQl9Ci0KLQotCQlwdWJsaWMgT2JqZWN0IGdldENvbnRleHQoKSB7Ci0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfTsKLQotCXB1YmxpYyBBcnRpZmFjdEVkaXRUZXN0KCkgewotCQlzdXBlcigpOwotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKCFnZXRUYXJnZXRQcm9qZWN0KCkuZXhpc3RzKCkpCi0JCQlpZiAoIWNyZWF0ZVByb2plY3QoKSkKLQkJCQlmYWlsKCk7Ci0JCXByb2plY3QgPSBnZXRUYXJnZXRQcm9qZWN0KCk7Ci0JfQotCi0KLQlwdWJsaWMgSVByb2plY3QgZ2V0VGFyZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChQUk9KRUNUX05BTUUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNyZWF0ZVByb2plY3QoKSB7Ci0JCUlQYXRoIGxvY2FsWmlwUGF0aCA9IGdldExvY2FsUGF0aCgpOwotCQlQcm9qZWN0VW56aXBVdGlsIHV0aWwgPSBuZXcgUHJvamVjdFVuemlwVXRpbChsb2NhbFppcFBhdGgsIG5ldyBTdHJpbmdbXXtQUk9KRUNUX05BTUV9KTsKLQkJcmV0dXJuIHV0aWwuY3JlYXRlUHJvamVjdHMoKTsKLQl9Ci0KLQotCi0JcHJpdmF0ZSBJUGF0aCBnZXRMb2NhbFBhdGgoKSB7Ci0KLQkJSVBsdWdpbkRlc2NyaXB0b3IgcGx1Z2luRGVzY3JpcHRvciA9IFBsYXRmb3JtLmdldFBsdWdpblJlZ2lzdHJ5KCkuZ2V0UGx1Z2luRGVzY3JpcHRvcigib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cyIpOwotCQlVUkwgdXJsID0gcGx1Z2luRGVzY3JpcHRvci5nZXRJbnN0YWxsVVJMKCk7Ci0KLQkJdHJ5IHsKLQkJCXVybCA9IG5ldyBVUkwodXJsLnRvU3RyaW5nKCkgKyB6aXBGaWxlUGF0aCk7Ci0KLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUxKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQllMS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCi0JCXRyeSB7Ci0JCQl1cmwgPSBQbGF0Zm9ybS5hc0xvY2FsVVJMKHVybCk7Ci0JCQlwcmludExvY2FsUGF0aCh1cmwpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBuZXcgUGF0aCh1cmwuZ2V0UGF0aCgpKTsKLQl9Ci0KLQotCi0JcHJpdmF0ZSB2b2lkIHByaW50TG9jYWxQYXRoKFVSTCB1cmwpIHsKLQkJSVBhdGggcGF0aCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0TG9jYXRpb24oKTsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUocGF0aC5hcHBlbmQoIlBsYXRmb3JtSW5mby50eHQiKS50b09TU3RyaW5nKCkpOwotCQlCdWZmZXJlZFdyaXRlciBidzsKLQkJU3RyaW5nIG9zTmFtZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpOwotCQlTdHJpbmcgZmlsZVNlcGVyYXRvciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgicGF0aC5zZXBhcmF0b3IiKTsKLQkJVVJMIHVybEZpbmRVc2luZ1BsdWdpbiA9IENvbW1vblRlc3RzUGx1Z2luLmluc3RhbmNlLmZpbmQoemlwRmlsZVBhdGgpOwotCQl0cnkgewotCQkJdXJsRmluZFVzaW5nUGx1Z2luID0gUGxhdGZvcm0uYXNMb2NhbFVSTCh1cmxGaW5kVXNpbmdQbHVnaW4pOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMSkgewotCQkJZTEucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJU3RyaW5nIGphdmFGaWxlU2VwZXJhdG9yID0gbmV3IENoYXJhY3RlcihGaWxlLnBhdGhTZXBhcmF0b3JDaGFyKS50b1N0cmluZygpOwotCi0KLQkJdHJ5IHsKLQkJCWJ3ID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBGaWxlV3JpdGVyKGZpbGUpKTsKLQkJCWJ3LndyaXRlKCJwbHVnaW5EZXNjcmlwdG9yIFVSTCAiICsgdXJsLnRvU3RyaW5nKCkpOwotCQkJYncud3JpdGUoIlxuIik7Ci0JCQlidy53cml0ZSgiT3BlcmF0aW5nIFN5c3RlbTogIiArIG9zTmFtZSk7Ci0JCQlidy53cml0ZSgiXG4iKTsKLQkJCWJ3LndyaXRlKCJTeXN0ZW0gZmlsZSBzZXBlcmF0b3I6ICIgKyBmaWxlU2VwZXJhdG9yKTsKLQkJCWJ3LndyaXRlKCJcbiIpOwotCQkJYncud3JpdGUoIlVzaW5nIFBsdWlnbi5maW5kIFVSTDoiICsgdXJsRmluZFVzaW5nUGx1Z2luLnRvU3RyaW5nKCkpOwotCQkJYncud3JpdGUoIlxuIik7Ci0JCQlidy53cml0ZSgiSmF2YSBmaWxlIHNlcGVyYXRvcjogIiArIGphdmFGaWxlU2VwZXJhdG9yKTsKLQkJCWJ3LndyaXRlKCJcbiIpOwotCQkJYncuY2xvc2UoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCi0KLQl9Ci0KLQotCi0JcHVibGljIHZvaWQgdGVzdEdldEFydGlmYWN0RWRpdEZvclJlYWRXb3JrYmVuY2hDb21wb25lbnQoKSB7Ci0JCUFydGlmYWN0RWRpdCBlZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVkaXQgPSBBcnRpZmFjdEVkaXQuZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZChwcm9qZWN0KTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChlZGl0ICE9IG51bGwpIHsKLQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJCX0KLQkJCWFzc2VydFRydWUoZWRpdCAhPSBudWxsKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBcnRpZmFjdEVkaXRGb3JXcml0ZVdvcmtiZW5jaENvbXBvbmVudCgpIHsKLQkJQXJ0aWZhY3RFZGl0IGVkaXQgPSBudWxsOwotCQl0cnkgewotCQkJZWRpdCA9IEFydGlmYWN0RWRpdC5nZXRBcnRpZmFjdEVkaXRGb3JXcml0ZShwcm9qZWN0KTsKLQotCQl9IGZpbmFsbHkgewotCQkJaWYgKGVkaXQgIT0gbnVsbCkgewotCQkJCWVkaXQuZGlzcG9zZSgpOwotCQkJfQotCQkJYXNzZXJ0VHJ1ZShlZGl0ICE9IG51bGwpOwotCQl9Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZENvbXBvbmVudEhhbmRsZSgpIHsKLQkJU3RydWN0dXJlRWRpdCBtb2R1bGVDb3JlID0gbnVsbDsKLQkJQXJ0aWZhY3RFZGl0IGVkaXQgPSBudWxsOwotCQl0cnkgewotCQkJbW9kdWxlQ29yZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvclJlYWQocHJvamVjdCk7Ci0JCQlXb3JrYmVuY2hDb21wb25lbnQgd2JDb21wb25lbnQgPSBtb2R1bGVDb3JlLmdldENvbXBvbmVudCgpOwotCQkJZWRpdCA9IEFydGlmYWN0RWRpdC5nZXRBcnRpZmFjdEVkaXRGb3JSZWFkKHByb2plY3QpOwotCi0JCX0gZmluYWxseSB7Ci0JCQlpZiAobW9kdWxlQ29yZSAhPSBudWxsKSB7Ci0JCQkJbW9kdWxlQ29yZS5kaXNwb3NlKCk7Ci0JCQkJZWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlhc3NlcnRUcnVlKGVkaXQgIT0gbnVsbCk7Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBcnRpZmFjdEVkaXRGb3JXcml0ZUNvbXBvbmVudEhhbmRsZSgpIHsKLQkJQXJ0aWZhY3RFZGl0IGVkaXQgPSBudWxsOwotCQl0cnkgewotCQkJZWRpdCA9IEFydGlmYWN0RWRpdC5nZXRBcnRpZmFjdEVkaXRGb3JXcml0ZShwcm9qZWN0KTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChlZGl0ICE9IG51bGwpIHsKLQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJCX0KLQkJCWFzc2VydFRydWUoZWRpdCAhPSBudWxsKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc1ZhbGlkRWRpdGFibGVNb2R1bGUoKSB7Ci0JCWFzc2VydFRydWUoQXJ0aWZhY3RFZGl0LmlzVmFsaWRFZGl0YWJsZU1vZHVsZShDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBcnRpZmFjdEVkaXRBcnRpZmFjdEVkaXRNb2RlbCgpIHsKLQkJQXJ0aWZhY3RFZGl0IGVkaXQgPSBuZXcgQXJ0aWZhY3RFZGl0KGdldEFydGlmYWN0RWRpdE1vZGVsZm9yUmVhZCgpKTsKLQkJYXNzZXJ0Tm90TnVsbChlZGl0KTsKLQkJZWRpdC5kaXNwb3NlKCk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJ0aWZhY3RFZGl0TW9kdWxlQ29yZU5hdHVyZVdvcmtiZW5jaENvbXBvbmVudGJvb2xlYW4oKSB7Ci0JCXRyeSB7Ci0JCQlTdHJ1Y3R1cmVFZGl0LmdldE1vZHVsZUNvcmVOYXR1cmUobW9kdWxlVVJJKTsKLQkJfSAgY2F0Y2ggKFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24gZSkgewotCQkJZmFpbCgpOwotCQl9Ci0JCUFydGlmYWN0RWRpdCBlZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVkaXQgPSBuZXcgQXJ0aWZhY3RFZGl0KHByb2plY3QsIHRydWUpOwotCQkJYXNzZXJ0Tm90TnVsbChlZGl0KTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChlZGl0ICE9IG51bGwpCi0JCQkJZWRpdC5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2F2ZSgpIHsKLQkJQXJ0aWZhY3RFZGl0IGVkaXQgPSBudWxsOwotCQl0cnkgewotCQkJZWRpdCA9IEFydGlmYWN0RWRpdC5nZXRBcnRpZmFjdEVkaXRGb3JXcml0ZShwcm9qZWN0KTsKLQkJCXRyeSB7Ci0JCQkJZWRpdC5zYXZlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChlZGl0ICE9IG51bGwpIHsKLQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJCX0KLQkJCWFzc2VydFRydWUoZWRpdCAhPSBudWxsKTsKLQkJfQotCQlhc3NlcnRUcnVlKHRydWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTYXZlSWZOZWNlc3NhcnkoKSB7Ci0JCUFydGlmYWN0RWRpdCBlZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVkaXQgPSBBcnRpZmFjdEVkaXQuZ2V0QXJ0aWZhY3RFZGl0Rm9yV3JpdGUocHJvamVjdCk7Ci0JCQl0cnkgewotCQkJCWVkaXQuc2F2ZUlmTmVjZXNzYXJ5KG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQotCQl9IGZpbmFsbHkgewotCQkJaWYgKGVkaXQgIT0gbnVsbCkgewotCQkJCWVkaXQuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JCXBhc3MoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2F2ZUlmTmVjZXNzYXJ5V2l0aFByb21wdCgpIHsKLQkJQXJ0aWZhY3RFZGl0IGVkaXQgPSBudWxsOwotCQl0cnkgewotCQkJZWRpdCA9IEFydGlmYWN0RWRpdC5nZXRBcnRpZmFjdEVkaXRGb3JXcml0ZShwcm9qZWN0KTsKLQkJCXRyeSB7Ci0JCQkJZWRpdC5zYXZlSWZOZWNlc3NhcnlXaXRoUHJvbXB0KG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIGhhbmRsZXIsIHRydWUpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChlZGl0ICE9IG51bGwpIHsKLQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJCX0KLQkJCXBhc3MoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXNwb3NlKCkgewotCQlBcnRpZmFjdEVkaXQgZWRpdDsKLQkJdHJ5IHsKLQkJCWVkaXQgPSBuZXcgQXJ0aWZhY3RFZGl0KGdldEFydGlmYWN0RWRpdE1vZGVsZm9yUmVhZCgpKTsKLQkJCWVkaXQuZGlzcG9zZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbChlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJcGFzcygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb250ZW50TW9kZWxSb290KCkgewotCQlBcnRpZmFjdEVkaXQgZWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllZGl0ID0gQXJ0aWZhY3RFZGl0LmdldEFydGlmYWN0RWRpdEZvclJlYWQocHJvamVjdCk7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gZWRpdC5nZXRDb250ZW50TW9kZWxSb290KCk7Ci0JCQkvLyBhc3NlcnROb3ROdWxsKG9iamVjdCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIGZhaWwoZS5nZXRNZXNzYWdlKCkpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGVkaXQgIT0gbnVsbCkgewotCQkJCWVkaXQuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZExpc3RlbmVyKCkgewotCQlBcnRpZmFjdEVkaXQgZWRpdCA9IGdldEFydGlmYWN0RWRpdEZvclJlYWQoKTsKLQkJdHJ5IHsKLQkJCWVkaXQuYWRkTGlzdGVuZXIoZ2V0RW1MaXN0ZW5lcigpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXBhc3MoKTsKLQkJZWRpdC5kaXNwb3NlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUxpc3RlbmVyKCkgewotCQlBcnRpZmFjdEVkaXQgZWRpdCA9IGdldEFydGlmYWN0RWRpdEZvclJlYWQoKTsKLQkJdHJ5IHsKLQkJCWVkaXQucmVtb3ZlTGlzdGVuZXIoZ2V0RW1MaXN0ZW5lcigpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXBhc3MoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzRWRpdE1vZGVsKCkgewotCi0JCUFydGlmYWN0RWRpdCBlZGl0ID0gZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZCgpOwotCQlhc3NlcnRUcnVlKGVkaXQuaGFzRWRpdE1vZGVsKGFydGlmYWN0RWRpdE1vZGVsRm9yUmVhZCkpOwotCQllZGl0LmRpc3Bvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QXJ0aWZhY3RFZGl0TW9kZWwoKSB7Ci0JCUFydGlmYWN0RWRpdCBlZGl0ID0gZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZCgpOwotCQlhc3NlcnRUcnVlKGVkaXQuaGFzRWRpdE1vZGVsKGFydGlmYWN0RWRpdE1vZGVsRm9yUmVhZCkpOwotCQllZGl0LmRpc3Bvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T2JqZWN0KCkgewotCQlwYXNzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldENsYXNzKCkgewotCQlBcnRpZmFjdEVkaXQgZWRpdCA9IGdldEFydGlmYWN0RWRpdEZvclJlYWQoKTsKLQkJYXNzZXJ0Tm90TnVsbChlZGl0LmdldENsYXNzKCkpOwotCQllZGl0LmRpc3Bvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzaENvZGUoKSB7Ci0JCUFydGlmYWN0RWRpdCBlZGl0ID0gZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZCgpOwotCQlpbnQgeSA9IC05OTk5OTk5OTk7Ci0JCWludCB4ID0gZWRpdC5oYXNoQ29kZSgpOwotCQlhc3NlcnRUcnVlKHggIT0geSk7Ci0JCWVkaXQuZGlzcG9zZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHMoKSB7Ci0JCWFzc2VydFRydWUoZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZCgpLmVxdWFscyhhcnRpZmFjdEVkaXRGb3JSZWFkKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsb25lKCkgewotCQlwYXNzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlhc3NlcnRUcnVlKGdldEFydGlmYWN0RWRpdEZvclJlYWQoKS50b1N0cmluZygpICE9IG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb3RpZnkoKSB7Ci0JCXRyeSB7Ci0JCQlzeW5jaHJvbml6ZWQgKGdldEFydGlmYWN0RWRpdEZvclJlYWQoKSkgewotCQkJCWFydGlmYWN0RWRpdEZvclJlYWQubm90aWZ5KCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlwYXNzKCk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm90aWZ5QWxsKCkgewotCQl0cnkgewotCQkJc3luY2hyb25pemVkIChnZXRBcnRpZmFjdEVkaXRGb3JSZWFkKCkpIHsKLQkJCQlhcnRpZmFjdEVkaXRGb3JSZWFkLm5vdGlmeUFsbCgpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbChlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJcGFzcygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RXYWl0bG9uZygpIHsKLQkJbG9uZyB4ID0gMjsKLQkJdHJ5IHsKLQkJCXN5bmNocm9uaXplZCAoZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZCgpKSB7Ci0JCQkJZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZCgpLndhaXQoeCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlwYXNzKCk7Ci0JfQotCi0JLyoKLQkgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciB2b2lkIHdhaXQobG9uZywgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RXYWl0bG9uZ2ludCgpIHsKLQkJaW50IHggPSAyOwotCQl0cnkgewotCQkJc3luY2hyb25pemVkIChnZXRBcnRpZmFjdEVkaXRGb3JSZWFkKCkpIHsKLQkJCQlnZXRBcnRpZmFjdEVkaXRGb3JSZWFkKCkud2FpdCh4KTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGZhaWwoZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXBhc3MoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0V2FpdCgpIHsKLQkJdHJ5IHsKLQkJCXN5bmNocm9uaXplZCAoZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZCgpKSB7Ci0JCQkJZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZCgpLndhaXQoKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGZhaWwoZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXBhc3MoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmluYWxpemUoKSB7Ci0JCXBhc3MoKTsKLQl9Ci0KLQotCXB1YmxpYyBBcnRpZmFjdEVkaXRNb2RlbCBnZXRBcnRpZmFjdEVkaXRNb2RlbGZvclJlYWQoKSB7Ci0JCUVNRldvcmtiZW5jaENvbnRleHQgY29udGV4dCA9IG5ldyBFTUZXb3JrYmVuY2hDb250ZXh0KHByb2plY3QpOwotCQlhcnRpZmFjdEVkaXRNb2RlbEZvclJlYWQgPSBuZXcgQXJ0aWZhY3RFZGl0TW9kZWwoRURJVF9NT0RFTF9JRCwgY29udGV4dCwgdHJ1ZSwgbW9kdWxlVVJJKTsKLQkJcmV0dXJuIGFydGlmYWN0RWRpdE1vZGVsRm9yUmVhZDsKLQl9Ci0KLQotCi0JcHVibGljIEFydGlmYWN0RWRpdCBnZXRBcnRpZmFjdEVkaXRGb3JSZWFkKCkgewotCQlhcnRpZmFjdEVkaXRGb3JSZWFkID0gbmV3IEFydGlmYWN0RWRpdChnZXRBcnRpZmFjdEVkaXRNb2RlbGZvclJlYWQoKSk7Ci0JCXJldHVybiBhcnRpZmFjdEVkaXRGb3JSZWFkOwotCX0KLQotCXB1YmxpYyB2b2lkIHBhc3MoKSB7Ci0JCWFzc2VydFRydWUodHJ1ZSk7Ci0JfQotCi0JcHVibGljIEVkaXRNb2RlbExpc3RlbmVyIGdldEVtTGlzdGVuZXIoKSB7Ci0JCWlmIChlbUxpc3RlbmVyID09IG51bGwpCi0JCQllbUxpc3RlbmVyID0gbmV3IEVkaXRNb2RlbExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGVkaXRNb2RlbENoYW5nZWQoRWRpdE1vZGVsRXZlbnQgYW5FdmVudCkgewotCQkJCX0KLQkJCX07Ci0JCXJldHVybiBlbUxpc3RlbmVyOwotCX0KLQotCXB1YmxpYyBBcnRpZmFjdEVkaXRNb2RlbCBnZXRBcnRpZmFjdEVkaXRNb2RlbEZvcldyaXRlKCkgewotCQlFTUZXb3JrYmVuY2hDb250ZXh0IGNvbnRleHQgPSBuZXcgRU1GV29ya2JlbmNoQ29udGV4dChwcm9qZWN0KTsKLQkJcmV0dXJuIG5ldyBBcnRpZmFjdEVkaXRNb2RlbChFRElUX01PREVMX0lELCBjb250ZXh0LCBmYWxzZSwgbW9kdWxlVVJJKTsKLQotCX0KLQotCXB1YmxpYyBBcnRpZmFjdEVkaXQgZ2V0QXJ0aWZhY3RFZGl0Rm9yV3JpdGUoKSB7Ci0JCXJldHVybiBuZXcgQXJ0aWZhY3RFZGl0KGdldEFydGlmYWN0RWRpdE1vZGVsRm9yV3JpdGUoKSk7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3Rlc3RzL0FsbFRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3Rlc3RzL0FsbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4NjAzZmQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS90ZXN0cy9BbGxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuY29tcG9uZW50Y29yZS50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgQWxsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQkKLQlwdWJsaWMgc3RhdGljIFRlc3RTdWl0ZSBzdWl0ZSgpIHsKLQkJCi0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsgCi0JCQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSVZpcnR1YWxGb2xkZXJBUElUZXN0LmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE1vZHVsZUNvcmVBUElGVlRUZXN0LmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE1vZHVsZUNvcmVVUklDb252ZXJ0ZXJVbml0VGVzdC5jbGFzcyk7Ci0JCS8vc3VpdGUuYWRkVGVzdFN1aXRlKFN0cnVjdHVyZUVkaXRBUElUZXN0LmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFN0cnVjdHVyZUVkaXRTdHJlc3NUZXN0LmNsYXNzKTsKLQkJCi0JCQotCQlyZXR1cm4gc3VpdGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS90ZXN0cy9CYXNlVmlydHVhbFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdGVzdHMvQmFzZVZpcnR1YWxUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMGNiNmMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS90ZXN0cy9CYXNlVmlydHVhbFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmNvbXBvbmVudGNvcmUudGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuY29tcG9uZW50Y29yZS52aXJ0dWFscGF0aC50ZXN0cy5UZXN0V29ya3NwYWNlOwotCi1wdWJsaWMgY2xhc3MgQmFzZVZpcnR1YWxUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJUHJvamVjdCBURVNUX1BST0pFQ1QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoVGVzdFdvcmtzcGFjZS5QUk9KRUNUX05BTUUpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9GT0xERVJfTkFNRSA9ICJXRUItSU5GIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGF0aCBXRUJJTkZfRk9MREVSX1JFQUxfUEFUSCA9IG5ldyBQYXRoKCIvV2ViTW9kdWxlMS9XZWJDb250ZW50LyIrVEVTVF9GT0xERVJfTkFNRSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGF0aCBXRUJJTkZfRk9MREVSX1JVTlRJTUVfUEFUSCA9IG5ldyBQYXRoKCIvIitURVNUX0ZPTERFUl9OQU1FKTsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGF0aCBURVNUREFUQV9GT0xERVJfUkVBTF9QQVRIID0gbmV3IFBhdGgoIldlYk1vZHVsZTEvdGVzdGRhdGEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQYXRoIFRFU1REQVRBX0ZPTERFUl9SVU5USU1FX1BBVEggPSBuZXcgUGF0aCgiLyIpOyAvLyROT04tTkxTLTEkCi0JCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJUGF0aCBERUxFVEVNRV9QQVRIID0gbmV3IFBhdGgoIi9kZWxldGVtZSIpOyAvLyROT04tTkxTLTEkCi0JCi0JcHJvdGVjdGVkIElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudDsKLQkKLQlwcm90ZWN0ZWQgSVZpcnR1YWxGb2xkZXIgd2ViSW5mRm9sZGVyOwotCXByb3RlY3RlZCBJQ29udGFpbmVyIHJlYWxXZWJJbmZGb2xkZXI7Ci0JCi0JcHJvdGVjdGVkIElWaXJ0dWFsRm9sZGVyIGRlbGV0ZW1lVmlydHVhbEZvbGRlcjsKLQlwcm90ZWN0ZWQgSUNvbnRhaW5lciBkZWxldGVtZUZvbGRlcjsJCi0KLQlwcm90ZWN0ZWQgSVZpcnR1YWxGb2xkZXIgdGVzdGRhdGFGb2xkZXI7Ci0JcHJvdGVjdGVkIElDb250YWluZXIgcmVhbFRlc3RkYXRhRm9sZGVyOwotCQotCQotCi0JcHVibGljIEJhc2VWaXJ0dWFsVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9IAotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJCi0JCWlmICghVGVzdFdvcmtzcGFjZS5nZXRUYXJnZXRQcm9qZWN0KCkuZXhpc3RzKCkpCi0JCQlpZiAoIVRlc3RXb3Jrc3BhY2UuY3JlYXRlUHJvamVjdCgpKQotCQkJCWZhaWwoKTsKLQotCQkKLQkJcmVhbFdlYkluZkZvbGRlciA9IFRFU1RfUFJPSkVDVC5nZXRGb2xkZXIoV0VCSU5GX0ZPTERFUl9SRUFMX1BBVEgpOwotCQkKLQkJY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoVEVTVF9QUk9KRUNUKTsKLQkJCi0JCUlWaXJ0dWFsRm9sZGVyIHJvb3RGb2xkZXIgPSBjb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpOwotCQkKLQkJd2ViSW5mRm9sZGVyID0gcm9vdEZvbGRlci5nZXRGb2xkZXIoV0VCSU5GX0ZPTERFUl9SVU5USU1FX1BBVEgpOyAJCQotCi0JCXRlc3RkYXRhRm9sZGVyID0gcm9vdEZvbGRlci5nZXRGb2xkZXIoVEVTVERBVEFfRk9MREVSX1JVTlRJTUVfUEFUSCk7IAotCQlyZWFsVGVzdGRhdGFGb2xkZXIgPSBURVNUX1BST0pFQ1QuZ2V0Rm9sZGVyKFRFU1REQVRBX0ZPTERFUl9SRUFMX1BBVEgpOwotCQkKLQkJZGVsZXRlbWVWaXJ0dWFsRm9sZGVyID0gcm9vdEZvbGRlci5nZXRGb2xkZXIoREVMRVRFTUVfUEFUSCk7Ci0JCWRlbGV0ZW1lVmlydHVhbEZvbGRlci5jcmVhdGUoSVZpcnR1YWxSZXNvdXJjZS5GT1JDRSwgbnVsbCk7Ci0JCQotCQlkZWxldGVtZUZvbGRlciA9IGRlbGV0ZW1lVmlydHVhbEZvbGRlci5nZXRVbmRlcmx5aW5nRm9sZGVyKCk7CQkKLQkJCi0JfQotCQotCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVhckRvd24oKTsKLQkJCi0JCWlmKGRlbGV0ZW1lRm9sZGVyLmV4aXN0cygpKQotCQkJZGVsZXRlbWVGb2xkZXIuZGVsZXRlKElWaXJ0dWFsUmVzb3VyY2UuRk9SQ0UsIG51bGwpOwotCQkKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3Rlc3RzL0NvbXBvbmVudENvcmVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3Rlc3RzL0NvbXBvbmVudENvcmVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhYWMxOWQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS90ZXN0cy9Db21wb25lbnRDb3JlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmNvbXBvbmVudGNvcmUudGVzdHM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmV0b29scy5jb21tb24udGVzdC5hcGl0b29scy5Qcm9qZWN0VW56aXBVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuQ29tbW9uVGVzdHNQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBDb21wb25lbnRDb3JlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaWxlU2VwID0gU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLnNlcGFyYXRvciIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfTkFNRSA9ICJUZXN0QXJ0aWZhY3RFZGl0IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfTU9EVUxFX05BTUUgPSAiV2ViTW9kdWxlMSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBVUkkgbW9kdWxlVVJJID0gVVJJLmNyZWF0ZVVSSSgibW9kdWxlOi9yZXNvdXJjZS9UZXN0QXJ0aWZhY3RFZGl0L1dlYk1vZHVsZTEiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUX01PREVMX0lEID0gImpzdC53ZWIiOwotCXByaXZhdGUgUGF0aCB6aXBGaWxlUGF0aCA9IG5ldyBQYXRoKCJUZXN0RGF0YSIgKyBmaWxlU2VwICsgIlRlc3RBcnRpZmFjdEVkaXQuemlwIik7Ci0JcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0OwotCXByaXZhdGUgaW50IGksIHNlZWQgPSAwOwotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKCFnZXRUYXJnZXRQcm9qZWN0KCkuZXhpc3RzKCkpCi0JCQlpZiAoIWNyZWF0ZVByb2plY3QoKSkKLQkJCQlmYWlsKCk7Ci0JCXByb2plY3QgPSBnZXRUYXJnZXRQcm9qZWN0KCk7Ci0JfQotCi0KLQlwdWJsaWMgSVByb2plY3QgZ2V0VGFyZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChQUk9KRUNUX05BTUUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNyZWF0ZVByb2plY3QoKSB7Ci0JCUlQYXRoIGxvY2FsWmlwUGF0aCA9IGdldExvY2FsUGF0aCgpOwotCQlQcm9qZWN0VW56aXBVdGlsIHV0aWwgPSBuZXcgUHJvamVjdFVuemlwVXRpbChsb2NhbFppcFBhdGgsIG5ldyBTdHJpbmdbXXtQUk9KRUNUX05BTUV9KTsKLQkJcmV0dXJuIHV0aWwuY3JlYXRlUHJvamVjdHMoKTsKLQl9Ci0KLQlwcml2YXRlIElQYXRoIGdldExvY2FsUGF0aCgpIHsKLQkJVVJMIHVybCA9IENvbW1vblRlc3RzUGx1Z2luLmluc3RhbmNlLmZpbmQoemlwRmlsZVBhdGgpOwotCQl0cnkgewotCQkJdXJsID0gUGxhdGZvcm0uYXNMb2NhbFVSTCh1cmwpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBuZXcgUGF0aCh1cmwuZ2V0UGF0aCgpKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVDb21wb25lbnQoKSB7Ci0JCXRyeSB7Ci0JCQluZXcgQ29tcG9uZW50Q29yZSgpOwotCQkJQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCwgInRlc3QiKTsKLQkJCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKGUudG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci0JcHVibGljIHZvaWQgdGVzdENyZWF0ZUNvbXBvbmVudFVzaW5nQ3JlYXRlKCkgewotCQkKLQkJSm9iW10gY3JlYXRlQ29tcG9uZW50Sm9iID0gbmV3IEpvYls1MDBdOwotCQlmb3IgKCAgaSA9IDA7IGkgPCA1MDA7IGkrKykgewotCQkJCi0JCSBjcmVhdGVDb21wb25lbnRKb2JbaV0gPSBuZXcgSm9iKCJDcmVhdGVDb21wb25lbnQgVGVzdCIpIHsKLQkJICAgICAgICBwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCSAgICAgICAgCXRyeSB7Ci0JCSAgICAJCQlJVmlydHVhbENvbXBvbmVudCBjCi0JCSAgICAgICAgICAgICAgICA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KCBwcm9qZWN0LCBwcm9qZWN0LmdldE5hbWUoKSArIGdldE5leHRTZWVkKCkgKTsKLQkJICAgIAkJCWMuY3JlYXRlKCAwLCBudWxsICk7Ci0JCSAgICAJCQotCQkgICAgCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkgICAgCQkJZmFpbChlLnRvU3RyaW5nKCkpOwotCQkgICAgCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQkgICAgCQl9Ci0JCSAgICAgICAgICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkgICAgICAgIH0KLQkJICAgIH07Ci0JCX0KLQkJZm9yIChpbnQgbiA9IDA7IG4gPCBjcmVhdGVDb21wb25lbnRKb2IubGVuZ3RoOyBuKyspIHsKLQkJCWNyZWF0ZUNvbXBvbmVudEpvYltuXS5zZXRSdWxlKHByb2plY3QpOwotCQkJY3JlYXRlQ29tcG9uZW50Sm9iW25dLnNjaGVkdWxlKCk7Ci0JCX0KLQkJCi0JfQotCi0JcHJvdGVjdGVkIGludCBnZXROZXh0U2VlZCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gc2VlZCsrOwotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZUZvbGRlcigpIHsKLQkJdHJ5IHsKLQkJCUNvbXBvbmVudENvcmUuY3JlYXRlRm9sZGVyKHByb2plY3QsIG5ldyBQYXRoKCJ0ZXN0L3J1bnRpbWVQYXRoIikpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbChlLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZUZpbGUoKSB7Ci0JCXRyeSB7Ci0JCQlDb21wb25lbnRDb3JlLmNyZWF0ZUZpbGUocHJvamVjdCwgbmV3IFBhdGgoInRlc3QvcnVudGltZVBhdGgvZmlsZSIpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoZS50b1N0cmluZygpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVSZWZlcmVuY2UoKSB7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IGNvbnRhaW5lciA9IG5ldyBWaXJ0dWFsQ29tcG9uZW50KHByb2plY3QsIG5ldyBQYXRoKCJ0ZXN0L3J1bnRpbWVQYXRoL2ZpbGUiKSk7Ci0JCQotCQl0cnkgewotCQkJQ29tcG9uZW50Q29yZS5jcmVhdGVSZWZlcmVuY2UoY29udGFpbmVyLGNvbnRhaW5lcik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKGUudG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci0JcHVibGljIHZvaWQgdGVzdENyZWF0ZVJlc291cmNlcygpIHsKLQkJSVJlc291cmNlIHJlcyA9IHByb2plY3QuZ2V0RmlsZShuZXcgUGF0aCgiV2ViTW9kdWxlMS9XZWJDb250ZW50L1dFQi1JTkYvd2ViLnhtbCIpKTsKLQkJCi0JCXRyeSB7Ci0JCQlDb21wb25lbnRDb3JlLmNyZWF0ZVJlc291cmNlcyhyZXMpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbChlLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3Rlc3RzL0lFZGl0TW9kZWxIYW5kbGVyVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS90ZXN0cy9JRWRpdE1vZGVsSGFuZGxlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI1MzI1NC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3Rlc3RzL0lFZGl0TW9kZWxIYW5kbGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuY29tcG9uZW50Y29yZS50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5JRWRpdE1vZGVsSGFuZGxlcjsKLQotcHVibGljIGNsYXNzIElFZGl0TW9kZWxIYW5kbGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQlwdWJsaWMgY2xhc3MgRWRpdE1vZGVsSGFuZGxlclRlc3QgaW1wbGVtZW50cyBJRWRpdE1vZGVsSGFuZGxlciB7Ci0JCXB1YmxpYyBFZGl0TW9kZWxIYW5kbGVyVGVzdCgpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNhdmUoSVByb2dyZXNzTW9uaXRvciBhTW9uaXRvcikgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2F2ZUlmTmVjZXNzYXJ5KElQcm9ncmVzc01vbml0b3IgYU1vbml0b3IpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2F2ZSgpIHsKLQkJSUVkaXRNb2RlbEhhbmRsZXIgaGFuZGxlciA9IG5ldyBFZGl0TW9kZWxIYW5kbGVyVGVzdCgpOwotCQloYW5kbGVyLnNhdmUobnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNhdmVJZk5lY2Vzc2FyeSgpIHsKLQkJSUVkaXRNb2RlbEhhbmRsZXIgaGFuZGxlciA9IG5ldyBFZGl0TW9kZWxIYW5kbGVyVGVzdCgpOwotCQloYW5kbGVyLnNhdmVJZk5lY2Vzc2FyeShudWxsKTsKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpc3Bvc2UoKSB7Ci0JCUlFZGl0TW9kZWxIYW5kbGVyIGhhbmRsZXIgPSBuZXcgRWRpdE1vZGVsSGFuZGxlclRlc3QoKTsKLQkJaGFuZGxlci5kaXNwb3NlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3Rlc3RzL0lWaXJ0dWFsQ29tcG9uZW50QVBJVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS90ZXN0cy9JVmlydHVhbENvbXBvbmVudEFQSVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVhZDQ1My4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3Rlc3RzL0lWaXJ0dWFsQ29tcG9uZW50QVBJVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuY29tcG9uZW50Y29yZS50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlc291cmNlOwotCi1wdWJsaWMgY2xhc3MgSVZpcnR1YWxDb21wb25lbnRBUElUZXN0IGV4dGVuZHMgQmFzZVZpcnR1YWxUZXN0IHsKLQotCXB1YmxpYyBJVmlydHVhbENvbXBvbmVudEFQSVRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgewotCQkKLQkJU3RyaW5nIG5hbWUgPSBjb21wb25lbnQuZ2V0TmFtZSgpOwotCX0KLQotLy8JcHVibGljIHZvaWQgdGVzdEdldENvbXBvbmVudFR5cGVJZCgpIHsKLS8vCQlTdHJpbmcgaWQgPSBjb21wb25lbnQuZ2V0Q29tcG9uZW50VHlwZUlkKCkgOwotLy8JfQotLy8KLS8vCXB1YmxpYyB2b2lkIHRlc3RTZXRDb21wb25lbnRUeXBlSWQoKSB7Ci0vLwkJU3RyaW5nIGlkID0gImpzdC5lamIiOwotLy8JCWNvbXBvbmVudC5zZXRDb21wb25lbnRUeXBlSWQoaWQpIDsKLS8vCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRNZXRhUHJvcGVydGllcygpIHsKLQkJUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gY29tcG9uZW50LmdldE1ldGFQcm9wZXJ0aWVzKCkgOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRNZXRhUmVzb3VyY2VzKCkgewotCQlJUGF0aFtdIG1ldGFyZXNvdXJjZXMgPSBjb21wb25lbnQuZ2V0TWV0YVJlc291cmNlcygpIDsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRNZXRhUmVzb3VyY2VzKCkgewotCQkKLQkJSVBhdGhbXSBtZXRhcmVzb3VyY2VzID0gbmV3IElQYXRoWzFdOwotCQltZXRhcmVzb3VyY2VzWzBdID0gbmV3IFBhdGgoIi90ZXN0Iik7Ci0JCWNvbXBvbmVudC5zZXRNZXRhUmVzb3VyY2VzKG1ldGFyZXNvdXJjZXMpIDsKLQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UmVzb3VyY2VzKCkgewotCQlTdHJpbmcgcmVzb3VyY2UgPSAiL3Rlc3QiOwotCQlJVmlydHVhbEZvbGRlciByb290Rm9sZGVyID0gY29tcG9uZW50LmdldFJvb3RGb2xkZXIoKTsJCQotCQlJVmlydHVhbFJlc291cmNlW10gdmlydHVhbFJlc291cmNlID0gcm9vdEZvbGRlci5nZXRSZXNvdXJjZXMocmVzb3VyY2UpIDsKLQotCX0KLQkKLQlwdWJsaWMgdm9pZCAgdGVzdEV4aXN0cygpewotCQlib29sZWFuIGV4aXN0cyA9IGNvbXBvbmVudC5leGlzdHMoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFJvb3RGb2xkZXIoKXsKLQkJY29tcG9uZW50LmdldFJvb3RGb2xkZXIoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFByb2plY3QoKXsKLQkJY29tcG9uZW50LmdldFByb2plY3QoKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdEFkZE1ldGFQcm9wZXJ0eSgpewotCQljb21wb25lbnQuc2V0TWV0YVByb3BlcnR5KCJUZXN0MSIsICJ0ZXN0MVZhbHVlIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFByb3BlcnRpZXMoKXsKLQkJUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCXByb3BzLnNldFByb3BlcnR5KCJUZXN0MiIsICJWYWx1ZTIiKTsKLQkJY29tcG9uZW50LnNldE1ldGFQcm9wZXJ0aWVzKHByb3BzKTsKLQl9CQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3Rlc3RzL0lWaXJ0dWFsQ29udGFpbmVyVGVzdEFQSS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS90ZXN0cy9JVmlydHVhbENvbnRhaW5lclRlc3RBUEkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU3NGViYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3Rlc3RzL0lWaXJ0dWFsQ29udGFpbmVyVGVzdEFQSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmNvbXBvbmVudGNvcmUudGVzdHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZXNvdXJjZTsKLQotcHVibGljIGNsYXNzIElWaXJ0dWFsQ29udGFpbmVyVGVzdEFQSSBleHRlbmRzIEJhc2VWaXJ0dWFsVGVzdCB7Ci0JCi0JcHJvdGVjdGVkIElWaXJ0dWFsQ29udGFpbmVyIGRlbGV0ZW1lVmlydHVhbEZvbGRlcjI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJUGF0aCBERUxFVEVNRV9QQVRIMiA9IG5ldyBQYXRoKCIvZGVsZXRlbWUyIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBJVmlydHVhbENvbnRhaW5lclRlc3RBUEkoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfSAKLQkKLQotCXB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlKCkKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCi0JCUlWaXJ0dWFsRm9sZGVyIHJvb3RGb2xkZXIgPSBjb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpOwotCQlkZWxldGVtZVZpcnR1YWxGb2xkZXIyID0gcm9vdEZvbGRlci5nZXRGb2xkZXIoREVMRVRFTUVfUEFUSDIpOwotCQlkZWxldGVtZVZpcnR1YWxGb2xkZXIyLmNyZWF0ZShJVmlydHVhbFJlc291cmNlLkZPUkNFLCBudWxsKTsKLQkJZGVsZXRlbWVWaXJ0dWFsRm9sZGVyMi5kZWxldGUoSVZpcnR1YWxSZXNvdXJjZS5GT1JDRSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdF9leGlzdHMoKSB7Ci0JCUlWaXJ0dWFsQ29udGFpbmVyIGNvbnRhaW5lciA9IHdlYkluZkZvbGRlcjsKLQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKCIvZGVsZXRlbWUiKTsKLQkJYm9vbGVhbiBiUmV0VmFsdWUgPSBjb250YWluZXIuZXhpc3RzKHBhdGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RfZmluZE1lbWJlcigpIHsKLQkJU3RyaW5nIG5hbWUgPSAibGliIjsKLQkJSVZpcnR1YWxDb250YWluZXIgY29udGFpbmVyID0gd2ViSW5mRm9sZGVyOwotCQlJVmlydHVhbFJlc291cmNlIHJlc291cmNlPSBjb250YWluZXIuZmluZE1lbWJlcihuYW1lKTsKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdF9maW5kTWVtYmVyMigpIHsKLQkJU3RyaW5nIG5hbWUgPSAibGliIjsKLQkJaW50IHNlYXJjaEZsYWdzID0gMDsKLQkJSVZpcnR1YWxDb250YWluZXIgY29udGFpbmVyID0gd2ViSW5mRm9sZGVyOwotCQlJVmlydHVhbFJlc291cmNlIHJlc291cmNlPSBjb250YWluZXIuZmluZE1lbWJlcihuYW1lLHNlYXJjaEZsYWdzKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdF9maW5kTWVtYmVyMygpIHsKLQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKCIvbGliIik7Ci0JCUlWaXJ0dWFsQ29udGFpbmVyIGNvbnRhaW5lciA9IHdlYkluZkZvbGRlcjsKLQkJSVZpcnR1YWxSZXNvdXJjZSByZXNvdXJjZT0gY29udGFpbmVyLmZpbmRNZW1iZXIocGF0aCk7Ci0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RfZmluZE1lbWJlcjQoKSB7Ci0JCUlQYXRoIHBhdGggPSBuZXcgUGF0aCgiL2xpYiIpOwotCQlpbnQgc2VhcmNoRmxhZ3MgPSAwOwotCQlJVmlydHVhbENvbnRhaW5lciBjb250YWluZXIgPSB3ZWJJbmZGb2xkZXI7Ci0JCUlWaXJ0dWFsUmVzb3VyY2UgcmVzb3VyY2U9IGNvbnRhaW5lci5maW5kTWVtYmVyKHBhdGgsc2VhcmNoRmxhZ3MpOwotCX0KLQotCQotCi0JcHVibGljIHZvaWQgdGVzdF9nZXRGaWxlKCkgewotCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgoIi9kZWxldGVtZSIpOwotCQlJVmlydHVhbENvbnRhaW5lciBjb250YWluZXIgPSB3ZWJJbmZGb2xkZXI7Ci0JCUlWaXJ0dWFsUmVzb3VyY2UgcmVzb3VyY2U9IGNvbnRhaW5lci5nZXRGaWxlKHBhdGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RfZ2V0Rm9sZGVyKCkgewotCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgoIi9kZWxldGVtZSIpOwotCQlJVmlydHVhbENvbnRhaW5lciBjb250YWluZXIgPSB3ZWJJbmZGb2xkZXI7Ci0JCUlWaXJ0dWFsUmVzb3VyY2UgcmVzb3VyY2U9IGNvbnRhaW5lci5nZXRGb2xkZXIocGF0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdF9nZXRGaWxlMigpIHsKLQkJU3RyaW5nIG5hbWUgPSAiL2RlbGV0ZW1lIjsKLQkJSVZpcnR1YWxDb250YWluZXIgY29udGFpbmVyID0gd2ViSW5mRm9sZGVyOwotCQlJVmlydHVhbFJlc291cmNlIHJlc291cmNlPSBjb250YWluZXIuZ2V0RmlsZShuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0X2dldEZvbGRlcjIoKSB7Ci0JCVN0cmluZyBuYW1lID0gIi9kZWxldGVtZSI7Ci0JCUlWaXJ0dWFsQ29udGFpbmVyIGNvbnRhaW5lciA9IHdlYkluZkZvbGRlcjsKLQkJSVZpcnR1YWxSZXNvdXJjZSByZXNvdXJjZT0gY29udGFpbmVyLmdldEZvbGRlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgIHZvaWQgdGVzdF9tZW1iZXJzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJVmlydHVhbENvbnRhaW5lciBjb250YWluZXIgPSB3ZWJJbmZGb2xkZXI7Ci0JCUlWaXJ0dWFsUmVzb3VyY2VbXSByZXNvdXJjZT0gY29udGFpbmVyLm1lbWJlcnMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtZW1iZXJzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJVmlydHVhbENvbnRhaW5lciBjb250YWluZXIgPSB3ZWJJbmZGb2xkZXI7Ci0JCWludCBtZW1iZXJGbGFncyA9IDA7Ci0JCUlWaXJ0dWFsUmVzb3VyY2VbXSByZXNvdXJjZT0gY29udGFpbmVyLm1lbWJlcnMobWVtYmVyRmxhZ3MpOwotCQkKLQotCX0KLQotCQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3Rlc3RzL0lWaXJ0dWFsRmlsZUFQSVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdGVzdHMvSVZpcnR1YWxGaWxlQVBJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmRiNGUwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdGVzdHMvSVZpcnR1YWxGaWxlQVBJVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuY29tcG9uZW50Y29yZS50ZXN0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlc291cmNlOwotCi0KLXB1YmxpYyBjbGFzcyBJVmlydHVhbEZpbGVBUElUZXN0IGV4dGVuZHMgQmFzZVZpcnR1YWxUZXN0IHsKLQotCXByb3RlY3RlZCBJVmlydHVhbEZpbGUgdGVzdEZpbGUxOwotCXByb3RlY3RlZCBJRmlsZSByZWFsVGVzdEZpbGUxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGF0aCBURVNUX0ZJTEVfUkVBTF9QQVRIID0gbmV3IFBhdGgoIldlYk1vZHVsZTEvdGVzdGRhdGEvVGVzdEZpbGUxLnR4dCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBhdGggVEVTVF9GSUxFX1JVTlRJTUVfUEFUSCA9IG5ldyBQYXRoKCIvIik7IC8vJE5PTi1OTFMtMSQKLQotCi0JcHVibGljIElWaXJ0dWFsRmlsZUFQSVRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JCQotCX0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXN1cGVyLnNldFVwKCk7Ci0JCUlWaXJ0dWFsRm9sZGVyIHJvb3RGb2xkZXIgPSBjb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpOwotCQl0ZXN0RmlsZTEgPSByb290Rm9sZGVyLmdldEZpbGUoVEVTVERBVEFfRk9MREVSX1JVTlRJTUVfUEFUSCk7IAotCQlyZWFsVGVzdEZpbGUxID0gVEVTVF9QUk9KRUNULmdldEZpbGUoVEVTVERBVEFfRk9MREVSX1JFQUxfUEFUSCk7Ci0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRVbmRlcmx5aW5nRmlsZSgpIHsKLQkJSUZpbGUgZmlsZSA9IHRlc3RGaWxlMS5nZXRVbmRlcmx5aW5nRmlsZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRVbmRlcmx5aW5nRmlsZXMoKSB7Ci0JCUlGaWxlW10gZmlsZSA9IHRlc3RGaWxlMS5nZXRVbmRlcmx5aW5nRmlsZXMoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElzQWNjZXNzaWJsZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKCgoSVZpcnR1YWxSZXNvdXJjZSlkZWxldGVtZVZpcnR1YWxGb2xkZXIpLmlzQWNjZXNzaWJsZSgpLHRydWUpOwotCQkoKElWaXJ0dWFsUmVzb3VyY2UpZGVsZXRlbWVWaXJ0dWFsRm9sZGVyKS5kZWxldGUoSVZpcnR1YWxSZXNvdXJjZS5GT1JDRSwgbnVsbCk7Ci0JCS8vYXNzZXJ0RXF1YWxzKGRlbGV0ZW1lVmlydHVhbEZvbGRlci5pc0FjY2Vzc2libGUoKSxmYWxzZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3Rlc3RzL0lWaXJ0dWFsRm9sZGVyQVBJVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS90ZXN0cy9JVmlydHVhbEZvbGRlckFQSVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2EzNjc5ZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3Rlc3RzL0lWaXJ0dWFsRm9sZGVyQVBJVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmNvbXBvbmVudGNvcmUudGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5TaW1wbGVUZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBJVmlydHVhbEZvbGRlckFQSVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJUHJvamVjdCBURVNUX1BST0pFQ1QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoVGVzdFdvcmtzcGFjZS5QUk9KRUNUX05BTUUpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9GT0xERVJfTkFNRSA9ICJXRUItSU5GIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGF0aCBXRUJJTkZfRk9MREVSX1JFQUxfUEFUSCA9IG5ldyBQYXRoKCIvV2ViTW9kdWxlMS9XZWJDb250ZW50LyIrVEVTVF9GT0xERVJfTkFNRSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGF0aCBXRUJJTkZfRk9MREVSX1JVTlRJTUVfUEFUSCA9IG5ldyBQYXRoKCIvIitURVNUX0ZPTERFUl9OQU1FKTsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGF0aCBURVNUREFUQV9GT0xERVJfUkVBTF9QQVRIID0gbmV3IFBhdGgoIldlYk1vZHVsZTEvdGVzdGRhdGEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQYXRoIFRFU1REQVRBX0ZPTERFUl9SVU5USU1FX1BBVEggPSBuZXcgUGF0aCgiLyIpOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSVBhdGggREVMRVRFTUVfUEFUSCA9IG5ldyBQYXRoKCIvZGVsZXRlbWUiKTsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50OwotCQotCXByaXZhdGUgSVZpcnR1YWxGb2xkZXIgd2ViSW5mRm9sZGVyOwotCXByaXZhdGUgSUNvbnRhaW5lciByZWFsV2ViSW5mRm9sZGVyOwotCQotCXByaXZhdGUgSVZpcnR1YWxGb2xkZXIgZGVsZXRlbWVWaXJ0dWFsRm9sZGVyOwotCXByaXZhdGUgSUNvbnRhaW5lciBkZWxldGVtZUZvbGRlcjsJCi0KLQlwdWJsaWMgSVZpcnR1YWxGb2xkZXJBUElUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0gCi0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVGVzdFN1aXRlKElWaXJ0dWFsRm9sZGVyQVBJVGVzdC5jbGFzcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJVGVzdFdvcmtzcGFjZS5pbml0KCk7CQkKLQkJCi0JCXJlYWxXZWJJbmZGb2xkZXIgPSBURVNUX1BST0pFQ1QuZ2V0Rm9sZGVyKFdFQklORl9GT0xERVJfUkVBTF9QQVRIKTsKLQkJCi0JCWNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KFRFU1RfUFJPSkVDVCk7Ci0JCUlWaXJ0dWFsRm9sZGVyIHJvb3RGb2xkZXIgPSBjb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpOwotCQkKLQkJd2ViSW5mRm9sZGVyID0gcm9vdEZvbGRlci5nZXRGb2xkZXIoV0VCSU5GX0ZPTERFUl9SVU5USU1FX1BBVEgpOyAJCQotCi0JCXJvb3RGb2xkZXIuZ2V0Rm9sZGVyKFRFU1REQVRBX0ZPTERFUl9SVU5USU1FX1BBVEgpOyAKLQkJVEVTVF9QUk9KRUNULmdldEZvbGRlcihURVNUREFUQV9GT0xERVJfUkVBTF9QQVRIKTsKLQkJCi0JCWRlbGV0ZW1lVmlydHVhbEZvbGRlciA9IHJvb3RGb2xkZXIuZ2V0Rm9sZGVyKERFTEVURU1FX1BBVEgpOwotCQlkZWxldGVtZVZpcnR1YWxGb2xkZXIuY3JlYXRlKElWaXJ0dWFsUmVzb3VyY2UuRk9SQ0UsIG51bGwpOwotCQkKLQkJZGVsZXRlbWVGb2xkZXIgPSBkZWxldGVtZVZpcnR1YWxGb2xkZXIuZ2V0VW5kZXJseWluZ0ZvbGRlcigpOwkJCi0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVsZXRlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoKChJVmlydHVhbFJlc291cmNlKWRlbGV0ZW1lVmlydHVhbEZvbGRlcikuZXhpc3RzKCksdHJ1ZSk7Ci0JCSgoSVZpcnR1YWxSZXNvdXJjZSlkZWxldGVtZVZpcnR1YWxGb2xkZXIpLmRlbGV0ZShJVmlydHVhbFJlc291cmNlLkZPUkNFLCBudWxsKTsKLQkJLy8gYXNzZXJ0RXF1YWxzKGRlbGV0ZW1lRm9sZGVyLmV4aXN0cygpLGZhbHNlKTsKLQkJCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JCQotCQlpZihkZWxldGVtZUZvbGRlci5leGlzdHMoKSkKLQkJCWRlbGV0ZW1lRm9sZGVyLmRlbGV0ZShJVmlydHVhbFJlc291cmNlLkZPUkNFLCBudWxsKTsKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEZpbGVFeHRlbnNpb24oKSB7Ci0JCWFzc2VydFRydWUoIlRoZSAvV0VCLUlORiBmb2xkZXIgc2hvdWxkIGhhdmUgbm8gZmlsZSBleHRlbnNpb24uIiwgKChJVmlydHVhbFJlc291cmNlKXdlYkluZkZvbGRlcikuZ2V0RmlsZUV4dGVuc2lvbigpID09IG51bGwpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRVbmRlcmx5aW5nRm9sZGVycygpIHsKLQkJSUNvbnRhaW5lcltdIGFEZWxldGVtZUZvbGRlciA9IGRlbGV0ZW1lVmlydHVhbEZvbGRlci5nZXRVbmRlcmx5aW5nRm9sZGVycygpOwotCQlhc3NlcnRFcXVhbHMoYURlbGV0ZW1lRm9sZGVyLmxlbmd0aD09MSx0cnVlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFVuZGVybHlpbmdSZXNvdXJjZXMoKSB7Ci0JCUlSZXNvdXJjZVtdIGFEZWxldGVtZUZvbGRlciA9ICgoSVZpcnR1YWxSZXNvdXJjZSlkZWxldGVtZVZpcnR1YWxGb2xkZXIpLmdldFVuZGVybHlpbmdSZXNvdXJjZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKGFEZWxldGVtZUZvbGRlci5sZW5ndGg9PTEsdHJ1ZSk7Ci0JfQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWaXJ0dWFsQ29tcG9uZW50RnJvbVJlc291cmNlKCkgewotCQlJUmVzb3VyY2UgYURlbGV0ZW1lRm9sZGVyID0gKChJVmlydHVhbFJlc291cmNlKWRlbGV0ZW1lVmlydHVhbEZvbGRlcikuZ2V0VW5kZXJseWluZ1Jlc291cmNlcygpWzBdOwotCQlJVmlydHVhbENvbXBvbmVudCBjb21wID0gKElWaXJ0dWFsQ29tcG9uZW50KWFEZWxldGVtZUZvbGRlci5nZXRBZGFwdGVyKElWaXJ0dWFsQ29tcG9uZW50LmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKGNvbXAuZ2V0TmFtZSgpLFRlc3RXb3Jrc3BhY2UuUFJPSkVDVF9OQU1FKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdEdldFVuZGVybHlpbmdGb2xkZXIoKSB7Ci0JCUlDb250YWluZXIgYURlbGV0ZW1lRm9sZGVyID0gZGVsZXRlbWVWaXJ0dWFsRm9sZGVyLmdldFVuZGVybHlpbmdGb2xkZXIoKTsKLQkJYXNzZXJ0Tm90TnVsbChhRGVsZXRlbWVGb2xkZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRVbmRlcmx5aW5nUmVzb3VyY2UoKSB7Ci0JCUlSZXNvdXJjZSBhRGVsZXRlbWVGb2xkZXIgPSAoKElWaXJ0dWFsUmVzb3VyY2UpZGVsZXRlbWVWaXJ0dWFsRm9sZGVyKS5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKTsKLQkJYXNzZXJ0Tm90TnVsbChhRGVsZXRlbWVGb2xkZXIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0V29ya3NwYWNlUmVsYXRpdmVQYXRoKCkgewotCQlJUGF0aCByZWFsUGF0aCA9IHJlYWxXZWJJbmZGb2xkZXIuZ2V0RnVsbFBhdGgoKTsKLQkJSVBhdGggdmlydHVhbFBhdGggPSAoKElWaXJ0dWFsUmVzb3VyY2Upd2ViSW5mRm9sZGVyKS5nZXRXb3Jrc3BhY2VSZWxhdGl2ZVBhdGgoKTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgd29ya3NwYWNlIHJlbGF0aXZlIHBhdGggb2YgdGhlIHZpcnR1YWwgcmVzb3VyY2UgbXVzdCBtYXRjaCB0aGUgcmVhbCByZXNvdXJjZSIsIHJlYWxQYXRoLCB2aXJ0dWFsUGF0aCk7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29tcG9uZW50KCkgeyAKLQkJYXNzZXJ0Tm90TnVsbCgoKElWaXJ0dWFsUmVzb3VyY2Upd2ViSW5mRm9sZGVyKS5nZXRDb21wb25lbnQoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpIHsKLQkJSVBhdGggcmVhbFBhdGggPSByZWFsV2ViSW5mRm9sZGVyLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKTsKLQkJSVBhdGggdmlydHVhbFBhdGggPSB3ZWJJbmZGb2xkZXIuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpOwotCQlhc3NlcnRFcXVhbHMoIlRoZSBwcm9qZWN0IHJlbGF0aXZlIHBhdGggb2YgdGhlIHZpcnR1YWwgcmVzb3VyY2UgbXVzdCBtYXRjaCB0aGUgcmVhbCByZXNvdXJjZSIsIHJlYWxQYXRoLCB2aXJ0dWFsUGF0aCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UnVudGltZVBhdGgoKSB7IAotCQlJUGF0aCB2aXJ0dWFsUGF0aCA9ICgoSVZpcnR1YWxSZXNvdXJjZSl3ZWJJbmZGb2xkZXIpLmdldFJ1bnRpbWVQYXRoKCk7Ci0JCWFzc2VydEVxdWFscygiVGhlIHJ1bnRpbWUgcGF0aCBvZiB0aGUgdmlydHVhbCByZXNvdXJjZSBtdXN0IG1hdGNoIHRoZSByZWFsIHJlc291cmNlIiwgV0VCSU5GX0ZPTERFUl9SVU5USU1FX1BBVEgsIHZpcnR1YWxQYXRoKTsgLy8kTk9OLU5MUy0xJAotCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgbmFtZSBvZiB0aGUgdmlydHVhbCByZXNvdXJjZSBtdXN0IG1hdGNoIHRoZSBleHBlY3RlZCBuYW1lLiIsIFRFU1RfRk9MREVSX05BTUUsIHdlYkluZkZvbGRlci5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFBhcmVudCgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgcGFyZW50IG9mIHRoZSB2aXJ0dWFsIHJlc291cmNlIG11c3QgbWF0Y2ggdGhlIGNvbXBvbmVudHMgcm9vdCBmb2xkZXIuIiwgY29tcG9uZW50LmdldFJvb3RGb2xkZXIoKSwgd2ViSW5mRm9sZGVyLmdldFBhcmVudCgpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzKCkgewotCQlJVmlydHVhbFJlc291cmNlIHJlc291cmNlID0gd2ViSW5mRm9sZGVyLmdldFBhcmVudCgpOwotCQlib29sZWFuIGJSZXRWYWx1ZSA9IHJlc291cmNlLmVxdWFscyhjb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpKTsKLQkJYXNzZXJ0VHJ1ZShiUmV0VmFsdWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRQcm9qZWN0KCkgewotCQlhc3NlcnRFcXVhbHMoIlRoZSBwcm9qZWN0IG9mIHRoZSB2aXJ0dWFsIHJlc291cmNlIG11c3QgbWF0Y2ggdGhlIHRlc3QgcHJvamVjdC4iLCBURVNUX1BST0pFQ1QsICgoSVZpcnR1YWxSZXNvdXJjZSl3ZWJJbmZGb2xkZXIpLmdldFByb2plY3QoKSk7IC8vJE5PTi1OTFMtMSQKLQl9ICAKLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRUeXBlKCkgewotCQlhc3NlcnRFcXVhbHMoIlRoZSB0eXBlIG9mIHRoZSB2aXJ0dWFsIHJlc291cmNlIG11c3QgbWF0Y2ggdGhlIHR5cGUgb2YgdGhlIHRlc3QgcHJvamVjdC4iLCBJVmlydHVhbFJlc291cmNlLkZPTERFUiwgKChJVmlydHVhbFJlc291cmNlKXdlYkluZkZvbGRlcikuZ2V0VHlwZSgpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkKLQkvKnB1YmxpYyB2b2lkIHRlc3RHZXRGaWxlUGF0aCgpIHsKLQkJSVZpcnR1YWxGaWxlIHRlc3QzanNwID0gdGVzdGRhdGFGb2xkZXIuZ2V0RmlsZShuZXcgUGF0aCgiL2pzcHMvVGVzdEpzcDMuanNwIikpOwotCQkKLQkJSVBhdGggZXhwZWN0ZWRQYXRoID0gVEVTVERBVEFfRk9MREVSX1JFQUxfUEFUSC5hcHBlbmQobmV3IFBhdGgoIi9qc3BzL1Rlc3RKc3AzLmpzcCIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgdGVzdCBmaWxlIHByb2plY3QgcmVsYXRpdmUgcGF0aCBtdXN0IG1hdGNoLiIsIGV4cGVjdGVkUGF0aCwgdGVzdDNqc3AuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCX0qLwotCQotCi0KLQkvKgotCSAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIHZvaWQgZGVsZXRlKGludCwgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQkvKnB1YmxpYyB2b2lkIHRlc3REZWxldGVpbnRJUHJvZ3Jlc3NNb25pdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWRlbGV0ZW1lVmlydHVhbEZvbGRlci5kZWxldGUoMCwgbnVsbCk7Ci0JCQotCQlhc3NlcnRUcnVlKCJUaGUgcmVhbCBmb2xkZXIgc2hvdWxkIGJlIGRlbGV0ZWQgd2hlbiBJVmlydHVhbFJlc291cmNlLkRFTEVURV9NRVRBTU9ERUxfT05MWSBpcyBOT1Qgc3VwcGxpZWQuIiwgIWRlbGV0ZW1lRm9sZGVyLmV4aXN0cygpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQotCQlJVmlydHVhbFJlc291cmNlW10gbWVtYmVycyA9IGNvbXBvbmVudC5tZW1iZXJzKCk7Ci0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlcnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmKG1lbWJlcnNbaV0uZ2V0UnVudGltZVBhdGgoKS5lcXVhbHMoZGVsZXRlbWVWaXJ0dWFsRm9sZGVyLmdldFJ1bnRpbWVQYXRoKCkpKSB7Ci0JCQkJZmFpbCgiRm91bmQgZGVsZXRlZCBmb2xkZXIgaW4gbWVtYmVycygpIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQkJCi0JfSovCi0JCi0JLyoKLQkgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciB2b2lkIGRlbGV0ZShpbnQsIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JLypwdWJsaWMgdm9pZCB0ZXN0RGVsZXRlaW50SVByb2dyZXNzTW9uaXRvcjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZGVsZXRlbWVWaXJ0dWFsRm9sZGVyLmRlbGV0ZShJVmlydHVhbFJlc291cmNlLklHTk9SRV9VTkRFUkxZSU5HX1JFU09VUkNFLCBudWxsKTsKLQkJCi0JCWFzc2VydFRydWUoIlRoZSByZWFsIGZvbGRlciBzaG91bGQgbm90IGJlIGRlbGV0ZWQgd2hlbiBJVmlydHVhbFJlc291cmNlLkRFTEVURV9NRVRBTU9ERUxfT05MWSBpcyBzdXBwbGllZC4iLCBkZWxldGVtZUZvbGRlci5leGlzdHMoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkKLQkJLy8gb25seSBoYW5kbGVzIGV4cGxpY2l0IG1hcHBpbmdzCi0JCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlVUkkgcnVudGltZVVSSSA9IFVSSS5jcmVhdGVVUkkoZGVsZXRlbWVWaXJ0dWFsRm9sZGVyLmdldFJ1bnRpbWVQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQltb2R1bGVDb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yV3JpdGUoVEVTVF9QUk9KRUNUKTsKLQkJCVdvcmtiZW5jaENvbXBvbmVudCB3YkNvbXBvbmVudCA9IG1vZHVsZUNvcmUuZmluZENvbXBvbmVudEJ5TmFtZShUZXN0V29ya3NwYWNlLldFQl9NT0RVTEVfMV9OQU1FKTsKLQkJCUNvbXBvbmVudFJlc291cmNlW10gcmVzb3VyY2VzID0gd2JDb21wb25lbnQuZmluZFdvcmtiZW5jaE1vZHVsZVJlc291cmNlQnlEZXBsb3lQYXRoKHJ1bnRpbWVVUkkpOwotCQkJYXNzZXJ0VHJ1ZSgiVGhlcmUgc2hvdWxkIGJlIG5vIG1hdGNoaW5nIGNvbXBvbmVudHMgZm91bmQgaW4gdGhlIG1vZGVsLiIsIHJlc291cmNlcy5sZW5ndGggPT0gMCk7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQl9IGZpbmFsbHkgewotCQkJaWYgKG1vZHVsZUNvcmUgIT0gbnVsbCkgewotCQkJCW1vZHVsZUNvcmUuc2F2ZUlmTmVjZXNzYXJ5KG51bGwpOwotCQkJCW1vZHVsZUNvcmUuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfSovCi0JCi0JLyoKLQkgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciB2b2lkIGRlbGV0ZShib29sZWFuLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCS8qcHVibGljIHZvaWQgdGVzdERlbGV0ZWJvb2xlYW5JUHJvZ3Jlc3NNb25pdG9yKCkgIHRocm93cyBFeGNlcHRpb24gIHsKLQkJZGVsZXRlbWVWaXJ0dWFsRm9sZGVyLmRlbGV0ZShJVmlydHVhbFJlc291cmNlLkZPUkNFLCBudWxsKTsKLQkJCi0JCWFzc2VydFRydWUoIlRoZSByZWFsIGZvbGRlciBzaG91bGQgYmUgZGVsZXRlZCB3aGVuIElWaXJ0dWFsUmVzb3VyY2UuREVMRVRFX01FVEFNT0RFTF9PTkxZIGlzIE5PVCBzdXBwbGllZC4iLCAhZGVsZXRlbWVGb2xkZXIuZXhpc3RzKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCi0JCUlWaXJ0dWFsUmVzb3VyY2VbXSBtZW1iZXJzID0gY29tcG9uZW50Lm1lbWJlcnMoKTsKLQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVycy5sZW5ndGg7IGkrKykgewotCQkJaWYobWVtYmVyc1tpXS5nZXRSdW50aW1lUGF0aCgpLmVxdWFscyhkZWxldGVtZVZpcnR1YWxGb2xkZXIuZ2V0UnVudGltZVBhdGgoKSkpIHsKLQkJCQlmYWlsKCJGb3VuZCBkZWxldGVkIGZvbGRlciBpbiBtZW1iZXJzKCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9CQotCX0JKi8gCi0JIAkKLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS90ZXN0cy9JVmlydHVhbFJlZmVyZW5jZUFQSVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdGVzdHMvSVZpcnR1YWxSZWZlcmVuY2VBUElUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4YTEwMTMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS90ZXN0cy9JVmlydHVhbFJlZmVyZW5jZUFQSVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmNvbXBvbmVudGNvcmUudGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlcy5WaXJ0dWFsUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKLQotcHVibGljIGNsYXNzIElWaXJ0dWFsUmVmZXJlbmNlQVBJVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlKCkgewotCQlJVmlydHVhbFJlZmVyZW5jZSByZWZlcmVuY2UgPSBuZXcgVmlydHVhbFJlZmVyZW5jZSgpOwotCQlyZWZlcmVuY2UuY3JlYXRlKDAsbnVsbCk7Ci0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRSdW50aW1lUGF0aCgpIHsKLQkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmZXJlbmNlID0gbmV3IFZpcnR1YWxSZWZlcmVuY2UoKTsKLQkJcmVmZXJlbmNlLnNldFJ1bnRpbWVQYXRoKG5ldyBQYXRoKCIvIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRSdW50aW1lUGF0aCgpIHsKLQkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmZXJlbmNlID0gbmV3IFZpcnR1YWxSZWZlcmVuY2UoKTsKLQkJSVBhdGggcGF0aCA9IHJlZmVyZW5jZS5nZXRSdW50aW1lUGF0aCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXREZXBlbmRlbmN5VHlwZSgpIHsKLQkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmZXJlbmNlID0gbmV3IFZpcnR1YWxSZWZlcmVuY2UoKTsKLQkJaW50IGRlcGVuZGVuY3lUeXBlID0gMDsKLQkJcmVmZXJlbmNlLnNldERlcGVuZGVuY3lUeXBlKGRlcGVuZGVuY3lUeXBlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVwZW5kZW5jeVR5cGUoKSB7Ci0JCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZmVyZW5jZSA9IG5ldyBWaXJ0dWFsUmVmZXJlbmNlKCk7Ci0JCWludCBkZXBlbmRlbmN5VHlwZSA9IDA7Ci0JCWRlcGVuZGVuY3lUeXBlID0gcmVmZXJlbmNlLmdldERlcGVuZGVuY3lUeXBlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV4aXN0cygpIHsKLQkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmZXJlbmNlID0gbmV3IFZpcnR1YWxSZWZlcmVuY2UoKTsKLQkJYm9vbGVhbiBleGlzdHMgPSByZWZlcmVuY2UuZXhpc3RzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEVuY2xvc2luZ0NvbXBvbmVudCgpIHsKLQkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmZXJlbmNlID0gbmV3IFZpcnR1YWxSZWZlcmVuY2UoKTsKLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gcmVmZXJlbmNlLmdldEVuY2xvc2luZ0NvbXBvbmVudCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkgewotCQlJVmlydHVhbFJlZmVyZW5jZSByZWZlcmVuY2UgPSBuZXcgVmlydHVhbFJlZmVyZW5jZSgpOwotCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSByZWZlcmVuY2UuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwotCi0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3Rlc3RzL01vZHVsZUNvcmVBUElGVlRUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3Rlc3RzL01vZHVsZUNvcmVBUElGVlRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjNWM5MDAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS90ZXN0cy9Nb2R1bGVDb3JlQVBJRlZUVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmNvbXBvbmVudGNvcmUudGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuY29tcG9uZW50Y29yZS52aXJ0dWFscGF0aC50ZXN0cy5UZXN0V29ya3NwYWNlOwotCi0vKioKLSAqIAotICogPHA+Ci0gKiBUbyBydW4gdGhpcyB0ZXN0LCBleHRyYWN0IHRoZSAvdGVzdERhdGEvdmlydHVhbC1hcGktdGVzdF93b3Jrc3BhY2UuemlwIGZvdW5kIHVuZGVyIHRoZSBzYW1lCi0gKiBwbHVnaW4sIGFuZCB1c2UgIlJ1biBBcyAtPiBKVW5pdCBQbHVnaW4gVGVzdCIuIEJlIHN1cmUgdG8gcG9pbnQgdGhlIGNvbmZpZ3VyYXRpb24gYXQgdGhlCi0gKiBleHRyYWN0ZWQgd29ya3NwYWNlLCBhbmQgbWFrZSBzdXJlIHRoYXQgIkNsZWFyIHdvcmtzcGFjZSBjb250ZW50cyIgaXMgTk9UIGNoZWNrZWQuIFRoZSB0ZXN0IG1heQotICogYmUgcnVuIHVzaW5nIGEgSGVhZGxlc3MgRWNsaXBzZS4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIE1vZHVsZUNvcmVBUElGVlRUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3MgSUZPTERFUl9DTEFTUyA9IElWaXJ0dWFsRm9sZGVyLmNsYXNzOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzIElGSUxFX0NMQVNTID0gSVZpcnR1YWxGaWxlLmNsYXNzOwotCi0JcHJpdmF0ZSBmaW5hbCBNYXAgdmlydHVhbFJlc291cmNlVHJlZSA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIElHTk9SRSA9IG5ldyBIYXNoTWFwKCk7Ci0KLQotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuU2ltcGxlVGVzdFN1aXRlKE1vZHVsZUNvcmVBUElGVlRUZXN0LmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgTW9kdWxlQ29yZUFQSUZWVFRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQotCQlzZXR1cE5hdmlnYXRlQ29tcG9uZW50VGVzdCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci50ZWFyRG93bigpOyAKLQkJdGVhckRvd25DcmVhdGVOZXdNb2R1bGVUZXN0KCk7Ci0JCXRlYXJEb3duQ3JlYXRlTGlua1Rlc3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZWFyRG93bkNyZWF0ZU5ld01vZHVsZVRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUZvbGRlciByb290Rm9sZGVyID0gVGVzdFdvcmtzcGFjZS5nZXRUYXJnZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKFRlc3RXb3Jrc3BhY2UuTkVXX1dFQl9NT0RVTEVfTkFNRSk7Ci0JCWlmIChyb290Rm9sZGVyLmV4aXN0cygpKQotCQkJcm9vdEZvbGRlci5kZWxldGUoSVJlc291cmNlLkZPUkNFIHwgSVJlc291cmNlLkFMV0FZU19ERUxFVEVfUFJPSkVDVF9DT05URU5ULCBudWxsKTsKLQotCQlTdHJ1Y3R1cmVFZGl0IG1vZHVsZUNvcmUgPSBudWxsOwotCi0JCXRyeSB7Ci0JCQltb2R1bGVDb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yV3JpdGUoVGVzdFdvcmtzcGFjZS5nZXRUYXJnZXRQcm9qZWN0KCkpOwotCQkJV29ya2JlbmNoQ29tcG9uZW50IHdiQ29tcG9uZW50ID0gbW9kdWxlQ29yZS5nZXRDb21wb25lbnQoKTsKLQotCQkJaWYgKHdiQ29tcG9uZW50ICE9IG51bGwpIHsKLQkJCQlDb21wb25lbnRSZXNvdXJjZVtdIGNvbXBvbmVudFJlc291cmNlcyA9IHdiQ29tcG9uZW50LmZpbmRSZXNvdXJjZXNCeVJ1bnRpbWVQYXRoKG5ldyBQYXRoKCIvIikpOyAvLyROT04tTkxTLTEkCQkJCQotCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb21wb25lbnRSZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJd2JDb21wb25lbnQuZ2V0UmVzb3VyY2VzKCkucmVtb3ZlKGNvbXBvbmVudFJlc291cmNlc1tpXSk7Ci0JCQkJfQotCQkJfQotCi0JCX0gZmluYWxseSB7Ci0JCQlpZiAobW9kdWxlQ29yZSAhPSBudWxsKSB7Ci0JCQkJbW9kdWxlQ29yZS5zYXZlKG51bGwpOwotCQkJCW1vZHVsZUNvcmUuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBNYXAgc3RydWN0dXJlIHRoYXQgbWltaWNzIHRoZSBleHBlY3RlZCBzdHJ1Y3R1cmUgb24gZGlzay4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXR1cE5hdmlnYXRlQ29tcG9uZW50VGVzdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJUGF0aCBpbWFnZXM7Ci0JCUlQYXRoIGpzcHM7Ci0JCUlQYXRoIFdFQl9JTkY7Ci0JCVRlc3RXb3Jrc3BhY2UuaW5pdCgpOwotCQl2aXJ0dWFsUmVzb3VyY2VUcmVlLnB1dCgoaW1hZ2VzID0gbmV3IFBhdGgoImltYWdlcyIpKSwgbmV3IEhhc2hNYXAoKSk7IC8vJE5PTi1OTFMtMSQKLQkJdmlydHVhbFJlc291cmNlVHJlZS5wdXQoKGpzcHMgPSBuZXcgUGF0aCgianNwcyIpKSwgbmV3IEhhc2hNYXAoKSk7IC8vJE5PTi1OTFMtMSQKLQkJdmlydHVhbFJlc291cmNlVHJlZS5wdXQobmV3IFBhdGgoVGVzdFdvcmtzcGFjZS5NRVRBX0lORiksIG5ldyBIYXNoTWFwKCkpOyAvLyROT04tTkxTLTEkCi0JCXZpcnR1YWxSZXNvdXJjZVRyZWUucHV0KChXRUJfSU5GID0gbmV3IFBhdGgoVGVzdFdvcmtzcGFjZS5XRUJfSU5GKSksIG5ldyBIYXNoTWFwKCkpOyAvLyROT04tTkxTLTEkCi0JCXZpcnR1YWxSZXNvdXJjZVRyZWUucHV0KG5ldyBQYXRoKCJUZXN0RmlsZTEudHh0IiksIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCXZpcnR1YWxSZXNvdXJjZVRyZWUucHV0KG5ldyBQYXRoKCJUZXN0RmlsZTIudHh0IiksIG51bGwpOyAvLyROT04tTkxTLTEkCi0KLQkJKChNYXApIHZpcnR1YWxSZXNvdXJjZVRyZWUuZ2V0KGltYWdlcykpLnB1dChuZXcgUGF0aCgiaWNvbi5naWYiKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQotCQkoKE1hcCkgdmlydHVhbFJlc291cmNlVHJlZS5nZXQoanNwcykpLnB1dChuZXcgUGF0aCgiVGVzdEpzcDEuanNwIiksIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCSgoTWFwKSB2aXJ0dWFsUmVzb3VyY2VUcmVlLmdldChqc3BzKSkucHV0KG5ldyBQYXRoKCJUZXN0SnNwMi5qc3AiKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJKChNYXApIHZpcnR1YWxSZXNvdXJjZVRyZWUuZ2V0KGpzcHMpKS5wdXQobmV3IFBhdGgoIlRlc3RKc3AzLmpzcCIpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCi0JCSgoTWFwKSB2aXJ0dWFsUmVzb3VyY2VUcmVlLmdldChXRUJfSU5GKSkucHV0KG5ldyBQYXRoKCJ3ZWIueG1sIiksIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCSgoTWFwKSB2aXJ0dWFsUmVzb3VyY2VUcmVlLmdldChXRUJfSU5GKSkucHV0KG5ldyBQYXRoKCJjbGFzc2VzIiksIElHTk9SRSk7IC8vJE5PTi1OTFMtMSQKLQkJKChNYXApIHZpcnR1YWxSZXNvdXJjZVRyZWUuZ2V0KFdFQl9JTkYpKS5wdXQobmV3IFBhdGgoImxpYiIpLCBuZXcgSGFzaE1hcCgpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENoZWNrcyBmb3IgYW5kIHJlbW92ZXMgdGhlIG1hcHBpbmcgYW5kIGZvbGRlciB0aGF0IHdpbGwgYmUgY3JlYXRlZCBieQotCSAqIHtAbGluayBNb2R1bGVDb3JlQVBJRlZUVGVzdCN0ZXN0Q3JlYXRlTGluaygpfS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZWFyRG93bkNyZWF0ZUxpbmtUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlGb2xkZXIgbW9kdWxlMkltYWdlcyA9IFRlc3RXb3Jrc3BhY2UuZ2V0VGFyZ2V0UHJvamVjdCgpLmdldEZvbGRlcihuZXcgUGF0aCgiL1dlYk1vZHVsZTIvaW1hZ2VzIikpOyAvLyROT04tTkxTLTEkCi0JCWlmIChtb2R1bGUySW1hZ2VzLmV4aXN0cygpKQotCQkJbW9kdWxlMkltYWdlcy5kZWxldGUoSVJlc291cmNlLkZPUkNFIHwgSVJlc291cmNlLkFMV0FZU19ERUxFVEVfUFJPSkVDVF9DT05URU5ULCBudWxsKTsKLQotCQlTdHJ1Y3R1cmVFZGl0IG1vZHVsZUNvcmUgPSBudWxsOwotCi0JCXRyeSB7Ci0JCQltb2R1bGVDb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yV3JpdGUoVGVzdFdvcmtzcGFjZS5nZXRUYXJnZXRQcm9qZWN0KCkpOwotCQkJV29ya2JlbmNoQ29tcG9uZW50IHdiQ29tcG9uZW50ID0gbW9kdWxlQ29yZS5nZXRDb21wb25lbnQoKTsKLQotCQkJQ29tcG9uZW50UmVzb3VyY2VbXSBjb21wb25lbnRSZXNvdXJjZXMgPSB3YkNvbXBvbmVudC5maW5kUmVzb3VyY2VzQnlSdW50aW1lUGF0aChuZXcgUGF0aCgiL2ltYWdlcyIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbXBvbmVudFJlc291cmNlcy5sZW5ndGg7IGkrKykgewotCQkJCXdiQ29tcG9uZW50LmdldFJlc291cmNlcygpLnJlbW92ZShjb21wb25lbnRSZXNvdXJjZXNbaV0pOwotCQkJfQotCi0JCX0gZmluYWxseSB7Ci0JCQlpZiAobW9kdWxlQ29yZSAhPSBudWxsKSB7Ci0JCQkJbW9kdWxlQ29yZS5zYXZlKG51bGwpOwotCQkJCW1vZHVsZUNvcmUuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBhc3NlcnRUcmVlKE1hcCByZXNvdXJjZVRyZWUsIElWaXJ0dWFsRm9sZGVyIHZpcnR1YWxGb2xkZXIpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcmVlKHJlc291cmNlVHJlZSwgdmlydHVhbEZvbGRlciwgIiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQWxsIG1ldGhvZHMgbGlzZWQgaW4gdGhlICJzZWUiIGNsYXVzZXMgYXJlIHRlc3RlZCBieSB0aGlzIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBJQ29udGFpbmVyI21lbWJlcnMoKQotCSAqIEBzZWUgSVJlc291cmNlI2dldE5hbWUoKQotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZVRyZWUKLQkgKiBAcGFyYW0gdmlydHVhbEZvbGRlcgotCSAqIEBwYXJhbSBpbmRlbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhc3NlcnRUcmVlKE1hcCByZXNvdXJjZVRyZWUsIElWaXJ0dWFsRm9sZGVyIHZpcnR1YWxGb2xkZXIsIFN0cmluZyBpbmRlbnQpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBBUElfVEVTVCBWaXJ0dWFsQ29udGFpbmVyLm1lbWJlcnMoKQotCQlJVmlydHVhbFJlc291cmNlW10gbWVtYmVycyA9IHZpcnR1YWxGb2xkZXIubWVtYmVycygpOwotCi0JCWFzc2VydEVxdWFscygiVGhlIG51bWJlciBvZiByZXNvdXJjZXMgY29udGFpbmVkIGJ5IFwiIiArIHZpcnR1YWxGb2xkZXIuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpICsgIlwiIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCXJlc291cmNlVHJlZS5zaXplKCksIG1lbWJlcnMubGVuZ3RoKTsKLQkJSVBhdGggcmVsYXRpdmVQYXRoOwotCQlNYXAgc3ViVHJlZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZW1iZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oaW5kZW50ICsgbWVtYmVyc1tpXSk7Ci0JCQlyZWxhdGl2ZVBhdGggPSBuZXcgUGF0aChtZW1iZXJzW2ldLmdldE5hbWUoKSk7Ci0KLQkJCXN1YlRyZWUgPSAoTWFwKSByZXNvdXJjZVRyZWUuZ2V0KHJlbGF0aXZlUGF0aCk7Ci0JCQlpZiAoc3ViVHJlZSAhPSBudWxsKSB7Ci0JCQkJYXNzZXJ0VHlwZShtZW1iZXJzW2ldLCBJRk9MREVSX0NMQVNTKTsKLQkJCQlpZiAoc3ViVHJlZSAhPSBJR05PUkUpCi0JCQkJCWFzc2VydFRyZWUoc3ViVHJlZSwgKElWaXJ0dWFsRm9sZGVyKSBtZW1iZXJzW2ldLCBpbmRlbnQgKyAiXHQiKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQlhc3NlcnRUeXBlKG1lbWJlcnNbaV0sIElGSUxFX0NMQVNTKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIGFzc2VydFR5cGUoSVZpcnR1YWxSZXNvdXJjZSByZXNvdXJjZSwgQ2xhc3MgdHlwZSkgewotCQlhc3NlcnRUcnVlKCJFeHBlY3RlZCBhKG4pICIgKyB0eXBlLmdldE5hbWUoKSArICIgZm9yIG1lbWJlcjogIiArIHJlc291cmNlLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCXR5cGUuaXNJbnN0YW5jZShyZXNvdXJjZSkpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEFsbCBtZXRob2RzIGxpc2VkIGluIHRoZSAic2VlIiBjbGF1c2VzIGFyZSB0ZXN0ZWQgYnkgdGhpcyBtZXRob2QuCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgQ29tcG9uZW50Q29yZSNjcmVhdGVDb21wb25lbnQoSVByb2plY3QsIFN0cmluZykKLQkgKiBAc2VlIElDb250YWluZXIjZ2V0Rm9sZGVyKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCkKLQkgKiBAc2VlIElDb250YWluZXIjbWVtYmVycygpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdE5hdmlnYXRlQ29tcG9uZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoVGVzdFdvcmtzcGFjZS5nZXRUYXJnZXRQcm9qZWN0KCksIFRlc3RXb3Jrc3BhY2UuV0VCX01PRFVMRV8xX05BTUUpOwotCQlJVmlydHVhbEZvbGRlciByb290Rm9sZGVyID0gY29tcG9uZW50LmdldFJvb3RGb2xkZXIoKTsKLQkJSVZpcnR1YWxGb2xkZXIgcm9vdCA9IHJvb3RGb2xkZXIuZ2V0Rm9sZGVyKG5ldyBQYXRoKCIvIikpOyAvLyROT04tTkxTLTEkIAotCQkvLyBUT0RPCi0JCS8vYXNzZXJ0VHJlZSh2aXJ0dWFsUmVzb3VyY2VUcmVlLCByb290KTsKLQotCX0KLQotCi0JLyoqCi0JICogPHA+Ci0JICogQWxsIG1ldGhvZHMgbGlzZWQgaW4gdGhlICJzZWUiIGNsYXVzZXMgYXJlIHRlc3RlZCBieSB0aGlzIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBDb21wb25lbnRDb3JlI2NyZWF0ZUNvbXBvbmVudChJUHJvamVjdCwgU3RyaW5nKQotCSAqIEBzZWUgSUNvbnRhaW5lciNnZXRGb2xkZXIob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoKQotCSAqIEBzZWUgSUZvbGRlciNjcmVhdGVMaW5rKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCwgaW50LAotCSAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICogCi0JICovCi0vKiBCdWcgMTYwMTAxCQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVMaW5rKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoVGVzdFdvcmtzcGFjZS5nZXRUYXJnZXRQcm9qZWN0KCksIFRlc3RXb3Jrc3BhY2UuV0VCX01PRFVMRV8yX05BTUUpOwotCQlJVmlydHVhbEZvbGRlciByb290Rm9sZGVyID0gY29tcG9uZW50LmdldFJvb3RGb2xkZXIoKTsKLQkJSVZpcnR1YWxGb2xkZXIgaW1hZ2VzID0gcm9vdEZvbGRlci5nZXRGb2xkZXIobmV3IFBhdGgoIi9pbWFnZXMiKSk7IC8vJE5PTi1OTFMtMSQJCQotCQkoKElWaXJ0dWFsUmVzb3VyY2UpaW1hZ2VzKS5jcmVhdGVMaW5rKG5ldyBQYXRoKCIvV2ViTW9kdWxlMi9pbWFnZXMiKSwgMCwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQotCQlJRm9sZGVyIHJlYWxJbWFnZXMgPSBUZXN0V29ya3NwYWNlLmdldFRhcmdldFByb2plY3QoKS5nZXRGb2xkZXIobmV3IFBhdGgoIi9XZWJNb2R1bGUyL2ltYWdlcyIpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJUaGUgL1dlYkNvbnRlbnQyL2ltYWdlcyBkaXJlY3RvcnkgbXVzdCBleGlzdC4iLCByZWFsSW1hZ2VzLmV4aXN0cygpKTsgLy8kTk9OLU5MUy0xJAotCi0JCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb2R1bGVDb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yUmVhZChUZXN0V29ya3NwYWNlLmdldFRhcmdldFByb2plY3QoKSk7Ci0JCQlXb3JrYmVuY2hDb21wb25lbnQgd2JDb21wb25lbnQgPSBtb2R1bGVDb3JlLmdldENvbXBvbmVudCgpOwotCi0JCQlDb21wb25lbnRSZXNvdXJjZVtdIGNvbXBvbmVudFJlc291cmNlcyA9IHdiQ29tcG9uZW50LmZpbmRSZXNvdXJjZXNCeVJ1bnRpbWVQYXRoKG5ldyBQYXRoKCIvaW1hZ2VzIikpOyAvLyROT04tTkxTLTEkCi0KLQkJCWFzc2VydFRydWUoIlRoZXJlIHNob3VsZCBiZSBhdCBsZWFzdCBvbmUgbWFwcGluZyBmb3IgdmlydHVhbCBwYXRoIFwiL2ltYWdlc1wiLiIsIGNvbXBvbmVudFJlc291cmNlcy5sZW5ndGggPiAwKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlSZXNvdXJjZVRyZWVSb290IHJlc291cmNlVHJlZVJvb3QgPSBSZXNvdXJjZVRyZWVSb290LmdldFNvdXJjZVJlc291cmNlVHJlZVJvb3Qod2JDb21wb25lbnQpOwotCQkJY29tcG9uZW50UmVzb3VyY2VzID0gcmVzb3VyY2VUcmVlUm9vdC5maW5kTW9kdWxlUmVzb3VyY2VzKHJlYWxJbWFnZXMuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLCBSZXNvdXJjZVRyZWVOb2RlLkNSRUFURV9OT05FKTsKLQotCQkJYXNzZXJ0VHJ1ZSgiVGhlcmUgc2hvdWxkIGJlIGV4YWN0bHkgb25lIENvbXBvbmVudCByZXNvdXJjZSB3aXRoIHRoZSBzb3VyY2UgcGF0aCBcIiIgKyByZWFsSW1hZ2VzLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKSArICJcIi4iLCBjb21wb25lbnRSZXNvdXJjZXMubGVuZ3RoID09IDEpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJYXNzZXJ0VHJ1ZSgiVGhlIHJ1bnRpbWUgcGF0aCBzaG91bGQgbWF0Y2ggXCIvaW1hZ2VzXCIuIiwgY29tcG9uZW50UmVzb3VyY2VzWzBdLmdldFJ1bnRpbWVQYXRoKCkudG9TdHJpbmcoKS5lcXVhbHMoIi9pbWFnZXMiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCQkvLyBtYWtlIHN1cmUgdGhhdCBvbmx5IG9uZSBjb21wb25lbnQgcmVzb3VyY2UgaXMgY3JlYXRlZAotCi0JCQlpbWFnZXMuY3JlYXRlTGluayhuZXcgUGF0aCgiL1dlYk1vZHVsZTIvaW1hZ2VzIiksIDAsIG51bGwpOyAvLyROT04tTkxTLTEkCi0KLQkJCWNvbXBvbmVudFJlc291cmNlcyA9IHJlc291cmNlVHJlZVJvb3QuZmluZE1vZHVsZVJlc291cmNlcyhyZWFsSW1hZ2VzLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKSwgUmVzb3VyY2VUcmVlTm9kZS5DUkVBVEVfTk9ORSk7Ci0KLQkJCWFzc2VydFRydWUoIlRoZXJlIHNob3VsZCBiZSBleGFjdGx5IG9uZSBDb21wb25lbnQgcmVzb3VyY2Ugd2l0aCB0aGUgc291cmNlIHBhdGggXCIiICsgcmVhbEltYWdlcy5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkgKyAiXCIuIiwgY29tcG9uZW50UmVzb3VyY2VzLmxlbmd0aCA9PSAxKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCWFzc2VydFRydWUoIlRoZSBydW50aW1lIHBhdGggc2hvdWxkIG1hdGNoIFwiL2ltYWdlc1wiLiIsIGNvbXBvbmVudFJlc291cmNlc1swXS5nZXRSdW50aW1lUGF0aCgpLnRvU3RyaW5nKCkuZXF1YWxzKCIvaW1hZ2VzIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChtb2R1bGVDb3JlICE9IG51bGwpCi0JCQkJbW9kdWxlQ29yZS5kaXNwb3NlKCk7Ci0JCX0KLQotCX0KLSovCi0JLyoqCi0JICogPHA+Ci0JICogQWxsIG1ldGhvZHMgbGlzZWQgaW4gdGhlICJzZWUiIGNsYXVzZXMgYXJlIHRlc3RlZCBieSB0aGlzIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBDb21wb25lbnRDb3JlI2NyZWF0ZUNvbXBvbmVudChJUHJvamVjdCwgU3RyaW5nKQotCSAqIEBzZWUgSUNvbnRhaW5lciNnZXRGb2xkZXIob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoKQotCSAqIEBzZWUgSUZvbGRlciNjcmVhdGVMaW5rKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCwgaW50LAotCSAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZVdlYk1vZHVsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQkvL1RPRE8gLSBSZWRvIHRlc3RzCi0KLS8vCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChUZXN0V29ya3NwYWNlLmdldFRhcmdldFByb2plY3QoKSwgVGVzdFdvcmtzcGFjZS5ORVdfV0VCX01PRFVMRV9OQU1FKTsKLS8vCQkvLyBpZighY29tcG9uZW50LmV4aXN0cygpKQotLy8JCWNvbXBvbmVudC5jcmVhdGUoMCwgbnVsbCk7Ci0vLwkJCi0vLwkJSVZpcnR1YWxGb2xkZXIgcm9vdEZvbGRlciA9IGNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCk7Ci0vLwkJSVZpcnR1YWxGb2xkZXIgcm9vdCA9IHJvb3RGb2xkZXIuZ2V0Rm9sZGVyKG5ldyBQYXRoKCIvIikpOyAvLyROT04tTkxTLTEkCi0vLwkJSVBhdGggcmVhbFdlYkNvbnRlbnRQYXRoID0gbmV3IFBhdGgoVGVzdFdvcmtzcGFjZS5QUk9KRUNUX05BTUUgKyBJUGF0aC5TRVBBUkFUT1IgKyAiV2ViQ29udGVudCIpOyAvLyROT04tTkxTLTEkCi0vLwkJcm9vdC5jcmVhdGVMaW5rKHJlYWxXZWJDb250ZW50UGF0aCwgMCwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLS8vCi0vLwkJSVZpcnR1YWxGb2xkZXIgbWV0YUluZkZvbGRlciA9IHJvb3QuZ2V0Rm9sZGVyKFRlc3RXb3Jrc3BhY2UuTUVUQV9JTkYpOwotLy8JCW1ldGFJbmZGb2xkZXIuY3JlYXRlKElWaXJ0dWFsUmVzb3VyY2UuRk9SQ0UsIG51bGwpOwotLy8KLS8vCQlJVmlydHVhbEZvbGRlciB3ZWJJbmZGb2xkZXIgPSByb290LmdldEZvbGRlcihUZXN0V29ya3NwYWNlLldFQl9JTkYpOwotLy8JCXdlYkluZkZvbGRlci5jcmVhdGUoSVZpcnR1YWxSZXNvdXJjZS5GT1JDRSwgbnVsbCk7Ci0vLwotLy8JCUlGb2xkZXIgcmVhbFdlYkNvbnRlbnQgPSBUZXN0V29ya3NwYWNlLmdldFRhcmdldFByb2plY3QoKS5nZXRGb2xkZXIocmVhbFdlYkNvbnRlbnRQYXRoKTsKLS8vCQlhc3NlcnRUcnVlKCJUaGUgIiArIHJlYWxXZWJDb250ZW50ICsgIiBkaXJlY3RvcnkgbXVzdCBleGlzdC4iLCByZWFsV2ViQ29udGVudC5leGlzdHMoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotLy8KLS8vCQlJRm9sZGVyIHJlYWxNZXRhSW5mRm9sZGVyID0gcmVhbFdlYkNvbnRlbnQuZ2V0Rm9sZGVyKFRlc3RXb3Jrc3BhY2UuTUVUQV9JTkYpOwotLy8JCWFzc2VydFRydWUoIlRoZSAiICsgcmVhbE1ldGFJbmZGb2xkZXIgKyAiIGRpcmVjdG9yeSBtdXN0IGV4aXN0LiIsIHJlYWxNZXRhSW5mRm9sZGVyLmV4aXN0cygpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0vLwotLy8JCUlGb2xkZXIgcmVhbFdlYkluZkZvbGRlciA9IHJlYWxXZWJDb250ZW50LmdldEZvbGRlcihUZXN0V29ya3NwYWNlLldFQl9JTkYpOwotLy8JCWFzc2VydFRydWUoIlRoZSAiICsgcmVhbFdlYkluZkZvbGRlciArICIgZGlyZWN0b3J5IG11c3QgZXhpc3QuIiwgcmVhbFdlYkluZkZvbGRlci5leGlzdHMoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotLy8KLS8vCQlTdHJ1Y3R1cmVFZGl0IG1vZHVsZUNvcmUgPSBudWxsOwotLy8JCXRyeSB7Ci0vLwkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKFRlc3RXb3Jrc3BhY2UuZ2V0VGFyZ2V0UHJvamVjdCgpKTsKLS8vCQkJV29ya2JlbmNoQ29tcG9uZW50IHdiQ29tcG9uZW50ID0gbW9kdWxlQ29yZS5nZXRDb21wb25lbnQoKTsKLS8vCi0vLwkJCUNvbXBvbmVudFJlc291cmNlW10gY29tcG9uZW50UmVzb3VyY2VzID0gd2JDb21wb25lbnQuZmluZFJlc291cmNlc0J5UnVudGltZVBhdGgobmV3IFBhdGgoIi8iICsgVGVzdFdvcmtzcGFjZS5NRVRBX0lORikpOyAvLyROT04tTkxTLTEkCi0vLwotLy8JCQlhc3NlcnRUcnVlKCJUaGVyZSBzaG91bGQgYmUgYXQgbGVhc3Qgb25lIG1hcHBpbmcgZm9yIHZpcnR1YWwgcGF0aCBcIi8iICsgVGVzdFdvcmtzcGFjZS5NRVRBX0lORiArICJcIi4iLCBjb21wb25lbnRSZXNvdXJjZXMubGVuZ3RoID4gMCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotLy8KLS8vCQkJUmVzb3VyY2VUcmVlUm9vdCByZXNvdXJjZVRyZWVSb290ID0gUmVzb3VyY2VUcmVlUm9vdC5nZXRTb3VyY2VSZXNvdXJjZVRyZWVSb290KHdiQ29tcG9uZW50KTsKLS8vCQkJY29tcG9uZW50UmVzb3VyY2VzID0gcmVzb3VyY2VUcmVlUm9vdC5maW5kTW9kdWxlUmVzb3VyY2VzKG1ldGFJbmZGb2xkZXIuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLCBSZXNvdXJjZVRyZWVOb2RlLkNSRUFURV9OT05FKTsKLS8vCi0vLwkJCWFzc2VydFRydWUoIlRoZXJlIHNob3VsZCBiZSBleGFjdGx5IG9uZSBDb21wb25lbnQgcmVzb3VyY2Ugd2l0aCB0aGUgc291cmNlIHBhdGggXCIiICsgbWV0YUluZkZvbGRlci5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkgKyAiXCIuIiwgY29tcG9uZW50UmVzb3VyY2VzLmxlbmd0aCA9PSAxKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0vLwotLy8JCQlhc3NlcnRUcnVlKCJUaGUgcnVudGltZSBwYXRoIHNob3VsZCBtYXRjaCBcIi8iICsgVGVzdFdvcmtzcGFjZS5NRVRBX0lORiArICJcIi4iLCBjb21wb25lbnRSZXNvdXJjZXNbMF0uZ2V0UnVudGltZVBhdGgoKS50b1N0cmluZygpLmVxdWFscygiLyIgKyBUZXN0V29ya3NwYWNlLk1FVEFfSU5GKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0vLwkJCQotLy8JCQkvLyB0cnkgdG8gZm9yY2UgZHVwbGljYXRlIG1hcHBpbmdzCi0vLwkJCW1ldGFJbmZGb2xkZXIuY3JlYXRlKElWaXJ0dWFsUmVzb3VyY2UuRk9SQ0UsIG51bGwpOwotLy8JCQl3ZWJJbmZGb2xkZXIuY3JlYXRlKElWaXJ0dWFsUmVzb3VyY2UuRk9SQ0UsIG51bGwpOwotLy8JCQkKLS8vCQkJLy8gZW5zdXJlIHRoYXQgbXVsdGlwbGUgbWFwcGluZ3MgYXJlbid0IGFkZGVkCi0vLwkJCQotLy8JCQlhc3NlcnRUcnVlKCJUaGUgbWFwcGluZyBzaG91bGQgbm90IGJlIGR1cGxpY2F0ZWQuIiwgIWlzRHVwbGljYXRlZCh3YkNvbXBvbmVudCwgbWV0YUluZkZvbGRlci5nZXRSdW50aW1lUGF0aCgpKSk7IC8vJE5PTi1OTFMtMSQKLS8vCQkJYXNzZXJ0VHJ1ZSgiVGhlIG1hcHBpbmcgc2hvdWxkIG5vdCBiZSBkdXBsaWNhdGVkLiIsICFpc0R1cGxpY2F0ZWQod2JDb21wb25lbnQsIHdlYkluZkZvbGRlci5nZXRSdW50aW1lUGF0aCgpKSk7IC8vJE5PTi1OTFMtMSQKLS8vCQl9IGZpbmFsbHkgewotLy8JCQlpZiAobW9kdWxlQ29yZSAhPSBudWxsKQotLy8JCQkJbW9kdWxlQ29yZS5kaXNwb3NlKCk7Ci0vLwkJfQotCi0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRHVwbGljYXRlZChXb3JrYmVuY2hDb21wb25lbnQgd2JDb21wb25lbnQsIElQYXRoIHJ1bnRpbWVQYXRoKSB7Ci0JCQotCQlVUkkgcnVudGltZVVSSSA9IFVSSS5jcmVhdGVVUkkocnVudGltZVBhdGgudG9TdHJpbmcoKSk7Ci0JCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJTGlzdCByZXNvdXJjZUxpc3QgPSB3YkNvbXBvbmVudC5nZXRSZXNvdXJjZXMoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2VMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJQ29tcG9uZW50UmVzb3VyY2UgcmVzb3VyY2UgPSAoQ29tcG9uZW50UmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJaWYocmVzb3VyY2UuZ2V0UnVudGltZVBhdGgoKS5lcXVhbHMocnVudGltZVVSSSkpCi0JCQkJaWYoZm91bmQpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCWVsc2UKLQkJCQkJZm91bmQgPSB0cnVlOwotCQl9CQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3Rlc3RzL01vZHVsZUNvcmVOYXR1cmVBUElUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3Rlc3RzL01vZHVsZUNvcmVOYXR1cmVBUElUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1N2NjZTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS90ZXN0cy9Nb2R1bGVDb3JlTmF0dXJlQVBJVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmNvbXBvbmVudGNvcmUudGVzdHM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmV0b29scy5jb21tb24udGVzdC5hcGl0b29scy5Qcm9qZWN0VW56aXBVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guRU1GV29ya2JlbmNoQ29udGV4dEJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLk1vZHVsZUNvcmVOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLlVucmVzb2x2ZWFibGVVUklFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkFydGlmYWN0RWRpdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklNb2R1bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuQ29tbW9uVGVzdHNQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBNb2R1bGVDb3JlTmF0dXJlQVBJVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpbGVTZXAgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImZpbGUuc2VwYXJhdG9yIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9OQU1FID0gIlRlc3RBcnRpZmFjdEVkaXQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9NT0RVTEVfTkFNRSA9ICJXZWJNb2R1bGUxIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFVSSSBtb2R1bGVVUkkgPSBVUkkuY3JlYXRlVVJJKCJtb2R1bGU6L3Jlc291cmNlL1Rlc3RBcnRpZmFjdEVkaXQvV2ViTW9kdWxlMSIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRfTU9ERUxfSUQgPSAianN0LndlYiI7Ci0JcHJpdmF0ZSBQYXRoIHppcEZpbGVQYXRoID0gbmV3IFBhdGgoIlRlc3REYXRhIiArIGZpbGVTZXAgKyAiVGVzdEFydGlmYWN0RWRpdC56aXAiKTsKLQlwcml2YXRlIElQcm9qZWN0IHByb2plY3Q7Ci0KLQotCS8vIC9UaGlzIHNob3VsZCBiZSBleHRyYWN0ZWQgb3V0LCBkb250IGhhdmUgdGltZSwganVzdCB0cnlpbmcgdG8gZ2V0IGNvdmVyYWdlCi0JLy8gZm9yIG00IGludGVncmF0aW9uLi4uLgotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKCFnZXRUYXJnZXRQcm9qZWN0KCkuZXhpc3RzKCkpCi0JCQlpZiAoIWNyZWF0ZVByb2plY3QoKSkKLQkJCQlmYWlsKCk7Ci0JCXByb2plY3QgPSBnZXRUYXJnZXRQcm9qZWN0KCk7Ci0JfQotCi0KLQlwdWJsaWMgSVByb2plY3QgZ2V0VGFyZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChQUk9KRUNUX05BTUUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNyZWF0ZVByb2plY3QoKSB7Ci0JCUlQYXRoIGxvY2FsWmlwUGF0aCA9IGdldExvY2FsUGF0aCgpOwotCQlQcm9qZWN0VW56aXBVdGlsIHV0aWwgPSBuZXcgUHJvamVjdFVuemlwVXRpbChsb2NhbFppcFBhdGgsIG5ldyBTdHJpbmdbXXtQUk9KRUNUX05BTUV9KTsKLQkJcmV0dXJuIHV0aWwuY3JlYXRlUHJvamVjdHMoKTsKLQl9Ci0KLQlwcml2YXRlIElQYXRoIGdldExvY2FsUGF0aCgpIHsKLQkJVVJMIHVybCA9IENvbW1vblRlc3RzUGx1Z2luLmluc3RhbmNlLmZpbmQoemlwRmlsZVBhdGgpOwotCQl0cnkgewotCQkJdXJsID0gUGxhdGZvcm0uYXNMb2NhbFVSTCh1cmwpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBuZXcgUGF0aCh1cmwuZ2V0UGF0aCgpKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb25maWd1cmUoKSB7Ci0JCU1vZHVsZUNvcmVOYXR1cmUgbmF0dXJlID0gTW9kdWxlQ29yZU5hdHVyZS5nZXRNb2R1bGVDb3JlTmF0dXJlKHByb2plY3QpOwotCQl0cnkgewotCQkJbmF0dXJlLmNvbmZpZ3VyZSgpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlmYWlsKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TW9kdWxlQ29yZU5hdHVyZSgpIHsKLQkJbmV3IE1vZHVsZUNvcmVOYXR1cmUoKTsKLQkJTW9kdWxlQ29yZU5hdHVyZSBuYXR1cmUgPSBNb2R1bGVDb3JlTmF0dXJlLmdldE1vZHVsZUNvcmVOYXR1cmUocHJvamVjdCk7Ci0JCWFzc2VydE5vdE51bGwobmF0dXJlKTsKLQl9Ci0KLQotCi0JcHVibGljIHZvaWQgdGVzdEdldE1vZHVsZVN0cnVjdHVyYWxNb2RlbEZvclJlYWQoKSB7Ci0JCU1vZHVsZUNvcmVOYXR1cmUgbmF0dXJlID0gTW9kdWxlQ29yZU5hdHVyZS5nZXRNb2R1bGVDb3JlTmF0dXJlKHByb2plY3QpOwotCQluYXR1cmUuZ2V0TW9kdWxlU3RydWN0dXJhbE1vZGVsRm9yUmVhZCh0aGlzKTsKLQkJQXJ0aWZhY3RFZGl0TW9kZWwgbW9kZWwgPSBuYXR1cmUuZ2V0QXJ0aWZhY3RFZGl0TW9kZWxGb3JSZWFkKG1vZHVsZVVSSSwgdGhpcyk7Ci0JCWFzc2VydE5vdE51bGwobW9kZWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRNb2R1bGVTdHJ1Y3R1cmFsTW9kZWxGb3JXcml0ZSgpIHsKLQkJTW9kdWxlQ29yZU5hdHVyZSBuYXR1cmUgPSBNb2R1bGVDb3JlTmF0dXJlLmdldE1vZHVsZUNvcmVOYXR1cmUocHJvamVjdCk7Ci0JCUFydGlmYWN0RWRpdE1vZGVsIG1vZGVsID0gbmF0dXJlLmdldEFydGlmYWN0RWRpdE1vZGVsRm9yV3JpdGUobW9kdWxlVVJJLCB0aGlzKTsKLQkJYXNzZXJ0Tm90TnVsbChtb2RlbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEFydGlmYWN0RWRpdE1vZGVsRm9yUmVhZCgpIHsKLQkJTW9kdWxlQ29yZU5hdHVyZSBuYXR1cmUgPSBNb2R1bGVDb3JlTmF0dXJlLmdldE1vZHVsZUNvcmVOYXR1cmUocHJvamVjdCk7Ci0JCUVkaXRNb2RlbCBtb2RlbCA9IG5hdHVyZS5nZXRFZGl0TW9kZWxGb3JSZWFkKEVESVRfTU9ERUxfSUQsIHRoaXMpOwotCQlhc3NlcnROb3ROdWxsKG1vZGVsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QXJ0aWZhY3RFZGl0TW9kZWxGb3JXcml0ZSgpIHsKLQkJTW9kdWxlQ29yZU5hdHVyZSBuYXR1cmUgPSBNb2R1bGVDb3JlTmF0dXJlLmdldE1vZHVsZUNvcmVOYXR1cmUocHJvamVjdCk7Ci0JCUVkaXRNb2RlbCBtb2RlbCA9IG5hdHVyZS5nZXRFZGl0TW9kZWxGb3JXcml0ZShFRElUX01PREVMX0lELCB0aGlzKTsKLQkJYXNzZXJ0Tm90TnVsbChtb2RlbCk7Ci0JfQotCi0JLyoKLQkgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBTdHJpbmcgZ2V0TmF0dXJlSUQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RHZXROYXR1cmVJRCgpIHsKLQkJTW9kdWxlQ29yZU5hdHVyZSBuYXR1cmUgPSBNb2R1bGVDb3JlTmF0dXJlLmdldE1vZHVsZUNvcmVOYXR1cmUocHJvamVjdCk7Ci0JCVN0cmluZyBpZCA9IG5hdHVyZS5nZXROYXR1cmVJRCgpOwotCQlhc3NlcnRUcnVlKGlkLmVxdWFscyhJTW9kdWxlQ29uc3RhbnRzLk1PRFVMRV9OQVRVUkVfSUQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJpbWFyeUNvbnRyaWJ1dGVUb0NvbnRleHQoKSB7Ci0JCU1vZHVsZUNvcmVOYXR1cmUgbmF0dXJlID0gTW9kdWxlQ29yZU5hdHVyZS5nZXRNb2R1bGVDb3JlTmF0dXJlKHByb2plY3QpOwotCQlFTUZXb3JrYmVuY2hDb250ZXh0QmFzZSBjb250ZXh0ID0gbmV3IEVNRldvcmtiZW5jaENvbnRleHRCYXNlKHByb2plY3QpOwotCQl0cnkgewotCQkJbmF0dXJlLnByaW1hcnlDb250cmlidXRlVG9Db250ZXh0KGNvbnRleHQpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgpOwotCQl9Ci0KLQl9Ci0KLQkvKgotCSAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIFJlc291cmNlU2V0IGdldFJlc291cmNlU2V0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UmVzb3VyY2VTZXQoKSB7Ci0JCU1vZHVsZUNvcmVOYXR1cmUgbmF0dXJlID0gTW9kdWxlQ29yZU5hdHVyZS5nZXRNb2R1bGVDb3JlTmF0dXJlKHByb2plY3QpOwotCQlSZXNvdXJjZVNldCBzZXQgPSBuYXR1cmUuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJYXNzZXJ0Tm90TnVsbChzZXQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZWNvbmRhcnlDb250cmlidXRlVG9Db250ZXh0KCkgewotCQlNb2R1bGVDb3JlTmF0dXJlIG5hdHVyZSA9IE1vZHVsZUNvcmVOYXR1cmUuZ2V0TW9kdWxlQ29yZU5hdHVyZShwcm9qZWN0KTsKLQkJRU1GV29ya2JlbmNoQ29udGV4dEJhc2UgY29udGV4dCA9IG5ldyBFTUZXb3JrYmVuY2hDb250ZXh0QmFzZShwcm9qZWN0KTsKLQkJdHJ5IHsKLQkJCW5hdHVyZS5zZWNvbmRhcnlDb250cmlidXRlVG9Db250ZXh0KGNvbnRleHQpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBTdHJpbmcgZ2V0UGx1Z2luSUQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RHZXRQbHVnaW5JRCgpIHsKLQkJLy8gcHJvdGVjdGVkIGNhbnQgdGVzdCB1bmxlc3MgaW4gc2FtZSBwYWNrYWdlLi4uLgotCQlNb2R1bGVDb3JlTmF0dXJlIG5hdHVyZSA9IE1vZHVsZUNvcmVOYXR1cmUuZ2V0TW9kdWxlQ29yZU5hdHVyZShwcm9qZWN0KTsKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZE1vZHVsZUNvcmVOYXR1cmVJZk5lY2Vzc2FyeSgpIHsKLQkJdHJ5IHsKLQkJCXByb2plY3QuZ2V0RGVzY3JpcHRpb24oKS5zZXROYXR1cmVJZHMobmV3IFN0cmluZ1swXSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlNb2R1bGVDb3JlTmF0dXJlLmFkZE1vZHVsZUNvcmVOYXR1cmVJZk5lY2Vzc2FyeShwcm9qZWN0LCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJTW9kdWxlQ29yZU5hdHVyZSBuYXR1cmUgPSBNb2R1bGVDb3JlTmF0dXJlLmdldE1vZHVsZUNvcmVOYXR1cmUocHJvamVjdCk7Ci0JCWFzc2VydE5vdE51bGwobmF0dXJlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24oKSB7Ci0JCVVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24gdXJpRXggPSAgIG5ldyBVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uKG1vZHVsZVVSSSk7Ci0JCWFzc2VydE5vdE51bGwodXJpRXgpOwotCX0KLQkKLQotCi0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdGVzdHMvTW9kdWxlQ29yZVVSSUNvbnZlcnRlclVuaXRUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3Rlc3RzL01vZHVsZUNvcmVVUklDb252ZXJ0ZXJVbml0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDgxZmE3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdGVzdHMvTW9kdWxlQ29yZVVSSUNvbnZlcnRlclVuaXRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5jb21wb25lbnRjb3JlLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Db21wb25lbnRDb3JlVVJJQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5jb21wb25lbnRjb3JlLnZpcnR1YWxwYXRoLnRlc3RzLlRlc3RXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5TaW1wbGVUZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBNb2R1bGVDb3JlVVJJQ29udmVydGVyVW5pdFRlc3QgIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRlc3RTdWl0ZShNb2R1bGVDb3JlVVJJQ29udmVydGVyVW5pdFRlc3QuY2xhc3MpOwotCX0KLQotCXB1YmxpYyBNb2R1bGVDb3JlVVJJQ29udmVydGVyVW5pdFRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsgIAotCQlUZXN0V29ya3NwYWNlLmluaXQoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE5vcm1hbGl6ZUREVVJJKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IAotCQkKLQkJQ29tcG9uZW50Q29yZVVSSUNvbnZlcnRlciBjb252ZXJ0ZXIgPSBuZXcgQ29tcG9uZW50Q29yZVVSSUNvbnZlcnRlcihUZXN0V29ya3NwYWNlLmdldFRhcmdldFByb2plY3QoKSk7Ci0JCQotCQlVUkkgaW5wdXRVUkkgPSBVUkkuY3JlYXRlVVJJKCJtb2R1bGU6L3Jlc291cmNlL1dlYk1vZHVsZTEvV2ViTW9kdWxlMS9XRUItSU5GL3dlYi54bWwiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJVVJJIHJlc3VsdFVSSSA9IGNvbnZlcnRlci5ub3JtYWxpemUoaW5wdXRVUkkpOwotCQkKLQkJVVJJIGV4cGVjdGVkVVJJID0gVVJJLmNyZWF0ZVVSSSgicGxhdGZvcm06L3Jlc291cmNlL1dlYk1vZHVsZTEvV2ViTW9kdWxlMS9XZWJDb250ZW50L1dFQi1JTkYvd2ViLnhtbCIpOyAvLyROT04tTkxTLTEkCi0JCS8vIFRPRE8KLQkJLy9hc3NlcnRFcXVhbHMoIlRoZSByZXN1bHRhbnQgVVJJIG11c3QgbWF0Y2ggdGhlIGV4cGVjdGVkIFVSSSIsIGV4cGVjdGVkVVJJLCByZXN1bHRVUkkpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS90ZXN0cy9TdHJ1Y3R1cmVFZGl0QVBJVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS90ZXN0cy9TdHJ1Y3R1cmVFZGl0QVBJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmQ0ZmFjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdGVzdHMvU3RydWN0dXJlRWRpdEFQSVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyMyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5jb21wb25lbnRjb3JlLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLk1vZHVsZUNvcmVOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Qcm9qZWN0Q29tcG9uZW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuU3RydWN0dXJlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5jb21wb25lbnRjb3JlLnZpcnR1YWxwYXRoLnRlc3RzLlRlc3RXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5TaW1wbGVUZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVFZGl0QVBJVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaWxlU2VwID0gU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLnNlcGFyYXRvciIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfTkFNRSA9ICJUZXN0QXJ0aWZhY3RFZGl0IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfTU9EVUxFX05BTUUgPSAiV2ViTW9kdWxlMSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBVUkkgbW9kdWxlVVJJID0gVVJJLmNyZWF0ZVVSSSgibW9kdWxlOi9yZXNvdXJjZS9UZXN0QXJ0aWZhY3RFZGl0L1dlYk1vZHVsZTEiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUX01PREVMX0lEID0gImpzdC53ZWIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRNT0RFTF9TVFJFU1MgPSAic3RyZXNzdGVzdCI7Ci0JcHJpdmF0ZSBQYXRoIHppcEZpbGVQYXRoID0gbmV3IFBhdGgoIlRlc3REYXRhIiArIGZpbGVTZXAgKyAiVGVzdEFydGlmYWN0RWRpdC56aXAiKTsKLQlwcml2YXRlIElQcm9qZWN0IHByb2plY3Q7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVGVzdFN1aXRlKFN0cnVjdHVyZUVkaXRBUElUZXN0LmNsYXNzKTsKLQl9Ci0KLQkvLyAvVGhpcyBzaG91bGQgYmUgZXh0cmFjdGVkIG91dCwgZG9udCBoYXZlIHRpbWUsIGp1c3QgdHJ5aW5nIHRvIGdldCBjb3ZlcmFnZQotCS8vIGZvciBtNCBpbnRlZ3JhdGlvbi4uLi4KLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RXb3Jrc3BhY2UuaW5pdCgpOwotCQlwcm9qZWN0ID0gVGVzdFdvcmtzcGFjZS5nZXRUYXJnZXRQcm9qZWN0KCk7Ci0JfQotCi0JcHVibGljIElQcm9qZWN0IGdldFRhcmdldFByb2plY3QoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoUFJPSkVDVF9OQU1FKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3RydWN0dXJlRWRpdEZvclJlYWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RydWN0dXJlRWRpdCBtb2R1bGVDb3JlID0gbnVsbDsKLQotCQl0cnkgewotCQkJbW9kdWxlQ29yZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvclJlYWQocHJvamVjdCk7Ci0JCQlhc3NlcnROb3ROdWxsKG1vZHVsZUNvcmUpOwotCQl9IGZpbmFsbHkgewotCQkJbW9kdWxlQ29yZS5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3RydWN0dXJlRWRpdEZvcldyaXRlKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJU3RydWN0dXJlRWRpdCBtb2R1bGVDb3JlID0gbnVsbDsKLQotCQl0cnkgewotCQkJbW9kdWxlQ29yZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvcldyaXRlKHByb2plY3QpOwotCQkJYXNzZXJ0Tm90TnVsbChtb2R1bGVDb3JlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCW1vZHVsZUNvcmUuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE1vZHVsZUNvcmVOYXR1cmUoKSB0aHJvd3MgRXhjZXB0aW9uewotCQlNb2R1bGVDb3JlTmF0dXJlIG5hdHVyZSA9IFN0cnVjdHVyZUVkaXQuZ2V0TW9kdWxlQ29yZU5hdHVyZShtb2R1bGVVUkkpOwotCQlhc3NlcnROb3ROdWxsKG5hdHVyZSk7Ci0JfQotCi0JLyoKLQkgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBJUHJvamVjdCBnZXRDb250YWluaW5nUHJvamVjdChXb3JrYmVuY2hDb21wb25lbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEdldENvbnRhaW5pbmdQcm9qZWN0V29ya2JlbmNoQ29tcG9uZW50KCkgewotCQlTdHJ1Y3R1cmVFZGl0IG1vZHVsZUNvcmUgPSBudWxsOwotCi0JCXRyeSB7Ci0JCQltb2R1bGVDb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yUmVhZChwcm9qZWN0KTsKLQkJCWFzc2VydE5vdE51bGwobW9kdWxlQ29yZSk7Ci0JCQlXb3JrYmVuY2hDb21wb25lbnQgd2JDb21wb25lbnQgPSBtb2R1bGVDb3JlLmdldENvbXBvbmVudCgpOwotCQkJYXNzZXJ0Tm90TnVsbCh3YkNvbXBvbmVudCk7Ci0JCQlJUHJvamVjdCBhUHJvamVjdCA9IFN0cnVjdHVyZUVkaXQuZ2V0Q29udGFpbmluZ1Byb2plY3Qod2JDb21wb25lbnQpOwotCQkJYXNzZXJ0Tm90TnVsbChhUHJvamVjdCk7Ci0JCX0gZmluYWxseSB7Ci0JCQltb2R1bGVDb3JlLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qCi0JICogQ2xhc3MgdW5kZXIgdGVzdCBmb3IgSVByb2plY3QgZ2V0Q29udGFpbmluZ1Byb2plY3QoVVJJKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb250YWluaW5nUHJvamVjdFVSSSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJUHJvamVjdCBhUHJvamVjdCA9IFN0cnVjdHVyZUVkaXQuZ2V0Q29udGFpbmluZ1Byb2plY3QobW9kdWxlVVJJKTsKLQkJYXNzZXJ0Tm90TnVsbChhUHJvamVjdCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0vLwlwdWJsaWMgdm9pZCB0ZXN0R2V0RWNsaXBzZVJlc291cmNlKCkgewotLy8JCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0vLwotLy8JCXRyeSB7Ci0vLwkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKHByb2plY3QpOwotLy8JCQlXb3JrYmVuY2hDb21wb25lbnQgd2JDb21wb25lbnQgPSBtb2R1bGVDb3JlLmZpbmRDb21wb25lbnRCeU5hbWUoV0VCX01PRFVMRV9OQU1FKTsKLS8vCQkJQ29tcG9uZW50UmVzb3VyY2UgY29tcG9uZW50UmVzb3VyY2UgPSB3YkNvbXBvbmVudC5maW5kUmVzb3VyY2VzQnlSdW50aW1lUGF0aChuZXcgUGF0aCgiL1Rlc3RBcnRpZmFjdEVkaXQvV2ViTW9kdWxlMSIpKVswXTsKLS8vCQkJbW9kdWxlQ29yZS5nZXRFY2xpcHNlUmVzb3VyY2UoY29tcG9uZW50UmVzb3VyY2UpOwotLy8JCX0gZmluYWxseSB7Ci0vLwkJCWlmIChtb2R1bGVDb3JlICE9IG51bGwpIHsKLS8vCQkJCW1vZHVsZUNvcmUuZGlzcG9zZSgpOwotLy8KLS8vCQkJfQotLy8JCQlhc3NlcnROb3ROdWxsKG1vZHVsZUNvcmUpOwotLy8KLS8vCQl9Ci0vLwl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLS8vCXB1YmxpYyB2b2lkIHRlc3RHZXRPdXRwdXRDb250YWluZXJSb290KCkgewotLy8JCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0vLwkJdHJ5IHsKLS8vCQkJbW9kdWxlQ29yZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvclJlYWQocHJvamVjdCk7Ci0vLwkJCVdvcmtiZW5jaENvbXBvbmVudCB3YkNvbXBvbmVudCA9IG1vZHVsZUNvcmUuZmluZENvbXBvbmVudEJ5TmFtZShXRUJfTU9EVUxFX05BTUUpOwotLy8JCQlDb21wb25lbnRSZXNvdXJjZSBjb21wb25lbnRSZXNvdXJjZSA9IHdiQ29tcG9uZW50LmZpbmRSZXNvdXJjZXNCeVJ1bnRpbWVQYXRoKG5ldyBQYXRoKCIvVGVzdEFydGlmYWN0RWRpdC9XZWJNb2R1bGUxIikpWzBdOwotLy8JCQlTdHJ1Y3R1cmVFZGl0LmdldE91dHB1dENvbnRhaW5lclJvb3Qod2JDb21wb25lbnQpOwotLy8JCX0gZmluYWxseSB7Ci0vLwkJCWlmIChtb2R1bGVDb3JlICE9IG51bGwpIHsKLS8vCQkJCW1vZHVsZUNvcmUuZGlzcG9zZSgpOwotLy8KLS8vCQkJfQotLy8JCQlhc3NlcnROb3ROdWxsKG1vZHVsZUNvcmUpOwotLy8JCX0KLS8vCX0KLQotCS8qKgotCSAqIAotCSAqLwotLy8JcHVibGljIHZvaWQgdGVzdEdldE91dHB1dENvbnRhaW5lcnNGb3JQcm9qZWN0KCkgewotLy8JCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0vLwkJdHJ5IHsKLS8vCQkJbW9kdWxlQ29yZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvclJlYWQocHJvamVjdCk7Ci0vLwkJCVdvcmtiZW5jaENvbXBvbmVudCB3YkNvbXBvbmVudCA9IG1vZHVsZUNvcmUuZmluZENvbXBvbmVudEJ5TmFtZShXRUJfTU9EVUxFX05BTUUpOwotLy8JCQlDb21wb25lbnRSZXNvdXJjZSBjb21wb25lbnRSZXNvdXJjZSA9IHdiQ29tcG9uZW50LmZpbmRSZXNvdXJjZXNCeVJ1bnRpbWVQYXRoKG5ldyBQYXRoKCIvVGVzdEFydGlmYWN0RWRpdC9XZWJNb2R1bGUxIikpWzBdOwotLy8JCQlTdHJ1Y3R1cmVFZGl0LmdldE91dHB1dENvbnRhaW5lcnNGb3JQcm9qZWN0KHByb2plY3QpOwotLy8JCX0gZmluYWxseSB7Ci0vLwkJCWlmIChtb2R1bGVDb3JlICE9IG51bGwpIHsKLS8vCQkJCW1vZHVsZUNvcmUuZGlzcG9zZSgpOwotLy8KLS8vCQkJfQotLy8JCQlhc3NlcnROb3ROdWxsKG1vZHVsZUNvcmUpOwotLy8JCX0KLS8vCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RHZXREZXBsb3llZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uewotCQlTdHJ1Y3R1cmVFZGl0IG1vZHVsZUNvcmUgPSBudWxsOwotCQl0cnkgewotCQkJbW9kdWxlQ29yZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvclJlYWQocHJvamVjdCk7Ci0JCQlhc3NlcnROb3ROdWxsKG1vZHVsZUNvcmUpOwotCQkJV29ya2JlbmNoQ29tcG9uZW50IHdiQ29tcG9uZW50ID0gbW9kdWxlQ29yZS5nZXRDb21wb25lbnQoKTsKLQkJCWFzc2VydE5vdE51bGwod2JDb21wb25lbnQpOwotCQkJU3RyaW5nIGRlcGxveU5hbWUgPSBTdHJ1Y3R1cmVFZGl0LmdldERlcGxveWVkTmFtZShtb2R1bGVVUkkpOwotCQkJYXNzZXJ0Tm90TnVsbChkZXBsb3lOYW1lKTsKLQkJfSBmaW5hbGx5IHsKLQkJCW1vZHVsZUNvcmUuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEdldENvbXBvbmVudFR5cGUoKSB7Ci0JCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb2R1bGVDb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yUmVhZChwcm9qZWN0KTsKLQkJCWFzc2VydE5vdE51bGwobW9kdWxlQ29yZSk7Ci0JCQlXb3JrYmVuY2hDb21wb25lbnQgd2JDb21wb25lbnQgPSBtb2R1bGVDb3JlLmdldENvbXBvbmVudCgpOwotCQkJYXNzZXJ0Tm90TnVsbCh3YkNvbXBvbmVudCk7Ci0JCQlDb21wb25lbnRUeXBlIHR5cGUgPSBTdHJ1Y3R1cmVFZGl0LmdldENvbXBvbmVudFR5cGUoQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCx3YkNvbXBvbmVudC5nZXROYW1lKCkpKTsKLQkJCWFzc2VydE5vdE51bGwodHlwZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQltb2R1bGVDb3JlLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTYXZlKCkgewotCi0JCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0KLQkJdHJ5IHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShwcm9qZWN0KTsKLQkJCWFzc2VydE5vdE51bGwobW9kdWxlQ29yZSk7Ci0JCQltb2R1bGVDb3JlLnNhdmUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQltb2R1bGVDb3JlLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTYXZlSWZOZWNlc3NhcnkoKSB7Ci0JCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0KLQkJdHJ5IHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShwcm9qZWN0KTsKLQkJCWFzc2VydE5vdE51bGwobW9kdWxlQ29yZSk7Ci0JCQltb2R1bGVDb3JlLnNhdmVJZk5lY2Vzc2FyeShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCW1vZHVsZUNvcmUuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByZXBhcmVQcm9qZWN0Q29tcG9uZW50c0lmTmVjZXNzYXJ5KCkgewotCQlTdHJ1Y3R1cmVFZGl0IG1vZHVsZUNvcmUgPSBudWxsOwotCi0JCXRyeSB7Ci0JCQltb2R1bGVDb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yV3JpdGUocHJvamVjdCk7Ci0JCQlhc3NlcnROb3ROdWxsKG1vZHVsZUNvcmUpOwotCQkJbW9kdWxlQ29yZS5wcmVwYXJlUHJvamVjdENvbXBvbmVudHNJZk5lY2Vzc2FyeSgpOwotCQl9IGZpbmFsbHkgewotCQkJbW9kdWxlQ29yZS5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29tcG9uZW50TW9kZWxSb290KCkgewotCQlTdHJ1Y3R1cmVFZGl0IG1vZHVsZUNvcmUgPSBudWxsOwotCi0JCXRyeSB7Ci0JCQltb2R1bGVDb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yV3JpdGUocHJvamVjdCk7Ci0JCQlhc3NlcnROb3ROdWxsKG1vZHVsZUNvcmUpOwotCQkJUHJvamVjdENvbXBvbmVudHMgcHJvamVjdENvbXBvbmVudHMgPSBtb2R1bGVDb3JlLmdldENvbXBvbmVudE1vZGVsUm9vdCgpOwotCQkJYXNzZXJ0Tm90TnVsbChwcm9qZWN0Q29tcG9uZW50cyk7Ci0JCX0gZmluYWxseSB7Ci0JCQltb2R1bGVDb3JlLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTb3VyY2VDb250YWluZXJzKCkgewotCQlTdHJ1Y3R1cmVFZGl0IG1vZHVsZUNvcmUgPSBudWxsOwotCi0JCXRyeSB7Ci0JCQltb2R1bGVDb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yV3JpdGUocHJvamVjdCk7Ci0JCQlhc3NlcnROb3ROdWxsKG1vZHVsZUNvcmUpOwotCQkJV29ya2JlbmNoQ29tcG9uZW50IHdiQ29tcG9uZW50ID0gbW9kdWxlQ29yZS5nZXRDb21wb25lbnQoKTsKLQkJCUNvbXBvbmVudFJlc291cmNlW10gY29udGFpbmVycyA9IG1vZHVsZUNvcmUuZ2V0U291cmNlQ29udGFpbmVycyh3YkNvbXBvbmVudCk7Ci0JCQlhc3NlcnROb3ROdWxsKGNvbnRhaW5lcnMpOwotCi0JCX0gZmluYWxseSB7Ci0JCQltb2R1bGVDb3JlLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRXb3JrYmVuY2hNb2R1bGVzKCkgewotCQlTdHJ1Y3R1cmVFZGl0IG1vZHVsZUNvcmUgPSBudWxsOwotCi0JCXRyeSB7Ci0JCQltb2R1bGVDb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yV3JpdGUocHJvamVjdCk7Ci0JCQlhc3NlcnROb3ROdWxsKG1vZHVsZUNvcmUpOwotCQkJV29ya2JlbmNoQ29tcG9uZW50IHdiQ29tcG9uZW50ID0gbW9kdWxlQ29yZS5nZXRDb21wb25lbnQoKTsKLQkJCWFzc2VydE5vdE51bGwod2JDb21wb25lbnQpOwotCQkJV29ya2JlbmNoQ29tcG9uZW50W10gY29tcG9uZW50cyA9IG1vZHVsZUNvcmUuZ2V0V29ya2JlbmNoTW9kdWxlcygpOwotCQkJYXNzZXJ0Tm90TnVsbChjb21wb25lbnRzKTsKLQkJCWFzc2VydFRydWUoY29tcG9uZW50cy5sZW5ndGggPiAwKTsKLQkJfSBmaW5hbGx5IHsKLQkJCW1vZHVsZUNvcmUuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZVdvcmtiZW5jaE1vZHVsZSgpIHsKLQotCQlTdHJ1Y3R1cmVFZGl0IG1vZHVsZUNvcmUgPSBudWxsOwotCi0JCXRyeSB7Ci0JCQltb2R1bGVDb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yV3JpdGUocHJvamVjdCk7Ci0JCQlhc3NlcnROb3ROdWxsKG1vZHVsZUNvcmUpOwotCQkJV29ya2JlbmNoQ29tcG9uZW50IHdiQ29tcG9uZW50ID0gbW9kdWxlQ29yZS5nZXRDb21wb25lbnQoKTsKLQkJCWFzc2VydE5vdE51bGwod2JDb21wb25lbnQpOwotCQkJd2JDb21wb25lbnQgPSBtb2R1bGVDb3JlLmNyZWF0ZVdvcmtiZW5jaE1vZHVsZSgidGVzdCIpOwotCQkJYXNzZXJ0Tm90TnVsbCh3YkNvbXBvbmVudCk7Ci0JCX0gZmluYWxseSB7Ci0JCQltb2R1bGVDb3JlLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZVdvcmtiZW5jaE1vZHVsZVJlc291cmNlKCkgewotCQlTdHJ1Y3R1cmVFZGl0IG1vZHVsZUNvcmUgPSBudWxsOwotCi0JCXRyeSB7Ci0JCQltb2R1bGVDb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yV3JpdGUocHJvamVjdCk7Ci0JCQlhc3NlcnROb3ROdWxsKG1vZHVsZUNvcmUpOwotCQkJV29ya2JlbmNoQ29tcG9uZW50IHdiQ29tcG9uZW50ID0gbW9kdWxlQ29yZS5nZXRDb21wb25lbnQoKTsKLQkJCWFzc2VydE5vdE51bGwod2JDb21wb25lbnQpOwotCQkJQ29tcG9uZW50UmVzb3VyY2UgcmVzb3VyY2UgPSBtb2R1bGVDb3JlLmNyZWF0ZVdvcmtiZW5jaE1vZHVsZVJlc291cmNlKHByb2plY3QuZ2V0RmlsZSgiV2ViTW9kdWxlMS9OZXdGb2xkZXIiKSk7Ci0JCQlhc3NlcnROb3ROdWxsKHJlc291cmNlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCW1vZHVsZUNvcmUuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZU1vZHVsZVR5cGUoKSB7Ci0JCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0KLQkJdHJ5IHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShwcm9qZWN0KTsKLQkJCWFzc2VydE5vdE51bGwobW9kdWxlQ29yZSk7Ci0JCQlXb3JrYmVuY2hDb21wb25lbnQgd2JDb21wb25lbnQgPSBtb2R1bGVDb3JlLmdldENvbXBvbmVudCgpOwotCQkJYXNzZXJ0Tm90TnVsbCh3YkNvbXBvbmVudCk7Ci0JCQlDb21wb25lbnRUeXBlIHR5cGUgPSBtb2R1bGVDb3JlLmNyZWF0ZU1vZHVsZVR5cGUoRURJVF9NT0RFTF9JRCk7Ci0JCQlhc3NlcnROb3ROdWxsKHR5cGUpOwotCQl9IGZpbmFsbHkgewotCQkJbW9kdWxlQ29yZS5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQotCS8qCi0JICogQ2xhc3MgdW5kZXIgdGVzdCBmb3IgQ29tcG9uZW50UmVzb3VyY2VbXSBmaW5kUmVzb3VyY2VzQnlSdW50aW1lUGF0aChVUkksIFVSSSkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0RmluZFJlc291cmNlc0J5UnVudGltZVBhdGhVUklVUkkoKSB0aHJvd3MgRXhjZXB0aW9uewotCQlTdHJ1Y3R1cmVFZGl0IG1vZHVsZUNvcmUgPSBudWxsOwotCQl0cnkgewotCQkJbW9kdWxlQ29yZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvcldyaXRlKHByb2plY3QpOwotCQkJYXNzZXJ0Tm90TnVsbChtb2R1bGVDb3JlKTsKLQkJCVdvcmtiZW5jaENvbXBvbmVudCB3YkNvbXBvbmVudCA9IG1vZHVsZUNvcmUuZ2V0Q29tcG9uZW50KCk7Ci0JCQlhc3NlcnROb3ROdWxsKHdiQ29tcG9uZW50KTsKLQkJCUNvbXBvbmVudFJlc291cmNlW10gcmVzb3VyY2VzID0gbW9kdWxlQ29yZS5maW5kUmVzb3VyY2VzQnlSdW50aW1lUGF0aChtb2R1bGVVUkkpOwotCQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZXMpOwotCQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZXMubGVuZ3RoID4gMCk7Ci0JCX0gZmluYWxseSB7Ci0JCQltb2R1bGVDb3JlLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qCi0JICogQ2xhc3MgdW5kZXIgdGVzdCBmb3IgQ29tcG9uZW50UmVzb3VyY2VbXSBmaW5kUmVzb3VyY2VzQnlSdW50aW1lUGF0aChVUkkpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEZpbmRSZXNvdXJjZXNCeVJ1bnRpbWVQYXRoVVJJKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJU3RydWN0dXJlRWRpdCBtb2R1bGVDb3JlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShwcm9qZWN0KTsKLQkJCWFzc2VydE5vdE51bGwobW9kdWxlQ29yZSk7Ci0JCQlXb3JrYmVuY2hDb21wb25lbnQgd2JDb21wb25lbnQgPSBtb2R1bGVDb3JlLmdldENvbXBvbmVudCgpOwotCQkJYXNzZXJ0Tm90TnVsbCh3YkNvbXBvbmVudCk7Ci0JCQlDb21wb25lbnRSZXNvdXJjZVtdIHJlc291cmNlcyA9IG1vZHVsZUNvcmUuZmluZFJlc291cmNlc0J5UnVudGltZVBhdGgobW9kdWxlVVJJLCBtb2R1bGVVUkkpOwotCQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZXMpOwotCQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZXMubGVuZ3RoID4gMCk7Ci0JCX0gZmluYWxseSB7Ci0JCQltb2R1bGVDb3JlLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaW5kUmVzb3VyY2VzQnlTb3VyY2VQYXRoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb2R1bGVDb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yV3JpdGUocHJvamVjdCk7Ci0JCQlhc3NlcnROb3ROdWxsKG1vZHVsZUNvcmUpOwotCQkJQ29tcG9uZW50UmVzb3VyY2VbXSByZXNvdXJjZXMgPSBtb2R1bGVDb3JlLmZpbmRSZXNvdXJjZXNCeVNvdXJjZVBhdGgobW9kdWxlVVJJKTsKLQkJCWFzc2VydE5vdE51bGwocmVzb3VyY2VzKTsKLQkJCWFzc2VydFRydWUocmVzb3VyY2VzLmxlbmd0aCA+IDApOwotCQl9IGZpbmFsbHkgewotCQkJbW9kdWxlQ29yZS5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmluZENvbXBvbmVudEJ5TmFtZSgpIHsKLQkJU3RydWN0dXJlRWRpdCBtb2R1bGVDb3JlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShwcm9qZWN0KTsKLQkJCWFzc2VydE5vdE51bGwobW9kdWxlQ29yZSk7Ci0JCQlXb3JrYmVuY2hDb21wb25lbnQgd2JDb21wb25lbnQgPSAgbW9kdWxlQ29yZS5nZXRDb21wb25lbnQoKTsKLQkJCWFzc2VydE5vdE51bGwod2JDb21wb25lbnQpOwotCQl9IGZpbmFsbHkgewotCQkJbW9kdWxlQ29yZS5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmluZENvbXBvbmVudEJ5VVJJKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb2R1bGVDb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yV3JpdGUocHJvamVjdCk7Ci0JCQlhc3NlcnROb3ROdWxsKG1vZHVsZUNvcmUpOwotCQkJV29ya2JlbmNoQ29tcG9uZW50IHdiQ29tcG9uZW50ID0gbW9kdWxlQ29yZS5maW5kQ29tcG9uZW50QnlVUkkobW9kdWxlVVJJKTsKLQkJCWFzc2VydE5vdE51bGwod2JDb21wb25lbnQpOwotCQl9IGZpbmFsbHkgewotCQkJbW9kdWxlQ29yZS5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNMb2NhbERlcGVuZGVuY3koKSB7Ci0JCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb2R1bGVDb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yUmVhZChwcm9qZWN0KTsKLQkJCWFzc2VydE5vdE51bGwobW9kdWxlQ29yZSk7Ci0JCQltb2R1bGVDb3JlLmlzTG9jYWxEZXBlbmRlbmN5KG51bGwpOwotCQl9IGZpbmFsbHkgewotCQkJbW9kdWxlQ29yZS5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Rmlyc3RNb2R1bGUoKSB7Ci0JCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb2R1bGVDb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yUmVhZChwcm9qZWN0KTsKLQkJCWFzc2VydE5vdE51bGwobW9kdWxlQ29yZSk7Ci0JCQlXb3JrYmVuY2hDb21wb25lbnQgd2JDb21wb25lbnQgPSAgbW9kdWxlQ29yZS5nZXRGaXJzdE1vZHVsZSgpOwotCQkJYXNzZXJ0Tm90TnVsbCh3YkNvbXBvbmVudCk7Ci0JCX0gZmluYWxseSB7Ci0JCQltb2R1bGVDb3JlLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVDb21wb25lbnRVUkkoKSB7Ci0JCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0JCVVSSSB1cmkgPSBTdHJ1Y3R1cmVFZGl0LmNyZWF0ZUNvbXBvbmVudFVSSShwcm9qZWN0LCAidGVzdENvbXAiKTsKLQkJYXNzZXJ0Tm90TnVsbCh1cmkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdGVzdHMvU3RydWN0dXJlRWRpdFN0cmVzc1Rlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdGVzdHMvU3RydWN0dXJlRWRpdFN0cmVzc1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZlMDFmYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3Rlc3RzL1N0cnVjdHVyZUVkaXRTdHJlc3NUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuY29tcG9uZW50Y29yZS50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRjb3JlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlN0cnVjdHVyZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuY29tcG9uZW50Y29yZS52aXJ0dWFscGF0aC50ZXN0cy5UZXN0V29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuU2ltcGxlVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlRWRpdFN0cmVzc1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmlsZVNlcCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiZmlsZS5zZXBhcmF0b3IiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX05BTUUgPSAiVGVzdEFydGlmYWN0RWRpdCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX01PRFVMRV9OQU1FID0gIldlYk1vZHVsZTEiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVVJJIG1vZHVsZVVSSSA9IFVSSS5jcmVhdGVVUkkoIm1vZHVsZTovcmVzb3VyY2UvVGVzdEFydGlmYWN0RWRpdC9XZWJNb2R1bGUxIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVF9NT0RFTF9JRCA9ICJqc3Qud2ViIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUTU9ERUxfU1RSRVNTID0gInN0cmVzc3Rlc3QiOwotCXByaXZhdGUgUGF0aCB6aXBGaWxlUGF0aCA9IG5ldyBQYXRoKCJUZXN0RGF0YSIgKyBmaWxlU2VwICsgIlRlc3RBcnRpZmFjdEVkaXQuemlwIik7Ci0JcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0OwotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRlc3RTdWl0ZShTdHJ1Y3R1cmVFZGl0U3RyZXNzVGVzdC5jbGFzcyk7Ci0JfQotCi0JLy8gL1RoaXMgc2hvdWxkIGJlIGV4dHJhY3RlZCBvdXQsIGRvbnQgaGF2ZSB0aW1lLCBqdXN0IHRyeWluZyB0byBnZXQgY292ZXJhZ2UKLQkvLyBmb3IgbTQgaW50ZWdyYXRpb24uLi4uCi0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0V29ya3NwYWNlLmluaXQoKTsKLQkJcHJvamVjdCA9IFRlc3RXb3Jrc3BhY2UuZ2V0VGFyZ2V0UHJvamVjdCgpOwotCX0KLQotCi0JcHVibGljIElQcm9qZWN0IGdldFRhcmdldFByb2plY3QoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoUFJPSkVDVF9OQU1FKTsKLQl9Ci0KLQotCi0JcHVibGljIHZvaWQgdGVzdE11bHRpVGhyZWFkQWNjZXNzKCkgewotCQkKLQkJSm9iW10gdGVzdEpvYnMgPSBuZXcgSm9iWzUwXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0Sm9icy5sZW5ndGg7IGkrKykgewotCQkJSm9iIGpvYiA9IG5ldyBKb2IoIkpvYiAiICsgaSkKLQkJICAgICAgewotCQkgICAgICAgIAotCQkgICAgICAgIHByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCSAgICAgICAgewotCQkgICAgICAgIFN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0JCSAgICAgICAgICB0cnkKLQkJICAgICAgICAgIHsKLQkJICAgICAgICAJbW9kdWxlQ29yZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvcldyaXRlKHByb2plY3QpOwotCQkgICAgICAgIAlQcm9wZXJ0eSBwcm9wID0gQ29tcG9uZW50Y29yZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb3BlcnR5KCk7Ci0JCSAgICAgICAgCXByb3Auc2V0TmFtZSgiSm9iICIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0JCSAgICAgICAgCXByb3Auc2V0VmFsdWUoIkJsYWgiKTsKLQkJICAgICAgICAJaWYgKG1vZHVsZUNvcmUgIT0gbnVsbCkgewotCQkgICAgICAgIAkJaWYgKG1vZHVsZUNvcmUuZ2V0Q29tcG9uZW50KCkgIT0gbnVsbCkgewotCQkgICAgICAgIAkJCW1vZHVsZUNvcmUuZ2V0Q29tcG9uZW50KCkuZ2V0UHJvcGVydGllcygpLmFkZChwcm9wKTsKLQkJICAgICAgICAJCQlTeXN0ZW0ub3V0LnByaW50bG4ocHJvcC5nZXROYW1lKCkpOwotCQkgICAgICAgIAkJCW1vZHVsZUNvcmUuc2F2ZUlmTmVjZXNzYXJ5KG51bGwpOwotCQkgICAgICAgIAkJfQotCQkgICAgICAgIAl9Ci0JCSAgICAgICAgICB9Ci0JCSAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0JCSAgICAgICAgICB7Ci0JCSAgICAgICAgCSAgZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJICAgICAgICAJICByZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCSAgICAgICAgICB9Ci0JCSAgICAgICAgICBmaW5hbGx5IHsKLQkJICAgICAgICAJICBpZiAobW9kdWxlQ29yZSAhPSBudWxsKQotCQkgICAgICAgIAkJICBtb2R1bGVDb3JlLmRpc3Bvc2UoKTsKLQkJICAgICAgICAgIH0KLQkJICAgICAgICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkgICAgICAgIH0KLQkJICAgICAgICBwdWJsaWMgYm9vbGVhbiBiZWxvbmdzVG8oT2JqZWN0IGZhbWlseSkgewotCQkJCQlyZXR1cm4gRURJVE1PREVMX1NUUkVTUy5lcXVhbHMoZmFtaWx5KTsKLQkJCQl9Ci0JCSAgICAgIH07Ci0JCQl0ZXN0Sm9ic1tpXSA9IGpvYjsJCi0JCQl9Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgdGVzdEpvYnMubGVuZ3RoOyBqKyspIHsKLQkJCUpvYiBqb2IgPSB0ZXN0Sm9ic1tqXTsKLQkJCWpvYi5zY2hlZHVsZSgpOwotCQl9Ci0JCXRyeSB7Ci0JCQlQbGF0Zm9ybS5nZXRKb2JNYW5hZ2VyKCkuam9pbihFRElUTU9ERUxfU1RSRVNTLG51bGwpOwotCQl9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCQotCX0KLXB1YmxpYyB2b2lkIHRlc3RNdWx0aVRocmVhZENvbXBvbmVudEFjY2VzcygpIHsKLQkJCi0JCUpvYltdIHRlc3RKb2JzID0gbmV3IEpvYls1MF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGVzdEpvYnMubGVuZ3RoOyBpKyspIHsKLQkJCUpvYiBqb2IgPSBuZXcgSm9iKCJKb2IgIiArIGkpCi0JCSAgICAgIHsKLQkJICAgICAgICAKLQkJICAgICAgICBwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkgICAgICAgIHsKLQkJICAgICAgICBJVmlydHVhbENvbXBvbmVudCBjb21wID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCSAgICAgICAgSVBhdGggYVBhdGggPSBjb21wLmdldFJvb3RGb2xkZXIoKS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCk7Ci0JCSAgICAgICAgYXNzZXJ0RXF1YWxzKGFQYXRoLG5ldyBQYXRoKCIvV2ViTW9kdWxlMS9XZWJDb250ZW50IikpOwotCQkgICAgICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkgICAgICAgIH0KLQkJICAgICAgICBwdWJsaWMgYm9vbGVhbiBiZWxvbmdzVG8oT2JqZWN0IGZhbWlseSkgewotCQkJCQlyZXR1cm4gRURJVE1PREVMX1NUUkVTUy5lcXVhbHMoZmFtaWx5KTsKLQkJCQl9Ci0JCSAgICAgIH07Ci0JCQl0ZXN0Sm9ic1tpXSA9IGpvYjsJCi0JCQl9Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgdGVzdEpvYnMubGVuZ3RoOyBqKyspIHsKLQkJCUpvYiBqb2IgPSB0ZXN0Sm9ic1tqXTsKLQkJCWpvYi5zY2hlZHVsZSgpOwotCQl9Ci0JCXRyeSB7Ci0JCQlQbGF0Zm9ybS5nZXRKb2JNYW5hZ2VyKCkuam9pbihFRElUTU9ERUxfU1RSRVNTLG51bGwpOwotCQl9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdGVzdHMvVGVzdFdvcmtzcGFjZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS90ZXN0cy9UZXN0V29ya3NwYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmOTM2ZTkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS90ZXN0cy9UZXN0V29ya3NwYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5jb21wb25lbnRjb3JlLnRlc3RzOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXRvb2xzLmNvbW1vbi50ZXN0LmFwaXRvb2xzLlByb2plY3RVbnppcFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5Db21tb25UZXN0c1BsdWdpbjsKLQotcHVibGljIGNsYXNzIFRlc3RXb3Jrc3BhY2UgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9OQU1FID0gIldlYk1vZHVsZTEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX01PRFVMRV8xX05BTUUgPSAiV2ViTW9kdWxlMSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfTU9EVUxFXzJfTkFNRSA9ICJXZWJNb2R1bGUyIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19XRUJfTU9EVUxFX05BTUUgPSAiTmV3V2ViTW9kdWxlIjsgLy8kTk9OLU5MUy0xJAotCQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQV9JTkYgPSAiTUVUQS1JTkYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX0lORiA9ICJXRUItSU5GIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIFBhdGggemlwRmlsZVBhdGggPSBuZXcgUGF0aCgidGVzdERhdGEvVGVzdFZpcnR1YWxBUEkuemlwIik7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJUHJvamVjdCBURVNUX1BST0pFQ1QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoVGVzdFdvcmtzcGFjZS5QUk9KRUNUX05BTUUpOwotCSAgCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gTU9EVUxFX05BTUVTID0gbmV3IFN0cmluZ1tde1dFQl9NT0RVTEVfMV9OQU1FLCBXRUJfTU9EVUxFXzJfTkFNRX07ICAKLQkKLQkKLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0IGdldFRhcmdldFByb2plY3QoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoUFJPSkVDVF9OQU1FKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdCgpIHsKLQkJCi0JCXRyeSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0VGFyZ2V0UHJvamVjdCgpOwotCQkJaWYgKCFwcm9qZWN0LmV4aXN0cygpKQotCQkJCWNyZWF0ZVByb2plY3QoKTsKLQkJCXByb2plY3QucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbnVsbCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeyAKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNyZWF0ZVByb2plY3QoKSB7Ci0JCUlQYXRoIGxvY2FsWmlwUGF0aCA9IGdldExvY2FsUGF0aCgpOwotCQlQcm9qZWN0VW56aXBVdGlsIHV0aWwgPSBuZXcgUHJvamVjdFVuemlwVXRpbChsb2NhbFppcFBhdGgsIG5ldyBTdHJpbmdbXXtQUk9KRUNUX05BTUV9KTsKLQkJcmV0dXJuIHV0aWwuY3JlYXRlUHJvamVjdHMoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJUGF0aCBnZXRMb2NhbFBhdGgoKSB7Ci0JCVVSTCB1cmwgPSBDb21tb25UZXN0c1BsdWdpbi5pbnN0YW5jZS5maW5kKHppcEZpbGVQYXRoKTsKLQkJdHJ5IHsKLQkJCXVybCA9IFBsYXRmb3JtLmFzTG9jYWxVUkwodXJsKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gbmV3IFBhdGgodXJsLmdldFBhdGgoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3ZpcnR1YWxwYXRoL3Rlc3RzL0RlZmVjdFZlcmlmaWNhdGlvblRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3ZpcnR1YWxwYXRoL3Rlc3RzL0RlZmVjdFZlcmlmaWNhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzN2IzZWMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS92aXJ0dWFscGF0aC90ZXN0cy9EZWZlY3RWZXJpZmljYXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuY29tcG9uZW50Y29yZS52aXJ0dWFscGF0aC50ZXN0czsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLkNvbW1vblRlc3RzUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgRGVmZWN0VmVyaWZpY2F0aW9uVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JCi0KLQlwcml2YXRlIHN0YXRpYyBQYXRoIHppcEZpbGVQYXRoID0gbmV3IFBhdGgoInRlc3REYXRhL0RlZmVjdFZlcmlmaWNhdGlvblRlc3RzLnppcCIpOwotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQlJUGF0aCBsb2NhbFppcFBhdGggPSBnZXRMb2NhbFBhdGgoKTsKLS8vCQlQcm9qZWN0VW56aXBVdGlsIHV0aWwgPSBuZXcgUHJvamVjdFVuemlwVXRpbChsb2NhbFppcFBhdGgsIG5ldyBTdHJpbmdbXXsiRGVmZWN0VmVyaWZpY2F0aW9uUHJvamVjdCJ9KTsKLS8vCQl1dGlsLmNyZWF0ZVByb2plY3RzKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3Q5Njg2MigpIHsgCi0JCQotCQlJUGF0aCBmaWxlUGF0aCA9IG5ldyBQYXRoKCIvV0VCLUlORi93ZWIueG1sIik7Ci0JCUlQYXRoIGZvbGRlclBhdGggPSBuZXcgUGF0aCgiL1dFQi1JTkYiKTsKLQkJCi0JCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGdldFByb2plY3QoKSwgIkRlZmVjdFZlcmlmaWNhdGlvblByb2plY3QiKTsKLQkJCi0JCUlWaXJ0dWFsRm9sZGVyIHJvb3RGb2xkZXIgPSBjb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpOwotCQlJVmlydHVhbFJlc291cmNlIGZpbGVSZXNvdXJjZSA9IHJvb3RGb2xkZXIuZmluZE1lbWJlcihmaWxlUGF0aCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgcmV0dXJuZWQgdHlwZSBzaG91bGQgYmUgYSBmaWxlLiIsIElWaXJ0dWFsUmVzb3VyY2UuRklMRSwgZmlsZVJlc291cmNlLmdldFR5cGUoKSk7Ci0KLQkJSVZpcnR1YWxSZXNvdXJjZSBmb2xkZXJSZXNvdXJjZSA9IHJvb3RGb2xkZXIuZmluZE1lbWJlcihmb2xkZXJQYXRoKTsJCQotCQlhc3NlcnRFcXVhbHMoIlRoZSByZXR1cm5lZCB0eXBlIHNob3VsZCBiZSBhIGZvbGRlci4iLCBJVmlydHVhbFJlc291cmNlLkZPTERFUiwgZm9sZGVyUmVzb3VyY2UuZ2V0VHlwZSgpKTsKLQotCX0KLQotCXByaXZhdGUgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdCgiRGVmZWN0VmVyaWZpY2F0aW9uUHJvamVjdCIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCQotCi0JcHJpdmF0ZSBzdGF0aWMgSVBhdGggZ2V0TG9jYWxQYXRoKCkgewotCQlVUkwgdXJsID0gQ29tbW9uVGVzdHNQbHVnaW4uaW5zdGFuY2UuZmluZCh6aXBGaWxlUGF0aCk7Ci0JCXRyeSB7Ci0JCQl1cmwgPSBQbGF0Zm9ybS5hc0xvY2FsVVJMKHVybCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBQYXRoKHVybC5nZXRQYXRoKCkpOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3ZpcnR1YWxwYXRoL3Rlc3RzL0lWaXJ0dWFsQ29tcG9uZW50QVBJVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS92aXJ0dWFscGF0aC90ZXN0cy9JVmlydHVhbENvbXBvbmVudEFQSVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE2OTg0Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3ZpcnR1YWxwYXRoL3Rlc3RzL0lWaXJ0dWFsQ29tcG9uZW50QVBJVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmNvbXBvbmVudGNvcmUudmlydHVhbHBhdGgudGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUmVmZXJlbmNlZENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuU3RydWN0dXJlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLk1vZHVsZVVSSVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlc291cmNlOwotCi1wdWJsaWMgY2xhc3MgSVZpcnR1YWxDb21wb25lbnRBUElUZXN0IGV4dGVuZHMgSVZpcnR1YWxDb250YWluZXJBUElUZXN0IHsKLQotCXByaXZhdGUgSVZpcnR1YWxDb21wb25lbnQgdmlydHVhbENvbXBvbmVudDsKLQlwcml2YXRlIFdvcmtiZW5jaENvbXBvbmVudCB3b3JrYmVuY2hDb21wb25lbnQ7Ci0JcHJpdmF0ZSBTdHJ1Y3R1cmVFZGl0IHN0cnVjdHVyZUVkaXQ7Ci0JCi0JcHVibGljIElWaXJ0dWFsQ29tcG9uZW50QVBJVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsgCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgVGVzdFN1aXRlIHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IElWaXJ0dWFsQ29tcG9uZW50QVBJVGVzdCgidGVzdEdldFJlZmVyZW5jZXMiKSk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZG9TZXR1cCgpIHRocm93cyBFeGNlcHRpb24geyAKLQkJdmlydHVhbENvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KFRlc3RXb3Jrc3BhY2UuVEVTVF9QUk9KRUNULCBUZXN0V29ya3NwYWNlLldFQl9NT0RVTEVfMV9OQU1FKTsKLQkJc3RydWN0dXJlRWRpdCA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvclJlYWQoVGVzdFdvcmtzcGFjZS5URVNUX1BST0pFQ1QpOwotCQl3b3JrYmVuY2hDb21wb25lbnQgPSBzdHJ1Y3R1cmVFZGl0LmdldENvbXBvbmVudCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geyAKLQkJc3VwZXIudGVhckRvd24oKTsKLQkJaWYoc3RydWN0dXJlRWRpdCAhPSBudWxsKQotCQkJc3RydWN0dXJlRWRpdC5kaXNwb3NlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB7Ci0JCQotCQlTdHJpbmcgbmFtZSA9IHZpcnR1YWxDb21wb25lbnQuZ2V0TmFtZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRNZXRhUHJvcGVydGllcygpIHsKLQkJUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gdmlydHVhbENvbXBvbmVudC5nZXRNZXRhUHJvcGVydGllcygpIDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWV0YVJlc291cmNlcygpIHsKLQkJSVBhdGhbXSBtZXRhcmVzb3VyY2VzID0gdmlydHVhbENvbXBvbmVudC5nZXRNZXRhUmVzb3VyY2VzKCkgOwotCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE1ldGFSZXNvdXJjZXMoKSB7Ci0JCQotCQlJUGF0aFtdIG1ldGFyZXNvdXJjZXMgPSBuZXcgSVBhdGhbMV07Ci0JCW1ldGFyZXNvdXJjZXNbMF0gPSBuZXcgUGF0aCgiL3Rlc3QiKTsKLQkJdmlydHVhbENvbXBvbmVudC5zZXRNZXRhUmVzb3VyY2VzKG1ldGFyZXNvdXJjZXMpIDsKLQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UmVzb3VyY2VzKCkgewotCQlTdHJpbmcgcmVzb3VyY2UgPSAiL3Rlc3QiOwotCQlJVmlydHVhbEZvbGRlciByb290Rm9sZGVyID0gdmlydHVhbENvbXBvbmVudC5nZXRSb290Rm9sZGVyKCk7Ci0JCUlWaXJ0dWFsUmVzb3VyY2VbXSB2aXJ0dWFsUmVzb3VyY2UgPSByb290Rm9sZGVyLmdldFJlc291cmNlcyhyZXNvdXJjZSkgOwotCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRSZWZlcmVuY2VzKCkgewotCQlJVmlydHVhbFJlZmVyZW5jZVtdIHJlZmVyZW5jZXMgPSB2aXJ0dWFsQ29tcG9uZW50LmdldFJlZmVyZW5jZXMoKTsKLQkJCi0JCWZvcihpbnQgaT0wOyBpPHJlZmVyZW5jZXMubGVuZ3RoO2krKykKLQkJCWFzc2VydFJlZmVyZW5jZShyZWZlcmVuY2VzW2ldKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFzc2VydFJlZmVyZW5jZShJVmlydHVhbFJlZmVyZW5jZSByZWZlcmVuY2UpIHsgCi0JCUxpc3QgcmVmZXJlbmNlZENvbXBvbmVudHMgPSB3b3JrYmVuY2hDb21wb25lbnQuZ2V0UmVmZXJlbmNlZENvbXBvbmVudHMoKTsKLQkJUmVmZXJlbmNlZENvbXBvbmVudCByZWZlcmVuY2VkQ29tcG9uZW50ID0gbnVsbDsKLQkJU3RyaW5nIGNvbXBvbmVudE5hbWUgPSBudWxsOwotCQlmb3IoaW50IGk9MDsgaTxyZWZlcmVuY2VkQ29tcG9uZW50cy5zaXplKCk7IGkrKykgewotCQkJcmVmZXJlbmNlZENvbXBvbmVudCA9IChSZWZlcmVuY2VkQ29tcG9uZW50KSByZWZlcmVuY2VkQ29tcG9uZW50cy5nZXQoaSk7Ci0JCQl0cnkgewotCQkJCWNvbXBvbmVudE5hbWUgPSBNb2R1bGVVUklVdGlsLmdldERlcGxveWVkTmFtZShyZWZlcmVuY2VkQ29tcG9uZW50LmdldEhhbmRsZSgpKTsKLQkJCX0gY2F0Y2ggKFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24gZSkgeyAgCi0JCQl9Ci0JCQlpZihjb21wb25lbnROYW1lICE9IG51bGwgJiYgY29tcG9uZW50TmFtZS5lcXVhbHMocmVmZXJlbmNlLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKS5nZXROYW1lKCkpKSB7CQkJCQkKLQkJCQlhc3NlcnRFcXVhbHMoIlRoZSBydW50aW1lIHBhdGhzIG11c3QgbWF0Y2guIiwgcmVmZXJlbmNlZENvbXBvbmVudC5nZXRSdW50aW1lUGF0aCgpLCByZWZlcmVuY2UuZ2V0UnVudGltZVBhdGgoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJUaGUgd29ya2JlbmNoIGNvbXBvbmVudCBzaG91bGQgbWF0Y2ggdGhlIGVuY2xvc2luZyBjb21wb25lbnQuIiwgdmlydHVhbENvbXBvbmVudCwgcmVmZXJlbmNlLmdldEVuY2xvc2luZ0NvbXBvbmVudCgpKTsKLQkJCQlhc3NlcnRFcXVhbHMoIlRoZSBkZXBlbmRlbmN5VHlwZXMgc2hvdWxkIG1hdGNoLiIsIHJlZmVyZW5jZWRDb21wb25lbnQuZ2V0RGVwZW5kZW5jeVR5cGUoKS5nZXRWYWx1ZSgpLCByZWZlcmVuY2UuZ2V0RGVwZW5kZW5jeVR5cGUoKSk7Ci0JCQkJVVJJIGFjdHVhbEhhbmRsZSA9IE1vZHVsZVVSSVV0aWwuZnVsbHlRdWFsaWZ5VVJJKHJlZmVyZW5jZS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkuZ2V0UHJvamVjdCgpKTsKLQkJCQlhc3NlcnRFcXVhbHMoIlRoZSBoYW5kbGVzIHNob3VsZCBtYXRjaC4iLCByZWZlcmVuY2VkQ29tcG9uZW50LmdldEhhbmRsZSgpLCBhY3R1YWxIYW5kbGUpOyAKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJZmFpbCgiQSBtYXRjaGluZyByZWZlcmVuY2Ugd2FzIG5vdCBmb3VuZCBmb3IgIityZWZlcmVuY2UuZ2V0UnVudGltZVBhdGgoKSk7IAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRSZWZlcmVuY2VzKCkgewotCQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdmlydHVhbHBhdGgvdGVzdHMvSVZpcnR1YWxDb250YWluZXJBUElUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3ZpcnR1YWxwYXRoL3Rlc3RzL0lWaXJ0dWFsQ29udGFpbmVyQVBJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWMyOTQ2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdmlydHVhbHBhdGgvdGVzdHMvSVZpcnR1YWxDb250YWluZXJBUElUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuY29tcG9uZW50Y29yZS52aXJ0dWFscGF0aC50ZXN0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVzb3VyY2U7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBJVmlydHVhbENvbnRhaW5lckFQSVRlc3QgZXh0ZW5kcyBJVmlydHVhbFJlc291cmNlQVBJVGVzdCB7CQotCi0JcHJvdGVjdGVkIElWaXJ0dWFsQ29udGFpbmVyIHRhcmdldFZpcnR1YWxDb250YWluZXI7Ci0JcHJvdGVjdGVkIElDb250YWluZXIgdGFyZ2V0UGxhdGZvcm1Db250YWluZXI7Ci0JcHJvdGVjdGVkIElQYXRoIGV4cGVjdGVkUGxhdGZvcm1Db250YWluZXJQYXRoOwotCQotCS8qCi0JICogIFRoZSBmb2xsb3dpbmcgZmllbGRzIGFzc3VtZSBhIG1pbmltdW0gc3RydWN0dXJlIG9mOgotCSAqICAKLQkgKiAgIC8JCQkJCQlbUm9vdF0KLQkgKiAgIAkvanNwcwkJCQlbRm9sZGVyXQotCSAqICAgCQkvVGVzdEpzcDMuanNwCVtGaWxlXQotCSAqICAgCS9XRUItSU5GCQkJW0ZvbGRlcl0KLQkgKiAgIAkJL2xpYgkJCVtGb2xkZXJdCi0JICogICAvVGVzdEZpbGUxLnR4dAkJCVtGaWxlXQotCSAqIAotCSAqLwotCQotCQotCXByb3RlY3RlZCBJUGF0aCBleHBlY3RlZEZpbGVTaW5nbGVEZXB0aFBhdGggPSBuZXcgUGF0aCgiL2pzcHMvVGVzdEpzcDMuanNwIik7Ci0JcHJvdGVjdGVkIElQYXRoIGV4cGVjdGVkRm9sZGVyU2luZ2xlRGVwdGhQYXRoID0gbmV3IFBhdGgoIldFQi1JTkYvbGliIik7Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBleHBlY3RlZEZvbGRlck5hbWUgPSAianNwcyI7Ci0JcHJvdGVjdGVkIElQYXRoIGV4cGVjdGVkRm9sZGVyWmVyb3RoRGVwdGhQYXRoID0gbmV3IFBhdGgoZXhwZWN0ZWRGb2xkZXJOYW1lKTsKLQkJCi0JcHJvdGVjdGVkIFN0cmluZyBleHBlY3RlZEZpbGVOYW1lID0gIlRlc3RGaWxlMS50eHQiOwotCXByb3RlY3RlZCBJUGF0aCBleHBlY3RlZEZpbGVaZXJvdGhEZXB0aFBhdGggPSBuZXcgUGF0aChleHBlY3RlZEZpbGVOYW1lKTsKLQkKLQlwdWJsaWMgSVZpcnR1YWxDb250YWluZXJBUElUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0JCi0JCi0KLQlwcm90ZWN0ZWQgdm9pZCBhc3NlcnRSZXF1aXJlbWVudHMoKSB7Ci0JCXN1cGVyLmFzc2VydFJlcXVpcmVtZW50cygpOwotLy8JCWFzc2VydE5vdE51bGwoIlRoZSB0YXJnZXQgdmlydHVhbCBjb250YWluZXIgbXVzdCBiZSBzcGVjaWZpZWQuIiwgdGFyZ2V0VmlydHVhbENvbnRhaW5lcik7Ci0vLwkJYXNzZXJ0Tm90TnVsbCgiVGhlIHRhcmdldCBwbGF0Zm9ybSBjb250YWluZXIgbXVzdCBiZSBzcGVjaWZpZWQuIiwgdGFyZ2V0UGxhdGZvcm1Db250YWluZXIpOwotLy8JCWFzc2VydE5vdE51bGwoIlRoZSBleHBlY3RlZCBwbGF0Zm9ybSBjb250YWluZXIgcGF0aCBtdXN0IGJlIHNwZWNpZmllZC4iLCBleHBlY3RlZFBsYXRmb3JtQ29udGFpbmVyUGF0aCk7Ci0JfQotCQotCi0JcHVibGljIHZvaWQgdGVzdEdldEZpbGVTdHJpbmcoKSB7Ci0JCUlWaXJ0dWFsRmlsZSB0ZXN0RmlsZTF0eHQgPSB0YXJnZXRWaXJ0dWFsQ29udGFpbmVyLmdldEZpbGUoZXhwZWN0ZWRGaWxlTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgdGVzdCBmaWxlIHByb2plY3QgcmVsYXRpdmUgcGF0aCBtdXN0IG1hdGNoLiIsIGV4cGVjdGVkUGxhdGZvcm1Db250YWluZXJQYXRoLmFwcGVuZChleHBlY3RlZEZpbGVOYW1lKSwgdGVzdEZpbGUxdHh0LmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEZpbGVQYXRoKCkgewotCQlJVmlydHVhbEZpbGUgdGVzdDNqc3AgPSB0YXJnZXRWaXJ0dWFsQ29udGFpbmVyLmdldEZpbGUoZXhwZWN0ZWRGaWxlU2luZ2xlRGVwdGhQYXRoKTsJCQotCQlJUGF0aCBleHBlY3RlZFBhdGggPSBleHBlY3RlZFBsYXRmb3JtQ29udGFpbmVyUGF0aC5hcHBlbmQoZXhwZWN0ZWRGaWxlU2luZ2xlRGVwdGhQYXRoKTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgdGVzdCBmaWxlIHByb2plY3QgcmVsYXRpdmUgcGF0aCBtdXN0IG1hdGNoLiIsIGV4cGVjdGVkUGF0aCwgdGVzdDNqc3AuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCX0gCi0JIAotCS8qCi0JICogQ2xhc3MgdW5kZXIgdGVzdCBmb3IgSVZpcnR1YWxGb2xkZXIgZ2V0Rm9sZGVyKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Rm9sZGVyU3RyaW5nKCkgewotCQlJVmlydHVhbEZvbGRlciBqc3BzRm9sZGVyID0gdGFyZ2V0VmlydHVhbENvbnRhaW5lci5nZXRGb2xkZXIoZXhwZWN0ZWRGb2xkZXJOYW1lKTsKLQkJYXNzZXJ0Tm90TnVsbCgiVGhlIGZvbGRlciBzaG91bGQgbm90IGJlIG51bGwuIiwganNwc0ZvbGRlcik7Ci0JCWFzc2VydEVxdWFscygiVGhlIG5hbWUgb2YgdGhlIGZvbGRlciByZXR1cm5lZCBzaG91bGVkIG1hdGNoIHRoZSBleHBlY3RlZCBmb2xkZXIuIiwgZXhwZWN0ZWRGb2xkZXJOYW1lLCBqc3BzRm9sZGVyLmdldE5hbWUoKSk7Ci0JfQotCi0JLyoKLQkgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBJVmlydHVhbEZvbGRlciBnZXRGb2xkZXIoSVBhdGgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEdldEZvbGRlcklQYXRoKCkgeyAKLQkJSVZpcnR1YWxGb2xkZXIgdGVzdEdldEZvbGRlciA9IHRhcmdldFZpcnR1YWxDb250YWluZXIuZ2V0Rm9sZGVyKGV4cGVjdGVkRm9sZGVyWmVyb3RoRGVwdGhQYXRoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiVGhlIGZvbGRlciBzaG91bGQgbm90IGJlIG51bGwuIiwgdGVzdEdldEZvbGRlcik7Ci0JCWFzc2VydEVxdWFscygiVGhlIG5hbWUgb2YgdGhlIGZvbGRlciByZXR1cm5lZCBzaG91bGVkIG1hdGNoIHRoZSBleHBlY3RlZCBmb2xkZXIuIiwgZXhwZWN0ZWRGb2xkZXJaZXJvdGhEZXB0aFBhdGgsIHRlc3RHZXRGb2xkZXIuZ2V0UnVudGltZVBhdGgoKSk7CQkKLQl9Ci0gCi0JLyoKLQkgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBib29sZWFuIGV4aXN0cyhJUGF0aCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0RXhpc3RzSVBhdGgoKSB7Ci0JCWFzc2VydFRydWUoIlRoZSBleHBlY3RlZCBmaWxlIHBhdGggc2hvdWxkIGJlIGZvdW5kIHRvIGV4aXN0LiIsIHRhcmdldFZpcnR1YWxDb250YWluZXIuZXhpc3RzKGV4cGVjdGVkRmlsZVNpbmdsZURlcHRoUGF0aCkpOwkJCi0JfQotCi0JLyoKLQkgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBJVmlydHVhbFJlc291cmNlIGZpbmRNZW1iZXIoU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RGaW5kTWVtYmVyU3RyaW5nKCkgewotCQlJVmlydHVhbFJlc291cmNlIGZvdW5kUmVzb3VyY2UgPSB0YXJnZXRWaXJ0dWFsQ29udGFpbmVyLmZpbmRNZW1iZXIoZXhwZWN0ZWRGb2xkZXJOYW1lKTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgdHlwZSBmb3VuZCBmb3IgdGhlIGV4cGVjdGVkIGZvbGRlciBuYW1lIHNob3VsZCBiZSBJVmlydHVhbFJlc291cmNlLkZPTERFUi4iLCBJVmlydHVhbFJlc291cmNlLkZPTERFUiwgZm91bmRSZXNvdXJjZS5nZXRUeXBlKCkpOwotCQlJVmlydHVhbEZvbGRlciBmb3VuZEZvbGRlciA9IChJVmlydHVhbEZvbGRlcikgZm91bmRSZXNvdXJjZTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgbmFtZSBzaG91bGQgYmUgY29ycmVjdC4iLCBleHBlY3RlZEZvbGRlck5hbWUsIGZvdW5kUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCi0KLQkJZm91bmRSZXNvdXJjZSA9IHRhcmdldFZpcnR1YWxDb250YWluZXIuZmluZE1lbWJlcihleHBlY3RlZEZpbGVOYW1lKTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgdHlwZSBmb3VuZCBmb3IgdGhlIGV4cGVjdGVkIGZvbGRlciBuYW1lIHNob3VsZCBiZSBJVmlydHVhbFJlc291cmNlLkZJTEUuIiwgSVZpcnR1YWxSZXNvdXJjZS5GSUxFLCBmb3VuZFJlc291cmNlLmdldFR5cGUoKSk7Ci0JCUlWaXJ0dWFsRmlsZSBmb3VuZEZpbGUgPSAoSVZpcnR1YWxGaWxlKSBmb3VuZFJlc291cmNlOwotCQlhc3NlcnRFcXVhbHMoIlRoZSBuYW1lIHNob3VsZCBiZSBjb3JyZWN0LiIsIGV4cGVjdGVkRmlsZU5hbWUsIGZvdW5kUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKgotCSAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIElWaXJ0dWFsUmVzb3VyY2UgZmluZE1lbWJlcihTdHJpbmcsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0RmluZE1lbWJlclN0cmluZ2ludCgpIHsKLQotCQlJVmlydHVhbFJlc291cmNlIGZvdW5kUmVzb3VyY2UgPSB0YXJnZXRWaXJ0dWFsQ29udGFpbmVyLmZpbmRNZW1iZXIoZXhwZWN0ZWRGb2xkZXJOYW1lLCBJVmlydHVhbFJlc291cmNlLk5PTkUpOwotCQlhc3NlcnRFcXVhbHMoIlRoZSB0eXBlIGZvdW5kIGZvciB0aGUgZXhwZWN0ZWQgZm9sZGVyIG5hbWUgc2hvdWxkIGJlIElWaXJ0dWFsUmVzb3VyY2UuRk9MREVSLiIsIElWaXJ0dWFsUmVzb3VyY2UuRk9MREVSLCBmb3VuZFJlc291cmNlLmdldFR5cGUoKSk7Ci0JCUlWaXJ0dWFsRm9sZGVyIGZvdW5kRm9sZGVyID0gKElWaXJ0dWFsRm9sZGVyKSBmb3VuZFJlc291cmNlOwotCQlhc3NlcnRFcXVhbHMoIlRoZSBuYW1lIHNob3VsZCBiZSBjb3JyZWN0LiIsIGV4cGVjdGVkRm9sZGVyTmFtZSwgZm91bmRSZXNvdXJjZS5nZXROYW1lKCkpOwotCQkKLQotCQlmb3VuZFJlc291cmNlID0gdGFyZ2V0VmlydHVhbENvbnRhaW5lci5maW5kTWVtYmVyKGV4cGVjdGVkRm9sZGVyTmFtZSwgSVZpcnR1YWxSZXNvdXJjZS5OT05FKTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgdHlwZSBmb3VuZCBmb3IgdGhlIGV4cGVjdGVkIGZvbGRlciBuYW1lIHNob3VsZCBiZSBJVmlydHVhbFJlc291cmNlLkZJTEUuIiwgSVZpcnR1YWxSZXNvdXJjZS5GSUxFLCBmb3VuZFJlc291cmNlLmdldFR5cGUoKSk7Ci0JCUlWaXJ0dWFsRmlsZSBmb3VuZEZpbGUgPSAoSVZpcnR1YWxGaWxlKSBmb3VuZFJlc291cmNlOwotCQlhc3NlcnRFcXVhbHMoIlRoZSBuYW1lIHNob3VsZCBiZSBjb3JyZWN0LiIsIGV4cGVjdGVkRmlsZU5hbWUsIGZvdW5kUmVzb3VyY2UuZ2V0TmFtZSgpKTsgCi0JfQotCi0JLyoKLQkgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBJVmlydHVhbFJlc291cmNlIGZpbmRNZW1iZXIoSVBhdGgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEZpbmRNZW1iZXJJUGF0aCgpIHsKLQotCQlJVmlydHVhbFJlc291cmNlIGZvdW5kUmVzb3VyY2UgPSB0YXJnZXRWaXJ0dWFsQ29udGFpbmVyLmZpbmRNZW1iZXIoZXhwZWN0ZWRGb2xkZXJTaW5nbGVEZXB0aFBhdGgpOwotCQlhc3NlcnRFcXVhbHMoIlRoZSB0eXBlIGZvdW5kIGZvciB0aGUgZXhwZWN0ZWQgZm9sZGVyIG5hbWUgc2hvdWxkIGJlIElWaXJ0dWFsUmVzb3VyY2UuRk9MREVSLiIsIElWaXJ0dWFsUmVzb3VyY2UuRk9MREVSLCBmb3VuZFJlc291cmNlLmdldFR5cGUoKSk7Ci0JCUlWaXJ0dWFsRm9sZGVyIGZvdW5kRm9sZGVyID0gKElWaXJ0dWFsRm9sZGVyKSBmb3VuZFJlc291cmNlOwotCQlhc3NlcnRFcXVhbHMoIlRoZSBuYW1lIHNob3VsZCBiZSBjb3JyZWN0LiIsIGV4cGVjdGVkRm9sZGVyU2luZ2xlRGVwdGhQYXRoLmxhc3RTZWdtZW50KCksIGZvdW5kUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCi0KLQkJZm91bmRSZXNvdXJjZSA9IHRhcmdldFZpcnR1YWxDb250YWluZXIuZmluZE1lbWJlcihleHBlY3RlZEZpbGVTaW5nbGVEZXB0aFBhdGgpOwotCQlhc3NlcnRFcXVhbHMoIlRoZSB0eXBlIGZvdW5kIGZvciB0aGUgZXhwZWN0ZWQgZm9sZGVyIG5hbWUgc2hvdWxkIGJlIElWaXJ0dWFsUmVzb3VyY2UuRklMRS4iLCBJVmlydHVhbFJlc291cmNlLkZJTEUsIGZvdW5kUmVzb3VyY2UuZ2V0VHlwZSgpKTsKLQkJSVZpcnR1YWxGaWxlIGZvdW5kRmlsZSA9IChJVmlydHVhbEZpbGUpIGZvdW5kUmVzb3VyY2U7Ci0JCWFzc2VydEVxdWFscygiVGhlIG5hbWUgc2hvdWxkIGJlIGNvcnJlY3QuIiwgZXhwZWN0ZWRGaWxlU2luZ2xlRGVwdGhQYXRoLmxhc3RTZWdtZW50KCksIGZvdW5kUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKgotCSAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIElWaXJ0dWFsUmVzb3VyY2UgZmluZE1lbWJlcihJUGF0aCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RGaW5kTWVtYmVySVBhdGhpbnQoKSB7Ci0JCUlWaXJ0dWFsUmVzb3VyY2UgZm91bmRSZXNvdXJjZSA9IHRhcmdldFZpcnR1YWxDb250YWluZXIuZmluZE1lbWJlcihleHBlY3RlZEZvbGRlclNpbmdsZURlcHRoUGF0aCwgSVZpcnR1YWxSZXNvdXJjZS5OT05FKTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgdHlwZSBmb3VuZCBmb3IgdGhlIGV4cGVjdGVkIGZvbGRlciBuYW1lIHNob3VsZCBiZSBJVmlydHVhbFJlc291cmNlLkZPTERFUi4iLCBJVmlydHVhbFJlc291cmNlLkZPTERFUiwgZm91bmRSZXNvdXJjZS5nZXRUeXBlKCkpOwotCQlJVmlydHVhbEZvbGRlciBmb3VuZEZvbGRlciA9IChJVmlydHVhbEZvbGRlcikgZm91bmRSZXNvdXJjZTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgbmFtZSBzaG91bGQgYmUgY29ycmVjdC4iLCBleHBlY3RlZEZvbGRlclNpbmdsZURlcHRoUGF0aC5sYXN0U2VnbWVudCgpLCBmb3VuZFJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQotCi0JCWZvdW5kUmVzb3VyY2UgPSB0YXJnZXRWaXJ0dWFsQ29udGFpbmVyLmZpbmRNZW1iZXIoZXhwZWN0ZWRGaWxlU2luZ2xlRGVwdGhQYXRoLCBJVmlydHVhbFJlc291cmNlLk5PTkUpOwotCQlhc3NlcnRFcXVhbHMoIlRoZSB0eXBlIGZvdW5kIGZvciB0aGUgZXhwZWN0ZWQgZm9sZGVyIG5hbWUgc2hvdWxkIGJlIElWaXJ0dWFsUmVzb3VyY2UuRklMRS4iLCBJVmlydHVhbFJlc291cmNlLkZJTEUsIGZvdW5kUmVzb3VyY2UuZ2V0VHlwZSgpKTsKLQkJSVZpcnR1YWxGaWxlIGZvdW5kRmlsZSA9IChJVmlydHVhbEZpbGUpIGZvdW5kUmVzb3VyY2U7Ci0JCWFzc2VydEVxdWFscygiVGhlIG5hbWUgc2hvdWxkIGJlIGNvcnJlY3QuIiwgZXhwZWN0ZWRGaWxlU2luZ2xlRGVwdGhQYXRoLmxhc3RTZWdtZW50KCksIGZvdW5kUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQl9Ci0gCi0KLQkvKgotCSAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIElWaXJ0dWFsUmVzb3VyY2VbXSBtZW1iZXJzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0TWVtYmVycygpIHsKLQl9Ci0KLQkvKgotCSAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIElWaXJ0dWFsUmVzb3VyY2VbXSBtZW1iZXJzKGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0TWVtYmVyc2ludCgpIHsKLQl9Ci0gCi0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlKCkgewotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS92aXJ0dWFscGF0aC90ZXN0cy9JVmlydHVhbEZpbGVBUElUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3ZpcnR1YWxwYXRoL3Rlc3RzL0lWaXJ0dWFsRmlsZUFQSVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmIzNDUyNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3ZpcnR1YWxwYXRoL3Rlc3RzL0lWaXJ0dWFsRmlsZUFQSVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmNvbXBvbmVudGNvcmUudmlydHVhbHBhdGgudGVzdHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZpbGU7Ci0KLXB1YmxpYyBjbGFzcyBJVmlydHVhbEZpbGVBUElUZXN0IGV4dGVuZHMgSVZpcnR1YWxSZXNvdXJjZUFQSVRlc3QgewotCQotCXB1YmxpYyBJVmlydHVhbEZpbGVBUElUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBkb1NldHVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IAotCQkKLQkJCi0JfQotCi0JLyoKLQkgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciB2b2lkIFZpcnR1YWxGaWxlKElQcm9qZWN0LCBTdHJpbmcsIElQYXRoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsRmlsZUlQcm9qZWN0U3RyaW5nSVBhdGgoKSB7Ci0JCQotCX0KLSAKLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRVbmRlcmx5aW5nRmlsZSgpIHsgCi0KLQkJSUZpbGUgcGxhdGZvcm1GaWxlVG9DcmVhdGUgPSAoKElWaXJ0dWFsRmlsZSl0YXJnZXRWaXJ0dWFsUmVzb3VyY2VUb0NyZWF0ZSkuZ2V0VW5kZXJseWluZ0ZpbGUoKTsgCi0JCWFzc2VydFRydWUoIlRoZSB1bmRlcnlsaW5nIHJlc291cmNlIHNob3VsZCBub3QgZXhpc3QuIiwgIXBsYXRmb3JtRmlsZVRvQ3JlYXRlLmV4aXN0cygpICk7ICAKLQotCQlJRmlsZSBleGlzdGluZ1BsYXRmb3JtRmlsZSA9ICgoSVZpcnR1YWxGaWxlKXRhcmdldEV4aXN0aW5nVmlydHVhbFJlc291cmNlKS5nZXRVbmRlcmx5aW5nRmlsZSgpOyAKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHVuZGVyeWxpbmcgcmVzb3VyY2Ugc2hvdWxkIG5vdCBleGlzdC4iLCAhZXhpc3RpbmdQbGF0Zm9ybUZpbGUuZXhpc3RzKCkgKTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRVbmRlcmx5aW5nRmlsZXMoKSB7ICAKLQkJCi0JCUlSZXNvdXJjZVtdIHBsYXRmb3JtRmlsZVRvQ3JlYXRlID0gKChJVmlydHVhbEZpbGUpdGFyZ2V0VmlydHVhbFJlc291cmNlVG9DcmVhdGUpLmdldFVuZGVybHlpbmdGaWxlcygpOwotCQlhc3NlcnRFcXVhbHMoIlRoZXJlIHNob3VsZCBvbmx5IGJlIG9uZSByZXNvdXJjZSBpbiB0aGUgcmVzdWx0IGFycmF5LiIsIDEsIHBsYXRmb3JtRmlsZVRvQ3JlYXRlLmxlbmd0aCk7Ci0JCWFzc2VydEVxdWFscygiVGhlIHR5cGUgb2YgdGhlIHVuZGVybHlpbmcgcmVzb3VyY2Ugc2hvdWxkIG1hdGNoIElSZXNvdXJjZS5GSUxFLiIsIElSZXNvdXJjZS5GSUxFLCBwbGF0Zm9ybUZpbGVUb0NyZWF0ZVswXS5nZXRUeXBlKCkpOwotCQlhc3NlcnRUcnVlKCJUaGUgdW5kZXJ5bGluZyByZXNvdXJjZSBzaG91bGQgbm90IGV4aXN0LiIsICFwbGF0Zm9ybUZpbGVUb0NyZWF0ZVswXS5leGlzdHMoKSApOyAKLQotCi0JCUlSZXNvdXJjZVtdIGV4aXN0aW5nUGxhdGZvcm1GaWxlID0gKChJVmlydHVhbEZpbGUpdGFyZ2V0RXhpc3RpbmdWaXJ0dWFsUmVzb3VyY2UpLmdldFVuZGVybHlpbmdGaWxlcygpOwotCQlhc3NlcnRFcXVhbHMoIlRoZXJlIHNob3VsZCBvbmx5IGJlIG9uZSByZXNvdXJjZSBpbiB0aGUgcmVzdWx0IGFycmF5LiIsIDEsIGV4aXN0aW5nUGxhdGZvcm1GaWxlLmxlbmd0aCk7Ci0JCWFzc2VydEVxdWFscygiVGhlIHR5cGUgb2YgdGhlIHVuZGVybHlpbmcgcmVzb3VyY2Ugc2hvdWxkIG1hdGNoIElSZXNvdXJjZS5GSUxFLiIsIElSZXNvdXJjZS5GSUxFLCBleGlzdGluZ1BsYXRmb3JtRmlsZVswXS5nZXRUeXBlKCkpOwotCQlhc3NlcnRUcnVlKCJUaGUgdW5kZXJ5bGluZyByZXNvdXJjZSBzaG91bGQgbm90IGV4aXN0LiIsICFleGlzdGluZ1BsYXRmb3JtRmlsZVswXS5leGlzdHMoKSApOyAgCi0KLQkJSUZpbGUgbXVsdGlQbGF0Zm9ybUZpbGUgPSAoKElWaXJ0dWFsRmlsZSl0YXJnZXRNdWx0aVZpcnR1YWxSZXNvdXJjZSkuZ2V0VW5kZXJseWluZ0ZpbGUoKTsgCi0JCWFzc2VydFRydWUoIlRoZSB1bmRlcnlsaW5nIHJlc291cmNlIHNob3VsZCBub3QgZXhpc3QuIiwgIW11bHRpUGxhdGZvcm1GaWxlLmV4aXN0cygpICk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3ZpcnR1YWxwYXRoL3Rlc3RzL0lWaXJ0dWFsRm9sZGVyQVBJVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS92aXJ0dWFscGF0aC90ZXN0cy9JVmlydHVhbEZvbGRlckFQSVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RmYWI3Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3ZpcnR1YWxwYXRoL3Rlc3RzL0lWaXJ0dWFsRm9sZGVyQVBJVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuY29tcG9uZW50Y29yZS52aXJ0dWFscGF0aC50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVzb3VyY2U7Ci0KLXB1YmxpYyBjbGFzcyBJVmlydHVhbEZvbGRlckFQSVRlc3QgZXh0ZW5kcyBJVmlydHVhbENvbnRhaW5lckFQSVRlc3QgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9GT0xERVJfTkFNRSA9ICJXRUItSU5GIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVBhdGggV0VCQ09OVEVOVF9GT0xERVJfUkVBTF9QQVRIID0gbmV3IFBhdGgoIi9XZWJNb2R1bGUxL1dlYkNvbnRlbnQvIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElQYXRoIFdFQklORl9GT0xERVJfUkVBTF9QQVRIID0gV0VCQ09OVEVOVF9GT0xERVJfUkVBTF9QQVRILmFwcGVuZChURVNUX0ZPTERFUl9OQU1FKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJUGF0aCBXRUJJTkZfRk9MREVSX1JVTlRJTUVfUEFUSCA9IG5ldyBQYXRoKCIvIitURVNUX0ZPTERFUl9OQU1FKTsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVBhdGggVEVTVERBVEFfRk9MREVSX1JFQUxfUEFUSCA9IG5ldyBQYXRoKCJXZWJNb2R1bGUxL3Rlc3RkYXRhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVBhdGggVEVTVERBVEFfRk9MREVSX1JVTlRJTUVfUEFUSCA9IG5ldyBQYXRoKCIvIik7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJUGF0aCBERUxFVEVNRV9QQVRIID0gbmV3IFBhdGgoIi9kZWxldGVtZSIpOyAvLyROT04tTkxTLTEkIAotCi0JcHVibGljIElWaXJ0dWFsRm9sZGVyQVBJVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9IAotCi0JcHJvdGVjdGVkIHZvaWQgZG9TZXR1cCgpIHRocm93cyBFeGNlcHRpb24geyAKLQkJCi0JCWV4cGVjdGVkUGxhdGZvcm1Db250YWluZXJQYXRoID0gVEVTVERBVEFfRk9MREVSX1JFQUxfUEFUSDsKLQkJCi0JCWV4cGVjdGVkUnVudGltZVBhdGggPSBXRUJJTkZfRk9MREVSX1JVTlRJTUVfUEFUSDsKLQkJZXhwZWN0ZWROYW1lID0gVEVTVF9GT0xERVJfTkFNRTsKLQkJZXhwZWN0ZWRQcm9qZWN0ID0gVGVzdFdvcmtzcGFjZS5URVNUX1BST0pFQ1Q7Ci0JCQotCQl0YXJnZXRFeGlzdGluZ1BsYXRmb3JtUmVzb3VyY2UgPSBUZXN0V29ya3NwYWNlLlRFU1RfUFJPSkVDVC5nZXRGb2xkZXIoV0VCSU5GX0ZPTERFUl9SRUFMX1BBVEgpOwotCQkKLQkJLy92aXJ0dWFsUGFyZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoVGVzdFdvcmtzcGFjZS5URVNUX1BST0pFQ1QsIFRlc3RXb3Jrc3BhY2UuV0VCX01PRFVMRV8xX05BTUUpOwotCQkKLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoVGVzdFdvcmtzcGFjZS5URVNUX1BST0pFQ1QpOwotCQlJVmlydHVhbEZvbGRlciByb290Rm9sZGVyID0gY29tcG9uZW50LmdldFJvb3RGb2xkZXIoKTsKLQkJdmlydHVhbFBhcmVudCA9IHJvb3RGb2xkZXI7Ci0JCQotCQl0YXJnZXRFeGlzdGluZ1ZpcnR1YWxSZXNvdXJjZSA9IHZpcnR1YWxQYXJlbnQuZ2V0Rm9sZGVyKFdFQklORl9GT0xERVJfUlVOVElNRV9QQVRIKTsgCQkKLQotCQl0YXJnZXRWaXJ0dWFsQ29udGFpbmVyID0gdmlydHVhbFBhcmVudC5nZXRGb2xkZXIoVEVTVERBVEFfRk9MREVSX1JVTlRJTUVfUEFUSCk7IAotCQl0YXJnZXRQbGF0Zm9ybUNvbnRhaW5lciA9IFRlc3RXb3Jrc3BhY2UuVEVTVF9QUk9KRUNULmdldEZvbGRlcihURVNUREFUQV9GT0xERVJfUkVBTF9QQVRIKTsKLQkJCi0JCXRhcmdldFZpcnR1YWxSZXNvdXJjZVRvRGVsZXRlID0gdmlydHVhbFBhcmVudC5nZXRGb2xkZXIoREVMRVRFTUVfUEFUSCk7Ci0JCXRhcmdldFZpcnR1YWxSZXNvdXJjZVRvRGVsZXRlLmNyZWF0ZShJVmlydHVhbFJlc291cmNlLkZPUkNFLCBudWxsKTsKLQkJCi0JCXRhcmdldFBsYXRmb3JtUmVzb3VyY2VUb0RlbGV0ZSA9IGV4cGVjdGVkUHJvamVjdC5nZXRGb2xkZXIodGFyZ2V0VmlydHVhbFJlc291cmNlVG9EZWxldGUuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpKTsJCQkKLQkJCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JCQotCQlpZih0YXJnZXRQbGF0Zm9ybVJlc291cmNlVG9EZWxldGUuZXhpc3RzKCkpCi0JCQl0YXJnZXRQbGF0Zm9ybVJlc291cmNlVG9EZWxldGUuZGVsZXRlKElWaXJ0dWFsUmVzb3VyY2UuRk9SQ0UsIG51bGwpOyAKLQl9ICAKLQkKLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRVbmRlcmx5aW5nRm9sZGVyKCkgeyAKLQkJSUNvbnRhaW5lciB1bmRlcmx5aW5nUmVzb3VyY2UgID0gKChJVmlydHVhbEZvbGRlcil0YXJnZXRFeGlzdGluZ1ZpcnR1YWxSZXNvdXJjZSkuZ2V0VW5kZXJseWluZ0ZvbGRlcigpOwkJCi0JCUlDb250YWluZXIgZXhwZWN0ZWRQbGF0Zm9ybVJlc291cmNlID0gVGVzdFdvcmtzcGFjZS5URVNUX1BST0pFQ1QuZ2V0Rm9sZGVyKFdFQklORl9GT0xERVJfUlVOVElNRV9QQVRIKTsJCQotCQlhc3NlcnRFcXVhbHMoIlRoZSB1bmRlcmx5aW5nIHJlc291cmNlIHNob3VsZCBiZSAiICtleHBlY3RlZFBsYXRmb3JtUmVzb3VyY2UuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLCBleHBlY3RlZFBsYXRmb3JtUmVzb3VyY2UsIHVuZGVybHlpbmdSZXNvdXJjZSk7IC8vJE5PTi1OTFMtMSQJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFVuZGVybHlpbmdGb2xkZXJzKCkgeyAKLQotCQlJQ29udGFpbmVyW10gdW5kZXJseWluZ1Jlc291cmNlcyAgPSAoKElWaXJ0dWFsRm9sZGVyKXRhcmdldFZpcnR1YWxDb250YWluZXIpLmdldFVuZGVybHlpbmdGb2xkZXJzKCk7Ci0JCWFzc2VydEVxdWFscygiVGhlcmUgc2hvdWxkIGJlIHR3byBmb2xkZXJzIG1hcHBlZCB0byByb290IiwgMiwgdW5kZXJseWluZ1Jlc291cmNlcy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCQotCQlTZXQgdW5kZXJseWluZ1Jlc291cmNlc1NldCA9IG5ldyBIYXNoU2V0KEFycmF5cy5hc0xpc3QodW5kZXJseWluZ1Jlc291cmNlcykpOwotCQlTZXQgZXhwZWN0ZWRVbmRlcmx5aW5nUmVzb3VyY2VzU2V0ID0gbmV3IEhhc2hTZXQoKTsKLQkJZXhwZWN0ZWRVbmRlcmx5aW5nUmVzb3VyY2VzU2V0LmFkZChUZXN0V29ya3NwYWNlLlRFU1RfUFJPSkVDVC5nZXRGb2xkZXIoVEVTVERBVEFfRk9MREVSX1JFQUxfUEFUSCkpOwotCQlleHBlY3RlZFVuZGVybHlpbmdSZXNvdXJjZXNTZXQuYWRkKFRlc3RXb3Jrc3BhY2UuVEVTVF9QUk9KRUNULmdldEZvbGRlcihXRUJDT05URU5UX0ZPTERFUl9SRUFMX1BBVEgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJFeHBlY3RpbmcgdHdvIGZvbGRlcnMgbWFwcGVkIHRvIHJvb3QuIiArZXhwZWN0ZWRVbmRlcmx5aW5nUmVzb3VyY2VzU2V0LCB1bmRlcmx5aW5nUmVzb3VyY2VzU2V0KTsgLy8kTk9OLU5MUy0xJAkKLQotCX0KLQkgCi0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdmlydHVhbHBhdGgvdGVzdHMvSVZpcnR1YWxSZWZlcmVuY2VBUElUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3ZpcnR1YWxwYXRoL3Rlc3RzL0lWaXJ0dWFsUmVmZXJlbmNlQVBJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzkxNWRkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdmlydHVhbHBhdGgvdGVzdHMvSVZpcnR1YWxSZWZlcmVuY2VBUElUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5jb21wb25lbnRjb3JlLnZpcnR1YWxwYXRoLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuVmlydHVhbFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZWZlcmVuY2U7Ci0KLXB1YmxpYyBjbGFzcyBJVmlydHVhbFJlZmVyZW5jZUFQSVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZSgpIHsKLQkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmZXJlbmNlID0gbmV3IFZpcnR1YWxSZWZlcmVuY2UoKTsKLQkJcmVmZXJlbmNlLmNyZWF0ZSgwLG51bGwpOwotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0UnVudGltZVBhdGgoKSB7Ci0JCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZmVyZW5jZSA9IG5ldyBWaXJ0dWFsUmVmZXJlbmNlKCk7Ci0JCXJlZmVyZW5jZS5zZXRSdW50aW1lUGF0aChuZXcgUGF0aCgiLyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UnVudGltZVBhdGgoKSB7Ci0JCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZmVyZW5jZSA9IG5ldyBWaXJ0dWFsUmVmZXJlbmNlKCk7Ci0JCUlQYXRoIHBhdGggPSByZWZlcmVuY2UuZ2V0UnVudGltZVBhdGgoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RGVwZW5kZW5jeVR5cGUoKSB7Ci0JCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZmVyZW5jZSA9IG5ldyBWaXJ0dWFsUmVmZXJlbmNlKCk7Ci0JCWludCBkZXBlbmRlbmN5VHlwZSA9IDA7Ci0JCXJlZmVyZW5jZS5zZXREZXBlbmRlbmN5VHlwZShkZXBlbmRlbmN5VHlwZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldERlcGVuZGVuY3lUeXBlKCkgewotCQlJVmlydHVhbFJlZmVyZW5jZSByZWZlcmVuY2UgPSBuZXcgVmlydHVhbFJlZmVyZW5jZSgpOwotCQlpbnQgZGVwZW5kZW5jeVR5cGUgPSAwOwotCQlkZXBlbmRlbmN5VHlwZSA9IHJlZmVyZW5jZS5nZXREZXBlbmRlbmN5VHlwZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFeGlzdHMoKSB7Ci0JCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZmVyZW5jZSA9IG5ldyBWaXJ0dWFsUmVmZXJlbmNlKCk7Ci0JCWJvb2xlYW4gZXhpc3RzID0gcmVmZXJlbmNlLmV4aXN0cygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRFbmNsb3NpbmdDb21wb25lbnQoKSB7Ci0JCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZmVyZW5jZSA9IG5ldyBWaXJ0dWFsUmVmZXJlbmNlKCk7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IHJlZmVyZW5jZS5nZXRFbmNsb3NpbmdDb21wb25lbnQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UmVmZXJlbmNlZENvbXBvbmVudCgpIHsKLQkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmZXJlbmNlID0gbmV3IFZpcnR1YWxSZWZlcmVuY2UoKTsKLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gcmVmZXJlbmNlLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS92aXJ0dWFscGF0aC90ZXN0cy9JVmlydHVhbFJlc291cmNlQVBJVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS92aXJ0dWFscGF0aC90ZXN0cy9JVmlydHVhbFJlc291cmNlQVBJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmZhYzYwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdmlydHVhbHBhdGgvdGVzdHMvSVZpcnR1YWxSZXNvdXJjZUFQSVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5jb21wb25lbnRjb3JlLnZpcnR1YWxwYXRoLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuU3RydWN0dXJlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLlJlc291cmNlVHJlZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuUmVzb3VyY2VUcmVlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVzb3VyY2U7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBJVmlydHVhbFJlc291cmNlQVBJVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQkKLQlwcm90ZWN0ZWQgSVZpcnR1YWxDb250YWluZXIgdmlydHVhbFBhcmVudDsJCi0JcHJvdGVjdGVkIElWaXJ0dWFsUmVzb3VyY2UgdGFyZ2V0RXhpc3RpbmdWaXJ0dWFsUmVzb3VyY2U7Ci0JcHJvdGVjdGVkIElSZXNvdXJjZSB0YXJnZXRFeGlzdGluZ1BsYXRmb3JtUmVzb3VyY2U7Ci0JICAKLQlwcm90ZWN0ZWQgSVZpcnR1YWxGb2xkZXIgdGFyZ2V0VmlydHVhbFJlc291cmNlVG9EZWxldGU7Ci0JcHJvdGVjdGVkIElSZXNvdXJjZSB0YXJnZXRQbGF0Zm9ybVJlc291cmNlVG9EZWxldGU7CSAKLQkJCi0JcHJvdGVjdGVkIElWaXJ0dWFsUmVzb3VyY2UgdGFyZ2V0VmlydHVhbFJlc291cmNlVG9DcmVhdGUgPSBudWxsOwotCXByb3RlY3RlZCBJVmlydHVhbFJlc291cmNlIHRhcmdldE11bHRpVmlydHVhbFJlc291cmNlID0gbnVsbDsgCi0JCi0JcHJvdGVjdGVkIElQcm9qZWN0IGV4cGVjdGVkUHJvamVjdDsJCi0JcHJvdGVjdGVkIElQYXRoIGV4cGVjdGVkUnVudGltZVBhdGg7Ci0JcHJvdGVjdGVkIFN0cmluZyBleHBlY3RlZE5hbWU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9OQU1FID0gbnVsbDsKLQotCXB1YmxpYyBJVmlydHVhbFJlc291cmNlQVBJVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9ICAKLQkKLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewkKLQkJVGVzdFdvcmtzcGFjZS5pbml0KCk7Ci0JCWRvU2V0dXAoKTsKLQkJYXNzZXJ0UmVxdWlyZW1lbnRzKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFzc2VydFJlcXVpcmVtZW50cygpIHsgCi0JCQotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGRvU2V0dXAoKSB0aHJvd3MgRXhjZXB0aW9uIDsKLQotCS8vVE9ETzogVGhpcyB0ZXN0IGZhaWxzIGludGVybWl0dGVudGx5IChCdWcgMTc1Mjg2KSwKLQkvL3dhaXRpbmcgZm9yIGJ1ZyAyMDgwOTMgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGludmVzdGlnYXRpbmcgZnVydGhlcgotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVMaW5rSVBhdGhpbnRJUHJvZ3Jlc3NNb25pdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KFRlc3RXb3Jrc3BhY2UuZ2V0VGFyZ2V0UHJvamVjdCgpLCBUZXN0V29ya3NwYWNlLldFQl9NT0RVTEVfMl9OQU1FKTsKLQkJSVZpcnR1YWxGb2xkZXIgcm9vdEZvbGRlciA9IGNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCk7Ci0JCQotCQlJVmlydHVhbEZvbGRlciBpbWFnZXMgPSByb290Rm9sZGVyLmdldEZvbGRlcihuZXcgUGF0aCgiL2ltYWdlcyIpKTsgLy8kTk9OLU5MUy0xJAkJCi0JCWltYWdlcy5jcmVhdGVMaW5rKG5ldyBQYXRoKCIvV2ViTW9kdWxlMi9pbWFnZXMiKSwgMCwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQotCQlJRm9sZGVyIHJlYWxJbWFnZXMgPSBUZXN0V29ya3NwYWNlLmdldFRhcmdldFByb2plY3QoKS5nZXRGb2xkZXIobmV3IFBhdGgoIi9XZWJNb2R1bGUyL2ltYWdlcyIpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJUaGUgL1dlYkNvbnRlbnQyL2ltYWdlcyBkaXJlY3RvcnkgbXVzdCBleGlzdC4iLCByZWFsSW1hZ2VzLmV4aXN0cygpKTsgLy8kTk9OLU5MUy0xJAotCi0JCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb2R1bGVDb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yUmVhZChUZXN0V29ya3NwYWNlLmdldFRhcmdldFByb2plY3QoKSk7Ci0JCQlXb3JrYmVuY2hDb21wb25lbnQgd2JDb21wb25lbnQgPSBtb2R1bGVDb3JlLmdldENvbXBvbmVudCgpOwotCi0JCQlDb21wb25lbnRSZXNvdXJjZVtdIGNvbXBvbmVudFJlc291cmNlcyA9IHdiQ29tcG9uZW50LmZpbmRSZXNvdXJjZXNCeVJ1bnRpbWVQYXRoKG5ldyBQYXRoKCIvaW1hZ2VzIikpOyAvLyROT04tTkxTLTEkCi0KLQkJCWFzc2VydFRydWUoIlRoZXJlIHNob3VsZCBiZSBhdCBsZWFzdCBvbmUgbWFwcGluZyBmb3IgdmlydHVhbCBwYXRoIFwiL2ltYWdlc1wiLiIsIGNvbXBvbmVudFJlc291cmNlcy5sZW5ndGggPiAwKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlSZXNvdXJjZVRyZWVSb290IHJlc291cmNlVHJlZVJvb3QgPSBSZXNvdXJjZVRyZWVSb290LmdldFNvdXJjZVJlc291cmNlVHJlZVJvb3Qod2JDb21wb25lbnQpOwotCQkJY29tcG9uZW50UmVzb3VyY2VzID0gcmVzb3VyY2VUcmVlUm9vdC5maW5kTW9kdWxlUmVzb3VyY2VzKHJlYWxJbWFnZXMuZ2V0RnVsbFBhdGgoKSwgUmVzb3VyY2VUcmVlTm9kZS5DUkVBVEVfTk9ORSk7Ci0KLQkJCWFzc2VydFRydWUoIlRoZXJlIHNob3VsZCBiZSBleGFjdGx5IG9uZSBDb21wb25lbnQgcmVzb3VyY2Ugd2l0aCB0aGUgc291cmNlIHBhdGggXCIiICsgcmVhbEltYWdlcy5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkgKyAiXCIuIiwgY29tcG9uZW50UmVzb3VyY2VzLmxlbmd0aCA9PSAxKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCWFzc2VydFRydWUoIlRoZSBydW50aW1lIHBhdGggc2hvdWxkIG1hdGNoIFwiL2ltYWdlc1wiLiIsIGNvbXBvbmVudFJlc291cmNlc1swXS5nZXRSdW50aW1lUGF0aCgpLnRvU3RyaW5nKCkuZXF1YWxzKCIvaW1hZ2VzIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJLy8gbWFrZSBzdXJlIHRoYXQgb25seSBvbmUgY29tcG9uZW50IHJlc291cmNlIGlzIGNyZWF0ZWQKLQotCQkJaW1hZ2VzLmNyZWF0ZUxpbmsobmV3IFBhdGgoIi9XZWJNb2R1bGUyL2ltYWdlcyIpLCAwLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCi0JCQljb21wb25lbnRSZXNvdXJjZXMgPSByZXNvdXJjZVRyZWVSb290LmZpbmRNb2R1bGVSZXNvdXJjZXMocmVhbEltYWdlcy5nZXRGdWxsUGF0aCgpLCBSZXNvdXJjZVRyZWVOb2RlLkNSRUFURV9OT05FKTsKLQotCQkJYXNzZXJ0VHJ1ZSgiVGhlcmUgc2hvdWxkIGJlIGV4YWN0bHkgb25lIENvbXBvbmVudCByZXNvdXJjZSB3aXRoIHRoZSBzb3VyY2UgcGF0aCBcIiIgKyByZWFsSW1hZ2VzLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKSArICJcIi4iLCBjb21wb25lbnRSZXNvdXJjZXMubGVuZ3RoID09IDEpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJYXNzZXJ0VHJ1ZSgiVGhlIHJ1bnRpbWUgcGF0aCBzaG91bGQgbWF0Y2ggXCIvaW1hZ2VzXCIuIiwgY29tcG9uZW50UmVzb3VyY2VzWzBdLmdldFJ1bnRpbWVQYXRoKCkudG9TdHJpbmcoKS5lcXVhbHMoIi9pbWFnZXMiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9IGZpbmFsbHkgewotCQkJaWYgKG1vZHVsZUNvcmUgIT0gbnVsbCkKLQkJCQltb2R1bGVDb3JlLmRpc3Bvc2UoKTsKLQkJfQotCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEVxdWFscygpIHRocm93cyBFeGNlcHRpb24gewotCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEV4aXN0cygpIHRocm93cyBFeGNlcHRpb24gewotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RmlsZUV4dGVuc2lvbigpIHsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIGV4aXN0aW5nIHZpcnR1YWwgcmVzb3VyY2Ugc2hvdWxkIGhhdmUgbm8gZmlsZSBleHRlbnNpb24uIiwgdGFyZ2V0RXhpc3RpbmdWaXJ0dWFsUmVzb3VyY2UuZ2V0RmlsZUV4dGVuc2lvbigpID09IG51bGwpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFdvcmtzcGFjZVJlbGF0aXZlUGF0aCgpIHsKLQkJSVBhdGggcmVhbFBhdGggPSB0YXJnZXRFeGlzdGluZ1BsYXRmb3JtUmVzb3VyY2UuZ2V0RnVsbFBhdGgoKTsKLQkJSVBhdGggdmlydHVhbFBhdGggPSB0YXJnZXRFeGlzdGluZ1ZpcnR1YWxSZXNvdXJjZS5nZXRXb3Jrc3BhY2VSZWxhdGl2ZVBhdGgoKTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgd29ya3NwYWNlIHJlbGF0aXZlIHBhdGggb2YgdGhlIHZpcnR1YWwgcmVzb3VyY2UgbXVzdCBtYXRjaCB0aGUgcmVhbCByZXNvdXJjZSIsIHJlYWxQYXRoLCB2aXJ0dWFsUGF0aCk7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkgewotCQlJUGF0aCByZWFsUGF0aCA9IHRhcmdldEV4aXN0aW5nUGxhdGZvcm1SZXNvdXJjZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCk7Ci0JCUlQYXRoIHZpcnR1YWxQYXRoID0gdGFyZ2V0RXhpc3RpbmdWaXJ0dWFsUmVzb3VyY2UuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpOwotCQlhc3NlcnRFcXVhbHMoIlRoZSBwcm9qZWN0IHJlbGF0aXZlIHBhdGggb2YgdGhlIHZpcnR1YWwgcmVzb3VyY2UgbXVzdCBtYXRjaCB0aGUgcmVhbCByZXNvdXJjZSIsIHJlYWxQYXRoLCB2aXJ0dWFsUGF0aCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UnVudGltZVBhdGgoKSB7IAotCQlJUGF0aCB2aXJ0dWFsUGF0aCA9IHRhcmdldEV4aXN0aW5nVmlydHVhbFJlc291cmNlLmdldFJ1bnRpbWVQYXRoKCk7Ci0JCWFzc2VydEVxdWFscygiVGhlIHJ1bnRpbWUgcGF0aCBvZiB0aGUgdmlydHVhbCByZXNvdXJjZSBtdXN0IG1hdGNoIHRoZSByZWFsIHJlc291cmNlIiwgZXhwZWN0ZWRSdW50aW1lUGF0aCwgdmlydHVhbFBhdGgpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB7Ci0JCWFzc2VydEVxdWFscygiVGhlIG5hbWUgb2YgdGhlIHZpcnR1YWwgcmVzb3VyY2UgbXVzdCBtYXRjaCB0aGUgZXhwZWN0ZWQgbmFtZS4iLCBleHBlY3RlZE5hbWUsIHRhcmdldEV4aXN0aW5nVmlydHVhbFJlc291cmNlLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UGFyZW50KCkgewotCQlhc3NlcnRFcXVhbHMoIlRoZSBwYXJlbnQgb2YgdGhlIHZpcnR1YWwgcmVzb3VyY2UgbXVzdCBtYXRjaCB0aGUgY29tcG9uZW50LiIsIHZpcnR1YWxQYXJlbnQsIHRhcmdldEV4aXN0aW5nVmlydHVhbFJlc291cmNlLmdldFBhcmVudCgpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRQcm9qZWN0KCkgewotCQlhc3NlcnRFcXVhbHMoIlRoZSBwcm9qZWN0IG9mIHRoZSB2aXJ0dWFsIHJlc291cmNlIG11c3QgbWF0Y2ggdGhlIHRlc3QgcHJvamVjdC4iLCBleHBlY3RlZFByb2plY3QsIHRhcmdldEV4aXN0aW5nVmlydHVhbFJlc291cmNlLmdldFByb2plY3QoKSk7IC8vJE5PTi1OTFMtMSQKLQl9ICAKLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRUeXBlKCkgewotCQlhc3NlcnRFcXVhbHMoIlRoZSB0eXBlIG9mIHRoZSB2aXJ0dWFsIHJlc291cmNlIG11c3QgbWF0Y2ggdGhlIHRlc3QgcHJvamVjdC4iLCBJUmVzb3VyY2UuRk9MREVSLCB0YXJnZXRFeGlzdGluZ1ZpcnR1YWxSZXNvdXJjZS5nZXRUeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb21wb25lbnQoKSB7IAotCQlhc3NlcnRFcXVhbHMoIlRoZSBjb21wb25lbnQgbmFtZSBvZiB0aGUgdmlydHVhbCByZXNvdXJjZSBtdXN0IG1hdGNoIHRoZSB0ZXN0IHByb2plY3QuIiwgVGVzdFdvcmtzcGFjZS5XRUJfTU9EVUxFXzFfTkFNRSwgdGFyZ2V0RXhpc3RpbmdWaXJ0dWFsUmVzb3VyY2UuZ2V0Q29tcG9uZW50KCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc0FjY2Vzc2libGUoKSB7Ci0JCWFzc2VydEVxdWFscygiVGhlIHBsYXRmb3JtIHJlc291cmNlIHNob3VsZCBiZSBhY2Nlc3NpYmxlIG9ubHkgaWYgdGhlIHZpcnR1YWwgcmVzb3VyY2UgaXMgYWNjZXNzaWJsZS4iLCB0YXJnZXRFeGlzdGluZ1BsYXRmb3JtUmVzb3VyY2UuaXNBY2Nlc3NpYmxlKCksIHRhcmdldEV4aXN0aW5nUGxhdGZvcm1SZXNvdXJjZS5pc0FjY2Vzc2libGUoKSk7IC8vJE5PTi1OTFMtMSQKLQl9IAotCi0JLyoKLQkgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciB2b2lkIGRlbGV0ZShpbnQsIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdERlbGV0ZWludElQcm9ncmVzc01vbml0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGFyZ2V0VmlydHVhbFJlc291cmNlVG9EZWxldGUuZGVsZXRlKDAsIG51bGwpOwotCQkKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHJlYWwgZm9sZGVyIHNob3VsZCBiZSBkZWxldGVkIHdoZW4gSVZpcnR1YWxSZXNvdXJjZS5ERUxFVEVfTUVUQU1PREVMX09OTFkgaXMgTk9UIHN1cHBsaWVkLiIsICF0YXJnZXRQbGF0Zm9ybVJlc291cmNlVG9EZWxldGUuZXhpc3RzKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCi0JCUlWaXJ0dWFsUmVzb3VyY2VbXSBtZW1iZXJzID0gdmlydHVhbFBhcmVudC5tZW1iZXJzKCk7Ci0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlcnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmKG1lbWJlcnNbaV0uZ2V0UnVudGltZVBhdGgoKS5lcXVhbHModGFyZ2V0VmlydHVhbFJlc291cmNlVG9EZWxldGUuZ2V0UnVudGltZVBhdGgoKSkpIHsKLQkJCQlmYWlsKCJGb3VuZCBkZWxldGVkIGZvbGRlciBpbiBtZW1iZXJzKCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9CQkKLQl9Ci0JCi0JLyoKLQkgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciB2b2lkIGRlbGV0ZShpbnQsIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdERlbGV0ZWludElQcm9ncmVzc01vbml0b3IyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRhcmdldFZpcnR1YWxSZXNvdXJjZVRvRGVsZXRlLmRlbGV0ZShJVmlydHVhbFJlc291cmNlLklHTk9SRV9VTkRFUkxZSU5HX1JFU09VUkNFLCBudWxsKTsKLQkJCi0JCWFzc2VydFRydWUoIlRoZSByZWFsIHJlc291cmNlIHNob3VsZCBub3QgYmUgZGVsZXRlZCB3aGVuIElWaXJ0dWFsUmVzb3VyY2UuSUdOT1JFX1VOREVSTFlJTkdfUkVTT1VSQ0UgaXMgc3VwcGxpZWQuIiwgdGFyZ2V0UGxhdGZvcm1SZXNvdXJjZVRvRGVsZXRlLmV4aXN0cygpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQotCQkvLyBvbmx5IGhhbmRsZXMgZXhwbGljaXQgbWFwcGluZ3MKLQkJU3RydWN0dXJlRWRpdCBtb2R1bGVDb3JlID0gbnVsbDsKLQkJdHJ5IHsgCi0JCQltb2R1bGVDb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yV3JpdGUoZXhwZWN0ZWRQcm9qZWN0KTsKLQkJCVdvcmtiZW5jaENvbXBvbmVudCB3YkNvbXBvbmVudCA9IG1vZHVsZUNvcmUuZ2V0Q29tcG9uZW50KCk7Ci0JCQlDb21wb25lbnRSZXNvdXJjZVtdIHJlc291cmNlcyA9IHdiQ29tcG9uZW50LmZpbmRSZXNvdXJjZXNCeVJ1bnRpbWVQYXRoKHRhcmdldFZpcnR1YWxSZXNvdXJjZVRvRGVsZXRlLmdldFJ1bnRpbWVQYXRoKCkpOwotCQkJYXNzZXJ0VHJ1ZSgiVGhlcmUgc2hvdWxkIGJlIG5vIG1hdGNoaW5nIHJlc291cmNlcyBmb3VuZCBpbiB0aGUgbW9kZWwuIiwgcmVzb3VyY2VzLmxlbmd0aCA9PSAwKTsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCX0gZmluYWxseSB7Ci0JCQlpZiAobW9kdWxlQ29yZSAhPSBudWxsKSB7Ci0JCQkJbW9kdWxlQ29yZS5zYXZlSWZOZWNlc3NhcnkobnVsbCk7Ci0JCQkJbW9kdWxlQ29yZS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciB2b2lkIGRlbGV0ZShib29sZWFuLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3REZWxldGVpbnRJUHJvZ3Jlc3NNb25pdG9yMygpICB0aHJvd3MgRXhjZXB0aW9uICB7Ci0JCXRhcmdldFZpcnR1YWxSZXNvdXJjZVRvRGVsZXRlLmRlbGV0ZShJVmlydHVhbFJlc291cmNlLkZPUkNFLCBudWxsKTsKLQkJCi0JCWFzc2VydFRydWUoIlRoZSByZWFsIHJlc291cmNlIHNob3VsZCBiZSBkZWxldGVkIHdoZW4gSVZpcnR1YWxSZXNvdXJjZS5JR05PUkVfVU5ERVJMWUlOR19SRVNPVVJDRSBpcyBOT1Qgc3VwcGxpZWQuIiwgIXRhcmdldFBsYXRmb3JtUmVzb3VyY2VUb0RlbGV0ZS5leGlzdHMoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkKLQkJSVZpcnR1YWxSZXNvdXJjZVtdIG1lbWJlcnMgPSB2aXJ0dWFsUGFyZW50Lm1lbWJlcnMoKTsKLQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVycy5sZW5ndGg7IGkrKykgewotCQkJaWYobWVtYmVyc1tpXS5nZXRSdW50aW1lUGF0aCgpLmVxdWFscyh0YXJnZXRWaXJ0dWFsUmVzb3VyY2VUb0RlbGV0ZS5nZXRSdW50aW1lUGF0aCgpKSkgewotCQkJCWZhaWwoIkZvdW5kIGRlbGV0ZWQgZm9sZGVyIGluIG1lbWJlcnMoKSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0JCi0JfQkKLQkgCi0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VW5kZXJseWluZ1Jlc291cmNlKCkgewotCQlJUmVzb3VyY2UgcGxhdGZvcm1SZXNvdXJjZVRvQ3JlYXRlID0gdGFyZ2V0VmlydHVhbFJlc291cmNlVG9DcmVhdGUuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCk7Ci0JCWludCBleHBlY3RlZFR5cGUgPSBkZXRlcm1pbmVFeHBlY3RlZFR5cGUodGFyZ2V0VmlydHVhbFJlc291cmNlVG9DcmVhdGUpOwotCQlhc3NlcnRFcXVhbHMoIlRoZSB0eXBlIG9mIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlIHNob3VsZCBtYXRjaCB0aGUgZXhwZWN0ZWQgdHlwZS4iLCBleHBlY3RlZFR5cGUsIHBsYXRmb3JtUmVzb3VyY2VUb0NyZWF0ZS5nZXRUeXBlKCkpOwotCQlhc3NlcnRUcnVlKCJUaGUgdW5kZXJ5bGluZyByZXNvdXJjZSBzaG91bGQgbm90IGV4aXN0LiIsICFwbGF0Zm9ybVJlc291cmNlVG9DcmVhdGUuZXhpc3RzKCkgKTsgIAotCQkKLQkJZXhwZWN0ZWRUeXBlID0gZGV0ZXJtaW5lRXhwZWN0ZWRUeXBlKHRhcmdldEV4aXN0aW5nVmlydHVhbFJlc291cmNlKTsKLQkJSVJlc291cmNlIGV4aXRpbmdQbGF0Zm9ybVJlc291cmNlID0gdGFyZ2V0RXhpc3RpbmdWaXJ0dWFsUmVzb3VyY2UuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCk7Ci0JCWFzc2VydEVxdWFscygiVGhlIHR5cGUgb2YgdGhlIHVuZGVybHlpbmcgcmVzb3VyY2Ugc2hvdWxkIG1hdGNoIHRoZSBleHBlY3RlZCB0eXBlLiIsIGV4cGVjdGVkVHlwZSwgZXhpdGluZ1BsYXRmb3JtUmVzb3VyY2UuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHVuZGVyeWxpbmcgcmVzb3VyY2Ugc2hvdWxkIGV4aXN0LiIsIGV4aXRpbmdQbGF0Zm9ybVJlc291cmNlLmV4aXN0cygpICk7Ci0JCQotCQkKLQkJZXhwZWN0ZWRUeXBlID0gZGV0ZXJtaW5lRXhwZWN0ZWRUeXBlKHRhcmdldE11bHRpVmlydHVhbFJlc291cmNlKTsKLQkJSVJlc291cmNlIG11bHRpUGxhdGZvcm1SZXNvdXJjZSA9IHRhcmdldE11bHRpVmlydHVhbFJlc291cmNlLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpOwotCQlhc3NlcnRFcXVhbHMoIlRoZSB0eXBlIG9mIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlIHNob3VsZCBtYXRjaCB0aGUgZXhwZWN0ZWQgdHlwZS4iLCBleHBlY3RlZFR5cGUsIG11bHRpUGxhdGZvcm1SZXNvdXJjZS5nZXRUeXBlKCkpOwotCQlhc3NlcnRUcnVlKCJUaGUgdW5kZXJ5bGluZyByZXNvdXJjZSBzaG91bGQgZXhpc3QuIiwgbXVsdGlQbGF0Zm9ybVJlc291cmNlLmV4aXN0cygpICk7IAotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VW5kZXJseWluZ1Jlc291cmNlcygpIHsgCi0KLQkJaW50IGV4cGVjdGVkVHlwZSA9IGRldGVybWluZUV4cGVjdGVkVHlwZSh0YXJnZXRWaXJ0dWFsUmVzb3VyY2VUb0NyZWF0ZSk7Ci0JCUlSZXNvdXJjZVtdIHBsYXRmb3JtUmVzb3VyY2VzVG9DcmVhdGUgPSB0YXJnZXRWaXJ0dWFsUmVzb3VyY2VUb0NyZWF0ZS5nZXRVbmRlcmx5aW5nUmVzb3VyY2VzKCk7Ci0JCWFzc2VydEVxdWFscygiVGhlcmUgc2hvdWxkIG9ubHkgYmUgb25lIHJlc291cmNlIGluIHRoZSByZXN1bHQgYXJyYXkuIiwgMSwgcGxhdGZvcm1SZXNvdXJjZXNUb0NyZWF0ZS5sZW5ndGgpOwotCQlhc3NlcnRFcXVhbHMoIlRoZSB0eXBlIG9mIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlIHNob3VsZCBtYXRjaCB0aGUgZXhwZWN0ZWQgdHlwZS4iLCBleHBlY3RlZFR5cGUsIHBsYXRmb3JtUmVzb3VyY2VzVG9DcmVhdGVbMF0uZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHVuZGVyeWxpbmcgcmVzb3VyY2Ugc2hvdWxkIG5vdCBleGlzdC4iLCAhcGxhdGZvcm1SZXNvdXJjZXNUb0NyZWF0ZVswXS5leGlzdHMoKSApOyAKLQotCQlleHBlY3RlZFR5cGUgPSBkZXRlcm1pbmVFeHBlY3RlZFR5cGUodGFyZ2V0RXhpc3RpbmdWaXJ0dWFsUmVzb3VyY2UpOwotCQlJUmVzb3VyY2VbXSBleGlzdGluZ1BsYXRmb3JtUmVzb3VyY2UgPSB0YXJnZXRFeGlzdGluZ1ZpcnR1YWxSZXNvdXJjZS5nZXRVbmRlcmx5aW5nUmVzb3VyY2VzKCk7Ci0JCWFzc2VydEVxdWFscygiVGhlcmUgc2hvdWxkIG9ubHkgYmUgb25lIHJlc291cmNlIGluIHRoZSByZXN1bHQgYXJyYXkuIiwgMSwgZXhpc3RpbmdQbGF0Zm9ybVJlc291cmNlLmxlbmd0aCk7Ci0JCWFzc2VydEVxdWFscygiVGhlIHR5cGUgb2YgdGhlIHVuZGVybHlpbmcgcmVzb3VyY2Ugc2hvdWxkIG1hdGNoIHRoZSBleHBlY3RlZCB0eXBlLiIsIGV4cGVjdGVkVHlwZSwgZXhpc3RpbmdQbGF0Zm9ybVJlc291cmNlWzBdLmdldFR5cGUoKSk7Ci0JCWFzc2VydFRydWUoIlRoZSB1bmRlcnlsaW5nIHJlc291cmNlIHNob3VsZCBub3QgZXhpc3QuIiwgZXhpc3RpbmdQbGF0Zm9ybVJlc291cmNlWzBdLmV4aXN0cygpICk7ICAKLQotCQkKLQkJZXhwZWN0ZWRUeXBlID0gZGV0ZXJtaW5lRXhwZWN0ZWRUeXBlKHRhcmdldE11bHRpVmlydHVhbFJlc291cmNlKTsKLQkJSVJlc291cmNlW10gbXVsdGlQbGF0Zm9ybVJlc291cmNlcyA9IHRhcmdldE11bHRpVmlydHVhbFJlc291cmNlLmdldFVuZGVybHlpbmdSZXNvdXJjZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgdHlwZSBvZiB0aGUgdW5kZXJseWluZyByZXNvdXJjZSBzaG91bGQgbWF0Y2ggdGhlIGV4cGVjdGVkIHR5cGUuIiwgZXhwZWN0ZWRUeXBlLCBtdWx0aVBsYXRmb3JtUmVzb3VyY2VzWzBdLmdldFR5cGUoKSk7Ci0JCWFzc2VydFRydWUoIlRoZSB1bmRlcnlsaW5nIHJlc291cmNlIHNob3VsZCBub3QgZXhpc3QuIiwgbXVsdGlQbGF0Zm9ybVJlc291cmNlc1swXS5leGlzdHMoKSApOyAKLQl9Ci0KLQlwcml2YXRlIGludCBkZXRlcm1pbmVFeHBlY3RlZFR5cGUoSVZpcnR1YWxSZXNvdXJjZSBhVmlydHVhbFJlc291cmNlKSB7IAotCQlzd2l0Y2godGFyZ2V0VmlydHVhbFJlc291cmNlVG9DcmVhdGUuZ2V0VHlwZSgpKSB7Ci0JCQljYXNlIElWaXJ0dWFsUmVzb3VyY2UuRklMRToKLQkJCQlyZXR1cm4gSVJlc291cmNlLkZJTEU7IAotCQkJY2FzZSBJVmlydHVhbFJlc291cmNlLkZPTERFUjoKLQkJCWNhc2UgSVZpcnR1YWxSZXNvdXJjZS5DT01QT05FTlQ6Ci0JCQkJcmV0dXJuIElSZXNvdXJjZS5GT0xERVI7IAotCQl9Ci0JCXJldHVybiAwOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS92aXJ0dWFscGF0aC90ZXN0cy9TdHJ1Y3R1cmVFZGl0VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS92aXJ0dWFscGF0aC90ZXN0cy9TdHJ1Y3R1cmVFZGl0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzY0ZjI4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdmlydHVhbHBhdGgvdGVzdHMvU3RydWN0dXJlRWRpdFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmNvbXBvbmVudGNvcmUudmlydHVhbHBhdGgudGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuU3RydWN0dXJlRWRpdDsKLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZUVkaXRUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHJpdmF0ZSBJUmVzb3VyY2UgYVJlc291cmNlOwotCi0JcHVibGljIFN0cnVjdHVyZUVkaXRUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlUZXN0V29ya3NwYWNlLmluaXQoKTsKLQkJYVJlc291cmNlPSBUZXN0V29ya3NwYWNlLlRFU1RfUFJPSkVDVC5nZXRGaWxlKG5ldyBQYXRoKCJXZWJNb2R1bGUxL3Rlc3RkYXRhL1Rlc3RGaWxlMS50eHQiKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RGaW5kQnlTb3VyY2VQYXRoKCkgeyAKLQkJSVByb2plY3QgcHJvaiA9IGFSZXNvdXJjZS5nZXRQcm9qZWN0KCk7Ci0JCVN0cnVjdHVyZUVkaXQgc2UgPSBudWxsOwotCQlMaXN0IGZvdW5kUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQl0cnkgewotCQkJc2UgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKHByb2opOwotCQkJQ29tcG9uZW50UmVzb3VyY2VbXSByZXNvdXJjZXMgPSBzZS5maW5kUmVzb3VyY2VzQnlTb3VyY2VQYXRoKGFSZXNvdXJjZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkpOwotCQkJYXNzZXJ0RXF1YWxzKCJUaGVyZSBzaG91bGQgYmUgb25lIHJlc291cmNlIGZvdW5kLiIsIDEsIHJlc291cmNlcy5sZW5ndGgpOwotCi0JCQlyZXNvdXJjZXMgPSBzZS5maW5kUmVzb3VyY2VzQnlTb3VyY2VQYXRoKGFSZXNvdXJjZS5nZXRGdWxsUGF0aCgpKTsKLQkJCWFzc2VydEVxdWFscygiVGhlcmUgc2hvdWxkIGJlIG9uZSByZXNvdXJjZSBmb3VuZC4iLCAxLCByZXNvdXJjZXMubGVuZ3RoKTsKLQkJfQotCQljYXRjaCAoVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCSBmaW5hbGx5IHsKLQkJCXNlLmRpc3Bvc2UoKTsJCi0JCX0gCi0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3ZpcnR1YWxwYXRoL3Rlc3RzL1Rlc3RXb3Jrc3BhY2UuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdmlydHVhbHBhdGgvdGVzdHMvVGVzdFdvcmtzcGFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDJlNTQyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdmlydHVhbHBhdGgvdGVzdHMvVGVzdFdvcmtzcGFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuY29tcG9uZW50Y29yZS52aXJ0dWFscGF0aC50ZXN0czsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXRvb2xzLmNvbW1vbi50ZXN0LmFwaXRvb2xzLlByb2plY3RVbnppcFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5Db21tb25UZXN0c1BsdWdpbjsKLQotcHVibGljIGNsYXNzIFRlc3RXb3Jrc3BhY2UgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9OQU1FID0gIldlYk1vZHVsZTEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX01PRFVMRV8xX05BTUUgPSAiV2ViTW9kdWxlMSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfTU9EVUxFXzJfTkFNRSA9ICJXZWJNb2R1bGUyIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19XRUJfTU9EVUxFX05BTUUgPSAiVGVzdFZpcnR1YWxBUEkiOyAvLyROT04tTkxTLTEkCi0JCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBX0lORiA9ICJNRVRBLUlORiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfSU5GID0gIldFQi1JTkYiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgUGF0aCB6aXBGaWxlUGF0aCA9IG5ldyBQYXRoKCJ0ZXN0RGF0YS9UZXN0VmlydHVhbEFQSS56aXAiKTsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElQcm9qZWN0IFRFU1RfUFJPSkVDVCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChUZXN0V29ya3NwYWNlLlBST0pFQ1RfTkFNRSk7Ci0JICAJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBNT0RVTEVfTkFNRVMgPSBuZXcgU3RyaW5nW117IldlYk1vZHVsZTEiLCAiV2ViTW9kdWxlMiJ9OyAgCi0JCi0JCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBnZXRUYXJnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KFBST0pFQ1RfTkFNRSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGluaXQoKSB7Ci0JCQotCQl0cnkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IGdldFRhcmdldFByb2plY3QoKTsKLQkJCWlmIChwcm9qZWN0LmV4aXN0cygpKQotCQkJCXByb2plY3QuZGVsZXRlKHRydWUsIHRydWUsIG51bGwpOwotCQkJY3JlYXRlUHJvamVjdCgpOyAKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7IAotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY3JlYXRlUHJvamVjdCgpIHsKLQkJSVBhdGggbG9jYWxaaXBQYXRoID0gZ2V0TG9jYWxQYXRoKCk7Ci0JCVByb2plY3RVbnppcFV0aWwgdXRpbCA9IG5ldyBQcm9qZWN0VW56aXBVdGlsKGxvY2FsWmlwUGF0aCwgbmV3IFN0cmluZ1tde1BST0pFQ1RfTkFNRX0pOwotCQlyZXR1cm4gdXRpbC5jcmVhdGVQcm9qZWN0cygpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIElQYXRoIGdldExvY2FsUGF0aCgpIHsKLQkJVVJMIHVybCA9IENvbW1vblRlc3RzUGx1Z2luLmluc3RhbmNlLmZpbmQoemlwRmlsZVBhdGgpOwotCQl0cnkgewotCQkJdXJsID0gUGxhdGZvcm0uYXNMb2NhbFVSTCh1cmwpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBuZXcgUGF0aCh1cmwuZ2V0UGF0aCgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9BLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTkwOTBiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9BLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBBIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUCA9ICJBLlAiOwotCi0JcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCkgewotCQlTZXQgcHJvcGVydHlOYW1lcyA9IHN1cGVyLmdldFByb3BlcnR5TmFtZXMoKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoUCk7Ci0JCXJldHVybiBwcm9wZXJ0eU5hbWVzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SUQoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL0IuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9CLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliNzg1YTAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL0IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlcjsKLQotcHVibGljIGNsYXNzIEIgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQID0gIkIuUCI7Ci0KLQlwdWJsaWMgU2V0IGdldFByb3BlcnR5TmFtZXMoKSB7Ci0JCVNldCBwcm9wZXJ0eU5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChQKTsKLQkJcmV0dXJuIHByb3BlcnR5TmFtZXM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJRCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvQy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL0MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM5YmZmMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvQy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgQyBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFAgPSAiQy5QIjsKLQotCXB1YmxpYyBTZXQgZ2V0UHJvcGVydHlOYW1lcygpIHsKLQkJU2V0IHByb3BlcnR5TmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFApOwotCQlyZXR1cm4gcHJvcGVydHlOYW1lczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldElEKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9EYXRhTW9kZWxBUElUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL0RhdGFNb2RlbEFQSVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1Y2FiN2QuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL0RhdGFNb2RlbEFQSVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzLmV4dGVuZGVkLkV4dGVuZGVkT3BlcmF0aW9uVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5TaW1wbGVUZXN0U3VpdGU7Ci0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqIAotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0KLSAqIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgRGF0YU1vZGVsQVBJVGVzdHMgZXh0ZW5kcyBUZXN0U3VpdGUgewotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IERhdGFNb2RlbEFQSVRlc3RzKCk7Ci0JfQotCi0JcHVibGljIERhdGFNb2RlbEFQSVRlc3RzKCkgewotCQlzdXBlcigpOwotCQlhZGRUZXN0KG5ldyBTaW1wbGVUZXN0U3VpdGUoRXZlbnRUZXN0LmNsYXNzKSk7Ci0JCWFkZFRlc3QobmV3IFNpbXBsZVRlc3RTdWl0ZShOZXN0aW5nVGVzdC5jbGFzcykpOwotCQlhZGRUZXN0KG5ldyBTaW1wbGVUZXN0U3VpdGUoTmVzdGVkTGlzdGVuaW5nVGVzdC5jbGFzcykpOwotCQlhZGRUZXN0KG5ldyBTaW1wbGVUZXN0U3VpdGUoU2ltcGxlRGF0YU1vZGVsVGVzdC5jbGFzcykpOwotCQlhZGRUZXN0KG5ldyBTaW1wbGVUZXN0U3VpdGUoRGF0YU1vZGVsRmFjdG9yeVRlc3QuY2xhc3MpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgU2ltcGxlVGVzdFN1aXRlKERhdGFNb2RlbEVuYWJsZW1lbnRUZXN0LmNsYXNzKSk7Ci0JCWFkZFRlc3QobmV3IFNpbXBsZVRlc3RTdWl0ZShUZXN0QWJzdHJhY3RETVByb3ZpZGVyLmNsYXNzKSk7Ci0JCWFkZFRlc3QobmV3IFNpbXBsZVRlc3RTdWl0ZShWYWxpZGF0aW9uVGVzdC5jbGFzcykpOwotCQlhZGRUZXN0KG5ldyBTaW1wbGVUZXN0U3VpdGUoRXh0ZW5kZWRPcGVyYXRpb25UZXN0cy5jbGFzcykpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9EYXRhTW9kZWxFbmFibGVtZW50VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL0RhdGFNb2RlbEVuYWJsZW1lbnRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2Nzc3Y2QuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL0RhdGFNb2RlbEVuYWJsZW1lbnRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuRGF0YU1vZGVsRW5hYmxlbWVudEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBEYXRhTW9kZWxFbmFibGVtZW50VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyB2b2lkIHRlc3RWYWxpZEV4dGVuc2lvbklEQW5kUHJvdmlkZXJUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0IHByb2ogPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoInRlbXAiKTsKLQkJaWYgKHByb2ogPT0gbnVsbCkgewotCQkJcHJvai5jcmVhdGUobnVsbCk7Ci0JCX0KLQkJSURhdGFNb2RlbCBkYXRhTW9kZWwgPSBEYXRhTW9kZWxFbmFibGVtZW50RmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwoInRlc3RQcm92aWRlckJhc2UiLCBwcm9qKTsKLQkJYXNzZXJ0VHJ1ZShkYXRhTW9kZWwuaXNQcm9wZXJ0eShJVGVzdERhdGFNb2RlbC5GT08pKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsaWRFeHRlbnNpb25JREltcGxlbWVudG9yRm9yUHJvdmlkZXJUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJSVByb2plY3QgcHJvaiA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdCgidGVtcCIpOwotCQlpZiAocHJvaiA9PSBudWxsKSB7Ci0JCQlwcm9qLmNyZWF0ZShudWxsKTsKLQkJfQotCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IERhdGFNb2RlbEVuYWJsZW1lbnRGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbCgidGVzdFByb3ZpZGVyQm9ndXMiLCBwcm9qKTsKLQkJYXNzZXJ0VHJ1ZShkYXRhTW9kZWwgPT0gbnVsbCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvRGF0YU1vZGVsRmFjdG9yeVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9EYXRhTW9kZWxGYWN0b3J5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTgwZjAwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9EYXRhTW9kZWxGYWN0b3J5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgRGF0YU1vZGVsRmFjdG9yeVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RCb2d1c0V4dGVuc2lvbigpIHsKLQkJRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IG51bGw7Ci0JCUlEYXRhTW9kZWwgZGF0YU1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWRhdGFNb2RlbCAgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbCgiYm9ndXMiKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWV4Y2VwdGlvbiA9IGU7Ci0JCX0KLQkJYXNzZXJ0TnVsbChkYXRhTW9kZWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkRXh0ZW5zaW9uSUQoKSB7Ci0JCUV4Y2VwdGlvbiBleGNlcHRpb24gPSBudWxsOwotCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlkYXRhTW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbCgiYmFkSUQiKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWV4Y2VwdGlvbiA9IGU7Ci0JCX0KLQkJYXNzZXJ0TnVsbChkYXRhTW9kZWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkRXh0ZW5zaW9uQ2xhc3MoKSB7Ci0JCUV4Y2VwdGlvbiBleGNlcHRpb24gPSBudWxsOwotCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkgZGF0YU1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwoT2JqZWN0LmNsYXNzKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWV4Y2VwdGlvbiA9IGU7Ci0JCX0KLQkJYXNzZXJ0TnVsbChkYXRhTW9kZWwpOwotCX0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRFeHRlbnNpb25JREFuZFByb3ZpZGVyVHlwZSgpIHsKLSAgICAgICAgU3RyaW5nW10gZGVzY3MgPSBEYXRhTW9kZWxGYWN0b3J5LmdldERhdGFNb2RlbFByb3ZpZGVySURzRm9yS2luZCgidGVzdFByb3ZpZGVyQmFzZSIpOwotICAgICAgICBJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKGRlc2NzWzBdKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShkYXRhTW9kZWwuaXNQcm9wZXJ0eShJVGVzdERhdGFNb2RlbC5GT08pKTsKLSAgICB9Ci0gICAgCi0JcHVibGljIHZvaWQgdGVzdFZhbGlkRXh0ZW5zaW9uSUQoKSB7Ci0JCUlEYXRhTW9kZWwgZGF0YU1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwoIm9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuSVRlc3REYXRhTW9kZWwiKTsKLQkJYXNzZXJ0VHJ1ZShkYXRhTW9kZWwuaXNQcm9wZXJ0eShJVGVzdERhdGFNb2RlbC5GT08pKTsKLQl9Ci0gICAgCi0JcHVibGljIHZvaWQgdGVzdFZhbGlkRXh0ZW5zaW9uQ2xhc3MoKSB7Ci0JCUlEYXRhTW9kZWwgZGF0YU1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwoSVRlc3REYXRhTW9kZWwuY2xhc3MpOwotCQlhc3NlcnRUcnVlKGRhdGFNb2RlbC5pc1Byb3BlcnR5KElUZXN0RGF0YU1vZGVsLkZPTykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWxpZEV4dGVuc2lvbkluc3RhbmNlKCkgewotCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBUZXN0RGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCWFzc2VydFRydWUoZGF0YU1vZGVsLmlzUHJvcGVydHkoSVRlc3REYXRhTW9kZWwuRk9PKSk7Ci0JfQotCi0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL0V2ZW50VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL0V2ZW50VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTgzODcxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9FdmVudFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgRXZlbnRUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIHZvaWQgdGVzdEV2ZW50Q3JlYXRpb24oKSB7Ci0JCUlEYXRhTW9kZWwgZG0gPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgQSgpKTsKLQkJZG0uc2V0UHJvcGVydHkoQS5QLCAiYWFhIik7Ci0JCURhdGFNb2RlbEV2ZW50IGV2ZW50ID0gbmV3IERhdGFNb2RlbEV2ZW50KGRtLCBBLlAsIERhdGFNb2RlbEV2ZW50LlZBTFVFX0NIRyk7Ci0JCWFzc2VydEVxdWFscyhkbSwgZXZlbnQuZ2V0RGF0YU1vZGVsKCkpOwotCQlhc3NlcnRFcXVhbHMoQS5QLCBldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWFhIiwgZXZlbnQuZ2V0UHJvcGVydHkoKSk7Ci0JCWFzc2VydEVxdWFscyhEYXRhTW9kZWxFdmVudC5WQUxVRV9DSEcsIGV2ZW50LmdldEZsYWcoKSk7Ci0JCWRtLnNldFByb3BlcnR5KEEuUCwgImJiYiIpOwotCQlhc3NlcnRFcXVhbHMoImJiYiIsIGV2ZW50LmdldFByb3BlcnR5KCkpOwotCQlldmVudCA9IG5ldyBEYXRhTW9kZWxFdmVudChkbSwgQS5QLCBEYXRhTW9kZWxFdmVudC5FTkFCTEVfQ0hHKTsKLQkJYXNzZXJ0RXF1YWxzKERhdGFNb2RlbEV2ZW50LkVOQUJMRV9DSEcsIGV2ZW50LmdldEZsYWcoKSk7Ci0JCWFzc2VydEVxdWFscyhkbS5pc1Byb3BlcnR5RW5hYmxlZChBLlApLCBldmVudC5pc1Byb3BlcnR5RW5hYmxlZCgpKTsKLQkJZXZlbnQgPSBuZXcgRGF0YU1vZGVsRXZlbnQoZG0sIEEuUCwgRGF0YU1vZGVsRXZlbnQuVkFMSURfVkFMVUVTX0NIRyk7Ci0JCWFzc2VydEVxdWFscyhEYXRhTW9kZWxFdmVudC5WQUxJRF9WQUxVRVNfQ0hHLCBldmVudC5nZXRGbGFnKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvSGVsbG9PcGVyYXRpb25FeHRlbnNpb24uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9IZWxsb09wZXJhdGlvbkV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2Q5ODdhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9IZWxsb09wZXJhdGlvbkV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgSGVsbG9PcGVyYXRpb25FeHRlbnNpb24gZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiB7Ci0KLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBleGVjdXRlIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIE9LX1NUQVRVUzsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyByZWRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiByZWRvIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIE9LX1NUQVRVUzsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiB1bmRvIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIE9LX1NUQVRVUzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9IZWxsb1Bvc3RPcGVyYXRpb25FeHRlbnNpb24uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9IZWxsb1Bvc3RPcGVyYXRpb25FeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYzNDkwOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvSGVsbG9Qb3N0T3BlcmF0aW9uRXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0czsKLQotcHVibGljIGNsYXNzIEhlbGxvUG9zdE9wZXJhdGlvbkV4dGVuc2lvbiBleHRlbmRzIEhlbGxvT3BlcmF0aW9uRXh0ZW5zaW9uIHsKLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL0hlbGxvUHJlT3BlcmF0aW9uRXh0ZW5zaW9uLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvSGVsbG9QcmVPcGVyYXRpb25FeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNmM2M4NC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvSGVsbG9QcmVPcGVyYXRpb25FeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzOwotCi1wdWJsaWMgY2xhc3MgSGVsbG9QcmVPcGVyYXRpb25FeHRlbnNpb24gZXh0ZW5kcyBIZWxsb09wZXJhdGlvbkV4dGVuc2lvbiB7Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9JVGVzdERhdGFNb2RlbC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL0lUZXN0RGF0YU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ODBmMmQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL0lUZXN0RGF0YU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0czsKLQotcHVibGljIGludGVyZmFjZSBJVGVzdERhdGFNb2RlbCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT08gPSAiSVRlc3REYXRhTW9kZWwuRk9PIjsKLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL05lc3RlZExpc3RlbmluZ1Rlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9OZXN0ZWRMaXN0ZW5pbmdUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyMTc0ZTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL05lc3RlZExpc3RlbmluZ1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgTmVzdGVkTGlzdGVuaW5nVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0ZW5lcnMxKCkgewotCQlUZXN0TGlzdGVuZXIgYUwgPSBuZXcgVGVzdExpc3RlbmVyKCk7Ci0JCVRlc3RMaXN0ZW5lciBiTCA9IG5ldyBUZXN0TGlzdGVuZXIoKTsKLQkJVGVzdExpc3RlbmVyIGNMID0gbmV3IFRlc3RMaXN0ZW5lcigpOwotCi0JCUlEYXRhTW9kZWwgYSA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBBKCkpOwotCQlJRGF0YU1vZGVsIGIgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgQigpKTsKLQkJSURhdGFNb2RlbCBjID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEMoKSk7Ci0JCWEuYWRkTGlzdGVuZXIoYUwpOwotCQliLmFkZExpc3RlbmVyKGJMKTsKLQkJYy5hZGRMaXN0ZW5lcihjTCk7Ci0KLQkJLy8gY3lsaWNhbAotCQlhLmFkZE5lc3RlZE1vZGVsKCJiIiwgYik7Ci0JCWIuYWRkTmVzdGVkTW9kZWwoImMiLCBjKTsKLQkJYy5hZGROZXN0ZWRNb2RlbCgiYSIsIGEpOwotCQlhTC5jbGVhckV2ZW50cygpOwotCQliTC5jbGVhckV2ZW50cygpOwotCQljTC5jbGVhckV2ZW50cygpOwotCQlhLnNldFByb3BlcnR5KEEuUCwgImEiKTsKLQkJYi5zZXRQcm9wZXJ0eShCLlAsICJiIik7Ci0JCWMuc2V0UHJvcGVydHkoQy5QLCAiYyIpOwotCQlMaXN0IGFFdmVudHMgPSBhTC5nZXRFdmVudHMoKTsKLQkJTGlzdCBiRXZlbnRzID0gYkwuZ2V0RXZlbnRzKCk7Ci0JCUxpc3QgY0V2ZW50cyA9IGNMLmdldEV2ZW50cygpOwotCQlhc3NlcnRFcXVhbHMoMywgYUV2ZW50cy5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYkV2ZW50cy5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgY0V2ZW50cy5zaXplKCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotCQkJRGF0YU1vZGVsRXZlbnQgYUV2ZW50ID0gKERhdGFNb2RlbEV2ZW50KSBhRXZlbnRzLmdldChpKTsKLQkJCURhdGFNb2RlbEV2ZW50IGJFdmVudCA9IChEYXRhTW9kZWxFdmVudCkgYkV2ZW50cy5nZXQoaSk7Ci0JCQlEYXRhTW9kZWxFdmVudCBjRXZlbnQgPSAoRGF0YU1vZGVsRXZlbnQpIGNFdmVudHMuZ2V0KGkpOwotCi0JCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IGFFdmVudC5nZXREYXRhTW9kZWwoKTsKLQkJCWFzc2VydEVxdWFscyhiRXZlbnQuZ2V0RGF0YU1vZGVsKCksIGRhdGFNb2RlbCk7Ci0JCQlhc3NlcnRFcXVhbHMoY0V2ZW50LmdldERhdGFNb2RlbCgpLCBkYXRhTW9kZWwpOwotCi0JCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gYUV2ZW50LmdldFByb3BlcnR5TmFtZSgpOwotCQkJYXNzZXJ0RXF1YWxzKGJFdmVudC5nZXRQcm9wZXJ0eU5hbWUoKSwgcHJvcGVydHlOYW1lKTsKLQkJCWFzc2VydEVxdWFscyhjRXZlbnQuZ2V0UHJvcGVydHlOYW1lKCksIHByb3BlcnR5TmFtZSk7Ci0KLQkJCWludCBmbGFnID0gYUV2ZW50LmdldEZsYWcoKTsKLQkJCWFzc2VydEVxdWFscyhiRXZlbnQuZ2V0RmxhZygpLCBmbGFnKTsKLQkJCWFzc2VydEVxdWFscyhjRXZlbnQuZ2V0RmxhZygpLCBmbGFnKTsKLQotCQkJT2JqZWN0IHByb3BlcnR5ID0gYUV2ZW50LmdldFByb3BlcnR5KCk7Ci0JCQlhc3NlcnRFcXVhbHMoYkV2ZW50LmdldFByb3BlcnR5KCksIHByb3BlcnR5KTsKLQkJCWFzc2VydEVxdWFscyhjRXZlbnQuZ2V0UHJvcGVydHkoKSwgcHJvcGVydHkpOwotCQkJc3dpdGNoIChpKSB7Ci0JCQkJY2FzZSAwIDoKLQkJCQkJYXNzZXJ0RXF1YWxzKGEsIGRhdGFNb2RlbCk7Ci0JCQkJCWFzc2VydEVxdWFscyhmbGFnLCBEYXRhTW9kZWxFdmVudC5WQUxVRV9DSEcpOwotCQkJCQlhc3NlcnRFcXVhbHMocHJvcGVydHlOYW1lLCBBLlApOwotCQkJCQlhc3NlcnRFcXVhbHMocHJvcGVydHksICJhIik7Ci0JCQkJCWFzc2VydFRydWUoZGF0YU1vZGVsLmlzUHJvcGVydHlTZXQocHJvcGVydHlOYW1lKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMSA6Ci0JCQkJCWFzc2VydEVxdWFscyhiLCBkYXRhTW9kZWwpOwotCQkJCQlhc3NlcnRFcXVhbHMoZmxhZywgRGF0YU1vZGVsRXZlbnQuVkFMVUVfQ0hHKTsKLQkJCQkJYXNzZXJ0RXF1YWxzKHByb3BlcnR5TmFtZSwgQi5QKTsKLQkJCQkJYXNzZXJ0RXF1YWxzKHByb3BlcnR5LCAiYiIpOwotCQkJCQlhc3NlcnRUcnVlKGRhdGFNb2RlbC5pc1Byb3BlcnR5U2V0KHByb3BlcnR5TmFtZSkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDIgOgotCQkJCQlhc3NlcnRFcXVhbHMoYywgZGF0YU1vZGVsKTsKLQkJCQkJYXNzZXJ0RXF1YWxzKGZsYWcsIERhdGFNb2RlbEV2ZW50LlZBTFVFX0NIRyk7Ci0JCQkJCWFzc2VydEVxdWFscyhwcm9wZXJ0eU5hbWUsIEMuUCk7Ci0JCQkJCWFzc2VydEVxdWFscyhwcm9wZXJ0eSwgImMiKTsKLQkJCQkJYXNzZXJ0VHJ1ZShkYXRhTW9kZWwuaXNQcm9wZXJ0eVNldChwcm9wZXJ0eU5hbWUpKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlhTC5jbGVhckV2ZW50cygpOwotCQliTC5jbGVhckV2ZW50cygpOwotCQljTC5jbGVhckV2ZW50cygpOwotCQlhLnNldFByb3BlcnR5KEEuUCwgbnVsbCk7Ci0JCWIuc2V0UHJvcGVydHkoQi5QLCBudWxsKTsKLQkJYy5zZXRQcm9wZXJ0eShDLlAsIG51bGwpOwotCQlhRXZlbnRzID0gYUwuZ2V0RXZlbnRzKCk7Ci0JCWJFdmVudHMgPSBiTC5nZXRFdmVudHMoKTsKLQkJY0V2ZW50cyA9IGNMLmdldEV2ZW50cygpOwotCQlhc3NlcnRFcXVhbHMoMywgYUV2ZW50cy5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYkV2ZW50cy5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgY0V2ZW50cy5zaXplKCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotCQkJRGF0YU1vZGVsRXZlbnQgYUV2ZW50ID0gKERhdGFNb2RlbEV2ZW50KSBhRXZlbnRzLmdldChpKTsKLQkJCURhdGFNb2RlbEV2ZW50IGJFdmVudCA9IChEYXRhTW9kZWxFdmVudCkgYkV2ZW50cy5nZXQoaSk7Ci0JCQlEYXRhTW9kZWxFdmVudCBjRXZlbnQgPSAoRGF0YU1vZGVsRXZlbnQpIGNFdmVudHMuZ2V0KGkpOwotCi0JCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IGFFdmVudC5nZXREYXRhTW9kZWwoKTsKLQkJCWFzc2VydEVxdWFscyhiRXZlbnQuZ2V0RGF0YU1vZGVsKCksIGRhdGFNb2RlbCk7Ci0JCQlhc3NlcnRFcXVhbHMoY0V2ZW50LmdldERhdGFNb2RlbCgpLCBkYXRhTW9kZWwpOwotCi0JCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gYUV2ZW50LmdldFByb3BlcnR5TmFtZSgpOwotCQkJYXNzZXJ0RXF1YWxzKGJFdmVudC5nZXRQcm9wZXJ0eU5hbWUoKSwgcHJvcGVydHlOYW1lKTsKLQkJCWFzc2VydEVxdWFscyhjRXZlbnQuZ2V0UHJvcGVydHlOYW1lKCksIHByb3BlcnR5TmFtZSk7Ci0KLQkJCWludCBmbGFnID0gYUV2ZW50LmdldEZsYWcoKTsKLQkJCWFzc2VydEVxdWFscyhiRXZlbnQuZ2V0RmxhZygpLCBmbGFnKTsKLQkJCWFzc2VydEVxdWFscyhjRXZlbnQuZ2V0RmxhZygpLCBmbGFnKTsKLQotCQkJT2JqZWN0IHByb3BlcnR5ID0gYUV2ZW50LmdldFByb3BlcnR5KCk7Ci0JCQlhc3NlcnRFcXVhbHMoYkV2ZW50LmdldFByb3BlcnR5KCksIHByb3BlcnR5KTsKLQkJCWFzc2VydEVxdWFscyhjRXZlbnQuZ2V0UHJvcGVydHkoKSwgcHJvcGVydHkpOwotCQkJc3dpdGNoIChpKSB7Ci0JCQkJY2FzZSAwIDoKLQkJCQkJYXNzZXJ0RXF1YWxzKGEsIGRhdGFNb2RlbCk7Ci0JCQkJCWFzc2VydEVxdWFscyhmbGFnLCBEYXRhTW9kZWxFdmVudC5WQUxVRV9DSEcpOwotCQkJCQlhc3NlcnRFcXVhbHMocHJvcGVydHlOYW1lLCBBLlApOwotCQkJCQlhc3NlcnRUcnVlKCFkYXRhTW9kZWwuaXNQcm9wZXJ0eVNldChwcm9wZXJ0eU5hbWUpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAxIDoKLQkJCQkJYXNzZXJ0RXF1YWxzKGIsIGRhdGFNb2RlbCk7Ci0JCQkJCWFzc2VydEVxdWFscyhmbGFnLCBEYXRhTW9kZWxFdmVudC5WQUxVRV9DSEcpOwotCQkJCQlhc3NlcnRFcXVhbHMocHJvcGVydHlOYW1lLCBCLlApOwotCQkJCQlhc3NlcnRUcnVlKCFkYXRhTW9kZWwuaXNQcm9wZXJ0eVNldChwcm9wZXJ0eU5hbWUpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyIDoKLQkJCQkJYXNzZXJ0RXF1YWxzKGMsIGRhdGFNb2RlbCk7Ci0JCQkJCWFzc2VydEVxdWFscyhmbGFnLCBEYXRhTW9kZWxFdmVudC5WQUxVRV9DSEcpOwotCQkJCQlhc3NlcnRFcXVhbHMocHJvcGVydHlOYW1lLCBDLlApOwotCQkJCQlhc3NlcnRUcnVlKCFkYXRhTW9kZWwuaXNQcm9wZXJ0eVNldChwcm9wZXJ0eU5hbWUpKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvTmVzdGluZ1Rlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9OZXN0aW5nVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzUxOWU1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9OZXN0aW5nVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLldUUFJlc291cmNlSGFuZGxlcjsKLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICogCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLQotICogQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXN0aW5nVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXByaXZhdGUgSURhdGFNb2RlbCBhOwotCXByaXZhdGUgSURhdGFNb2RlbCBiOwotCXByaXZhdGUgSURhdGFNb2RlbCBjOwotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJYSA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBBKCkpOwotCQliID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEIoKSk7Ci0JCWMgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgQygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAobnVsbCAhPSBhKSB7Ci0JCQlhLmRpc3Bvc2UoKTsKLQkJCWEgPSBudWxsOwotCQl9Ci0JCWlmIChudWxsICE9IGIpIHsKLQkJCWIuZGlzcG9zZSgpOwotCQkJYiA9IG51bGw7Ci0JCX0KLQotCQlpZiAobnVsbCAhPSBjKSB7Ci0JCQljLmRpc3Bvc2UoKTsKLQkJCWMgPSBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWROZXN0ZWRNb2RlbCgpIHsKLQkJU3RyaW5nIE5FU1RFRF9NT0RFTF9OT1RfTE9DQVRFRCA9IFdUUFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIjIxIik7IC8vJE5PTi1OTFMtMSQKLQkJRXhjZXB0aW9uIGV4ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWEuZ2V0TmVzdGVkTW9kZWwoImZvbyIpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCWV4ID0gZTsKLQkJfQotCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbChleCk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGV4LmdldE1lc3NhZ2UoKS5zdGFydHNXaXRoKE5FU1RFRF9NT0RFTF9OT1RfTE9DQVRFRCkpOwotCQlleCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlhLmdldE5lc3RlZE1vZGVsKG51bGwpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCWV4ID0gZTsKLQkJfQotCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbChleCk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGV4LmdldE1lc3NhZ2UoKS5zdGFydHNXaXRoKE5FU1RFRF9NT0RFTF9OT1RfTE9DQVRFRCkpOwotCi0JCWEuYWRkTmVzdGVkTW9kZWwoImIiLCBiKTsKLQkJZXggPSBudWxsOwotCQl0cnkgewotCQkJYS5nZXROZXN0ZWRNb2RlbChudWxsKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlleCA9IGU7Ci0JCX0KLQkJQXNzZXJ0LmFzc2VydE5vdE51bGwoZXgpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShleC5nZXRNZXNzYWdlKCkuc3RhcnRzV2l0aChORVNURURfTU9ERUxfTk9UX0xPQ0FURUQpKTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc05lc3RlZE1vZGVsKCkgewotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoYS5pc05lc3RlZE1vZGVsKCIiKSk7Ci0JCUFzc2VydC5hc3NlcnRGYWxzZShhLmlzTmVzdGVkTW9kZWwobnVsbCkpOwotCQlhLmFkZE5lc3RlZE1vZGVsKCJiIiwgYik7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGEuaXNOZXN0ZWRNb2RlbCgiYiIpKTsKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGEuaXNOZXN0ZWRNb2RlbCgiYyIpKTsKLQkJYS5hZGROZXN0ZWRNb2RlbCgiYyIsIGMpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShhLmlzTmVzdGVkTW9kZWwoImMiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZU5vbkV4aXN0ZW50TW9kZWxzKCkgewotCQlBc3NlcnQuYXNzZXJ0TnVsbChhLnJlbW92ZU5lc3RlZE1vZGVsKCJhIikpOwotCQlBc3NlcnQuYXNzZXJ0TnVsbChhLnJlbW92ZU5lc3RlZE1vZGVsKG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmVzdGVkQW5kR2V0TmVzdGluZygpIHsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygwLCBhLmdldE5lc3RlZE1vZGVscygpLnNpemUoKSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoMCwgYi5nZXROZXN0aW5nTW9kZWxzKCkuc2l6ZSgpKTsKLQotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShhLmFkZE5lc3RlZE1vZGVsKCJiIiwgYikpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIGEuZ2V0TmVzdGVkTW9kZWxzKCkuc2l6ZSgpKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYS5nZXROZXN0ZWRNb2RlbHMoKS5jb250YWlucyhiKSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoYiwgYS5nZXROZXN0ZWRNb2RlbCgiYiIpKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygxLCBiLmdldE5lc3RpbmdNb2RlbHMoKS5zaXplKCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShiLmdldE5lc3RpbmdNb2RlbHMoKS5jb250YWlucyhhKSk7Ci0KLQkJQXNzZXJ0LmFzc2VydFRydWUoYS5hZGROZXN0ZWRNb2RlbCgiYyIsIGMpKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygyLCBhLmdldE5lc3RlZE1vZGVscygpLnNpemUoKSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGEuZ2V0TmVzdGVkTW9kZWxzKCkuY29udGFpbnMoYykpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKGMsIGEuZ2V0TmVzdGVkTW9kZWwoImMiKSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoMSwgYy5nZXROZXN0aW5nTW9kZWxzKCkuc2l6ZSgpKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYy5nZXROZXN0aW5nTW9kZWxzKCkuY29udGFpbnMoYSkpOwotCi0JCUFzc2VydC5hc3NlcnRUcnVlKGIuYWRkTmVzdGVkTW9kZWwoImMiLCBjKSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoMSwgYi5nZXROZXN0ZWRNb2RlbHMoKS5zaXplKCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShiLmdldE5lc3RlZE1vZGVscygpLmNvbnRhaW5zKGMpKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygyLCBjLmdldE5lc3RpbmdNb2RlbHMoKS5zaXplKCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShjLmdldE5lc3RpbmdNb2RlbHMoKS5jb250YWlucyhiKSk7Ci0KLQkJQXNzZXJ0LmFzc2VydEVxdWFscyhiLCBhLnJlbW92ZU5lc3RlZE1vZGVsKCJiIikpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIGEuZ2V0TmVzdGVkTW9kZWxzKCkuc2l6ZSgpKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygwLCBiLmdldE5lc3RpbmdNb2RlbHMoKS5zaXplKCkpOwotCi0JCUFzc2VydC5hc3NlcnRFcXVhbHMoYywgYS5yZW1vdmVOZXN0ZWRNb2RlbCgiYyIpKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygwLCBhLmdldE5lc3RlZE1vZGVscygpLnNpemUoKSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoMSwgYy5nZXROZXN0aW5nTW9kZWxzKCkuc2l6ZSgpKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYy5nZXROZXN0aW5nTW9kZWxzKCkuY29udGFpbnMoYikpOwotCi0JCUFzc2VydC5hc3NlcnRFcXVhbHMoYywgYi5yZW1vdmVOZXN0ZWRNb2RlbCgiYyIpKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygwLCBiLmdldE5lc3RlZE1vZGVscygpLnNpemUoKSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoMCwgYy5nZXROZXN0aW5nTW9kZWxzKCkuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2VsZk5lc3QoKSB7Ci0JCUFzc2VydC5hc3NlcnRGYWxzZShhLmFkZE5lc3RlZE1vZGVsKCJhIiwgYSkpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIGEuZ2V0TmVzdGVkTW9kZWxzKCkuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RHVwbGljYXRlTmVzdCgpIHsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYS5hZGROZXN0ZWRNb2RlbCgiYjEiLCBiKSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoYiwgYS5nZXROZXN0ZWRNb2RlbCgiYjEiKSk7Ci0JCUFzc2VydC5hc3NlcnRGYWxzZShhLmFkZE5lc3RlZE1vZGVsKCJiMiIsIGIpKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscyhiLCBhLmdldE5lc3RlZE1vZGVsKCJiMSIpKTsKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGEuaXNOZXN0ZWRNb2RlbCgiYjIiKSk7Ci0JfQotCi0KLQkvKioKLQkgKiA8Y29kZT4KLQkgKiAxICAgIDIgICAzICAgIDQgICAgIDUgICAgNgotCSAqIEEgIHwgQSB8IEEgIHwgQSAgIHwgQSAgfCBBCi0JICogIEIgfCAgIHwgIEIgfCAgQiAgfCAgQiB8ICBCCi0JICogICAgICAgICAgICAgICAgIEMgfCAgICB8ICAgQwotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0SXNQcm9wZXJ0eVNpbXBsZU5lc3RpbmcwKCkgewotCQlhLmFkZE5lc3RlZE1vZGVsKCJiIiwgYik7IC8vIDEKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGEuaXNCYXNlUHJvcGVydHkoQi5QKSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGEuaXNQcm9wZXJ0eShCLlApKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYS5pc05lc3RlZFByb3BlcnR5KEIuUCkpOwotCi0JCWEucmVtb3ZlTmVzdGVkTW9kZWwoImIiKTsgLy8gMgotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoYS5pc0Jhc2VQcm9wZXJ0eShCLlApKTsKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGEuaXNQcm9wZXJ0eShCLlApKTsKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGEuaXNOZXN0ZWRQcm9wZXJ0eShCLlApKTsKLQotCQlhLmFkZE5lc3RlZE1vZGVsKCJiIiwgYik7IC8vIDMKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGEuaXNCYXNlUHJvcGVydHkoQi5QKSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGEuaXNQcm9wZXJ0eShCLlApKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYS5pc05lc3RlZFByb3BlcnR5KEIuUCkpOwotCi0JCWIuYWRkTmVzdGVkTW9kZWwoImMiLCBjKTsgLy8gNAotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoYS5pc0Jhc2VQcm9wZXJ0eShDLlApKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYS5pc1Byb3BlcnR5KEMuUCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShhLmlzTmVzdGVkUHJvcGVydHkoQy5QKSk7Ci0KLQkJYi5yZW1vdmVOZXN0ZWRNb2RlbCgiYyIpOyAvLyA1Ci0JCUFzc2VydC5hc3NlcnRGYWxzZShhLmlzQmFzZVByb3BlcnR5KEMuUCkpOwotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoYS5pc1Byb3BlcnR5KEMuUCkpOwotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoYS5pc05lc3RlZFByb3BlcnR5KEMuUCkpOwotCi0JCWIuYWRkTmVzdGVkTW9kZWwoImMiLCBjKTsgLy8gNgotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoYS5pc0Jhc2VQcm9wZXJ0eShDLlApKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYS5pc1Byb3BlcnR5KEMuUCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShhLmlzTmVzdGVkUHJvcGVydHkoQy5QKSk7Ci0JfQotCi0JLyoqCi0JICogPGNvZGU+Ci0JICogMSAgICAyICAgICAzICAgIDQKLQkgKiBBICB8IEEgICB8IEEgIHwgQQotCSAqICBCIHwgIEIgIHwgIEIgfAotCSAqICAgICAgICBDIHwgICAgfAotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0SXNQcm9wZXJ0eVNpbXBsZU5lc3RpbmcxKCkgewotCQlhLmFkZE5lc3RlZE1vZGVsKCJiIiwgYik7IC8vIDEKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGEuaXNCYXNlUHJvcGVydHkoQi5QKSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGEuaXNQcm9wZXJ0eShCLlApKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYS5pc05lc3RlZFByb3BlcnR5KEIuUCkpOwotCQkvLyBjaGVjayBhJ3MgbmVzdGVkCi0JCUFzc2VydC5hc3NlcnRUcnVlKGIgPT0gYS5nZXROZXN0ZWRNb2RlbCgiYiIpKTsKLQkJQ29sbGVjdGlvbiBuZXN0ZWRNb2RlbE5hbWVzID0gYS5nZXROZXN0ZWRNb2RlbE5hbWVzKCk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoMSwgbmVzdGVkTW9kZWxOYW1lcy5zaXplKCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShuZXN0ZWRNb2RlbE5hbWVzLmNvbnRhaW5zKCJiIikpOwotCQlDb2xsZWN0aW9uIGJhc2VQcm9wZXJ0aWVzID0gYS5nZXRCYXNlUHJvcGVydGllcygpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKDMsIGJhc2VQcm9wZXJ0aWVzLnNpemUoKSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGJhc2VQcm9wZXJ0aWVzLmNvbnRhaW5zKEEuUCkpOwotCQlDb2xsZWN0aW9uIG5lc3RlZFByb3BlcnRpZXMgPSBhLmdldE5lc3RlZFByb3BlcnRpZXMoKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygzLCBuZXN0ZWRQcm9wZXJ0aWVzLnNpemUoKSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKG5lc3RlZFByb3BlcnRpZXMuY29udGFpbnMoQi5QKSk7Ci0JCUNvbGxlY3Rpb24gYWxsUHJvcGVydGllcyA9IGEuZ2V0QWxsUHJvcGVydGllcygpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKDQsIGFsbFByb3BlcnRpZXMuc2l6ZSgpKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYWxsUHJvcGVydGllcy5jb250YWlucyhBLlApKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYWxsUHJvcGVydGllcy5jb250YWlucyhCLlApKTsKLQotCi0JCWIuYWRkTmVzdGVkTW9kZWwoImMiLCBjKTsgLy8gMgotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoYS5pc0Jhc2VQcm9wZXJ0eShDLlApKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYS5pc1Byb3BlcnR5KEMuUCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShhLmlzTmVzdGVkUHJvcGVydHkoQy5QKSk7Ci0JCUFzc2VydC5hc3NlcnRGYWxzZShiLmlzQmFzZVByb3BlcnR5KEMuUCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShiLmlzUHJvcGVydHkoQy5QKSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGIuaXNOZXN0ZWRQcm9wZXJ0eShDLlApKTsKLQkJLy8gY2hlY2sgYSdzIG5lc3RlZAotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShiID09IGEuZ2V0TmVzdGVkTW9kZWwoImIiKSk7Ci0JCW5lc3RlZE1vZGVsTmFtZXMgPSBhLmdldE5lc3RlZE1vZGVsTmFtZXMoKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygxLCBuZXN0ZWRNb2RlbE5hbWVzLnNpemUoKSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKG5lc3RlZE1vZGVsTmFtZXMuY29udGFpbnMoImIiKSk7Ci0JCWJhc2VQcm9wZXJ0aWVzID0gYS5nZXRCYXNlUHJvcGVydGllcygpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKDMsIGJhc2VQcm9wZXJ0aWVzLnNpemUoKSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGJhc2VQcm9wZXJ0aWVzLmNvbnRhaW5zKEEuUCkpOwotCQluZXN0ZWRQcm9wZXJ0aWVzID0gYS5nZXROZXN0ZWRQcm9wZXJ0aWVzKCk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoNCwgbmVzdGVkUHJvcGVydGllcy5zaXplKCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShuZXN0ZWRQcm9wZXJ0aWVzLmNvbnRhaW5zKEIuUCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShuZXN0ZWRQcm9wZXJ0aWVzLmNvbnRhaW5zKEMuUCkpOwotCQlhbGxQcm9wZXJ0aWVzID0gYS5nZXRBbGxQcm9wZXJ0aWVzKCk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoNSwgYWxsUHJvcGVydGllcy5zaXplKCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShhbGxQcm9wZXJ0aWVzLmNvbnRhaW5zKEEuUCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShhbGxQcm9wZXJ0aWVzLmNvbnRhaW5zKEIuUCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShhbGxQcm9wZXJ0aWVzLmNvbnRhaW5zKEMuUCkpOwotCQkvLyBjaGVjayBiJ3MgbmVzdGVkCi0JCUFzc2VydC5hc3NlcnRUcnVlKGMgPT0gYi5nZXROZXN0ZWRNb2RlbCgiYyIpKTsKLQkJbmVzdGVkTW9kZWxOYW1lcyA9IGIuZ2V0TmVzdGVkTW9kZWxOYW1lcygpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIG5lc3RlZE1vZGVsTmFtZXMuc2l6ZSgpKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUobmVzdGVkTW9kZWxOYW1lcy5jb250YWlucygiYyIpKTsKLQkJYmFzZVByb3BlcnRpZXMgPSBiLmdldEJhc2VQcm9wZXJ0aWVzKCk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoMywgYmFzZVByb3BlcnRpZXMuc2l6ZSgpKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYmFzZVByb3BlcnRpZXMuY29udGFpbnMoQi5QKSk7Ci0JCW5lc3RlZFByb3BlcnRpZXMgPSBiLmdldE5lc3RlZFByb3BlcnRpZXMoKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygzLCBuZXN0ZWRQcm9wZXJ0aWVzLnNpemUoKSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKG5lc3RlZFByb3BlcnRpZXMuY29udGFpbnMoQy5QKSk7Ci0JCWFsbFByb3BlcnRpZXMgPSBiLmdldEFsbFByb3BlcnRpZXMoKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscyg0LCBhbGxQcm9wZXJ0aWVzLnNpemUoKSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGFsbFByb3BlcnRpZXMuY29udGFpbnMoQi5QKSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGFsbFByb3BlcnRpZXMuY29udGFpbnMoQy5QKSk7Ci0KLQkJYi5yZW1vdmVOZXN0ZWRNb2RlbCgiYyIpOyAvLyAzCi0JCUFzc2VydC5hc3NlcnRGYWxzZShhLmlzQmFzZVByb3BlcnR5KEMuUCkpOwotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoYS5pc1Byb3BlcnR5KEMuUCkpOwotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoYS5pc05lc3RlZFByb3BlcnR5KEMuUCkpOwotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoYi5pc0Jhc2VQcm9wZXJ0eShDLlApKTsKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGIuaXNQcm9wZXJ0eShDLlApKTsKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGIuaXNOZXN0ZWRQcm9wZXJ0eShDLlApKTsKLQkJLy8gY2hlY2sgYSdzIG5lc3RlZAotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShiID09IGEuZ2V0TmVzdGVkTW9kZWwoImIiKSk7Ci0JCW5lc3RlZE1vZGVsTmFtZXMgPSBhLmdldE5lc3RlZE1vZGVsTmFtZXMoKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygxLCBuZXN0ZWRNb2RlbE5hbWVzLnNpemUoKSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKG5lc3RlZE1vZGVsTmFtZXMuY29udGFpbnMoImIiKSk7Ci0JCWJhc2VQcm9wZXJ0aWVzID0gYS5nZXRCYXNlUHJvcGVydGllcygpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKDMsIGJhc2VQcm9wZXJ0aWVzLnNpemUoKSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGJhc2VQcm9wZXJ0aWVzLmNvbnRhaW5zKEEuUCkpOwotCQluZXN0ZWRQcm9wZXJ0aWVzID0gYS5nZXROZXN0ZWRQcm9wZXJ0aWVzKCk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoMywgbmVzdGVkUHJvcGVydGllcy5zaXplKCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShuZXN0ZWRQcm9wZXJ0aWVzLmNvbnRhaW5zKEIuUCkpOwotCQlhbGxQcm9wZXJ0aWVzID0gYS5nZXRBbGxQcm9wZXJ0aWVzKCk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoNCwgYWxsUHJvcGVydGllcy5zaXplKCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShhbGxQcm9wZXJ0aWVzLmNvbnRhaW5zKEEuUCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShhbGxQcm9wZXJ0aWVzLmNvbnRhaW5zKEIuUCkpOwotCQkvLyBjaGVjayBiJ3MgbmVzdGVkCi0JCW5lc3RlZE1vZGVsTmFtZXMgPSBiLmdldE5lc3RlZE1vZGVsTmFtZXMoKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygwLCBuZXN0ZWRNb2RlbE5hbWVzLnNpemUoKSk7Ci0JCWJhc2VQcm9wZXJ0aWVzID0gYi5nZXRCYXNlUHJvcGVydGllcygpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKDMsIGJhc2VQcm9wZXJ0aWVzLnNpemUoKSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGJhc2VQcm9wZXJ0aWVzLmNvbnRhaW5zKEIuUCkpOwotCQluZXN0ZWRQcm9wZXJ0aWVzID0gYi5nZXROZXN0ZWRQcm9wZXJ0aWVzKCk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbmVzdGVkUHJvcGVydGllcy5zaXplKCkpOwotCQlhbGxQcm9wZXJ0aWVzID0gYi5nZXRBbGxQcm9wZXJ0aWVzKCk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoMywgYWxsUHJvcGVydGllcy5zaXplKCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShhbGxQcm9wZXJ0aWVzLmNvbnRhaW5zKEIuUCkpOwotCi0JCWEucmVtb3ZlTmVzdGVkTW9kZWwoImIiKTsgLy8gNAotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoYS5pc0Jhc2VQcm9wZXJ0eShCLlApKTsKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGEuaXNQcm9wZXJ0eShCLlApKTsKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGEuaXNOZXN0ZWRQcm9wZXJ0eShCLlApKTsKLQkJLy8gY2hlY2sgYSdzIG5lc3RlZAotCQluZXN0ZWRNb2RlbE5hbWVzID0gYS5nZXROZXN0ZWRNb2RlbE5hbWVzKCk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbmVzdGVkTW9kZWxOYW1lcy5zaXplKCkpOwotCQliYXNlUHJvcGVydGllcyA9IGEuZ2V0QmFzZVByb3BlcnRpZXMoKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygzLCBiYXNlUHJvcGVydGllcy5zaXplKCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShiYXNlUHJvcGVydGllcy5jb250YWlucyhBLlApKTsKLQkJbmVzdGVkUHJvcGVydGllcyA9IGEuZ2V0TmVzdGVkUHJvcGVydGllcygpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG5lc3RlZFByb3BlcnRpZXMuc2l6ZSgpKTsKLQkJYWxsUHJvcGVydGllcyA9IGEuZ2V0QWxsUHJvcGVydGllcygpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKDMsIGFsbFByb3BlcnRpZXMuc2l6ZSgpKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYWxsUHJvcGVydGllcy5jb250YWlucyhBLlApKTsKLQl9Ci0KLQkvKioKLQkgKiA8Y29kZT4KLQkgKiAxICAgIDIgICAgIDMgICAgNCAKLQkgKiBBICB8IEEgICB8IEEgIHwgQQotCSAqICAgIHwgIEIgIHwgICAgfCAKLQkgKiBCICB8ICAgQyB8IEIgIHwgQgotCSAqICBDIHwgICAgIHwgIEMgfCAKLQkgKiAgICAgICAgICB8ICAgIHwgQwotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0SXNQcm9wZXJ0eVNpbXBsZU5lc3RpbmcyKCkgewotCQliLmFkZE5lc3RlZE1vZGVsKCJjIiwgYyk7IC8vIDEKLQkJQXNzZXJ0LmFzc2VydFRydWUoYi5pc1Byb3BlcnR5KEMuUCkpOwotCi0JCWEuYWRkTmVzdGVkTW9kZWwoImIiLCBiKTsgLy8gMgotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShhLmlzUHJvcGVydHkoQi5QKSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGEuaXNQcm9wZXJ0eShDLlApKTsKLQotCQlhLnJlbW92ZU5lc3RlZE1vZGVsKCJiIik7IC8vIDMKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGEuaXNQcm9wZXJ0eShCLlApKTsKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGEuaXNQcm9wZXJ0eShDLlApKTsKLQotCQliLnJlbW92ZU5lc3RlZE1vZGVsKCJjIik7IC8vIDQKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGIuaXNQcm9wZXJ0eShDLlApKTsKLQl9Ci0KLQkvKioKLQkgKiA8Y29kZT4KLQkgKiAxICAgIDIgICAgIDMgICAgICA0ICAgICA1Ci0JICogQSAgfCBBICAgfCBBICAgIHwgQSAgIHwgQQotCSAqICBCIHwgIEIgIHwgIEIgICB8ICBCICB8ICBCCi0JICogICAgICAgIEMgfCAgIEMgIHwgICBDIHwKLQkgKiAgICAgICAgICB8ICAgQzIgfAotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0SXNQcm9wZXJ0eUNvbXBsZXhOZXN0aW5nMSgpIHsKLQkJYS5hZGROZXN0ZWRNb2RlbCgiYiIsIGIpOyAvLyAxCi0JCWIuYWRkTmVzdGVkTW9kZWwoImMiLCBjKTsgLy8gMgotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShhLmlzUHJvcGVydHkoQy5QKSk7Ci0JCUlEYXRhTW9kZWwgYzIgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgQygpKTsKLQkJYi5hZGROZXN0ZWRNb2RlbCgiYzIiLCBjMik7IC8vIDMKLQkJYi5yZW1vdmVOZXN0ZWRNb2RlbCgiYzIiKTsgLy8gNAotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShiLmlzUHJvcGVydHkoQy5QKSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGEuaXNQcm9wZXJ0eShDLlApKTsKLQkJYi5yZW1vdmVOZXN0ZWRNb2RlbCgiYyIpOyAvLyA1Ci0JCUFzc2VydC5hc3NlcnRGYWxzZShiLmlzUHJvcGVydHkoQy5QKSk7Ci0JCUFzc2VydC5hc3NlcnRGYWxzZShhLmlzUHJvcGVydHkoQy5QKSk7Ci0JfQotCi0JLyoqCi0JICogPGNvZGU+Ci0JICogMSAgICAyICAgICAzICAgICA0ICAgICA1ICAgICAgNiAgICAgIDcKLQkgKiBBICB8IEEgICB8IEEgICB8IEEgICB8IEEgICAgfCBBICAgIHwgQQotCSAqICBCIHwgIEIgIHwgIEIgIHwgIEIgIHwgIEIgICB8ICBCICAgfCAgQgotCSAqICAgICAgICBDIHwgICBDIHwgICBDIHwgICBDICB8ICAgQzIgfAotCSAqICAgICAgICAgICAgIEMyIHwgICAgICAgICBDMiB8Ci0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RJc1Byb3BlcnR5Q29tcGxleE5lc3RpbmcyKCkgewotCQlhLmFkZE5lc3RlZE1vZGVsKCJiIiwgYik7IC8vIDEKLQkJYi5hZGROZXN0ZWRNb2RlbCgiYyIsIGMpOyAvLyAyCi0JCUFzc2VydC5hc3NlcnRUcnVlKGEuaXNQcm9wZXJ0eShDLlApKTsKLQkJSURhdGFNb2RlbCBjMiA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBDKCkpOwotCQlhLmFkZE5lc3RlZE1vZGVsKCJjMiIsIGMyKTsgLy8gMwotCQlhLnJlbW92ZU5lc3RlZE1vZGVsKCJjMiIpOyAvLyA0Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGEuaXNQcm9wZXJ0eShDLlApKTsKLQkJYi5hZGROZXN0ZWRNb2RlbCgiYzIiLCBjMik7IC8vIDUKLQkJQXNzZXJ0LmFzc2VydFRydWUoYS5pc1Byb3BlcnR5KEMuUCkpOwotCQliLnJlbW92ZU5lc3RlZE1vZGVsKCJjIik7IC8vIDYKLQkJQXNzZXJ0LmFzc2VydFRydWUoYS5pc1Byb3BlcnR5KEMuUCkpOwotCQliLnJlbW92ZU5lc3RlZE1vZGVsKCJjMiIpOyAvLyA3Ci0JCUFzc2VydC5hc3NlcnRGYWxzZShhLmlzUHJvcGVydHkoQy5QKSk7Ci0JfQotCi0JLyoqCi0JICogPGNvZGU+Ci0JICogMSAgICAgMiAgICAgICAgICAgICAzICAgICAgNCAgICAgICAgICAgICA1ICAgICA2Ci0JICogQSAgIHwgQSAgICAgICAgICAgfCBCICAgIHwgQSAgICAgICAgICB8ICBDICAgfCBBCi0JICogIEIgIHwgIEIgICAgICAgICAgfCAgQyAgIHwgIEIgICAgICAgICB8ICAgQSAgfCBCCi0JICogICBDIHwgICBDICAgICAgICAgfCAgIEEgIHwgICBDICAgICAgICB8ICAgIEIgfCBDCi0JICogICAgICAgICAgQSAobG9vcCkgfCAgICAgIHwgICAgQShsb29wKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0SXNQcm9wZXJ0eUNvbXBsZXhOZXN0aW5nMygpIHsKLQkJYS5hZGROZXN0ZWRNb2RlbCgiYiIsIGIpOwotCQliLmFkZE5lc3RlZE1vZGVsKCJjIiwgYyk7IC8vIDEKLQkJQXNzZXJ0LmFzc2VydFRydWUoYS5pc1Byb3BlcnR5KEIuUCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShhLmlzUHJvcGVydHkoQy5QKSk7Ci0JCUFzc2VydC5hc3NlcnRGYWxzZShiLmlzUHJvcGVydHkoQS5QKSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGIuaXNQcm9wZXJ0eShDLlApKTsKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGMuaXNQcm9wZXJ0eShBLlApKTsKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGMuaXNQcm9wZXJ0eShCLlApKTsKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGEuaXNQcm9wZXJ0eSgiZm9vIikpOwotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoYi5pc1Byb3BlcnR5KCJmb28iKSk7Ci0JCUFzc2VydC5hc3NlcnRGYWxzZShjLmlzUHJvcGVydHkoImZvbyIpKTsKLQkJYy5hZGROZXN0ZWRNb2RlbCgiYSIsIGEpOyAvLyAyCi0JCUFzc2VydC5hc3NlcnRUcnVlKGEuaXNQcm9wZXJ0eShCLlApKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYS5pc1Byb3BlcnR5KEMuUCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShiLmlzUHJvcGVydHkoQS5QKSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGIuaXNQcm9wZXJ0eShDLlApKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYy5pc1Byb3BlcnR5KEEuUCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShjLmlzUHJvcGVydHkoQi5QKSk7Ci0JCUFzc2VydC5hc3NlcnRGYWxzZShhLmlzUHJvcGVydHkoImZvbyIpKTsKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGIuaXNQcm9wZXJ0eSgiZm9vIikpOwotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoYy5pc1Byb3BlcnR5KCJmb28iKSk7Ci0JCWEucmVtb3ZlTmVzdGVkTW9kZWwoImIiKTsgLy8gMwotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoYS5pc1Byb3BlcnR5KEIuUCkpOwotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoYS5pc1Byb3BlcnR5KEMuUCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShiLmlzUHJvcGVydHkoQS5QKSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGIuaXNQcm9wZXJ0eShDLlApKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYy5pc1Byb3BlcnR5KEEuUCkpOwotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoYy5pc1Byb3BlcnR5KEIuUCkpOwotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoYS5pc1Byb3BlcnR5KCJmb28iKSk7Ci0JCUFzc2VydC5hc3NlcnRGYWxzZShiLmlzUHJvcGVydHkoImZvbyIpKTsKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGMuaXNQcm9wZXJ0eSgiZm9vIikpOwotCQlhLmFkZE5lc3RlZE1vZGVsKCJiIiwgYik7IC8vIDQKLQkJQXNzZXJ0LmFzc2VydFRydWUoYS5pc1Byb3BlcnR5KEIuUCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShhLmlzUHJvcGVydHkoQy5QKSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGIuaXNQcm9wZXJ0eShBLlApKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYi5pc1Byb3BlcnR5KEMuUCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShjLmlzUHJvcGVydHkoQS5QKSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGMuaXNQcm9wZXJ0eShCLlApKTsKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGEuaXNQcm9wZXJ0eSgiZm9vIikpOwotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoYi5pc1Byb3BlcnR5KCJmb28iKSk7Ci0JCUFzc2VydC5hc3NlcnRGYWxzZShjLmlzUHJvcGVydHkoImZvbyIpKTsKLQkJYi5yZW1vdmVOZXN0ZWRNb2RlbCgiYyIpOyAvLyA1Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGEuaXNQcm9wZXJ0eShCLlApKTsKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGEuaXNQcm9wZXJ0eShDLlApKTsKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGIuaXNQcm9wZXJ0eShBLlApKTsKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGIuaXNQcm9wZXJ0eShDLlApKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYy5pc1Byb3BlcnR5KEEuUCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShjLmlzUHJvcGVydHkoQi5QKSk7Ci0JCUFzc2VydC5hc3NlcnRGYWxzZShhLmlzUHJvcGVydHkoImZvbyIpKTsKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGIuaXNQcm9wZXJ0eSgiZm9vIikpOwotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoYy5pc1Byb3BlcnR5KCJmb28iKSk7Ci0JCWMucmVtb3ZlTmVzdGVkTW9kZWwoImEiKTsKLQkJYS5yZW1vdmVOZXN0ZWRNb2RlbCgiYiIpOwotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoYS5pc1Byb3BlcnR5KEIuUCkpOwotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoYS5pc1Byb3BlcnR5KEMuUCkpOwotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoYi5pc1Byb3BlcnR5KEEuUCkpOwotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoYi5pc1Byb3BlcnR5KEMuUCkpOwotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoYy5pc1Byb3BlcnR5KEEuUCkpOwotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoYy5pc1Byb3BlcnR5KEIuUCkpOwotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoYS5pc1Byb3BlcnR5KCJmb28iKSk7Ci0JCUFzc2VydC5hc3NlcnRGYWxzZShiLmlzUHJvcGVydHkoImZvbyIpKTsKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGMuaXNQcm9wZXJ0eSgiZm9vIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRHZXRQcm9wZXJ0eTEoKSB7Ci0JCS8vIGN5bGljYWwKLQkJYS5hZGROZXN0ZWRNb2RlbCgiYiIsIGIpOwotCQliLmFkZE5lc3RlZE1vZGVsKCJjIiwgYyk7Ci0JCWMuYWRkTmVzdGVkTW9kZWwoImEiLCBhKTsKLQotCQlhLnNldFByb3BlcnR5KEEuUCwgImEiKTsKLQkJYS5zZXRQcm9wZXJ0eShCLlAsICJiIik7Ci0JCWEuc2V0UHJvcGVydHkoQy5QLCAiYyIpOwotCQlhc3NlcnRFcXVhbHMoImEiLCBhLmdldFByb3BlcnR5KEEuUCkpOwotCQlhc3NlcnRFcXVhbHMoImEiLCBiLmdldFByb3BlcnR5KEEuUCkpOwotCQlhc3NlcnRFcXVhbHMoImEiLCBjLmdldFByb3BlcnR5KEEuUCkpOwotCQlhc3NlcnRFcXVhbHMoImIiLCBhLmdldFByb3BlcnR5KEIuUCkpOwotCQlhc3NlcnRFcXVhbHMoImIiLCBiLmdldFByb3BlcnR5KEIuUCkpOwotCQlhc3NlcnRFcXVhbHMoImIiLCBjLmdldFByb3BlcnR5KEIuUCkpOwotCQlhc3NlcnRFcXVhbHMoImMiLCBhLmdldFByb3BlcnR5KEMuUCkpOwotCQlhc3NlcnRFcXVhbHMoImMiLCBiLmdldFByb3BlcnR5KEMuUCkpOwotCQlhc3NlcnRFcXVhbHMoImMiLCBjLmdldFByb3BlcnR5KEMuUCkpOwotCi0JCWIuc2V0UHJvcGVydHkoQS5QLCAiYWEiKTsKLQkJYi5zZXRQcm9wZXJ0eShCLlAsICJiYiIpOwotCQliLnNldFByb3BlcnR5KEMuUCwgImNjIik7Ci0JCWFzc2VydEVxdWFscygiYWEiLCBhLmdldFByb3BlcnR5KEEuUCkpOwotCQlhc3NlcnRFcXVhbHMoImFhIiwgYi5nZXRQcm9wZXJ0eShBLlApKTsKLQkJYXNzZXJ0RXF1YWxzKCJhYSIsIGMuZ2V0UHJvcGVydHkoQS5QKSk7Ci0JCWFzc2VydEVxdWFscygiYmIiLCBhLmdldFByb3BlcnR5KEIuUCkpOwotCQlhc3NlcnRFcXVhbHMoImJiIiwgYi5nZXRQcm9wZXJ0eShCLlApKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYiIsIGMuZ2V0UHJvcGVydHkoQi5QKSk7Ci0JCWFzc2VydEVxdWFscygiY2MiLCBhLmdldFByb3BlcnR5KEMuUCkpOwotCQlhc3NlcnRFcXVhbHMoImNjIiwgYi5nZXRQcm9wZXJ0eShDLlApKTsKLQkJYXNzZXJ0RXF1YWxzKCJjYyIsIGMuZ2V0UHJvcGVydHkoQy5QKSk7Ci0KLQkJYy5zZXRQcm9wZXJ0eShBLlAsICJhYWEiKTsKLQkJYy5zZXRQcm9wZXJ0eShCLlAsICJiYmIiKTsKLQkJYy5zZXRQcm9wZXJ0eShDLlAsICJjY2MiKTsKLQkJYXNzZXJ0RXF1YWxzKCJhYWEiLCBhLmdldFByb3BlcnR5KEEuUCkpOwotCQlhc3NlcnRFcXVhbHMoImFhYSIsIGIuZ2V0UHJvcGVydHkoQS5QKSk7Ci0JCWFzc2VydEVxdWFscygiYWFhIiwgYy5nZXRQcm9wZXJ0eShBLlApKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYmIiLCBhLmdldFByb3BlcnR5KEIuUCkpOwotCQlhc3NlcnRFcXVhbHMoImJiYiIsIGIuZ2V0UHJvcGVydHkoQi5QKSk7Ci0JCWFzc2VydEVxdWFscygiYmJiIiwgYy5nZXRQcm9wZXJ0eShCLlApKTsKLQkJYXNzZXJ0RXF1YWxzKCJjY2MiLCBhLmdldFByb3BlcnR5KEMuUCkpOwotCQlhc3NlcnRFcXVhbHMoImNjYyIsIGIuZ2V0UHJvcGVydHkoQy5QKSk7Ci0JCWFzc2VydEVxdWFscygiY2NjIiwgYy5nZXRQcm9wZXJ0eShDLlApKTsKLQl9Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9TaW1wbGVEYXRhTW9kZWxUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvU2ltcGxlRGF0YU1vZGVsVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTgyMDdhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9TaW1wbGVEYXRhTW9kZWxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLldUUFJlc291cmNlSGFuZGxlcjsKLQotCi1wdWJsaWMgY2xhc3MgU2ltcGxlRGF0YU1vZGVsVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXByaXZhdGUgY2xhc3MgRE1Qcm92aWRlciBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXIgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlRfUFJPUCA9ICJJTlRfUFJPUCI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOVF9QUk9QMiA9ICJJTlRfUFJPUDIiOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlRfUFJPUDMgPSAiSU5UX1BST1AzIjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5UX1BST1A0ID0gIklOVF9QUk9QNCI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJPT0xFQU5fUFJPUCA9ICJCT09MRUFOX1BST1AiOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCT09MRUFOX1BST1AyID0gIkJPT0xFQU5fUFJPUDIiOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJJTkdfUFJPUCA9ICJTVFJJTkdfUFJPUCI7Ci0KLQkJcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCkgewotCQkJU2V0IHByb3BlcnR5TmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7Ci0JCQlwcm9wZXJ0eU5hbWVzLmFkZChJTlRfUFJPUCk7Ci0JCQlwcm9wZXJ0eU5hbWVzLmFkZChJTlRfUFJPUDIpOwotCQkJcHJvcGVydHlOYW1lcy5hZGQoSU5UX1BST1AzKTsKLQkJCXByb3BlcnR5TmFtZXMuYWRkKElOVF9QUk9QNCk7Ci0JCQlwcm9wZXJ0eU5hbWVzLmFkZChCT09MRUFOX1BST1ApOwotCQkJcHJvcGVydHlOYW1lcy5hZGQoQk9PTEVBTl9QUk9QMik7Ci0JCQlwcm9wZXJ0eU5hbWVzLmFkZChTVFJJTkdfUFJPUCk7Ci0JCQlyZXR1cm4gcHJvcGVydHlOYW1lczsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKElOVF9QUk9QKSkgewotCQkJCXJldHVybiBuZXcgSW50ZWdlcigxMCk7Ci0JCQl9IGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSU5UX1BST1AyKSkgewotCQkJCXJldHVybiBnZXRQcm9wZXJ0eShJTlRfUFJPUCk7Ci0JCQl9IGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQk9PTEVBTl9QUk9QKSkgewotCQkJCXJldHVybiBCb29sZWFuLlRSVUU7Ci0JCQl9IGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoU1RSSU5HX1BST1ApKSB7Ci0JCQkJcmV0dXJuICJmb28iICsgZ2V0UHJvcGVydHkoSU5UX1BST1ApICsgZ2V0UHJvcGVydHkoQk9PTEVBTl9QUk9QKTsKLQkJCX0KLQkJCXJldHVybiBzdXBlci5nZXREZWZhdWx0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlFbmFibGVkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEJPT0xFQU5fUFJPUDIpKSB7Ci0JCQkJcmV0dXJuIGdldEJvb2xlYW5Qcm9wZXJ0eShCT09MRUFOX1BST1ApOwotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBwcm9wZXJ0eVNldChTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgcHJvcGVydHlWYWx1ZSkgewotCQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSU5UX1BST1ApKSB7Ci0JCQkJbW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoSU5UX1BST1AyLCBJRGF0YU1vZGVsLlZBTFVFX0NIRyk7Ci0JCQkJbW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoSU5UX1BST1AyLCBJRGF0YU1vZGVsLlZBTElEX1ZBTFVFU19DSEcpOwotCQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKFNUUklOR19QUk9QLCBJRGF0YU1vZGVsLkRFRkFVTFRfQ0hHKTsKLQkJCX0KLQkJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEJPT0xFQU5fUFJPUCkpIHsKLQkJCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShCT09MRUFOX1BST1AyLCBJRGF0YU1vZGVsLkVOQUJMRV9DSEcpOwotCQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKFNUUklOR19QUk9QLCBJRGF0YU1vZGVsLkRFRkFVTFRfQ0hHKTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcHVibGljIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltdIGdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCQlpZiAoSU5UX1BST1AyLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQkJaW50IHJhbmdlID0gZ2V0SW50UHJvcGVydHkoSU5UX1BST1ApOwotCQkJCUludGVnZXJbXSBpbnRzID0gbmV3IEludGVnZXJbcmFuZ2VdOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW50cy5sZW5ndGg7IGkrKykgewotCQkJCQlpbnRzW2ldID0gbmV3IEludGVnZXIoaSArIDEpOwotCQkJCX0KLQkJCQlyZXR1cm4gRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yLmNyZWF0ZURlc2NyaXB0b3JzKGludHMpOwotCQkJfQotCQkJaWYgKElOVF9QUk9QMy5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJCWludCByYW5nZSA9IDM7Ci0JCQkJSW50ZWdlcltdIGludHMgPSBuZXcgSW50ZWdlcltyYW5nZV07Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWludHNbaV0gPSBuZXcgSW50ZWdlcihpICsgMSk7Ci0JCQkJfQotCQkJCVN0cmluZ1tdIGRlc2NyaXB0aW9ucyA9IG5ldyBTdHJpbmdbXXsib25lIiwgInR3byIsICJ0aHJlZSJ9OwotCQkJCXJldHVybiBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IuY3JlYXRlRGVzY3JpcHRvcnMoaW50cywgZGVzY3JpcHRpb25zKTsKLQkJCX0KLQkJCWlmIChJTlRfUFJPUDQuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCQlEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IG5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbM107Ci0JCQkJU3RyaW5nW10gZGVzY3JpcHRpb25zID0gbmV3IFN0cmluZ1tdeyJvbmUiLCAidHdvIiwgInRocmVlIn07Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJCQlkZXNjcmlwdG9yc1tpXSA9IG5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IobmV3IEludGVnZXIoaSArIDEpLCBkZXNjcmlwdGlvbnNbaV0pOwotCQkJCX0KLQkJCQlyZXR1cm4gZGVzY3JpcHRvcnM7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IgZ2V0UHJvcGVydHlEZXNjcmlwdG9yKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJCU9iamVjdCBwcm9wZXJ0eSA9IGdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JCQlpZiAoSU5UX1BST1AyLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQkJcmV0dXJuIG5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IocHJvcGVydHkpOwotCQkJfSBlbHNlIGlmIChJTlRfUFJPUDMuZXF1YWxzKHByb3BlcnR5TmFtZSkgfHwgSU5UX1BST1A0LmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQkJU3RyaW5nW10gZGVzY3JpcHRpb25zID0gbmV3IFN0cmluZ1tdeyJvbmUiLCAidHdvIiwgInRocmVlIn07Ci0JCQkJaW50IHZhbHVlID0gKChJbnRlZ2VyKSBwcm9wZXJ0eSkuaW50VmFsdWUoKTsKLQkJCQlyZXR1cm4gbmV3IERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcihwcm9wZXJ0eSwgZGVzY3JpcHRpb25zW3ZhbHVlIC0gMV0pOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0SUQoKSB7Ci0JCQlyZXR1cm4gaWQ7Ci0JCX0KLQotCQlwdWJsaWMgTGlzdCBnZXRFeHRlbmRlZENvbnRleHQoKSB7Ci0JCQlyZXR1cm4gZXh0ZW5kZWRDb250ZXh0OwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBpZDsKLQlwcml2YXRlIExpc3QgZXh0ZW5kZWRDb250ZXh0OwotCi0JcHJpdmF0ZSBJRGF0YU1vZGVsIGRtOwotCXByaXZhdGUgVGVzdExpc3RlbmVyIGRtTDsKLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCWRtID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IERNUHJvdmlkZXIoKSk7Ci0JCWRtTCA9IG5ldyBUZXN0TGlzdGVuZXIoKTsKLQkJZG0uYWRkTGlzdGVuZXIoZG1MKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFzaWNzKCkgewotCQlpZCA9IG51bGw7Ci0JCWFzc2VydEVxdWFscygiIiwgZG0uZ2V0SUQoKSk7Ci0JCWlkID0gImZvbyI7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgZG0uZ2V0SUQoKSk7Ci0JCWV4dGVuZGVkQ29udGV4dCA9IG51bGw7Ci0JCWFzc2VydE5vdE51bGwoZG0uZ2V0RXh0ZW5kZWRDb250ZXh0KCkpOwotCQlleHRlbmRlZENvbnRleHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWFzc2VydFRydWUoZG0uZ2V0RXh0ZW5kZWRDb250ZXh0KCkgPT0gZXh0ZW5kZWRDb250ZXh0KTsKLQkJZXh0ZW5kZWRDb250ZXh0LmFkZCgiZm9vIik7Ci0JCWFzc2VydFRydWUoZG0uZ2V0RXh0ZW5kZWRDb250ZXh0KCkgPT0gZXh0ZW5kZWRDb250ZXh0KTsKLQkJYXNzZXJ0Tm90TnVsbChkbS5nZXREZWZhdWx0T3BlcmF0aW9uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkUHJvcGVydHkoKSB7Ci0JCVN0cmluZyBQUk9QRVJUWV9OT1RfTE9DQVRFRF8gPSBXVFBSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCIyMCIpOyAvLyROT04tTkxTLTEkCi0JCUV4Y2VwdGlvbiBleCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlkbS5nZXRQcm9wZXJ0eSgiZm9vIik7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJZXggPSBlOwotCQl9Ci0JCUFzc2VydC5hc3NlcnROb3ROdWxsKGV4KTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoZXguZ2V0TWVzc2FnZSgpLnN0YXJ0c1dpdGgoUFJPUEVSVFlfTk9UX0xPQ0FURURfKSk7Ci0JCWV4ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWRtLmdldEludFByb3BlcnR5KCJmb28iKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlleCA9IGU7Ci0JCX0KLQkJQXNzZXJ0LmFzc2VydE5vdE51bGwoZXgpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShleC5nZXRNZXNzYWdlKCkuc3RhcnRzV2l0aChQUk9QRVJUWV9OT1RfTE9DQVRFRF8pKTsKLQkJZXggPSBudWxsOwotCQlleCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlkbS5nZXRCb29sZWFuUHJvcGVydHkoImZvbyIpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCWV4ID0gZTsKLQkJfQotCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbChleCk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGV4LmdldE1lc3NhZ2UoKS5zdGFydHNXaXRoKFBST1BFUlRZX05PVF9MT0NBVEVEXykpOwotCQlleCA9IG51bGw7Ci0JCWV4ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWRtLmdldFN0cmluZ1Byb3BlcnR5KCJmb28iKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlleCA9IGU7Ci0JCX0KLQkJQXNzZXJ0LmFzc2VydE5vdE51bGwoZXgpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShleC5nZXRNZXNzYWdlKCkuc3RhcnRzV2l0aChQUk9QRVJUWV9OT1RfTE9DQVRFRF8pKTsKLQkJZXggPSBudWxsOwotCQl0cnkgewotCQkJZG0uZ2V0U3RyaW5nUHJvcGVydHkobnVsbCk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJZXggPSBlOwotCQl9Ci0JCUFzc2VydC5hc3NlcnROb3ROdWxsKGV4KTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoZXguZ2V0TWVzc2FnZSgpLnN0YXJ0c1dpdGgoUFJPUEVSVFlfTk9UX0xPQ0FURURfKSk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlEZXNjcmlwdG9ycygpIHsKLQkJRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMgPSBkbS5nZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoRE1Qcm92aWRlci5JTlRfUFJPUDIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpbnQgdmFsdWUgPSBpICsgMTsKLQkJCWFzc2VydEVxdWFscyh2YWx1ZSwgKChJbnRlZ2VyKSBkZXNjcmlwdG9yc1tpXS5nZXRQcm9wZXJ0eVZhbHVlKCkpLmludFZhbHVlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKCIiICsgdmFsdWUsIGRlc2NyaXB0b3JzW2ldLmdldFByb3BlcnR5RGVzY3JpcHRpb24oKSk7Ci0JCX0KLQkJZGVzY3JpcHRvcnMgPSBkbS5nZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoRE1Qcm92aWRlci5JTlRfUFJPUDMpOwotCQlTdHJpbmdbXSBkZXNjcmlwdGlvbnMgPSBuZXcgU3RyaW5nW117Im9uZSIsICJ0d28iLCAidGhyZWUifTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJaW50IHZhbHVlID0gaSArIDE7Ci0JCQlhc3NlcnRFcXVhbHModmFsdWUsICgoSW50ZWdlcikgZGVzY3JpcHRvcnNbaV0uZ2V0UHJvcGVydHlWYWx1ZSgpKS5pbnRWYWx1ZSgpKTsKLQkJCWFzc2VydEVxdWFscyhkZXNjcmlwdGlvbnNbaV0sIGRlc2NyaXB0b3JzW2ldLmdldFByb3BlcnR5RGVzY3JpcHRpb24oKSk7Ci0JCX0KLQkJZGVzY3JpcHRvcnMgPSBkbS5nZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoRE1Qcm92aWRlci5JTlRfUFJPUDQpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpbnQgdmFsdWUgPSBpICsgMTsKLQkJCWFzc2VydEVxdWFscyh2YWx1ZSwgKChJbnRlZ2VyKSBkZXNjcmlwdG9yc1tpXS5nZXRQcm9wZXJ0eVZhbHVlKCkpLmludFZhbHVlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKGRlc2NyaXB0aW9uc1tpXSwgZGVzY3JpcHRvcnNbaV0uZ2V0UHJvcGVydHlEZXNjcmlwdGlvbigpKTsKLQkJfQotCQlmb3IgKGludCBpID0gMTsgaSA8IDQ7IGkrKykgewotCQkJZG0uc2V0SW50UHJvcGVydHkoRE1Qcm92aWRlci5JTlRfUFJPUDIsIGkpOwotCQkJRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBkbS5nZXRQcm9wZXJ0eURlc2NyaXB0b3IoRE1Qcm92aWRlci5JTlRfUFJPUDIpOwotCQkJYXNzZXJ0RXF1YWxzKGRlc2NyaXB0b3IuZ2V0UHJvcGVydHlWYWx1ZSgpLCBkbS5nZXRQcm9wZXJ0eShETVByb3ZpZGVyLklOVF9QUk9QMikpOwotCQkJYXNzZXJ0RXF1YWxzKCgoSW50ZWdlcikgZGVzY3JpcHRvci5nZXRQcm9wZXJ0eVZhbHVlKCkpLmludFZhbHVlKCksIGRtLmdldEludFByb3BlcnR5KERNUHJvdmlkZXIuSU5UX1BST1AyKSk7Ci0JCQlhc3NlcnRUcnVlKGRlc2NyaXB0b3IuZ2V0UHJvcGVydHlEZXNjcmlwdGlvbigpLmVxdWFscyhJbnRlZ2VyLnRvU3RyaW5nKGkpKSk7Ci0KLQkJCWRtLnNldEludFByb3BlcnR5KERNUHJvdmlkZXIuSU5UX1BST1AzLCBpKTsKLQkJCWRlc2NyaXB0b3IgPSBkbS5nZXRQcm9wZXJ0eURlc2NyaXB0b3IoRE1Qcm92aWRlci5JTlRfUFJPUDMpOwotCQkJYXNzZXJ0RXF1YWxzKGRlc2NyaXB0b3IuZ2V0UHJvcGVydHlWYWx1ZSgpLCBkbS5nZXRQcm9wZXJ0eShETVByb3ZpZGVyLklOVF9QUk9QMykpOwotCQkJYXNzZXJ0RXF1YWxzKCgoSW50ZWdlcikgZGVzY3JpcHRvci5nZXRQcm9wZXJ0eVZhbHVlKCkpLmludFZhbHVlKCksIGRtLmdldEludFByb3BlcnR5KERNUHJvdmlkZXIuSU5UX1BST1AzKSk7Ci0JCQlhc3NlcnRUcnVlKGRlc2NyaXB0b3IuZ2V0UHJvcGVydHlEZXNjcmlwdGlvbigpLmVxdWFscyhkZXNjcmlwdGlvbnNbaSAtIDFdKSk7Ci0KLQkJCWRtLnNldEludFByb3BlcnR5KERNUHJvdmlkZXIuSU5UX1BST1A0LCBpKTsKLQkJCWRlc2NyaXB0b3IgPSBkbS5nZXRQcm9wZXJ0eURlc2NyaXB0b3IoRE1Qcm92aWRlci5JTlRfUFJPUDQpOwotCQkJYXNzZXJ0RXF1YWxzKGRlc2NyaXB0b3IuZ2V0UHJvcGVydHlWYWx1ZSgpLCBkbS5nZXRQcm9wZXJ0eShETVByb3ZpZGVyLklOVF9QUk9QNCkpOwotCQkJYXNzZXJ0RXF1YWxzKCgoSW50ZWdlcikgZGVzY3JpcHRvci5nZXRQcm9wZXJ0eVZhbHVlKCkpLmludFZhbHVlKCksIGRtLmdldEludFByb3BlcnR5KERNUHJvdmlkZXIuSU5UX1BST1A0KSk7Ci0JCQlhc3NlcnRUcnVlKGRlc2NyaXB0b3IuZ2V0UHJvcGVydHlEZXNjcmlwdGlvbigpLmVxdWFscyhkZXNjcmlwdGlvbnNbaSAtIDFdKSk7Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0cygpIHsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRtLmdldEJvb2xlYW5Qcm9wZXJ0eShETVByb3ZpZGVyLkJPT0xFQU5fUFJPUCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgKChCb29sZWFuKSBkbS5nZXRQcm9wZXJ0eShETVByb3ZpZGVyLkJPT0xFQU5fUFJPUCkpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwLCBkbS5nZXRJbnRQcm9wZXJ0eShETVByb3ZpZGVyLklOVF9QUk9QKSk7Ci0JCWFzc2VydEVxdWFscygxMCwgKChJbnRlZ2VyKSBkbS5nZXRQcm9wZXJ0eShETVByb3ZpZGVyLklOVF9QUk9QKSkuaW50VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vMTB0cnVlIiwgKFN0cmluZykgZG0uZ2V0UHJvcGVydHkoRE1Qcm92aWRlci5TVFJJTkdfUFJPUCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbzEwdHJ1ZSIsIGRtLmdldFN0cmluZ1Byb3BlcnR5KERNUHJvdmlkZXIuU1RSSU5HX1BST1ApKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlDaGFuZ2VkT25MaXN0ZW5lcigpIHsKLQkJZG1MLmNsZWFyRXZlbnRzKCk7Ci0JCURhdGFNb2RlbEV2ZW50IGV2ZW50ID0gbmV3IERhdGFNb2RlbEV2ZW50KGRtLCBBLlAsIERhdGFNb2RlbEV2ZW50LlZBTFVFX0NIRyk7Ci0JCWRtTC5wcm9wZXJ0eUNoYW5nZWQoZXZlbnQpOwotCQlMaXN0IGV2ZW50cyA9IGRtTC5nZXRFdmVudHMoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGV2ZW50cy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGV2ZW50cy5jb250YWlucyhldmVudCkpOwotCi0JCWRtTC5jbGVhckV2ZW50cygpOwotCQlJRGF0YU1vZGVsTGlzdGVuZXIgaWRtbCA9IGRtTDsKLQkJaWRtbC5wcm9wZXJ0eUNoYW5nZWQoZXZlbnQpOwotCQlldmVudHMgPSBkbUwuZ2V0RXZlbnRzKCk7Ci0JCWFzc2VydEVxdWFscygxLCBldmVudHMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShldmVudHMuY29udGFpbnMoZXZlbnQpKTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVMaXN0ZW5lcigpIHsKLQkJZG1MLmNsZWFyRXZlbnRzKCk7Ci0JCWRtLm5vdGlmeVByb3BlcnR5Q2hhbmdlKERNUHJvdmlkZXIuSU5UX1BST1AyLCBJRGF0YU1vZGVsLkRFRkFVTFRfQ0hHKTsKLQkJTGlzdCBldmVudHMgPSBkbUwuZ2V0RXZlbnRzKCk7Ci0JCWFzc2VydEVxdWFscygxLCBldmVudHMuc2l6ZSgpKTsKLQotCQlkbUwuY2xlYXJFdmVudHMoKTsKLQkJZG0ucmVtb3ZlTGlzdGVuZXIoZG1MKTsKLQkJZG0ubm90aWZ5UHJvcGVydHlDaGFuZ2UoRE1Qcm92aWRlci5JTlRfUFJPUDIsIElEYXRhTW9kZWwuREVGQVVMVF9DSEcpOwotCQlldmVudHMgPSBkbUwuZ2V0RXZlbnRzKCk7Ci0JCWFzc2VydEVxdWFscygwLCBldmVudHMuc2l6ZSgpKTsKLQotCQlkbUwuY2xlYXJFdmVudHMoKTsKLQkJZG0uYWRkTGlzdGVuZXIoZG1MKTsKLQkJZG0uYWRkTGlzdGVuZXIoZG1MKTsKLQkJZG0uYWRkTGlzdGVuZXIoZG1MKTsKLQkJZG0uYWRkTGlzdGVuZXIoZG1MKTsKLQkJZG0uYWRkTGlzdGVuZXIoZG1MKTsKLQkJZG0ubm90aWZ5UHJvcGVydHlDaGFuZ2UoRE1Qcm92aWRlci5JTlRfUFJPUDIsIElEYXRhTW9kZWwuREVGQVVMVF9DSEcpOwotCQlldmVudHMgPSBkbUwuZ2V0RXZlbnRzKCk7Ci0JCWFzc2VydEVxdWFscygxLCBldmVudHMuc2l6ZSgpKTsKLQotCQlkbUwuY2xlYXJFdmVudHMoKTsKLQkJZG0ucmVtb3ZlTGlzdGVuZXIoZG1MKTsKLQkJZG0ubm90aWZ5UHJvcGVydHlDaGFuZ2UoRE1Qcm92aWRlci5JTlRfUFJPUDIsIElEYXRhTW9kZWwuREVGQVVMVF9DSEcpOwotCQlldmVudHMgPSBkbUwuZ2V0RXZlbnRzKCk7Ci0JCWFzc2VydEVxdWFscygwLCBldmVudHMuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyaW5nRXZlbnRzKCkgewotCQlkbUwuY2xlYXJFdmVudHMoKTsKLQkJZG0ubm90aWZ5UHJvcGVydHlDaGFuZ2UoRE1Qcm92aWRlci5JTlRfUFJPUDIsIElEYXRhTW9kZWwuREVGQVVMVF9DSEcpOwotCQlMaXN0IGV2ZW50cyA9IGRtTC5nZXRFdmVudHMoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGV2ZW50cy5zaXplKCkpOwotCQlEYXRhTW9kZWxFdmVudCBldmVudCA9IChEYXRhTW9kZWxFdmVudCkgZXZlbnRzLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKERNUHJvdmlkZXIuSU5UX1BST1AyLCBldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhEYXRhTW9kZWxFdmVudC5WQUxVRV9DSEcsIGV2ZW50LmdldEZsYWcoKSk7Ci0KLQkJZG1MLmNsZWFyRXZlbnRzKCk7Ci0JCWRtLm5vdGlmeVByb3BlcnR5Q2hhbmdlKERNUHJvdmlkZXIuSU5UX1BST1AyLCBJRGF0YU1vZGVsLlZBTElEX1ZBTFVFU19DSEcpOwotCQlldmVudHMgPSBkbUwuZ2V0RXZlbnRzKCk7Ci0JCWFzc2VydEVxdWFscygxLCBldmVudHMuc2l6ZSgpKTsKLQkJZXZlbnQgPSAoRGF0YU1vZGVsRXZlbnQpIGV2ZW50cy5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscyhETVByb3ZpZGVyLklOVF9QUk9QMiwgZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRGF0YU1vZGVsRXZlbnQuVkFMSURfVkFMVUVTX0NIRywgZXZlbnQuZ2V0RmxhZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlU2V0RXZlbnRzKCkgewotCQlkbUwuY2xlYXJFdmVudHMoKTsKLQkJZG0uc2V0SW50UHJvcGVydHkoRE1Qcm92aWRlci5JTlRfUFJPUDIsIDEwMCk7Ci0JCUxpc3QgZXZlbnRzID0gZG1MLmdldEV2ZW50cygpOwotCQlhc3NlcnRFcXVhbHMoMSwgZXZlbnRzLnNpemUoKSk7Ci0JCURhdGFNb2RlbEV2ZW50IGV2ZW50ID0gKERhdGFNb2RlbEV2ZW50KSBldmVudHMuZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMoRE1Qcm92aWRlci5JTlRfUFJPUDIsIGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKERhdGFNb2RlbEV2ZW50LlZBTFVFX0NIRywgZXZlbnQuZ2V0RmxhZygpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgZG0uZ2V0SW50UHJvcGVydHkoRE1Qcm92aWRlci5JTlRfUFJPUDIpKTsKLQotCQlkbUwuY2xlYXJFdmVudHMoKTsKLQkJZG0uc2V0SW50UHJvcGVydHkoRE1Qcm92aWRlci5JTlRfUFJPUDIsIDEwMCk7Ci0JCWV2ZW50cyA9IGRtTC5nZXRFdmVudHMoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGV2ZW50cy5zaXplKCkpOwotCi0JCWRtTC5jbGVhckV2ZW50cygpOwotCQlkbS5zZXRJbnRQcm9wZXJ0eShETVByb3ZpZGVyLklOVF9QUk9QMiwgMTAxKTsKLQkJZXZlbnRzID0gZG1MLmdldEV2ZW50cygpOwotCQlhc3NlcnRFcXVhbHMoMSwgZXZlbnRzLnNpemUoKSk7Ci0JCWV2ZW50ID0gKERhdGFNb2RlbEV2ZW50KSBldmVudHMuZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMoRE1Qcm92aWRlci5JTlRfUFJPUDIsIGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29tcGxleEV2ZW50cygpIHsKLQkJZG1MLmNsZWFyRXZlbnRzKCk7Ci0JCWRtLnNldEludFByb3BlcnR5KERNUHJvdmlkZXIuSU5UX1BST1AsIDExKTsKLQkJTGlzdCBldmVudHMgPSBkbUwuZ2V0RXZlbnRzKCk7Ci0JCWFzc2VydEVxdWFscyg0LCBldmVudHMuc2l6ZSgpKTsKLQotCQlEYXRhTW9kZWxFdmVudCBldmVudCA9IChEYXRhTW9kZWxFdmVudCkgZXZlbnRzLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKERNUHJvdmlkZXIuSU5UX1BST1AyLCBldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhEYXRhTW9kZWxFdmVudC5WQUxVRV9DSEcsIGV2ZW50LmdldEZsYWcoKSk7Ci0JCWFzc2VydEVxdWFscygxMSwgKChJbnRlZ2VyKSBkbS5nZXRQcm9wZXJ0eShETVByb3ZpZGVyLklOVF9QUk9QMikpLmludFZhbHVlKCkpOwotCi0JCWV2ZW50ID0gKERhdGFNb2RlbEV2ZW50KSBldmVudHMuZ2V0KDEpOwotCQlhc3NlcnRFcXVhbHMoRE1Qcm92aWRlci5JTlRfUFJPUDIsIGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKERhdGFNb2RlbEV2ZW50LlZBTElEX1ZBTFVFU19DSEcsIGV2ZW50LmdldEZsYWcoKSk7Ci0JCURhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gZXZlbnQuZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKCk7Ci0JCURhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzMiA9IGRtLmdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhETVByb3ZpZGVyLklOVF9QUk9QMik7Ci0JCWFzc2VydEVxdWFscygxMSwgZGVzY3JpcHRvcnMubGVuZ3RoKTsKLQkJYXNzZXJ0RXF1YWxzKDExLCBkZXNjcmlwdG9yczIubGVuZ3RoKTsKLQotCQlldmVudCA9IChEYXRhTW9kZWxFdmVudCkgZXZlbnRzLmdldCgyKTsKLQkJYXNzZXJ0RXF1YWxzKERNUHJvdmlkZXIuU1RSSU5HX1BST1AsIGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKERhdGFNb2RlbEV2ZW50LlZBTFVFX0NIRywgZXZlbnQuZ2V0RmxhZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28xMXRydWUiLCBldmVudC5nZXRQcm9wZXJ0eSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28xMXRydWUiLCBkbS5nZXREZWZhdWx0UHJvcGVydHkoRE1Qcm92aWRlci5TVFJJTkdfUFJPUCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbzExdHJ1ZSIsIGRtLmdldFByb3BlcnR5KERNUHJvdmlkZXIuU1RSSU5HX1BST1ApKTsKLQotCQlldmVudCA9IChEYXRhTW9kZWxFdmVudCkgZXZlbnRzLmdldCgzKTsKLQkJYXNzZXJ0RXF1YWxzKERNUHJvdmlkZXIuSU5UX1BST1AsIGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKERhdGFNb2RlbEV2ZW50LlZBTFVFX0NIRywgZXZlbnQuZ2V0RmxhZygpKTsKLQkJYXNzZXJ0RXF1YWxzKDExLCAoKEludGVnZXIpIGRtLmdldFByb3BlcnR5KERNUHJvdmlkZXIuSU5UX1BST1ApKS5pbnRWYWx1ZSgpKTsKLQotCQlkbUwuY2xlYXJFdmVudHMoKTsKLQkJZG0uc2V0Qm9vbGVhblByb3BlcnR5KERNUHJvdmlkZXIuQk9PTEVBTl9QUk9QLCBmYWxzZSk7Ci0JCWV2ZW50cyA9IGRtTC5nZXRFdmVudHMoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGV2ZW50cy5zaXplKCkpOwotCQlldmVudCA9IChEYXRhTW9kZWxFdmVudCkgZXZlbnRzLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKERNUHJvdmlkZXIuQk9PTEVBTl9QUk9QMiwgZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRGF0YU1vZGVsRXZlbnQuRU5BQkxFX0NIRywgZXZlbnQuZ2V0RmxhZygpKTsKLQkJYXNzZXJ0RmFsc2UoZG0uaXNQcm9wZXJ0eUVuYWJsZWQoRE1Qcm92aWRlci5CT09MRUFOX1BST1AyKSk7Ci0JCWFzc2VydEZhbHNlKGV2ZW50LmlzUHJvcGVydHlFbmFibGVkKCkpOwotCi0JCWV2ZW50ID0gKERhdGFNb2RlbEV2ZW50KSBldmVudHMuZ2V0KDEpOwotCQlhc3NlcnRFcXVhbHMoRE1Qcm92aWRlci5TVFJJTkdfUFJPUCwgZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRGF0YU1vZGVsRXZlbnQuVkFMVUVfQ0hHLCBldmVudC5nZXRGbGFnKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbzExZmFsc2UiLCBldmVudC5nZXRQcm9wZXJ0eSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28xMWZhbHNlIiwgZG0uZ2V0RGVmYXVsdFByb3BlcnR5KERNUHJvdmlkZXIuU1RSSU5HX1BST1ApKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28xMWZhbHNlIiwgZG0uZ2V0UHJvcGVydHkoRE1Qcm92aWRlci5TVFJJTkdfUFJPUCkpOwotCi0JCWV2ZW50ID0gKERhdGFNb2RlbEV2ZW50KSBldmVudHMuZ2V0KDIpOwotCQlhc3NlcnRFcXVhbHMoRE1Qcm92aWRlci5CT09MRUFOX1BST1AsIGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKERhdGFNb2RlbEV2ZW50LlZBTFVFX0NIRywgZXZlbnQuZ2V0RmxhZygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkbS5nZXRCb29sZWFuUHJvcGVydHkoRE1Qcm92aWRlci5CT09MRUFOX1BST1ApKTsKLQotCQlkbS5zZXRTdHJpbmdQcm9wZXJ0eShETVByb3ZpZGVyLlNUUklOR19QUk9QLCAiYmFyIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgZG0uZ2V0U3RyaW5nUHJvcGVydHkoRE1Qcm92aWRlci5TVFJJTkdfUFJPUCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbzExZmFsc2UiLCBkbS5nZXREZWZhdWx0UHJvcGVydHkoRE1Qcm92aWRlci5TVFJJTkdfUFJPUCkpOwotCQlkbUwuY2xlYXJFdmVudHMoKTsKLQkJZG0uc2V0Qm9vbGVhblByb3BlcnR5KERNUHJvdmlkZXIuQk9PTEVBTl9QUk9QLCB0cnVlKTsKLQkJZXZlbnRzID0gZG1MLmdldEV2ZW50cygpOwotCQlhc3NlcnRFcXVhbHMoMiwgZXZlbnRzLnNpemUoKSk7Ci0JCWV2ZW50ID0gKERhdGFNb2RlbEV2ZW50KSBldmVudHMuZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMoRE1Qcm92aWRlci5CT09MRUFOX1BST1AyLCBldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCWV2ZW50ID0gKERhdGFNb2RlbEV2ZW50KSBldmVudHMuZ2V0KDEpOwotCQlhc3NlcnRFcXVhbHMoRE1Qcm92aWRlci5CT09MRUFOX1BST1AsIGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoImJhciIsIGRtLmdldFN0cmluZ1Byb3BlcnR5KERNUHJvdmlkZXIuU1RSSU5HX1BST1ApKTsKLQkJZG0uc2V0U3RyaW5nUHJvcGVydHkoRE1Qcm92aWRlci5TVFJJTkdfUFJPUCwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscygiZm9vMTF0cnVlIiwgZG0uZ2V0U3RyaW5nUHJvcGVydHkoRE1Qcm92aWRlci5TVFJJTkdfUFJPUCkpOwotCQlkbUwuY2xlYXJFdmVudHMoKTsKLQkJZG0uc2V0Qm9vbGVhblByb3BlcnR5KERNUHJvdmlkZXIuQk9PTEVBTl9QUk9QLCBmYWxzZSk7Ci0JCWV2ZW50cyA9IGRtTC5nZXRFdmVudHMoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGV2ZW50cy5zaXplKCkpOwotCQlldmVudCA9IChEYXRhTW9kZWxFdmVudCkgZXZlbnRzLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKERNUHJvdmlkZXIuQk9PTEVBTl9QUk9QMiwgZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRGF0YU1vZGVsRXZlbnQuRU5BQkxFX0NIRywgZXZlbnQuZ2V0RmxhZygpKTsKLQkJYXNzZXJ0RmFsc2UoZG0uaXNQcm9wZXJ0eUVuYWJsZWQoRE1Qcm92aWRlci5CT09MRUFOX1BST1AyKSk7Ci0JCWFzc2VydEZhbHNlKGV2ZW50LmlzUHJvcGVydHlFbmFibGVkKCkpOwotCi0JCWV2ZW50ID0gKERhdGFNb2RlbEV2ZW50KSBldmVudHMuZ2V0KDEpOwotCQlhc3NlcnRFcXVhbHMoRE1Qcm92aWRlci5TVFJJTkdfUFJPUCwgZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRGF0YU1vZGVsRXZlbnQuVkFMVUVfQ0hHLCBldmVudC5nZXRGbGFnKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbzExZmFsc2UiLCBldmVudC5nZXRQcm9wZXJ0eSgpKTsKLQotCQlldmVudCA9IChEYXRhTW9kZWxFdmVudCkgZXZlbnRzLmdldCgyKTsKLQkJYXNzZXJ0RXF1YWxzKERNUHJvdmlkZXIuQk9PTEVBTl9QUk9QLCBldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhEYXRhTW9kZWxFdmVudC5WQUxVRV9DSEcsIGV2ZW50LmdldEZsYWcoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZG0uZ2V0Qm9vbGVhblByb3BlcnR5KERNUHJvdmlkZXIuQk9PTEVBTl9QUk9QKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvVGVzdEFic3RyYWN0RE1Qcm92aWRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL1Rlc3RBYnN0cmFjdERNUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRhNTQ0MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvVGVzdEFic3RyYWN0RE1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgVGVzdEFic3RyYWN0RE1Qcm92aWRlciBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTlRFR0VSID0gIklOVEVHRVIiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCT09MRUFOID0gIkJPT0xFQU4iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJJTkcgPSAiU1RSSU5HIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0JKRUNUID0gIk9CSkVDVCI7Ci0KLQlwcml2YXRlIGNsYXNzIERNT3AgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiB7Ci0KLQkJcHVibGljIERNT3AoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIERNT3AoSURhdGFNb2RlbCBtb2RlbCkgewotCQkJc3VwZXIobW9kZWwpOwotCQl9Ci0KLQkJcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBJU3RhdHVzIHJlZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0SUQoU3RyaW5nIGlkKSB7Ci0JCQlzdXBlci5zZXRJRChpZCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldElEKCkgewotCQkJcmV0dXJuIHN1cGVyLmdldElEKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXREYXRhTW9kZWwoSURhdGFNb2RlbCBtb2RlbCkgewotCQkJc3VwZXIuc2V0RGF0YU1vZGVsKG1vZGVsKTsKLQkJfQotCi0JCXB1YmxpYyBJRGF0YU1vZGVsIGdldERhdGFNb2RlbCgpIHsKLQkJCXJldHVybiBzdXBlci5nZXREYXRhTW9kZWwoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgRE1Qcm92aWRlciBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXIgewotCi0JCXB1YmxpYyBTZXQgZ2V0UHJvcGVydHlOYW1lcygpewotCQkJU2V0IHByb3BlcnR5TmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7Ci0JCQlwcm9wZXJ0eU5hbWVzLmFkZChJTlRFR0VSKTsKLQkJCXByb3BlcnR5TmFtZXMuYWRkKEJPT0xFQU4pOwotCQkJcHJvcGVydHlOYW1lcy5hZGQoU1RSSU5HKTsKLQkJCXByb3BlcnR5TmFtZXMuYWRkKE9CSkVDVCk7Ci0JCQlyZXR1cm4gcHJvcGVydHlOYW1lczsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGluaXQoKSB7Ci0JCQlzdXBlci5pbml0KCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0RGVmYXVsdFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnR5RW5hYmxlZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCQlyZXR1cm4gc3VwZXIuaXNQcm9wZXJ0eUVuYWJsZWQocHJvcGVydHlOYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKFN0cmluZyBuYW1lKSB7Ci0JCQlyZXR1cm4gc3VwZXIudmFsaWRhdGUobmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBwcm9wZXJ0eVNldChTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgcHJvcGVydHlWYWx1ZSkgewotCQkJcmV0dXJuIHN1cGVyLnByb3BlcnR5U2V0KHByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSk7Ci0JCX0KLQotCQlwdWJsaWMgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIGdldFByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9yKHByb3BlcnR5TmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJCXJldHVybiBzdXBlci5nZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMocHJvcGVydHlOYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBMaXN0IGdldEV4dGVuZGVkQ29udGV4dCgpIHsKLQkJCXJldHVybiBzdXBlci5nZXRFeHRlbmRlZENvbnRleHQoKTsKLQkJfQotCi0JCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldERlZmF1bHRPcGVyYXRpb24oKSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0RGVmYXVsdE9wZXJhdGlvbigpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRJRCgpIHsKLQkJCXJldHVybiBzdXBlci5nZXRJRCgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCXN1cGVyLmRpc3Bvc2UoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHByb3RlY3RlZFRlc3QoKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eShJTlRFR0VSKTsKLQkJCXN1cGVyLnNldFByb3BlcnR5KElOVEVHRVIsIG5ldyBJbnRlZ2VyKDEpKTsKLQkJCXN1cGVyLmdldEJvb2xlYW5Qcm9wZXJ0eShCT09MRUFOKTsKLQkJCXN1cGVyLnNldEJvb2xlYW5Qcm9wZXJ0eShCT09MRUFOLCB0cnVlKTsKLQkJCXN1cGVyLmdldEludFByb3BlcnR5KElOVEVHRVIpOwotCQkJc3VwZXIuc2V0SW50UHJvcGVydHkoSU5URUdFUiwgMSk7Ci0JCQlzdXBlci5nZXRTdHJpbmdQcm9wZXJ0eShTVFJJTkcpOwotCQkJc3VwZXIuaXNQcm9wZXJ0eVNldChJTlRFR0VSKTsKLQkJfQotCX0KLQotCUlEYXRhTW9kZWxQcm92aWRlciBpZG1wID0gbnVsbDsKLQlBYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyIGRtcCA9IG51bGw7Ci0JSURhdGFNb2RlbCBkbSA9IG51bGw7Ci0KLQlJRGF0YU1vZGVsT3BlcmF0aW9uIGlkbW8gPSBudWxsOwotCUFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIGRtbyA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlkbXAgPSBuZXcgRE1Qcm92aWRlcigpOwotCQlpZG1wID0gZG1wOwotCQlkbSA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKGRtcCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXIoKSB7Ci0JCWRtcC5zZXREYXRhTW9kZWwoZG0pOwotCQlhc3NlcnRUcnVlKGRtID09IGRtcC5nZXREYXRhTW9kZWwoKSk7Ci0JCWFzc2VydE5vdE51bGwoZG1wLmdldFByb3BlcnR5TmFtZXMoKSk7Ci0JCWRtcC5pbml0KCk7Ci0JCWFzc2VydE51bGwoZG1wLmdldERlZmF1bHRQcm9wZXJ0eShJTlRFR0VSKSk7Ci0JCWFzc2VydFRydWUoZG1wLmlzUHJvcGVydHlFbmFibGVkKElOVEVHRVIpKTsKLQkJYXNzZXJ0TnVsbChkbXAudmFsaWRhdGUoSU5URUdFUikpOwotCQlhc3NlcnRUcnVlKGRtcC5wcm9wZXJ0eVNldChJTlRFR0VSLCBuZXcgSW50ZWdlcigxKSkpOwotCQlhc3NlcnROdWxsKGRtcC5nZXRQcm9wZXJ0eURlc2NyaXB0b3IoSU5URUdFUikpOwotCQlhc3NlcnROdWxsKGRtcC5nZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoSU5URUdFUikpOwotCQlhc3NlcnROdWxsKGRtcC5nZXRFeHRlbmRlZENvbnRleHQoKSk7Ci0JCWFzc2VydE51bGwoZG1wLmdldERlZmF1bHRPcGVyYXRpb24oKSk7Ci0JCWFzc2VydFRydWUoZG1wLmdldElEKCkuZXF1YWxzKGRtcC5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotCQkoKERNUHJvdmlkZXIpIGRtcCkucHJvdGVjdGVkVGVzdCgpOwotCQlkbXAuZGlzcG9zZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJRGF0YU1vZGVsUHJvdmlkZXIoKSB7Ci0JCWlkbXAuc2V0RGF0YU1vZGVsKGRtKTsKLQkJYXNzZXJ0VHJ1ZShkbSA9PSBpZG1wLmdldERhdGFNb2RlbCgpKTsKLQkJYXNzZXJ0Tm90TnVsbChpZG1wLmdldFByb3BlcnR5TmFtZXMoKSk7Ci0JCWlkbXAuaW5pdCgpOwotCQlhc3NlcnROdWxsKGlkbXAuZ2V0RGVmYXVsdFByb3BlcnR5KElOVEVHRVIpKTsKLQkJYXNzZXJ0VHJ1ZShpZG1wLmlzUHJvcGVydHlFbmFibGVkKElOVEVHRVIpKTsKLQkJYXNzZXJ0TnVsbChpZG1wLnZhbGlkYXRlKElOVEVHRVIpKTsKLQkJYXNzZXJ0VHJ1ZShpZG1wLnByb3BlcnR5U2V0KElOVEVHRVIsIG5ldyBJbnRlZ2VyKDEpKSk7Ci0JCWFzc2VydE51bGwoaWRtcC5nZXRQcm9wZXJ0eURlc2NyaXB0b3IoSU5URUdFUikpOwotCQlhc3NlcnROdWxsKGlkbXAuZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKElOVEVHRVIpKTsKLQkJYXNzZXJ0TnVsbChpZG1wLmdldEV4dGVuZGVkQ29udGV4dCgpKTsKLQkJYXNzZXJ0TnVsbChpZG1wLmdldERlZmF1bHRPcGVyYXRpb24oKSk7Ci0JCWFzc2VydFRydWUoaWRtcC5nZXRJRCgpLmVxdWFscyhpZG1wLmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0JCWlkbXAuZGlzcG9zZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbigpIHsKLQkJZG1vID0gbmV3IERNT3AoKTsKLQkJZG1vID0gbmV3IERNT3AoZG0pOwotCQlpZG1vID0gZG1vOwotCQlkbW8uc2V0SUQoImZvbyIpOwotCQlhc3NlcnRUcnVlKGRtby5nZXRJRCgpLmVxdWFscygiZm9vIikpOwotCQlkbW8uc2V0RGF0YU1vZGVsKGRtKTsKLQkJYXNzZXJ0VHJ1ZShkbSA9PSBkbW8uZ2V0RGF0YU1vZGVsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SURhdGFNb2RlbE9wZXJhdGlvbigpIHsKLQkJZG1vID0gbmV3IERNT3AoKTsKLQkJaWRtbyA9IGRtbzsKLQkJaWRtby5zZXRJRCgiZm9vIik7Ci0JCWFzc2VydFRydWUoaWRtby5nZXRJRCgpLmVxdWFscygiZm9vIikpOwotCQlpZG1vLnNldERhdGFNb2RlbChkbSk7Ci0JCWFzc2VydFRydWUoZG0gPT0gaWRtby5nZXREYXRhTW9kZWwoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvVGVzdERhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvVGVzdERhdGFNb2RlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMjNmOTAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL1Rlc3REYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgVGVzdERhdGFNb2RlbFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlciBpbXBsZW1lbnRzIElUZXN0RGF0YU1vZGVsIHsKLQotCXByaXZhdGUgc3RhdGljIGludCBpbnN0YW5jZUNvdW50ID0gMDsKLQotCXB1YmxpYyBzdGF0aWMgaW50IGdldEluc3RhbmNlQ291bnQoKSB7Ci0JCXJldHVybiBpbnN0YW5jZUNvdW50OwotCX0KLQotCi0JcHVibGljIFRlc3REYXRhTW9kZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQkJaW5zdGFuY2VDb3VudCsrOwotCX0KLQotCXB1YmxpYyBTZXQgZ2V0UHJvcGVydHlOYW1lcygpIHsKLQkJU2V0IHByb3BlcnR5TmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKElUZXN0RGF0YU1vZGVsLkZPTyk7Ci0JCXJldHVybiBwcm9wZXJ0eU5hbWVzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SUQoKSB7Ci0JCXJldHVybiBJVGVzdERhdGFNb2RlbC5jbGFzcy5nZXROYW1lKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvVGVzdExpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvVGVzdExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhZGViMTkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL1Rlc3RMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxMaXN0ZW5lcjsKLQotcHVibGljIGNsYXNzIFRlc3RMaXN0ZW5lciBpbXBsZW1lbnRzIElEYXRhTW9kZWxMaXN0ZW5lciB7Ci0KLQlwcml2YXRlIEFycmF5TGlzdCBldmVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwdWJsaWMgdm9pZCBjbGVhckV2ZW50cygpIHsKLQkJZXZlbnRzLmNsZWFyKCk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0RXZlbnRzKCkgewotCQlyZXR1cm4gZXZlbnRzOwotCX0KLQotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChEYXRhTW9kZWxFdmVudCBldmVudCkgewotCQlldmVudHMuYWRkKGV2ZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvVmFsaWRhdGlvblRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9WYWxpZGF0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWY4YWIzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9WYWxpZGF0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuQ29tbW9uVGVzdHNQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBID0gIkEiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCID0gIkIiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDID0gIkMiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gYWxsUHJvcGVydGllcyA9IG5ldyBTdHJpbmdbXXtBLCBCLCBDfTsKLQotCi0JcHJpdmF0ZSBjbGFzcyBQIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlciB7Ci0KLQotCQlwdWJsaWMgU2V0IGdldFByb3BlcnR5TmFtZXMoKXsKLQkJCVNldCBwcm9wZXJ0eU5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwotCQkJcHJvcGVydHlOYW1lcy5hZGQoQSk7Ci0JCQlwcm9wZXJ0eU5hbWVzLmFkZChCKTsKLQkJCXByb3BlcnR5TmFtZXMuYWRkKEMpOwotCQkJcmV0dXJuIHByb3BlcnR5TmFtZXM7Ci0JCX0KLQotCQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCQl2YWxpZGF0aW9uTGlzdC5hZGQocHJvcGVydHlOYW1lKTsKLQkJCXJldHVybiBzdGF0dXM7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIElTdGF0dXMgZXJyb3JTdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENvbW1vblRlc3RzUGx1Z2luLlBMVUdJTl9JRCwgMCwgImVycm9yIiwgbnVsbCk7Ci0JcHJpdmF0ZSBJU3RhdHVzIG9rU3RhdHVzID0gSURhdGFNb2RlbFByb3ZpZGVyLk9LX1NUQVRVUzsKLQotCXByaXZhdGUgSVN0YXR1cyBzdGF0dXM7Ci0KLQlwcml2YXRlIExpc3QgdmFsaWRhdGlvbkxpc3Q7Ci0KLQlwcml2YXRlIElEYXRhTW9kZWwgZG07Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlkbSA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBQKCkpOwotCQlzdGF0dXMgPSBva1N0YXR1czsKLQkJdmFsaWRhdGlvbkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgX3Rlc3RCYXNpY1ZhbGlkYXRpb24oKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0JCQlib29sZWFuIG9rID0gaSA9PSAwOwotCQkJc3RhdHVzID0gb2sgPyBva1N0YXR1cyA6IGVycm9yU3RhdHVzOwotCi0JCQl2YWxpZGF0aW9uTGlzdC5jbGVhcigpOwotCQkJYXNzZXJ0VHJ1ZShkbS5pc1ZhbGlkKCkgPT0gb2spOwotCQkJYXNzZXJ0RXF1YWxzKG9rID8gNSA6IDEsIHZhbGlkYXRpb25MaXN0LnNpemUoKSk7Ci0JCQlhc3NlcnRUcnVlKHZhbGlkYXRpb25MaXN0LmNvbnRhaW5zKEEpIHx8IHZhbGlkYXRpb25MaXN0LmNvbnRhaW5zKElEYXRhTW9kZWxQcm9wZXJ0aWVzLkFMTE9XX0VYVEVOU0lPTlMpIHx8IHZhbGlkYXRpb25MaXN0LmNvbnRhaW5zKElEYXRhTW9kZWxQcm9wZXJ0aWVzLlJFU1RSSUNUX0VYVEVOU0lPTlMpKTsKLQkJCWlmIChvaykgewotCQkJCWFzc2VydFRydWUodmFsaWRhdGlvbkxpc3QuY29udGFpbnMoQikpOwotCQkJCWFzc2VydFRydWUodmFsaWRhdGlvbkxpc3QuY29udGFpbnMoQykpOwotCQkJfQotCQkJdmFsaWRhdGlvbkxpc3QuY2xlYXIoKTsKLQotCQkJYXNzZXJ0VHJ1ZShkbS52YWxpZGF0ZSgpLmlzT0soKSA9PSBvayk7Ci0JCQkvLyBUT0RPCi0JCQkvL2Fzc2VydEVxdWFscyhvayA/IDMgOiAxLCB2YWxpZGF0aW9uTGlzdC5zaXplKCkpOwotCQkJYXNzZXJ0VHJ1ZSh2YWxpZGF0aW9uTGlzdC5jb250YWlucyhBKSB8fCB2YWxpZGF0aW9uTGlzdC5jb250YWlucyhJRGF0YU1vZGVsUHJvcGVydGllcy5BTExPV19FWFRFTlNJT05TKSB8fCB2YWxpZGF0aW9uTGlzdC5jb250YWlucyhJRGF0YU1vZGVsUHJvcGVydGllcy5SRVNUUklDVF9FWFRFTlNJT05TKSk7Ci0JCQlpZiAob2spIHsKLQkJCQlhc3NlcnRUcnVlKHZhbGlkYXRpb25MaXN0LmNvbnRhaW5zKEIpKTsKLQkJCQlhc3NlcnRUcnVlKHZhbGlkYXRpb25MaXN0LmNvbnRhaW5zKEMpKTsKLQkJCX0KLQkJCXZhbGlkYXRpb25MaXN0LmNsZWFyKCk7Ci0KLQkJCWFzc2VydFRydWUoZG0udmFsaWRhdGUodHJ1ZSkuaXNPSygpID09IG9rKTsKLQkJCWFzc2VydEVxdWFscyhvayA/IDUgOiAxLCB2YWxpZGF0aW9uTGlzdC5zaXplKCkpOwotCQkJdmFsaWRhdGlvbkxpc3QuY2xlYXIoKTsKLQotCQkJYXNzZXJ0VHJ1ZShkbS52YWxpZGF0ZShmYWxzZSkuaXNPSygpID09IG9rKTsKLQkJCWFzc2VydEVxdWFscyg1LCB2YWxpZGF0aW9uTGlzdC5zaXplKCkpOwotCQkJYXNzZXJ0VHJ1ZSh2YWxpZGF0aW9uTGlzdC5jb250YWlucyhBKSk7Ci0JCQlhc3NlcnRUcnVlKHZhbGlkYXRpb25MaXN0LmNvbnRhaW5zKEIpKTsKLQkJCWFzc2VydFRydWUodmFsaWRhdGlvbkxpc3QuY29udGFpbnMoQykpOwotCQkJdmFsaWRhdGlvbkxpc3QuY2xlYXIoKTsKLQotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBhbGxQcm9wZXJ0aWVzLmxlbmd0aDsgaisrKSB7Ci0JCQkJYXNzZXJ0VHJ1ZShkbS5pc1Byb3BlcnR5VmFsaWQoYWxsUHJvcGVydGllc1tqXSkgPT0gb2spOwotCQkJCWFzc2VydEVxdWFscygxLCB2YWxpZGF0aW9uTGlzdC5zaXplKCkpOwotCQkJCWFzc2VydFRydWUodmFsaWRhdGlvbkxpc3QuY29udGFpbnMoYWxsUHJvcGVydGllc1tqXSkpOwotCQkJCXZhbGlkYXRpb25MaXN0LmNsZWFyKCk7Ci0JCQkJYXNzZXJ0VHJ1ZShkbS52YWxpZGF0ZVByb3BlcnR5KGFsbFByb3BlcnRpZXNbal0pLmlzT0soKSA9PSBvayk7Ci0JCQkJYXNzZXJ0RXF1YWxzKDEsIHZhbGlkYXRpb25MaXN0LnNpemUoKSk7Ci0JCQkJYXNzZXJ0VHJ1ZSh2YWxpZGF0aW9uTGlzdC5jb250YWlucyhhbGxQcm9wZXJ0aWVzW2pdKSk7Ci0JCQkJdmFsaWRhdGlvbkxpc3QuY2xlYXIoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRWYWxpZGF0aW9uKCkgewotCQlkbS5hZGROZXN0ZWRNb2RlbCgiYSIsIERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBBKCkpKTsKLQkJZG0uYWRkTmVzdGVkTW9kZWwoImIiLCBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgQigpKSk7Ci0JCWRtLmFkZE5lc3RlZE1vZGVsKCJjIiwgRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEMoKSkpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCQl2YWxpZGF0aW9uTGlzdC5jbGVhcigpOwotCQkJc3dpdGNoIChpKSB7Ci0JCQkJY2FzZSAwIDoKLQkJCQkJYXNzZXJ0VHJ1ZShkbS5pc1ZhbGlkKCkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDEgOgotCQkJCQlhc3NlcnRUcnVlKGRtLnZhbGlkYXRlKCkuaXNPSygpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyIDoKLQkJCQkJYXNzZXJ0VHJ1ZShkbS52YWxpZGF0ZSh0cnVlKS5pc09LKCkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDMgOgotCQkJCQlhc3NlcnRUcnVlKGRtLnZhbGlkYXRlKGZhbHNlKS5pc09LKCkpOwotCQkJCQlicmVhazsKLQkJCX0KLQkJCWFzc2VydEVxdWFscyg4LCB2YWxpZGF0aW9uTGlzdC5zaXplKCkpOwotCQkJYXNzZXJ0VHJ1ZSh2YWxpZGF0aW9uTGlzdC5jb250YWlucyhBKSk7Ci0JCQlhc3NlcnRUcnVlKHZhbGlkYXRpb25MaXN0LmNvbnRhaW5zKEIpKTsKLQkJCWFzc2VydFRydWUodmFsaWRhdGlvbkxpc3QuY29udGFpbnMoQykpOwotCQkJYXNzZXJ0VHJ1ZSh2YWxpZGF0aW9uTGlzdC5jb250YWlucygiYSIpKTsKLQkJCWFzc2VydFRydWUodmFsaWRhdGlvbkxpc3QuY29udGFpbnMoImIiKSk7Ci0JCQlhc3NlcnRUcnVlKHZhbGlkYXRpb25MaXN0LmNvbnRhaW5zKCJjIikpOwotCQkJdmFsaWRhdGlvbkxpc3QuY2xlYXIoKTsKLQkJfQotCQlzdGF0dXMgPSBlcnJvclN0YXR1czsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJCXZhbGlkYXRpb25MaXN0LmNsZWFyKCk7Ci0JCQlzd2l0Y2ggKGkpIHsKLQkJCQljYXNlIDAgOgotCQkJCQlhc3NlcnRUcnVlKCFkbS5pc1ZhbGlkKCkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDEgOgotCQkJCQlhc3NlcnRUcnVlKCFkbS52YWxpZGF0ZSgpLmlzT0soKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMiA6Ci0JCQkJCWFzc2VydFRydWUoIWRtLnZhbGlkYXRlKHRydWUpLmlzT0soKSk7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQkJLy8gVE9ETwotCQkJLy9hc3NlcnRFcXVhbHMoMSwgdmFsaWRhdGlvbkxpc3Quc2l6ZSgpKTsKLQkJCS8vYXNzZXJ0VHJ1ZSghdmFsaWRhdGlvbkxpc3QuY29udGFpbnMoImEiKSk7Ci0JCQkvL2Fzc2VydFRydWUoIXZhbGlkYXRpb25MaXN0LmNvbnRhaW5zKCJiIikpOwotCQkJLy9hc3NlcnRUcnVlKCF2YWxpZGF0aW9uTGlzdC5jb250YWlucygiYyIpKTsKLQkJCXZhbGlkYXRpb25MaXN0LmNsZWFyKCk7Ci0JCX0KLQotCQlhc3NlcnRUcnVlKCFkbS52YWxpZGF0ZShmYWxzZSkuaXNPSygpKTsKLQkJYXNzZXJ0RXF1YWxzKDgsIHZhbGlkYXRpb25MaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUodmFsaWRhdGlvbkxpc3QuY29udGFpbnMoQSkpOwotCQlhc3NlcnRUcnVlKHZhbGlkYXRpb25MaXN0LmNvbnRhaW5zKEIpKTsKLQkJYXNzZXJ0VHJ1ZSh2YWxpZGF0aW9uTGlzdC5jb250YWlucyhDKSk7Ci0JCWFzc2VydFRydWUodmFsaWRhdGlvbkxpc3QuY29udGFpbnMoImEiKSk7Ci0JCWFzc2VydFRydWUodmFsaWRhdGlvbkxpc3QuY29udGFpbnMoImIiKSk7Ci0JCWFzc2VydFRydWUodmFsaWRhdGlvbkxpc3QuY29udGFpbnMoImMiKSk7Ci0JCXZhbGlkYXRpb25MaXN0LmNsZWFyKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvZXh0ZW5kZWQvQS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL2V4dGVuZGVkL0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY4MjBlNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvZXh0ZW5kZWQvQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuZXh0ZW5kZWQ7Ci0KLQotcHVibGljIGNsYXNzIEEgZXh0ZW5kcyBBYnN0cmFjdElEYXRhTW9kZWxUZXN0T3BlcmF0aW9uIHsKLQotCXB1YmxpYyBBKCkgewotCQlzdXBlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9leHRlbmRlZC9BYnN0cmFjdElEYXRhTW9kZWxUZXN0T3BlcmF0aW9uLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvZXh0ZW5kZWQvQWJzdHJhY3RJRGF0YU1vZGVsVGVzdE9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGUxYTM4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9leHRlbmRlZC9BYnN0cmFjdElEYXRhTW9kZWxUZXN0T3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0cy5leHRlbmRlZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgQWJzdHJhY3RJRGF0YU1vZGVsVGVzdE9wZXJhdGlvbiBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIHsKLQotCXB1YmxpYyBBYnN0cmFjdElEYXRhTW9kZWxUZXN0T3BlcmF0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBYnN0cmFjdElEYXRhTW9kZWxUZXN0T3BlcmF0aW9uKElEYXRhTW9kZWwgZG0pIHsKLQkJc3VwZXIoZG0pOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlFeHRlbmRlZE9wZXJhdGlvblRlc3RzLmV4ZWN1dGlvbkxpc3QuYWRkKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQkJcmV0dXJuIE9LX1NUQVRVUzsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyByZWRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJRXh0ZW5kZWRPcGVyYXRpb25UZXN0cy5leGVjdXRpb25MaXN0LmFkZChnZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0JCXJldHVybiBPS19TVEFUVVM7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgdW5kbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCUV4dGVuZGVkT3BlcmF0aW9uVGVzdHMuZXhlY3V0aW9uTGlzdC5hZGQoZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCQlyZXR1cm4gT0tfU1RBVFVTOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9leHRlbmRlZC9CLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvZXh0ZW5kZWQvQi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWQ0N2EwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9leHRlbmRlZC9CLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0cy5leHRlbmRlZDsKLQotCi1wdWJsaWMgY2xhc3MgQiBleHRlbmRzIEFic3RyYWN0SURhdGFNb2RlbFRlc3RPcGVyYXRpb24gewotCi0JcHVibGljIEIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL2V4dGVuZGVkL0MuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9leHRlbmRlZC9DLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NTFjNjAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL2V4dGVuZGVkL0MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzLmV4dGVuZGVkOwotCi0KLXB1YmxpYyBjbGFzcyBDIGV4dGVuZHMgQWJzdHJhY3RJRGF0YU1vZGVsVGVzdE9wZXJhdGlvbiB7Ci0KLQlwdWJsaWMgQygpIHsKLQkJc3VwZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvZXh0ZW5kZWQvRC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL2V4dGVuZGVkL0QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM2NzBhNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvZXh0ZW5kZWQvRC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuZXh0ZW5kZWQ7Ci0KLXB1YmxpYyBjbGFzcyBEIGV4dGVuZHMgQWJzdHJhY3RJRGF0YU1vZGVsVGVzdE9wZXJhdGlvbiB7Ci0KLQlwdWJsaWMgRCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9leHRlbmRlZC9FLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvZXh0ZW5kZWQvRS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2JlZjczLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9leHRlbmRlZC9FLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0cy5leHRlbmRlZDsKLQotcHVibGljIGNsYXNzIEUgZXh0ZW5kcyBBYnN0cmFjdElEYXRhTW9kZWxUZXN0T3BlcmF0aW9uIHsKLQotCXB1YmxpYyBFKCkgewotCQlzdXBlcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL2V4dGVuZGVkL0V4dGVuZGVkT3BlcmF0aW9uVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9leHRlbmRlZC9FeHRlbmRlZE9wZXJhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwYWI4NTcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL2V4dGVuZGVkL0V4dGVuZGVkT3BlcmF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0cy5leHRlbmRlZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwuSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwuSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC5JRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25MaXN0ZW5lcjsKLQotcHVibGljIGNsYXNzIEV4dGVuZGVkT3BlcmF0aW9uVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgc3RhdGljIExpc3QgZXhlY3V0aW9uTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGEgPSBBLmNsYXNzLmdldE5hbWUoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBiID0gQi5jbGFzcy5nZXROYW1lKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgYyA9IEMuY2xhc3MuZ2V0TmFtZSgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGQgPSBELmNsYXNzLmdldE5hbWUoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBlID0gRS5jbGFzcy5nZXROYW1lKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZiA9IEYuY2xhc3MuZ2V0TmFtZSgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGcgPSBHLmNsYXNzLmdldE5hbWUoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBoID0gSC5jbGFzcy5nZXROYW1lKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgciA9IFIuY2xhc3MuZ2V0TmFtZSgpOwotCi0JcHJvdGVjdGVkIGNsYXNzIFBhdXNlTGlzdGVuZXIgaW1wbGVtZW50cyBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25MaXN0ZW5lciB7Ci0KLQkJcHVibGljIExpc3QgcGF1c2VkT3BlcmF0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlwdWJsaWMgaW50IG5vdGlmeShJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudCBldmVudCkgewotCQkJU3RyaW5nIG9wSUQgPSBldmVudC5nZXRPcGVyYXRpb24oKS5nZXRJRCgpOwotCQkJaWYgKHBhdXNlZE9wZXJhdGlvbnMuY29udGFpbnMob3BJRCkpIHsKLQkJCQlyZXR1cm4gQ09OVElOVUU7Ci0JCQl9Ci0JCQlwYXVzZWRPcGVyYXRpb25zLmFkZChvcElEKTsKLQkJCXJldHVybiBQQVVTRTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBQYXVzZUxpc3RlbmVyIHBhdXNlTGlzdGVuZXIgPSBuZXcgUGF1c2VMaXN0ZW5lcigpOwotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJZXhlY3V0aW9uTGlzdC5jbGVhcigpOwotCQlwYXVzZUxpc3RlbmVyLnBhdXNlZE9wZXJhdGlvbnMuY2xlYXIoKTsKLQkJSVByb2plY3QgcCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdCgiZm9vIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKCFwLmV4aXN0cygpKSB7Ci0JCQlwLmNyZWF0ZShudWxsKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbGxPbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJRGF0YU1vZGVsIGRtID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IFJvb3RETVByb3ZpZGVyKCkpOwotCQlTdHJpbmdbXSBmb3J3YXJkRXhwZWN0ZWRSZXN1bHRzID0gbmV3IFN0cmluZ1tde2MsIGEsIGQsIHIsIGUsIGIsIGYsIGcsIGh9OwotCQlTdHJpbmdbXSBmb3J3YXJkRXhwZWN0ZWRQYXVzZU9yZGVyID0gbmV3IFN0cmluZ1tde3IsIGEsIGMsIGQsIGIsIGUsIGYsIGgsIGd9OwotCQljaGVja0FsbChkbSwgZm9yd2FyZEV4cGVjdGVkUmVzdWx0cywgZm9yd2FyZEV4cGVjdGVkUGF1c2VPcmRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFsbE9mZigpIHRocm93cyBFeGNlcHRpb24gewotCQlJRGF0YU1vZGVsIGRtID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IFJvb3RETVByb3ZpZGVyKCkpOwotCQlkbS5zZXRCb29sZWFuUHJvcGVydHkoSURhdGFNb2RlbFByb3BlcnRpZXMuQUxMT1dfRVhURU5TSU9OUywgZmFsc2UpOwotCQlTdHJpbmdbXSBmb3J3YXJkRXhwZWN0ZWRSZXN1bHRzID0gbmV3IFN0cmluZ1tde3J9OwotCQlTdHJpbmdbXSBmb3J3YXJkRXhwZWN0ZWRQYXVzZU9yZGVyID0gbmV3IFN0cmluZ1tde3J9OwotCQljaGVja0FsbChkbSwgZm9yd2FyZEV4cGVjdGVkUmVzdWx0cywgZm9yd2FyZEV4cGVjdGVkUGF1c2VPcmRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFPZmYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSURhdGFNb2RlbCBkbSA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBSb290RE1Qcm92aWRlcigpKTsKLQkJTGlzdCByZXN0cmljdGVkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmVzdHJpY3RlZExpc3QuYWRkKGEpOwotCQlkbS5zZXRQcm9wZXJ0eShJRGF0YU1vZGVsUHJvcGVydGllcy5SRVNUUklDVF9FWFRFTlNJT05TLCByZXN0cmljdGVkTGlzdCk7Ci0JCVN0cmluZ1tdIGZvcndhcmRFeHBlY3RlZFJlc3VsdHMgPSBuZXcgU3RyaW5nW117ciwgZSwgYiwgZiwgZywgaH07Ci0JCVN0cmluZ1tdIGZvcndhcmRFeHBlY3RlZFBhdXNlT3JkZXIgPSBuZXcgU3RyaW5nW117ciwgYiwgZSwgZiwgaCwgZ307Ci0JCWNoZWNrQWxsKGRtLCBmb3J3YXJkRXhwZWN0ZWRSZXN1bHRzLCBmb3J3YXJkRXhwZWN0ZWRQYXVzZU9yZGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Qk9mZigpIHRocm93cyBFeGNlcHRpb24gewotCQlJRGF0YU1vZGVsIGRtID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IFJvb3RETVByb3ZpZGVyKCkpOwotCQlMaXN0IHJlc3RyaWN0ZWRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXN0cmljdGVkTGlzdC5hZGQoYik7Ci0JCWRtLnNldFByb3BlcnR5KElEYXRhTW9kZWxQcm9wZXJ0aWVzLlJFU1RSSUNUX0VYVEVOU0lPTlMsIHJlc3RyaWN0ZWRMaXN0KTsKLQkJU3RyaW5nW10gZm9yd2FyZEV4cGVjdGVkUmVzdWx0cyA9IG5ldyBTdHJpbmdbXXtjLCBhLCBkLCByfTsKLQkJU3RyaW5nW10gZm9yd2FyZEV4cGVjdGVkUGF1c2VPcmRlciA9IG5ldyBTdHJpbmdbXXtyLCBhLCBjLCBkfTsKLQkJY2hlY2tBbGwoZG0sIGZvcndhcmRFeHBlY3RlZFJlc3VsdHMsIGZvcndhcmRFeHBlY3RlZFBhdXNlT3JkZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDT2ZmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlEYXRhTW9kZWwgZG0gPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgUm9vdERNUHJvdmlkZXIoKSk7Ci0JCUxpc3QgcmVzdHJpY3RlZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJlc3RyaWN0ZWRMaXN0LmFkZChjKTsKLQkJZG0uc2V0UHJvcGVydHkoSURhdGFNb2RlbFByb3BlcnRpZXMuUkVTVFJJQ1RfRVhURU5TSU9OUywgcmVzdHJpY3RlZExpc3QpOwotCQlTdHJpbmdbXSBmb3J3YXJkRXhwZWN0ZWRSZXN1bHRzID0gbmV3IFN0cmluZ1tde2EsIGQsIHIsIGUsIGIsIGYsIGcsIGh9OwotCQlTdHJpbmdbXSBmb3J3YXJkRXhwZWN0ZWRQYXVzZU9yZGVyID0gbmV3IFN0cmluZ1tde3IsIGEsIGQsIGIsIGUsIGYsIGgsIGd9OwotCQljaGVja0FsbChkbSwgZm9yd2FyZEV4cGVjdGVkUmVzdWx0cywgZm9yd2FyZEV4cGVjdGVkUGF1c2VPcmRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENGT2ZmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlEYXRhTW9kZWwgZG0gPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgUm9vdERNUHJvdmlkZXIoKSk7Ci0JCUxpc3QgcmVzdHJpY3RlZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJlc3RyaWN0ZWRMaXN0LmFkZChjKTsKLQkJcmVzdHJpY3RlZExpc3QuYWRkKGYpOwotCQlkbS5zZXRQcm9wZXJ0eShJRGF0YU1vZGVsUHJvcGVydGllcy5SRVNUUklDVF9FWFRFTlNJT05TLCByZXN0cmljdGVkTGlzdCk7Ci0JCVN0cmluZ1tdIGZvcndhcmRFeHBlY3RlZFJlc3VsdHMgPSBuZXcgU3RyaW5nW117YSwgZCwgciwgZSwgYn07Ci0JCVN0cmluZ1tdIGZvcndhcmRFeHBlY3RlZFBhdXNlT3JkZXIgPSBuZXcgU3RyaW5nW117ciwgYSwgZCwgYiwgZX07Ci0JCWNoZWNrQWxsKGRtLCBmb3J3YXJkRXhwZWN0ZWRSZXN1bHRzLCBmb3J3YXJkRXhwZWN0ZWRQYXVzZU9yZGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q0JPZmYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSURhdGFNb2RlbCBkbSA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBSb290RE1Qcm92aWRlcigpKTsKLQkJTGlzdCByZXN0cmljdGVkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmVzdHJpY3RlZExpc3QuYWRkKGMpOwotCQlyZXN0cmljdGVkTGlzdC5hZGQoYik7Ci0JCWRtLnNldFByb3BlcnR5KElEYXRhTW9kZWxQcm9wZXJ0aWVzLlJFU1RSSUNUX0VYVEVOU0lPTlMsIHJlc3RyaWN0ZWRMaXN0KTsKLQkJU3RyaW5nW10gZm9yd2FyZEV4cGVjdGVkUmVzdWx0cyA9IG5ldyBTdHJpbmdbXXthLCBkLCByfTsKLQkJU3RyaW5nW10gZm9yd2FyZEV4cGVjdGVkUGF1c2VPcmRlciA9IG5ldyBTdHJpbmdbXXtyLCBhLCBkfTsKLQkJY2hlY2tBbGwoZG0sIGZvcndhcmRFeHBlY3RlZFJlc3VsdHMsIGZvcndhcmRFeHBlY3RlZFBhdXNlT3JkZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBRUZPZmYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSURhdGFNb2RlbCBkbSA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBSb290RE1Qcm92aWRlcigpKTsKLQkJTGlzdCByZXN0cmljdGVkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmVzdHJpY3RlZExpc3QuYWRkKGEpOwotCQlyZXN0cmljdGVkTGlzdC5hZGQoZSk7Ci0JCXJlc3RyaWN0ZWRMaXN0LmFkZChmKTsKLQkJZG0uc2V0UHJvcGVydHkoSURhdGFNb2RlbFByb3BlcnRpZXMuUkVTVFJJQ1RfRVhURU5TSU9OUywgcmVzdHJpY3RlZExpc3QpOwotCQlTdHJpbmdbXSBmb3J3YXJkRXhwZWN0ZWRSZXN1bHRzID0gbmV3IFN0cmluZ1tde3IsIGJ9OwotCQlTdHJpbmdbXSBmb3J3YXJkRXhwZWN0ZWRQYXVzZU9yZGVyID0gbmV3IFN0cmluZ1tde3IsIGJ9OwotCQljaGVja0FsbChkbSwgZm9yd2FyZEV4cGVjdGVkUmVzdWx0cywgZm9yd2FyZEV4cGVjdGVkUGF1c2VPcmRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFCT2ZmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlEYXRhTW9kZWwgZG0gPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgUm9vdERNUHJvdmlkZXIoKSk7Ci0JCUxpc3QgcmVzdHJpY3RlZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJlc3RyaWN0ZWRMaXN0LmFkZChhKTsKLQkJcmVzdHJpY3RlZExpc3QuYWRkKGIpOwotCQlkbS5zZXRQcm9wZXJ0eShJRGF0YU1vZGVsUHJvcGVydGllcy5SRVNUUklDVF9FWFRFTlNJT05TLCByZXN0cmljdGVkTGlzdCk7Ci0JCVN0cmluZ1tdIGZvcndhcmRFeHBlY3RlZFJlc3VsdHMgPSBuZXcgU3RyaW5nW117cn07Ci0JCVN0cmluZ1tdIGZvcndhcmRFeHBlY3RlZFBhdXNlT3JkZXIgPSBuZXcgU3RyaW5nW117cn07Ci0JCWNoZWNrQWxsKGRtLCBmb3J3YXJkRXhwZWN0ZWRSZXN1bHRzLCBmb3J3YXJkRXhwZWN0ZWRQYXVzZU9yZGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tBbGwoSURhdGFNb2RlbCBkbSwgU3RyaW5nW10gZm9yd2FyZEV4cGVjdGVkUmVzdWx0cywgU3RyaW5nW10gZXhwZWN0ZWRQYXVzZU9yZGVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nW10gdW5kb0V4cGVjdGVkUmVzdWx0cyA9IHJldmVyc2VTdHJpbmcoZm9yd2FyZEV4cGVjdGVkUmVzdWx0cyk7Ci0JCWJvb2xlYW4gc2hvdWxkUm9sbEJhY2sgPSBmYWxzZTsKLQotCQkvLyBDaGVjayByZWd1bGFyIGV4ZWN1dGlvbnMKLQkJSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uIG9wID0gKElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbilkbS5nZXREZWZhdWx0T3BlcmF0aW9uKCk7Ci0JCWNoZWNrRXhlY3V0aW9uKG9wLCBmb3J3YXJkRXhwZWN0ZWRSZXN1bHRzLCBudWxsLCBzaG91bGRSb2xsQmFjayk7Ci0JCWNoZWNrVW5kbyhvcCwgdW5kb0V4cGVjdGVkUmVzdWx0cywgbnVsbCk7Ci0JCWNoZWNrUmVkbyhvcCwgZm9yd2FyZEV4cGVjdGVkUmVzdWx0cywgbnVsbCk7Ci0JCWNoZWNrVW5kbyhvcCwgdW5kb0V4cGVjdGVkUmVzdWx0cywgbnVsbCk7Ci0KLQkJLy8gQ2hlY2sgZXhlY3V0aW9ucyB3aXRoIHBhdXNpbmcgJiByZXN1bWluZwotCQlvcCA9IChJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb24pZG0uZ2V0RGVmYXVsdE9wZXJhdGlvbigpOwotCQlvcC5hZGRPcGVyYXRpb25MaXN0ZW5lcihwYXVzZUxpc3RlbmVyKTsKLQkJY2hlY2tFeGVjdXRpb24ob3AsIGZvcndhcmRFeHBlY3RlZFJlc3VsdHMsIGV4cGVjdGVkUGF1c2VPcmRlciwgc2hvdWxkUm9sbEJhY2spOwotCQljaGVja1VuZG8ob3AsIHVuZG9FeHBlY3RlZFJlc3VsdHMsIHVuZG9FeHBlY3RlZFJlc3VsdHMpOwotCQljaGVja1JlZG8ob3AsIGZvcndhcmRFeHBlY3RlZFJlc3VsdHMsIGZvcndhcmRFeHBlY3RlZFJlc3VsdHMpOwotCQljaGVja1VuZG8ob3AsIHVuZG9FeHBlY3RlZFJlc3VsdHMsIHVuZG9FeHBlY3RlZFJlc3VsdHMpOwotCi0JCS8vIENoZWNrIGV4ZWN1dGlvbnMgd2l0aCBwYXVzaW5nLCByZXN1bWluZyAmIHJvbGxpbmcgYmFjay4KLQkJb3AgPSAoSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uKWRtLmdldERlZmF1bHRPcGVyYXRpb24oKTsKLQkJb3AuYWRkT3BlcmF0aW9uTGlzdGVuZXIocGF1c2VMaXN0ZW5lcik7Ci0JCXNob3VsZFJvbGxCYWNrID0gdHJ1ZTsKLQkJY2hlY2tFeGVjdXRpb24ob3AsIGZvcndhcmRFeHBlY3RlZFJlc3VsdHMsIGV4cGVjdGVkUGF1c2VPcmRlciwgc2hvdWxkUm9sbEJhY2spOwotCQljaGVja1VuZG8ob3AsIHVuZG9FeHBlY3RlZFJlc3VsdHMsIHVuZG9FeHBlY3RlZFJlc3VsdHMpOwotCQljaGVja1JlZG8ob3AsIGZvcndhcmRFeHBlY3RlZFJlc3VsdHMsIGZvcndhcmRFeHBlY3RlZFJlc3VsdHMpOwotCQljaGVja1VuZG8ob3AsIHVuZG9FeHBlY3RlZFJlc3VsdHMsIHVuZG9FeHBlY3RlZFJlc3VsdHMpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nW10gcmV2ZXJzZVN0cmluZyhTdHJpbmdbXSBmb3J3YXJkU3RyaW5nKSB7Ci0JCVN0cmluZ1tdIHJldmVyc2VTdHJpbmcgPSBuZXcgU3RyaW5nW2ZvcndhcmRTdHJpbmcubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXZlcnNlU3RyaW5nLmxlbmd0aDsgaSsrKSB7Ci0JCQlyZXZlcnNlU3RyaW5nW2ldID0gZm9yd2FyZFN0cmluZ1tmb3J3YXJkU3RyaW5nLmxlbmd0aCAtIGkgLSAxXTsKLQkJfQotCQlyZXR1cm4gcmV2ZXJzZVN0cmluZzsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tFeGVjdXRpb24oSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uIG9wLCBTdHJpbmdbXSBleHBlY3RlZFJlc3VsdHMsIFN0cmluZ1tdIGV4cGVjdGVkUGF1c2VPcmRlciwgYm9vbGVhbiByb2xsYmFjaykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscyhJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb24uTk9UX1NUQVJURUQsIG9wLmdldEV4ZWN1dGlvblN0YXRlKCkpOwotCQlvcC5leGVjdXRlKG51bGwsIG51bGwpOwotCQlpZiAobnVsbCAhPSBleHBlY3RlZFBhdXNlT3JkZXIpIHsKLQkJCWlmIChyb2xsYmFjaykgewotCQkJCUxpc3QgY2FjaGVkRXhlY3V0aW9uTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkUmVzdWx0cy5sZW5ndGg7IGkrKykgewotCQkJCQljYWNoZWRFeGVjdXRpb25MaXN0LmNsZWFyKCk7Ci0JCQkJCWNhY2hlZEV4ZWN1dGlvbkxpc3QuYWRkQWxsKGV4ZWN1dGlvbkxpc3QpOwotCQkJCQlhc3NlcnRFcXVhbHMoSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uLlBBVVNFRF9FWEVDVVRFLCBvcC5nZXRFeGVjdXRpb25TdGF0ZSgpKTsKLQkJCQkJb3Aucm9sbEJhY2sobnVsbCwgbnVsbCk7Ci0JCQkJCWFzc2VydEVxdWFscyhJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb24uQ09NUExFVEVfUk9MTEJBQ0ssIG9wLmdldEV4ZWN1dGlvblN0YXRlKCkpOwotCQkJCQljaGVja1JvbGxCYWNrUmVzdWx0cyhjYWNoZWRFeGVjdXRpb25MaXN0LCBleHBlY3RlZFJlc3VsdHMpOwotCQkJCQlvcC5yZXN1bWUobnVsbCwgbnVsbCk7Ci0JCQkJfQotCQkJCWFzc2VydEVxdWFscyhJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb24uQ09NUExFVEVfRVhFQ1VURSwgb3AuZ2V0RXhlY3V0aW9uU3RhdGUoKSk7Ci0JCQkJY2hlY2tSZXN1bHRzKGV4cGVjdGVkUmVzdWx0cywgZXhwZWN0ZWRQYXVzZU9yZGVyKTsJCi0JCQkJCi0JCQkJcGF1c2VMaXN0ZW5lci5wYXVzZWRPcGVyYXRpb25zLmNsZWFyKCk7Ci0JCQkJZXhlY3V0aW9uTGlzdC5jbGVhcigpOwotCQkJCW9wLmV4ZWN1dGUobnVsbCwgbnVsbCk7Ci0JCQl9Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkUmVzdWx0cy5sZW5ndGg7IGkrKykgewotCQkJCWFzc2VydEVxdWFscyhJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb24uUEFVU0VEX0VYRUNVVEUsIG9wLmdldEV4ZWN1dGlvblN0YXRlKCkpOwotCQkJCW9wLnJlc3VtZShudWxsLCBudWxsKTsKLQkJCX0KLQkJfQotCQlhc3NlcnRFcXVhbHMoSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uLkNPTVBMRVRFX0VYRUNVVEUsIG9wLmdldEV4ZWN1dGlvblN0YXRlKCkpOwotCQljaGVja1Jlc3VsdHMoZXhwZWN0ZWRSZXN1bHRzLCBleHBlY3RlZFBhdXNlT3JkZXIpOwotCQlleGVjdXRpb25MaXN0LmNsZWFyKCk7Ci0JCXBhdXNlTGlzdGVuZXIucGF1c2VkT3BlcmF0aW9ucy5jbGVhcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja1VuZG8oSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uIG9wLCBTdHJpbmdbXSBleHBlY3RlZFJlc3VsdHMsIFN0cmluZ1tdIGV4cGVjdGVkUGF1c2VPcmRlcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChvcC5nZXRFeGVjdXRpb25TdGF0ZSgpICE9IElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbi5DT01QTEVURV9FWEVDVVRFICYmIG9wLmdldEV4ZWN1dGlvblN0YXRlKCkgIT0gSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uLkNPTVBMRVRFX1JFRE8pIHsKLQkJCWZhaWwoIk9wZXJhdGlvbiBleGVjdXRpb24gc3RhdGUgaW52YWxpZCAiICsgb3AuZ2V0RXhlY3V0aW9uU3RhdGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlvcC51bmRvKG51bGwsIG51bGwpOwotCQlpZiAobnVsbCAhPSBleHBlY3RlZFBhdXNlT3JkZXIpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWRSZXN1bHRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbi5QQVVTRURfVU5ETywgb3AuZ2V0RXhlY3V0aW9uU3RhdGUoKSk7Ci0JCQkJb3AucmVzdW1lKG51bGwsIG51bGwpOwotCQkJfQotCQl9Ci0JCWFzc2VydEVxdWFscyhJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb24uQ09NUExFVEVfVU5ETywgb3AuZ2V0RXhlY3V0aW9uU3RhdGUoKSk7Ci0JCWNoZWNrUmVzdWx0cyhleHBlY3RlZFJlc3VsdHMsIGV4cGVjdGVkUGF1c2VPcmRlcik7Ci0JCWV4ZWN1dGlvbkxpc3QuY2xlYXIoKTsKLQkJcGF1c2VMaXN0ZW5lci5wYXVzZWRPcGVyYXRpb25zLmNsZWFyKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrUmVkbyhJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb24gb3AsIFN0cmluZ1tdIGV4cGVjdGVkUmVzdWx0cywgU3RyaW5nW10gZXhwZWN0ZWRQYXVzZU9yZGVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbi5DT01QTEVURV9VTkRPLCBvcC5nZXRFeGVjdXRpb25TdGF0ZSgpKTsKLQkJb3AucmVkbyhudWxsLCBudWxsKTsKLQkJaWYgKG51bGwgIT0gZXhwZWN0ZWRQYXVzZU9yZGVyKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkUmVzdWx0cy5sZW5ndGg7IGkrKykgewotCQkJCWFzc2VydEVxdWFscyhJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb24uUEFVU0VEX1JFRE8sIG9wLmdldEV4ZWN1dGlvblN0YXRlKCkpOwotCQkJCW9wLnJlc3VtZShudWxsLCBudWxsKTsKLQkJCX0KLQkJfQotCQlhc3NlcnRFcXVhbHMoSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uLkNPTVBMRVRFX1JFRE8sIG9wLmdldEV4ZWN1dGlvblN0YXRlKCkpOwotCQljaGVja1Jlc3VsdHMoZXhwZWN0ZWRSZXN1bHRzLCBleHBlY3RlZFBhdXNlT3JkZXIpOwotCQlleGVjdXRpb25MaXN0LmNsZWFyKCk7Ci0JCXBhdXNlTGlzdGVuZXIucGF1c2VkT3BlcmF0aW9ucy5jbGVhcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja1JvbGxCYWNrUmVzdWx0cyhMaXN0IGNhY2hlZEV4ZWN1dGlvbkxpc3QsIFN0cmluZyBbXSBleHBlY3RlZFJlc3VsdHMpIHsKLQkJYXNzZXJ0RXF1YWxzKGNhY2hlZEV4ZWN1dGlvbkxpc3Quc2l6ZSgpICogMiwgZXhlY3V0aW9uTGlzdC5zaXplKCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNhY2hlZEV4ZWN1dGlvbkxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCWFzc2VydEVxdWFscyhleHBlY3RlZFJlc3VsdHNbaV0sIChTdHJpbmcpZXhlY3V0aW9uTGlzdC5nZXQoaSkpOwotCQkJYXNzZXJ0RXF1YWxzKChTdHJpbmcpY2FjaGVkRXhlY3V0aW9uTGlzdC5nZXQoaSksIChTdHJpbmcpIGV4ZWN1dGlvbkxpc3QuZ2V0KGV4ZWN1dGlvbkxpc3Quc2l6ZSgpIC0gMSAtIGkpKTsKLQkJfQotCQlleGVjdXRpb25MaXN0LmNsZWFyKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrUmVzdWx0cyhTdHJpbmdbXSBleHBlY3RlZFJlc3VsdHMsIFN0cmluZ1tdIGV4cGVjdGVkUGF1c2VPcmRlcikgewotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRSZXN1bHRzLmxlbmd0aCwgZXhlY3V0aW9uTGlzdC5zaXplKCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkUmVzdWx0cy5sZW5ndGg7IGkrKykgewotCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkUmVzdWx0c1tpXSwgKFN0cmluZykgZXhlY3V0aW9uTGlzdC5nZXQoaSkpOwotCQl9Ci0JCWlmIChudWxsID09IGV4cGVjdGVkUGF1c2VPcmRlcikgewotCQkJYXNzZXJ0RXF1YWxzKDAsIHBhdXNlTGlzdGVuZXIucGF1c2VkT3BlcmF0aW9ucy5zaXplKCkpOwotCQl9IGVsc2UgewotCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkUGF1c2VPcmRlci5sZW5ndGgsIHBhdXNlTGlzdGVuZXIucGF1c2VkT3BlcmF0aW9ucy5zaXplKCkpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZFBhdXNlT3JkZXIubGVuZ3RoOyBpKyspIHsKLQkJCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRQYXVzZU9yZGVyW2ldLCAoU3RyaW5nKSBwYXVzZUxpc3RlbmVyLnBhdXNlZE9wZXJhdGlvbnMuZ2V0KGkpKTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL2V4dGVuZGVkL0YuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9leHRlbmRlZC9GLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmYjA5OWMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL2V4dGVuZGVkL0YuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzLmV4dGVuZGVkOwotCi1wdWJsaWMgY2xhc3MgRiBleHRlbmRzIEFic3RyYWN0SURhdGFNb2RlbFRlc3RPcGVyYXRpb24gewotCi0JcHVibGljIEYoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvZXh0ZW5kZWQvRy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL2V4dGVuZGVkL0cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAzYjYwOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvZXh0ZW5kZWQvRy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuZXh0ZW5kZWQ7Ci0KLXB1YmxpYyBjbGFzcyBHIGV4dGVuZHMgQWJzdHJhY3RJRGF0YU1vZGVsVGVzdE9wZXJhdGlvbiB7Ci0KLQlwdWJsaWMgRygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9leHRlbmRlZC9ILmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvZXh0ZW5kZWQvSC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjNjY2RkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9leHRlbmRlZC9ILmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0cy5leHRlbmRlZDsKLQotcHVibGljIGNsYXNzIEggZXh0ZW5kcyBBYnN0cmFjdElEYXRhTW9kZWxUZXN0T3BlcmF0aW9uIHsKLQotCXB1YmxpYyBIKCkgewotCQlzdXBlcigpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9leHRlbmRlZC9SLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvZXh0ZW5kZWQvUi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzFlMTRjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9leHRlbmRlZC9SLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0cy5leHRlbmRlZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotCi1wdWJsaWMgY2xhc3MgUiBleHRlbmRzIEFic3RyYWN0SURhdGFNb2RlbFRlc3RPcGVyYXRpb24gewotCi0JcHVibGljIFIoSURhdGFNb2RlbCBkbSl7Ci0JCXN1cGVyKGRtKTsKLQl9Ci0JCi0JcHVibGljIFIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL2V4dGVuZGVkL1Jvb3RETVByb3ZpZGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvZXh0ZW5kZWQvUm9vdERNUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDljYzFkNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvZXh0ZW5kZWQvUm9vdERNUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzLmV4dGVuZGVkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxPcGVyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBSb290RE1Qcm92aWRlciBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXIgewotCi0JcHVibGljIElEYXRhTW9kZWxPcGVyYXRpb24gZ2V0RGVmYXVsdE9wZXJhdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBSKG1vZGVsKTsKLQl9Ci0KLQlwdWJsaWMgSVByb2plY3QgZ2V0VGFyZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdCgiZm9vIik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy90ZXN0cy9idnQvQXV0b21hdGVkQlZULmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy90ZXN0cy9idnQvQXV0b21hdGVkQlZULmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwZWU2ZTAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvdGVzdHMvYnZ0L0F1dG9tYXRlZEJWVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gQXByIDEsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byAKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy50ZXN0cy5idnQ7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbHVnaW5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnRlc3RzLkVudmlyb25tZW50VGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmFydGlmYWN0ZWRpdC50ZXN0cy5BcnRpZmFjdEVkaXRBUElUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuY29tcG9uZW50Y29yZS50ZXN0cy5BbGxUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzLkRhdGFNb2RlbEFQSVRlc3RzOwotCi0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqIAotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBBdXRvbWF0ZWRCVlQgZXh0ZW5kcyBUZXN0U3VpdGUgewotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmFzZURpcmVjdG9yeSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKSArIGphdmEuaW8uRmlsZS5zZXBhcmF0b3JDaGFyICsgIlRlc3REYXRhIiArIGphdmEuaW8uRmlsZS5zZXBhcmF0b3JDaGFyOwotCi0Jc3RhdGljIHsKLQkJdHJ5IHsKLQkJCUlQbHVnaW5EZXNjcmlwdG9yIHBsdWdpbkRlc2NyaXB0b3IgPSBQbGF0Zm9ybS5nZXRQbHVnaW5SZWdpc3RyeSgpLmdldFBsdWdpbkRlc2NyaXB0b3IoIm9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMiKTsKLQkJCVVSTCB1cmwgPSBwbHVnaW5EZXNjcmlwdG9yLmdldEluc3RhbGxVUkwoKTsKLQkJCUF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ID0gUGxhdGZvcm0uYXNMb2NhbFVSTCh1cmwpLmdldEZpbGUoKSArICJUZXN0RGF0YSIgKyBqYXZhLmlvLkZpbGUuc2VwYXJhdG9yQ2hhcjsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbigiVXNpbmcgd29ya2luZyBkaXJlY3Rvcnkgc2luY2UgYSB3b3Jrc3BhY2UgVVJMIGNvdWxkIG5vdCBiZSBsb2NhdGVkLiIpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgdW5pbXBsZW1lbnRlZE1ldGhvZHM7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCXVuaW1wbGVtZW50ZWRNZXRob2RzID0gMDsKLQkJVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci0JCWlmICh1bmltcGxlbWVudGVkTWV0aG9kcyA+IDApIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXG5DYWxscyB0byB3YXJuVW5pbXBsOiAiICsgdW5pbXBsZW1lbnRlZE1ldGhvZHMpOwotCQl9Ci0JfQotCi0JcHVibGljIEF1dG9tYXRlZEJWVCgpIHsKLQkJc3VwZXIoKTsKLQkJVGVzdFN1aXRlIHN1aXRlID0gKFRlc3RTdWl0ZSkgQXV0b21hdGVkQlZULnN1aXRlKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc3VpdGUudGVzdENvdW50KCk7IGkrKykgewotCQkJYWRkVGVzdChzdWl0ZS50ZXN0QXQoaSkpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCJUZXN0IGZvciBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3QuYnZ0Iik7Ci0JCXN1aXRlLmFkZFRlc3QoQWxsVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoRGF0YU1vZGVsQVBJVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoQXJ0aWZhY3RFZGl0QVBJVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoRW52aXJvbm1lbnRUZXN0cy5zdWl0ZSgpKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL3Rlc3RzL2J2dC9BdXRvbWF0ZWRCVlRFY2xpcHNlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy90ZXN0cy9idnQvQXV0b21hdGVkQlZURWNsaXBzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjE2MjNlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL3Rlc3RzL2J2dC9BdXRvbWF0ZWRCVlRFY2xpcHNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMjUsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy50ZXN0cy5idnQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGx1Z2luRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBBdXRvbWF0ZWRCVlRFY2xpcHNlIGV4dGVuZHMgQXV0b21hdGVkQlZUIHsKLQkKLQlwdWJsaWMgQXV0b21hdGVkQlZURWNsaXBzZSgpewotCQlzdXBlcigpOwotCQlJUGx1Z2luRGVzY3JpcHRvciBwbHVnaW5EZXNjcmlwdG9yID0gUGxhdGZvcm0uZ2V0UGx1Z2luUmVnaXN0cnkoKS5nZXRQbHVnaW5EZXNjcmlwdG9yKCJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzIik7Ci0gICAgICAgIFVSTCB1cmwgPSBwbHVnaW5EZXNjcmlwdG9yLmdldEluc3RhbGxVUkwoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgCUF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ID0gUGxhdGZvcm0uYXNMb2NhbFVSTCh1cmwpLmdldEZpbGUoKSArICJUZXN0RGF0YSIrIGphdmEuaW8uRmlsZS5zZXBhcmF0b3JDaGFyOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9wbHVnaW4ucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwOWJkYjkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1Byb3BlcnRpZXMgZmlsZSBmb3Igb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cwotQnVuZGxlLVZlbmRvci4wID0gRWNsaXBzZS5vcmcKLUJ1bmRsZS1OYW1lLjAgPSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9wbHVnaW4ueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDU0MzJjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJEYXRhTW9kZWxWZXJpZmllciIgbmFtZT0iRGF0YSBNb2RlbCBWZXJpZmllciBGYWN0b3J5IEV4dGVuc2lvbiIgc2NoZW1hPSJzY2hlbWEvZGF0YU1vZGVsVmVyaWZpZXIuZXhzZCIvPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3Iuc3VpdGVzIj4KLSAgICAgICAgIDxzdWl0ZQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuRGF0YU1vZGVsQVBJVGVzdHMiCi0gICAgICAgICAgICBuYW1lPSJJRGF0YU1vZGVsIEFQSSBUZXN0cyI+Ci0gICAgICAgICA8L3N1aXRlPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLkRhdGFNb2RlbFByb3ZpZGVyRXh0ZW5zaW9uIj4KLSAgICAgIDxEYXRhTW9kZWxQcm92aWRlcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuVGVzdERhdGFNb2RlbFByb3ZpZGVyIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuSVRlc3REYXRhTW9kZWwiLz4KLSAgICAgIDxEYXRhTW9kZWxQcm92aWRlcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5vcGVyYXRpb25zLnRlc3RzLm1hbmFnZXIuVGVzdFByb3ZpZGVyMSIKLSAgICAgICAgICAgIGlkPSJ0ZXN0cHJvdmlkZXIxIi8+Ci0gICAgICA8RGF0YU1vZGVsUHJvdmlkZXIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mub3BlcmF0aW9ucy50ZXN0cy5tYW5hZ2VyLlRlc3RQcm92aWRlcjIiCi0gICAgICAgICAgICBpZD0idGVzdHByb3ZpZGVyMiIvPgotICAgICAgPERhdGFNb2RlbFByb3ZpZGVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLm9wZXJhdGlvbnMudGVzdHMubWFuYWdlci5UZXN0RXh0ZW5kZWRQcm92aWRlciIKLSAgICAgICAgICAgIGlkPSJ0ZXN0RXh0ZW5kZWRQcm92aWRlciIvPgotICAgICAgPERhdGFNb2RlbFByb3ZpZGVyCi0gICAgICAgICAgICBjbGFzcz0iYm9ndXNDbGFzcyIKLSAgICAgICAgICAgIGlkPSJib2d1cyIvPgotICAgICAgPFByb3ZpZGVyRGVmaW5lc1R5cGUKLSAgICAgIAkJcHJvdmlkZXJUeXBlPSJ0ZXN0UHJvdmlkZXJCYXNlIgotICAgICAgCQlwcm92aWRlcklEPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzLklUZXN0RGF0YU1vZGVsIi8+Ci0gICAgICA8UHJvdmlkZXJEZWZpbmVzVHlwZQotICAgICAgCQlwcm92aWRlclR5cGU9InRlc3RQcm92aWRlckJvZ3VzIgotICAgICAgCQlwcm92aWRlcklEPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzLklUZXN0RGF0YU1vZGVsIi8+Ci0gICAgICA8UHJvdmlkZXJJbXBsZW1lbnRzVHlwZQotICAgICAgCQlwcm92aWRlclR5cGU9InRlc3RQcm92aWRlckJvZ3VzIgotICAgICAgCQlwcm92aWRlcklEPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzLklUZXN0RGF0YU1vZGVsQm9ndXMiLz4JCQotICAgICAgPFByb3ZpZGVySW1wbGVtZW50c1R5cGUKLSAgICAgIAkJcHJvdmlkZXJUeXBlPSJ0ZXN0UHJvdmlkZXJCb2d1cyIKLSAgICAgIAkJcHJvdmlkZXJJRD0iZmFrZS5ub25yZWdpc3RlcmVkLmZ1bmN0aW9uZ3JvdXAuSVRlc3REYXRhTW9kZWwiCi0JIC8+CSAgIAkJCi0JICA8IS0tIFRlc3QgZm9yIGluY29tcGxldGUgaWQncywgY2xhc3NlcycgYW5kIGR1cGxpY2F0ZXMKLSAgICAgIDxEYXRhTW9kZWxQcm92aWRlcgotICAgICAgICAgICAgY2xhc3M9IiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzLklUZXN0RGF0YU1vZGVsIi8+Ci0gICAgICA8RGF0YU1vZGVsUHJvdmlkZXIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzLlRlc3REYXRhTW9kZWxQcm92aWRlciIKLSAgICAgICAgICAgIGlkPSIiLz4KLSAgICAgIDxEYXRhTW9kZWxQcm92aWRlcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuVGVzdERhdGFNb2RlbFByb3ZpZGVyIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuSVRlc3REYXRhTW9kZWwiLz4KLSAgICAgIC0tPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3Iuc3VpdGVzIj4KLSAgICAgIDxzdWl0ZQotICAgICAgICAgICAgY2xhc3M9IiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudGVzdHMuYnZ0LkF1dG9tYXRlZEJWVCIKLSAgICAgICAgICAgIG5hbWU9IkNvbW1vbiBGcmFtZXdvcmsgQlZUIFRlc3RzIi8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPCEtLQotICAgCQlBIHBpY3R1cmUgb2YgdGhlIG9wZXJhdGlvbiB0cmVlCi0gICAKLSAgICAgICAgICAgICAgICAgICAgICAgIFIKLSAgICAgICAgICAgICAgICAgICAgICAgLyBcCi0gICAgICAgICAgICAgICAgICAgICAgLyAgIFwKLSAgICAgICAgICAgICAgICAgICAgIC8gICAgIFwKLSAgICAgICAgICAgICAgICAgICAgQSAgICAgICBCCi0gICAgICAgICAgICAgICAgICAgLyBcICAgICAvIFwKLSAgICAgICAgICAgICAgICAgIC8gICBcICAgLyAgIFwKLSAgICAgICAgICAgICAgICAgQyAgICAgRCBFICAgICBGCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEcKLSAgIC0tPgotICAgCi0gIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuT3BlcmF0aW9uRXh0ZW5zaW9uIgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuZXh0ZW5kZWQiPgotICAgICAgPG9wZXJhdGlvbkV4dGVuc2lvbgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuZXh0ZW5kZWQuUiIKLSAgICAgICAgICAgIHBvc3RPcGVyYXRpb25DbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0cy5leHRlbmRlZC5CIgotICAgICAgICAgICAgcHJlT3BlcmF0aW9uQ2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuZXh0ZW5kZWQuQSIvPgotICAgICAgPG9wZXJhdGlvbkV4dGVuc2lvbgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuZXh0ZW5kZWQuQSIKLSAgICAgICAgICAgIHBvc3RPcGVyYXRpb25DbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0cy5leHRlbmRlZC5EIgotICAgICAgICAgICAgcHJlT3BlcmF0aW9uQ2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuZXh0ZW5kZWQuQyIvPgotICAgICAgPG9wZXJhdGlvbkV4dGVuc2lvbgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuZXh0ZW5kZWQuQiIKLSAgICAgICAgICAgIHBvc3RPcGVyYXRpb25DbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0cy5leHRlbmRlZC5GIgotICAgICAgICAgICAgcHJlT3BlcmF0aW9uQ2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuZXh0ZW5kZWQuRSIvPgotICAgICAgPG9wZXJhdGlvbkV4dGVuc2lvbgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuZXh0ZW5kZWQuRiIKLSAgICAgICAgICAgIHBvc3RPcGVyYXRpb25DbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0cy5leHRlbmRlZC5IIi8+Ci0gICAgICA8b3BlcmF0aW9uRXh0ZW5zaW9uCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0cy5leHRlbmRlZC5IIgotICAgICAgICAgICAgcHJlT3BlcmF0aW9uQ2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuZXh0ZW5kZWQuRyIvPgotICAgICAgPG9wZXJhdGlvbkV4dGVuc2lvbgotICAgICAgICAgICAgaWQ9IkFQcmUyIgotICAgICAgICAgICAgcHJlT3BlcmF0aW9uQ2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5vcGVyYXRpb25zLnRlc3RzLm1hbmFnZXIuVGVzdEV4dGVuZGVkT3BlcmF0aW9uIi8+Ci0gICAgICA8b3BlcmF0aW9uRXh0ZW5zaW9uCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0cy5leHRlbmRlZC5IIi8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgCi0gICA8IS0tIFVuY29tbWVudCB0aGUgYmVsb3cgaG9vayB0byB0ZXN0IHNwZWNpZmljIG9wZXJhdGlvbiBleHRlbnNpb24gaWRzIHdoZW4gbmVlZGVkIC0tPgotICAgPCEtLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5PcGVyYXRpb25FeHRlbnNpb24iCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0cy5leHRlbmRlZCI+Ci0gICAgICA8b3BlcmF0aW9uRXh0ZW5zaW9uCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLmFyY2hpdmUub3BlcmF0aW9ucy5XZWJDb21wb25lbnRFeHBvcnRPcGVyYXRpb24iCi0gICAgICAgICAgICBwcmVPcGVyYXRpb25DbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0cy5IZWxsb1ByZU9wZXJhdGlvbkV4dGVuc2lvbiIKLSAgICAgICAgICAgIHBvc3RPcGVyYXRpb25DbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0cy5IZWxsb1Bvc3RPcGVyYXRpb25FeHRlbnNpb24iLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgLS0+Ci0gIAotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL3NjaGVtYS9kYXRhTW9kZWxWZXJpZmllci5leHNkIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9zY2hlbWEvZGF0YU1vZGVsVmVyaWZpZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTYyMjhhNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL3NjaGVtYS9kYXRhTW9kZWxWZXJpZmllci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cyI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cyIgaWQ9ImRhdGFNb2RlbFZlcmlmaWVyIiBuYW1lPSJEYXRhIE1vZGVsIFZlcmlmaWVyIEZhY3RvcnkgRXh0ZW5zaW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBkZXNjcmlwdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJkYXRhTW9kZWxWZXJpZmVyTGlzdCI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Imxpc3RDbGFzcyIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvdGVzdC54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL3Rlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzFlNDEyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvdGVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPHByb2plY3QgbmFtZT0idGVzdHN1aXRlIiBkZWZhdWx0PSJydW4iIGJhc2VkaXI9Ii4iPgotICA8IS0tIFRoZSBwcm9wZXJ0eSAke2VjbGlwc2UtaG9tZX0gc2hvdWxkIGJlIHBhc3NlZCBpbnRvIHRoaXMgc2NyaXB0IC0tPgotICA8IS0tIFNldCBhIG1lYW5pbmdmdWwgZGVmYXVsdCB2YWx1ZSBmb3Igd2hlbiBpdCBpcyBub3QuIC0tPgotICA8cHJvcGVydHkgbmFtZT0iZWNsaXBzZS1ob21lIiB2YWx1ZT0iJHtiYXNlZGlyfVwuLlwuLiIvPgotCi0gIDwhLS0gc2V0cyB0aGUgcHJvcGVydGllcyBlY2xpcHNlLWhvbWUsIGFuZCBsaWJyYXJ5LWZpbGUgLS0+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImxpYnJhcnktZmlsZSIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zL29yZy5lY2xpcHNlLnRlc3RfMy4xLjAvbGlicmFyeS54bWwiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImV4dHJhVk1hcmdzIiB2YWx1ZT0iLURvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmpvbmFzLjQzMj0ke2pvbmFzNDMyRGlyfSIvPiAKLSAgICAgICAgICAgIAotICA8cHJvcGVydHkgbmFtZT0id29ya3NwYWNlIiB2YWx1ZT0iJHtiYXNlZGlyfS8ke3BsdWdpbi1uYW1lfSIvPgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgYWxsIGluaXRpYWxpemF0aW9uIGNvZGUgdGhhdCBuZWVkcyB0byBiZSBkb25lIGZvciAtLT4KLSAgPCEtLSBhbGwgdGVzdHMgdGhhdCBhcmUgdG8gYmUgcnVuLiBJbml0aWFsaXphdGlvbiBmb3IgaW5kaXZpZHVhbCB0ZXN0cyAtLT4KLSAgPCEtLSBzaG91bGQgYmUgZG9uZSB3aXRoaW4gdGhlIGJvZHkgb2YgdGhlIHN1aXRlIHRhcmdldC4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0gICAgPHRzdGFtcC8+Ci0gICAgPGRlbGV0ZT4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtlY2xpcHNlLWhvbWV9IiBpbmNsdWRlcz0ib3JnKi54bWwiLz4KLSAgICA8L2RlbGV0ZT4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBkZWZpbmVzIHRoZSB0ZXN0cyB0aGF0IG5lZWQgdG8gYmUgcnVuLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJzdWl0ZSI+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7d29ya3NwYWNlfSIgcXVpZXQ9InRydWUiLz4KLSAgICAKLSAgICA8YW50IHRhcmdldD0iY29yZS10ZXN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkYXRhLWRpciIgdmFsdWU9IiR7d29ya3NwYWNlfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc25hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudGVzdHMuYnZ0LkF1dG9tYXRlZEJWVCIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImV4dHJhVk1hcmdzIiB2YWx1ZT0iJHtleHRyYVZNYXJnc30iLz4KLSAgICA8L2FudD4KLSAgPC90YXJnZXQ+Ci0gICAgCi0gIDwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgY29kZSB0byBjbGVhbnVwIHRoZSB0ZXN0aW5nIGVudmlyb25tZW50IGFmdGVyIC0tPgotICA8IS0tIGFmdGVyIGFsbCBvZiB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1bi4gWW91IGNhbiB1c2UgdGhpcyB0YXJnZXQgdG8gLS0+Ci0gIDwhLS0gZGVsZXRlIHRlbXBvcmFyeSBmaWxlcyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJjbGVhbnVwIj4KLQk8ZGVsZXRlIGRpcj0iJHt3b3Jrc3BhY2V9IiBxdWlldD0idHJ1ZSIvPgotICA8L3RhcmdldD4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IHJ1bnMgdGhlIHRlc3Qgc3VpdGUuIEFueSBhY3Rpb25zIHRoYXQgbmVlZCB0byBoYXBwZW4gLS0+Ci0gIDwhLS0gYWZ0ZXIgYWxsIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuIHNob3VsZCBnbyBoZXJlLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJydW4iIGRlcGVuZHM9ImluaXQsc3VpdGUsY2xlYW51cCI+Ci0gICAgPGFudCB0YXJnZXQ9ImNvbGxlY3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImluY2x1ZGVzIiB2YWx1ZT0ib3JnKi54bWwiLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvdXRwdXQtZmlsZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9LnhtbCIvPgotICAgIDwvYW50PgotICA8L3RhcmdldD4KLQotPC9wcm9qZWN0PgotCi0KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy90ZXN0RGF0YS9UZXN0QXJ0aWZhY3RFZGl0LnppcCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvdGVzdERhdGEvVGVzdEFydGlmYWN0RWRpdC56aXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2N2NlMjIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy90ZXN0RGF0YS9UZXN0QXJ0aWZhY3RFZGl0LnppcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvdGVzdERhdGEvVGVzdFZpcnR1YWxBUEkuemlwIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy90ZXN0RGF0YS9UZXN0VmlydHVhbEFQSS56aXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMjJkNDguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy90ZXN0RGF0YS9UZXN0VmlydHVhbEFQSS56aXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL3Rlc3REYXRhL2Jhc2VEYXRhXzAxLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvdGVzdERhdGEvYmFzZURhdGFfMDEueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDgzNzY2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvdGVzdERhdGEvYmFzZURhdGFfMDEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBhcHBsaWNhdGlvbiBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKMkVFIEFwcGxpY2F0aW9uIDEuMy8vRU4iICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9hcHBsaWNhdGlvbl8xXzMuZHRkIj4KLTxhcHBsaWNhdGlvbiBpZD0iQXBwbGljYXRpb25fSUQiPgotCTxkaXNwbGF5LW5hbWU+dGVzdDwvZGlzcGxheS1uYW1lPgotCTxtb2R1bGUgaWQ9IkphdmFDbGllbnRNb2R1bGVfMTA0OTEzOTg0OTc3MiI+Ci0JCTxqYXZhPnRlc3RDbGllbnQuamFyPC9qYXZhPgotCTwvbW9kdWxlPgotCTxtb2R1bGUgaWQ9IkVqYk1vZHVsZV8xMDQ5MTM5ODQ5NzgyIj4KLQkJPGVqYj50ZXN0RUpCLmphcjwvZWpiPgotCTwvbW9kdWxlPgotCTxtb2R1bGUgaWQ9IldlYk1vZHVsZV8xMDQ5MTM5ODQ5ODEyIj4KLQkJPHdlYj4KLQkJCTx3ZWItdXJpPnRlc3RXZWIud2FyPC93ZWItdXJpPgotCQkJPGNvbnRleHQtcm9vdD50ZXN0V2ViPC9jb250ZXh0LXJvb3Q+Ci0JCTwvd2ViPgotCTwvbW9kdWxlPgotPC9hcHBsaWNhdGlvbj4KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy90ZXN0RGF0YS9lcXVhbFRvXzAxX2Nhc2VfMDEueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy90ZXN0RGF0YS9lcXVhbFRvXzAxX2Nhc2VfMDEueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzljNjJlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvdGVzdERhdGEvZXF1YWxUb18wMV9jYXNlXzAxLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBhcHBsaWNhdGlvbiBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKMkVFIEFwcGxpY2F0aW9uIDEuMy8vRU4iICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9hcHBsaWNhdGlvbl8xXzMuZHRkIj4KLTxhcHBsaWNhdGlvbiBpZD0iQXBwbGljYXRpb25fSUQiPgotCTxkaXNwbGF5LW5hbWU+dGVzdDwvZGlzcGxheS1uYW1lPjxtb2R1bGUgaWQ9IkphdmFDbGllbnRNb2R1bGVfMTA0OTEzOTg0OTc3MiI+PGphdmE+dGVzdENsaWVudC5qYXI8L2phdmE+PC9tb2R1bGU+Ci0JPG1vZHVsZSBpZD0iRWpiTW9kdWxlXzEwNDkxMzk4NDk3ODIiPjxlamI+dGVzdEVKQi5qYXI8L2VqYj48L21vZHVsZT48bW9kdWxlIGlkPSJXZWJNb2R1bGVfMTA0OTEzOTg0OTgxMiI+PHdlYj48d2ViLXVyaT50ZXN0V2ViLndhcjwvd2ViLXVyaT48Y29udGV4dC1yb290PnRlc3RXZWI8L2NvbnRleHQtcm9vdD48L3dlYj48L21vZHVsZT48L2FwcGxpY2F0aW9uPgotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL3Rlc3REYXRhL2VxdWFsVG9fMDFfY2FzZV8wMi54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL3Rlc3REYXRhL2VxdWFsVG9fMDFfY2FzZV8wMi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiZmY3NDUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy90ZXN0RGF0YS9lcXVhbFRvXzAxX2Nhc2VfMDIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBhcHBsaWNhdGlvbiBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKMkVFIEFwcGxpY2F0aW9uIDEuMy8vRU4iICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9hcHBsaWNhdGlvbl8xXzMuZHRkIj4KLTxhcHBsaWNhdGlvbiBpZD0iQXBwbGljYXRpb25fSUQKLSI+ICA8IS0tIGEgY29tbWVudCB0byBpZ25vcmUKLQotCi0KLSAgICAtLT4KLQk8ZGlzcGxheS1uYW1lPgotICAgIHRlc3Q8L2Rpc3BsYXktbmFtZT48bW9kdWxlIGlkPSIKLSAgICBKYXZhQ2xpZW50TW9kdWxlXzEwNDkxMzk4NDk3NzIKLSAgICAiPjxqYXZhPnRlc3RDbGllbnQuamFyPC9qYXZhPjwvbW9kdWxlPjwhLS0gYSBjb21tZW50IHRvIGlnbm9yZSAtLT4KLQk8bW9kdWxlIGlkPSJFamJNb2R1bGVfMTA0OTEzOTg0OTc4MiI+PGVqYj50ZXN0RUpCLmphcjwvZWpiPjwvbW9kdWxlPjxtb2R1bGUgaWQ9IldlYk1vZHVsZV8xMDQ5MTM5ODQ5ODEyCi0gICAgIj48d2ViPjx3ZWItdXJpPnRlc3RXZWIud2FyPC93ZWItdXJpPjxjb250ZXh0LXJvb3Q+dGVzdFdlYjwvY29udGV4dC1yb290Pjwvd2ViPjwvbW9kdWxlPjwvYXBwbGljYXRpb24+Ci0gICAgICAgPCEtLSBhIGNvbW1lbnQgdG8gaWdub3JlIC0tPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy90ZXN0RGF0YS91bmVxdWFsVG9fMDFfY2FzZV8wMS54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL3Rlc3REYXRhL3VuZXF1YWxUb18wMV9jYXNlXzAxLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QxMDQwYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL3Rlc3REYXRhL3VuZXF1YWxUb18wMV9jYXNlXzAxLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgYXBwbGljYXRpb24gUFVCTElDICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSjJFRSBBcHBsaWNhdGlvbiAxLjMvL0VOIiAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvYXBwbGljYXRpb25fMV8zLmR0ZCI+Ci08YXBwbGljYXRpb24gaWQ9IkFwcGxpY2F0aW9uX0lEIj4KLQk8ZGlzcGxheS1uYW1lPnRlc3Q8L2Rpc3BsYXktbmFtZT4KLQk8bW9kdWxlIGlkPSJKYXZhQ2xpZW50TW9kdWxlXzEwNDkxMzk4NDk3NyI+Ci0JCTxqYXZhPnRlc3RDbGllbnQuamFyPC9qYXZhPgotCTwvbW9kdWxlPgotCTxtb2R1bGUgaWQ9IkVqYk1vZHVsZV8xMDQ5MTM5ODQ5NzgyIj4KLQkJPGVqYj50ZXN0RUpCLmphcjwvZWpiPgotCTwvbW9kdWxlPgotCTxtb2R1bGUgaWQ9IldlYk1vZHVsZV8xMDQ5MTM5ODQ5ODEyIj4KLQkJPHdlYj4KLQkJCTx3ZWItdXJpPnRlc3RXZWIud2FyPC93ZWItdXJpPgotCQkJPGNvbnRleHQtcm9vdD50ZXN0V2ViPC9jb250ZXh0LXJvb3Q+Ci0JCTwvd2ViPgotCTwvbW9kdWxlPgotPC9hcHBsaWNhdGlvbj4KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy90ZXN0RGF0YS91bmVxdWFsVG9fMDFfY2FzZV8wMi54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL3Rlc3REYXRhL3VuZXF1YWxUb18wMV9jYXNlXzAyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZlYTAyOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL3Rlc3REYXRhL3VuZXF1YWxUb18wMV9jYXNlXzAyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgYXBwbGljYXRpb24gUFVCTElDICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSjJFRSBBcHBsaWNhdGlvbiAxLjMvL0VOIiAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvYXBwbGljYXRpb25fMV8zLmR0ZCI+Ci08YXBwbGljYXRpb24gaWQ9IkFwcGxpY2F0aW9uX0lEIj4KLQk8ZGlzcGxheS1uYW1lPnRlc3Q8L2Rpc3BsYXktbmFtZT4KLQk8bW9kdWxlIGlkPSJKYXZhQ2xpZW50TW9kdWxlXzEwNDkxMzk4NDk3NzIiPgotCQk8amF2YT50ZXN0Q2xpZW50LmphcjwvamF2YT4KLQk8L21vZHVsZT4KLQk8bW9kdWxlIGlkPSJFamJNb2R1bGVfMTA0OTEzOTg0OTc4MiI+Ci0JCTxlamI+dGVzdEVKQi5qYXI8L2VqYj4KLQk8L21vZHVsZT4KLQk8bW9kdWxlIGlkPSJXZWJNb2R1bGVfMTA0OTEzOTg0OTgxMiI+Ci0JCTx3ZWI+Ci0JCQk8Y29udGV4dC1yb290PnRlc3RXZWI8L2NvbnRleHQtcm9vdD4KLQkJPC93ZWI+Ci0JPC9tb2R1bGU+Ci08L2FwcGxpY2F0aW9uPgotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL3Rlc3REYXRhL3VuZXF1YWxUb18wMV9jYXNlXzAzLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvdGVzdERhdGEvdW5lcXVhbFRvXzAxX2Nhc2VfMDMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjI5YzJlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvdGVzdERhdGEvdW5lcXVhbFRvXzAxX2Nhc2VfMDMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBhcHBsaWNhdGlvbiBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKMkVFIEFwcGxpY2F0aW9uIDEuMy8vRU4iICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9hcHBsaWNhdGlvbl8xXzMuZHRkIj4KLTxhcHBsaWNhdGlvbiBpZD0iQXBwbGljYXRpb25fSUQiPgotCTxkaXNwbGF5LW5hbWU+dGVzdDwvZGlzcGxheS1uYW1lPgotCTxtb2R1bGUgaWQ9IkphdmFDbGllbnRNb2R1bGVfMTA0OTEzOTg0OTc3MiI+Ci0JCTxqYXZhPnRlc3RDbGllbnQuamFyPC9qYXZhPgotCTwvbW9kdWxlPgotCTxtb2R1bGUgaWQ9IkVqYk1vZHVsZV8xMDQ5MTM5ODQ5NzgyIj4KLQkJPGVqYj50ZXN0RUpCPC9lamI+Ci0JPC9tb2R1bGU+Ci0JPG1vZHVsZSBpZD0iV2ViTW9kdWxlXzEwNDkxMzk4NDk4MTIiPgotCQk8d2ViPgotCQkJPHdlYi11cmk+dGVzdFdlYi53YXI8L3dlYi11cmk+Ci0JCQk8Y29udGV4dC1yb290PnRlc3RXZWI8L2NvbnRleHQtcm9vdD4KLQkJPC93ZWI+Ci0JPC9tb2R1bGU+Ci08L2FwcGxpY2F0aW9uPgotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL3Rlc3REYXRhL3VuZXF1YWxUb18wMV9jYXNlXzA0LnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvdGVzdERhdGEvdW5lcXVhbFRvXzAxX2Nhc2VfMDQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDBiZDAzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvdGVzdERhdGEvdW5lcXVhbFRvXzAxX2Nhc2VfMDQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBhcHBsaWNhdGlvbiBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMgSW5jLi8vRFREIEoyRUUgQXBwbGljYXRpb24gMS4zLy9FTiIgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2FwcGxpY2F0aW9uXzFfMy5kdGQiPgotPGFwcGxpY2F0aW9uIGlkPSJBcHBsaWNhdGlvbl9JRCI+Ci0JPGRpc3BsYXktbmFtZT50ZXN0PC9kaXNwbGF5LW5hbWU+Ci0JPG1vZHVsZSBpZD0iSmF2YUNsaWVudE1vZHVsZV8xMDQ5MTM5ODQ5NzcyIj4KLQkJPGphdmE+dGVzdENsaWVudC5qYXI8L2phdmE+Ci0JPC9tb2R1bGU+Ci0JPG1vZHVsZSBpZD0iRWpiTW9kdWxlXzEwNDkxMzk4NDk3ODIiPgotCQk8ZWpiPnRlc3RFSkIuamFyPC9lamI+Ci0JPC9tb2R1bGU+Ci0JPG1vZHVsZSBpZD0iV2ViTW9kdWxlXzEwNDkxMzk4NDk4MTIiPgotCQk8d2ViPgotCQkJPHdlYi11cmk+dGVzdFdlYi53YXI8L3dlYi11cmk+Ci0JCQk8Y29udGV4dC1yb290PnRlc3RXZWI8L2NvbnRleHQtcm9vdD4KLQkJPC93ZWI+Ci0JPC9tb2R1bGU+Ci08L2FwcGxpY2F0aW9uPgotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL3Rlc3REYXRhL3VuZXF1YWxUb18wMV9jYXNlXzA1LnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvdGVzdERhdGEvdW5lcXVhbFRvXzAxX2Nhc2VfMDUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzZiOGJmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvdGVzdERhdGEvdW5lcXVhbFRvXzAxX2Nhc2VfMDUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLSI/PgotPCFET0NUWVBFIGFwcGxpY2F0aW9uIFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEoyRUUgQXBwbGljYXRpb24gMS4zLy9FTiIgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2FwcGxpY2F0aW9uXzFfMy5kdGQiPgotPGFwcGxpY2F0aW9uIGlkPSJBcHBsaWNhdGlvbl9JRCI+Ci0JPGRpc3BsYXktbmFtZT50ZXN0PC9kaXNwbGF5LW5hbWU+Ci0JPG1vZHVsZSBpZD0iSmF2YUNsaWVudE1vZHVsZV8xMDQ5MTM5ODQ5NzcyIj4KLQkJPGphdmE+dGVzdENsaWVudC5qYXI8L2phdmE+Ci0JPC9tb2R1bGU+Ci0JPG1vZHVsZSBpZD0iRWpiTW9kdWxlXzEwNDkxMzk4NDk3ODIiPgotCQk8ZWpiPnRlc3RFSkIuamFyPC9lamI+Ci0JPC9tb2R1bGU+Ci0JPG1vZHVsZSBpZD0iV2ViTW9kdWxlXzEwNDkxMzk4NDk4MTIiPgotCQk8d2ViPgotCQkJPHdlYi11cmk+dGVzdFdlYi53YXI8L3dlYi11cmk+Ci0JCQk8Y29udGV4dC1yb290PnRlc3RXZWI8L2NvbnRleHQtcm9vdD4KLQkJPC93ZWI+Ci0JPC9tb2R1bGU+Ci08L2FwcGxpY2F0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLnRlc3RzLy5jbGFzc3BhdGggYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U3MzkzMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvLmN2c2lnbm9yZSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS50ZXN0cy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Nzk2OGJkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS50ZXN0cy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotdGVtcC5mb2xkZXIKLXRlc3RzLmphcgotamF2YUNvbXBpbGVyLnRlc3RzLmphci5hcmdzCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvLnByb2plY3QgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNGIwNjcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLnRlc3RzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLnRlc3RzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGViYWE3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNTdW4gSnVuIDAzIDAwOjM0OjA5IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNDRmNTcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS50ZXN0cwotQnVuZGxlLVZlcnNpb246IDEuMC4xLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzUGF0aDogdGVzdHMuamFyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMuaW50ZXJuYWwuQ2FjaGVUZXN0c1BsdWdpbgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5qdW5pdDtidW5kbGUtdmVyc2lvbj0iWzMuOC4yLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLnRlc3RzLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNAotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLnRlc3RzL2Fib3V0Lmh0bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdlMzdjNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotc291cmNlLnRlc3RzLmphciA9IHNyYy8KLW91dHB1dC50ZXN0cy5qYXIgPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgdGVzdHMuamFyLFwKLSAgICAgICAgICAgICAgIHRlc3QueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLXNyYy5pbmNsdWRlcyA9IGJ1aWxkLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVlNDhiNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSMgcHJvcGVydGllcyBmaWxlIGZvciBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMKLUJ1bmRsZS1WZW5kb3IuMCA9IEVjbGlwc2UKLUJ1bmRsZS1OYW1lLjAgPSBDYWNoZSBUZXN0cyBQbHVnLWluClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvQ2FjaGVFbnRyeVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0NhY2hlRW50cnlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5ODMwOGMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvQ2FjaGVFbnRyeVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogVGVzdHMgZm9yIHRoZSBDYWNoZUVudHJ5IGNsYXNzLgotICovCi1wdWJsaWMgY2xhc3MgQ2FjaGVFbnRyeVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZQotewotCS8qKgotCSAgKiBDcmVhdGUgYSB0ZXN0cyBzdWl0ZSBmcm9tIHRoaXMgdGVzdCBjbGFzcy4KLQkgICogCi0JICAqIEByZXR1cm4gQSB0ZXN0IHN1aXRlIGNvbnRhaW5pbmcgdGhpcyB0ZXN0IGNsYXNzLgotCSAgKi8KLQkgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0JICB7Ci0JICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKENhY2hlRW50cnlUZXN0LmNsYXNzKTsKLQkgIH0KLQkKLQkvKioKLQkgKiBUZXN0IHRoYXQgdGhlIGVudHJ5IGlzIG5vdCBjb25zaWRlcmVkIGV4cGlyZWQgd2hlbiAtMSBpcyBzcGVjaWZpZWQuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdE5vdEV4cGlyZWRXaGVuTWludXNPbmUoKQotCXsKLQkJQ2FjaGVFbnRyeSBjYWNoZUVudHJ5ID0gbmV3IENhY2hlRW50cnkobnVsbCwgbnVsbCwgMCwgLTEpOwotCQlhc3NlcnRGYWxzZSgiVGhlIGNhY2hlIGVudHJ5IGlzIGV4cGlyZWQgd2hlbiAtMSBpcyBzcGVjaWZpZWQuIiwgY2FjaGVFbnRyeS5oYXNFeHBpcmVkKCkpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0IHRoYXQgdGhlIGVudHJ5IGlzIG5vdCBjb25zaWRlcmVkIGV4cGlyZWQgd2hlbiB0aGUgc2V0IGV4cGlyYXRpb24KLQkgKiB0aW1lIGlzIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCBzeXN0ZW0gdGltZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0Tm90RXhwaXJlZFdoZW5HcmVhdGVyVGhhblN5c3RlbVRpbWUoKQotCXsKLQkJQ2FjaGVFbnRyeSBjYWNoZUVudHJ5ID0gbmV3IENhY2hlRW50cnkobnVsbCwgbnVsbCwgMCwgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyA2MDAwMCk7Ci0JCWFzc2VydEZhbHNlKCJUaGUgY2FjaGUgZW50cnkgaXMgZXhwaXJlZCB3aGVuIGdyZWF0ZXIgdGhhbiB0aGUgY3Vycm5ldCBzeXN0ZW0gdGltZS4iLCBjYWNoZUVudHJ5Lmhhc0V4cGlyZWQoKSk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3QgdGhhdCB0aGUgZW50cnkgaXMgY29uc2lkZXJlZCBleHBpcmVkIHdoZW4gdGhlIHNldCBleHBpcmF0aW9uCi0JICogdGltZSBpcyBsZXNzIHRoYW4gdGhlIGN1cnJlbnQgc3lzdGVtIHRpbWUuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEV4cGlyZWRXaGVuTGVzc1RoYW5TeXN0ZW1UaW1lKCkKLQl7Ci0JCUNhY2hlRW50cnkgY2FjaGVFbnRyeSA9IG5ldyBDYWNoZUVudHJ5KG51bGwsIG51bGwsIDAsIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gNjAwMDApOwotCQlhc3NlcnRUcnVlKCJUaGUgY2FjaGUgZW50cnkgaXMgbm90IGV4cGlyZWQgd2hlbiBsZXNzIHRoYW4gdGhlIGN1cnJuZXQgc3lzdGVtIHRpbWUuIiwgY2FjaGVFbnRyeS5oYXNFeHBpcmVkKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0NhY2hlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvQ2FjaGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5ZjQ5NmYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvQ2FjaGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBUZXN0cyBmb3IgdGhlIENhY2hlIGNsYXNzLgotICovCi1wdWJsaWMgY2xhc3MgQ2FjaGVUZXN0IGV4dGVuZHMgVGVzdENhc2UKLXsKLQlwcml2YXRlIENhY2hlIGNhY2hlOwotCQotCS8qKgotCSAgKiBDcmVhdGUgYSB0ZXN0cyBzdWl0ZSBmcm9tIHRoaXMgdGVzdCBjbGFzcy4KLQkgICogCi0JICAqIEByZXR1cm4gQSB0ZXN0IHN1aXRlIGNvbnRhaW5pbmcgdGhpcyB0ZXN0IGNsYXNzLgotCSAgKi8KLQkgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0JICB7Ci0JICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKENhY2hlVGVzdC5jbGFzcyk7Ci0JICB9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQljYWNoZSA9IENhY2hlLmdldEluc3RhbmNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogVGVzdCB0cnlpbmcgdG8gY2FjaGUgYSByZXNvdXJjZSB0aGF0IGRvZXNuJ3QgZXhpc3QKLQkgKiBvbiBhIHNlcnZlciB0aGF0IGRvZXMgZXhpc3QuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEdldE5vbkV4aXN0YW50UmVzb3VyY2UoKQotCXsKLQkJU3RyaW5nIHJlc291cmNlID0gImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMvbm9uZXhpc3RhbnRmaWxlIjsKLQkJU3RyaW5nIHJlc3VsdCA9IGNhY2hlLmdldFJlc291cmNlKHJlc291cmNlKTsKLQkJY2FjaGUuY2xlYXIoKTsKLQkJYXNzZXJ0TnVsbCgiVGhlIHJlc3VsdCByZXR1cm5lZCBmb3IgcmVzb3VyY2UgIiArIHJlc291cmNlICsgIiBpcyBub3QgbnVsbC4iLCByZXN1bHQpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0IHRyeWluZyB0byBjYWNoZSBhIHJlc291cmNlIHRoYXQgZG9lc24ndCBleGlzdAotCSAqIGJlY2F1c2UgdGhlIHNlcnZlciBkb2Vzbid0IGV4aXN0LgotCSAqLwotLy8JcHVibGljIHZvaWQgdGVzdEdldE5vbkV4aXN0YW50U2VydmVyKCkKLS8vCXsKLS8vCQlTdHJpbmcgcmVzb3VyY2UgPSAiaHR0cDovL3d3dy5lY2xpcHNlLmJhZC93ZWJ0b29scy9ub25leGlzdGFudGZpbGUiOwotLy8JCVN0cmluZyByZXN1bHQgPSBjYWNoZS5nZXRSZXNvdXJjZShyZXNvdXJjZSk7Ci0vLwkJY2FjaGUuY2xlYXIoKTsKLS8vCQlhc3NlcnROdWxsKCJUaGUgcmVzdWx0IHJldHVybmVkIGZvciByZXNvdXJjZSAiICsgcmVzb3VyY2UgKyAiIGlzIG5vdCBudWxsLiIsIHJlc3VsdCk7Ci0vLwl9Ci0JCi0JLyoqCi0JICogVGVzdCB0cnlpbmcgdG8gZ2V0IGEgcmVzb3VyY2Ugc3BlY2lmaWVkIGJ5IG51bGwuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEdldE51bGxSZXNvdXJjZSgpCi0JewotCQlTdHJpbmcgcmVzb3VyY2UgPSBudWxsOwotCQlTdHJpbmcgcmVzdWx0ID0gY2FjaGUuZ2V0UmVzb3VyY2UocmVzb3VyY2UpOwotCQljYWNoZS5jbGVhcigpOwotCQlhc3NlcnROdWxsKCJUaGUgcmVzdWx0IHJldHVybmVkIGZvciByZXNvdXJjZSAiICsgcmVzb3VyY2UgKyAiIGlzIG5vdCBudWxsLiIsIHJlc3VsdCk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3QgdHJ5aW5nIHRvIGNhY2hlIGEgcmVzb3VyY2UgdGhhdCBkb2VzIGV4aXN0LgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RHZXRSZXNvdXJjZVRoYXRFeGlzdHMoKQotCXsKLQkJU3RyaW5nIHJlc291cmNlID0gImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMiOwotCQlTdHJpbmcgcmVzdWx0ID0gY2FjaGUuZ2V0UmVzb3VyY2UocmVzb3VyY2UpOwotCQljYWNoZS5jbGVhcigpOwotCQlhc3NlcnROb3ROdWxsKCJUaGUgcmVzdWx0IHJldHVybmVkIGZvciByZXNvdXJjZSAiICsgcmVzb3VyY2UgKyAiIHdhcyBudWxsLiIsIHJlc3VsdCk7Ci0JCWFzc2VydFRydWUoIlRoZSByZXN1bHQgYW5kIHJlc291cmNlIGFyZSB0aGUgc2FtZS4iLCAhcmVzb3VyY2UuZXF1YWxzKHJlc3VsdCkpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0IHRvIGVuc3VyZSB0aGUgcmVzdWx0IHRoYXQgaXMgcmV0dXJuZWQgc3RhcnRzIHdpdGggZmlsZTovLy8KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0UmVzdWx0U3RhcnRzV2l0aEZpbGUoKQotCXsKLQkJU3RyaW5nIHJlc291cmNlID0gImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMiOwotCQlTdHJpbmcgcmVzdWx0ID0gY2FjaGUuZ2V0UmVzb3VyY2UocmVzb3VyY2UpOwotCQljYWNoZS5jbGVhcigpOwotCQlhc3NlcnRUcnVlKCJUaGUgcmVzdWx0IGRvZXMgbm90IHN0YXJ0IHdpdGggZmlsZTovLy8uIiwgcmVzdWx0LnN0YXJ0c1dpdGgoImZpbGU6Ly8vIikpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0IHRvIGVuc3VyZSBkZWxldGluZyBhIGNhY2hlIGVudHJ5IGRlbGV0ZXMgaXQgZnJvbSB0aGUgY2FjaGUgYW5kCi0JICogZnJvbSB0aGUgZmlsZSBzeXN0ZW0uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdERlbGV0ZUNhY2hlRW50cnkoKQotCXsKLQkJU3RyaW5nIHJlc291cmNlID0gImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMiOwotCQlTdHJpbmcgcmVzdWx0ID0gY2FjaGUuZ2V0UmVzb3VyY2UocmVzb3VyY2UpOwotCQlhc3NlcnROb3ROdWxsKCJUaGUgbG9jYWwgY2FjaGUgZmlsZSBpcyBudWxsLiIsIHJlc3VsdCk7Ci0JCS8vIFJlbW92ZSBmaWxlOi8vLyBmcm9tIHRoZSByZXN1bHQuCi0JCXJlc3VsdCA9IHJlc3VsdC5zdWJzdHJpbmcoOCk7Ci0JCWFzc2VydFRydWUoIlRoZSBjYWNoZSBmaWxlICIgKyByZXN1bHQgKyAiIGRvZXMgbm90IGV4aXN0LiIsIG5ldyBGaWxlKHJlc3VsdCkuZXhpc3RzKCkpOwotCQljYWNoZS5kZWxldGVFbnRyeShyZXNvdXJjZSk7Ci0JCWFzc2VydEZhbHNlKCJUaGUgY2FjaGUgZmlsZSB3YXMgbm90IGRlbGV0ZWQuIiwgbmV3IEZpbGUocmVzdWx0KS5leGlzdHMoKSk7Ci0JCWFzc2VydFRydWUoIlRoZSBjYWNoZSBzdGlsbCBjb250YWlucyB0aGUgZGVsZXRlZCBlbnRyeS4iLCBjYWNoZS5nZXRDYWNoZWRVUklzKCkubGVuZ3RoID09IDApOwotCQljYWNoZS5jbGVhcigpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0IHRvIGVuc3VyZSBkZWxldGluZyBhIG51bGwgY2FjaGUgZW50cnkgc2ltcGx5IHJldHVybnMuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdERlbGV0ZU51bGxDYWNoZUVudHJ5KCkKLQl7Ci0JCVN0cmluZyByZXNvdXJjZSA9ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzIjsKLQkJY2FjaGUuZ2V0UmVzb3VyY2UocmVzb3VyY2UpOwotCQljYWNoZS5kZWxldGVFbnRyeShudWxsKTsKLQkJYXNzZXJ0RmFsc2UoIlRoZSBjYWNoZSBubyBsb25nZXIgY29udGFpbnMgdGhlIGVudHJ5IGFmdGVyIGRlbGV0aW5nIG51bGwuIiwgY2FjaGUuZ2V0Q2FjaGVkVVJJcygpLmxlbmd0aCA9PSAwKTsKLQkJY2FjaGUuY2xlYXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdCB0byBlbnN1cmUgY2xlYXJpbmcgdGhlIGNhY2hlIHdpdGggYSBzaW5nbGUgZW50cnkgZGVsZXRlcyB0aGUgZW50cnkKLQkgKiBmcm9tIHRoZSBjYWNoZSBhbmQgZGVsZXRlcyB0aGUgZmlsZSBmcm9tIHRoZSBmaWxlIHN5c3RlbS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJDYWNoZVdpdGhTaW5nbGVFbnRyeSgpCi0JewotCQlTdHJpbmcgcmVzb3VyY2UxID0gImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMiOwotCQlTdHJpbmcgcmVzdWx0MSA9IGNhY2hlLmdldFJlc291cmNlKHJlc291cmNlMSk7Ci0JCWFzc2VydE5vdE51bGwoIlRoZSBsb2NhbCBjYWNoZSBmaWxlIGlzIG51bGwgZm9yIHJlc291cmNlMS4iLCByZXN1bHQxKTsKLQkJLy8gUmVtb3ZlIGZpbGU6Ly8vIGZyb20gdGhlIHJlc3VsdC4KLQkJcmVzdWx0MSA9IHJlc3VsdDEuc3Vic3RyaW5nKDgpOwotCQlhc3NlcnRUcnVlKCJUaGUgY2FjaGUgZmlsZSAiICsgcmVzdWx0MSArICIgZG9lcyBub3QgZXhpc3QuIiwgbmV3IEZpbGUocmVzdWx0MSkuZXhpc3RzKCkpOwotCQljYWNoZS5jbGVhcigpOwotCQlhc3NlcnRGYWxzZSgiVGhlIGNhY2hlIGZpbGUgZm9yIHJlc291cmNlMSB3YXMgbm90IGRlbGV0ZWQuIiwgbmV3IEZpbGUocmVzdWx0MSkuZXhpc3RzKCkpOwotCQlhc3NlcnRUcnVlKCJUaGUgY2FjaGUgc3RpbGwgY29udGFpbnMgdGhlIGRlbGV0ZWQgZW50cmllcy4iLCBjYWNoZS5nZXRDYWNoZWRVUklzKCkubGVuZ3RoID09IDApOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0IHRvIGVuc3VyZSBjbGVhcmluZyB0aGUgY2FjaGUgd2l0aCBtdWx0aXBsZSBlbnRyaWVzIGRlbGV0ZXMgdGhlIGVudHJpZXMKLQkgKiBmcm9tIHRoZSBjYWNoZSBhbmQgZGVsZXRlcyB0aGUgZmlsZXMgZnJvbSB0aGUgZmlsZSBzeXN0ZW0uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdENsZWFyQ2FjaGVXaXRoTXVsdGlwbGVFbnRyaWVzKCkKLQl7Ci0JCVN0cmluZyByZXNvdXJjZTEgPSAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scyI7Ci0JCVN0cmluZyByZXNvdXJjZTIgPSAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI7Ci0JCVN0cmluZyByZXN1bHQxID0gY2FjaGUuZ2V0UmVzb3VyY2UocmVzb3VyY2UxKTsKLQkJU3RyaW5nIHJlc3VsdDIgPSBjYWNoZS5nZXRSZXNvdXJjZShyZXNvdXJjZTIpOwotCQlhc3NlcnROb3ROdWxsKCJUaGUgbG9jYWwgY2FjaGUgZmlsZSBpcyBudWxsIGZvciByZXNvdXJjZTEuIiwgcmVzdWx0MSk7Ci0JCWFzc2VydE5vdE51bGwoIlRoZSBsb2NhbCBjYWNoZSBmaWxlIGlzIG51bGwgZm9yIHJlc291cmNlMi4iLCByZXN1bHQyKTsKLQkJLy8gUmVtb3ZlIGZpbGU6Ly8vIGZyb20gdGhlIHJlc3VsdC4KLQkJcmVzdWx0MSA9IHJlc3VsdDEuc3Vic3RyaW5nKDgpOwotCQlyZXN1bHQyID0gcmVzdWx0Mi5zdWJzdHJpbmcoOCk7Ci0JCWFzc2VydFRydWUoIlRoZSBjYWNoZSBmaWxlICIgKyByZXN1bHQxICsgIiBkb2VzIG5vdCBleGlzdC4iLCBuZXcgRmlsZShyZXN1bHQxKS5leGlzdHMoKSk7Ci0JCWFzc2VydFRydWUoIlRoZSBjYWNoZSBmaWxlICIgKyByZXN1bHQyICsgIiBkb2VzIG5vdCBleGlzdC4iLCBuZXcgRmlsZShyZXN1bHQyKS5leGlzdHMoKSk7Ci0JCWNhY2hlLmNsZWFyKCk7Ci0JCWFzc2VydEZhbHNlKCJUaGUgY2FjaGUgZmlsZSBmb3IgcmVzb3VyY2UxIHdhcyBub3QgZGVsZXRlZC4iLCBuZXcgRmlsZShyZXN1bHQxKS5leGlzdHMoKSk7Ci0JCWFzc2VydEZhbHNlKCJUaGUgY2FjaGUgZmlsZSBmb3IgcmVzb3VyY2UyIHdhcyBub3QgZGVsZXRlZC4iLCBuZXcgRmlsZShyZXN1bHQyKS5leGlzdHMoKSk7Ci0JCWFzc2VydFRydWUoIlRoZSBjYWNoZSBzdGlsbCBjb250YWlucyB0aGUgZGVsZXRlZCBlbnRyaWVzLiIsIGNhY2hlLmdldENhY2hlZFVSSXMoKS5sZW5ndGggPT0gMCk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3QgdG8gZW5zdXJlIGRlbGV0aW5nIGEgbnVsbCBjYWNoZSBlbnRyeSBzaW1wbHkgcmV0dXJucy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0SW5zdGFuY2UoKQotCXsKLQkJYXNzZXJ0Tm90TnVsbCgiVGhlIGNhY2hlIG9iamVjdCBpcyBudWxsLiIsIGNhY2hlKTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdCB0byBlbnN1cmUgZ2V0Q2FjaGVFbnRyaWVzIHJldHVybnMgYWxsIG9mIHRoZSBjYWNoZSBlbnRyaWVzIGFuZCBub3QgZW50cmllcyB0aGF0IAotICAgKiBoYXZlbid0IGJlZW4gY2FjaGVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RHZXRDYWNoZUVudHJpZXMoKQotCXsKLQkJU3RyaW5nIHJlc291cmNlMSA9ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzIjsKLQkJU3RyaW5nIHJlc291cmNlMiA9ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIjsKLQkJU3RyaW5nIHJlc291cmNlMyA9ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzL25vbmV4aXN0YW50ZmlsZSI7Ci0JCWNhY2hlLmdldFJlc291cmNlKHJlc291cmNlMSk7Ci0JCWNhY2hlLmdldFJlc291cmNlKHJlc291cmNlMik7Ci0JCWNhY2hlLmdldFJlc291cmNlKHJlc291cmNlMyk7Ci0JCVN0cmluZ1tdIHVyaXMgPSBjYWNoZS5nZXRDYWNoZWRVUklzKCk7Ci0JCWFzc2VydFRydWUoIlRoZXJlIGFyZSBub3QgMiBlbnRyaWVzIGluIHRoZSBjYWNoZS4iLCB1cmlzLmxlbmd0aCA9PSAyKTsKLQkJCi0JCWZvcihpbnQgaSA9IDA7IGkgPCB1cmlzLmxlbmd0aCAtMTsgaSsrKQotCQl7Ci0JCSAgU3RyaW5nIHVyaSA9IHVyaXNbaV07Ci0JCSAgaWYoISh1cmkuZXF1YWxzKHJlc291cmNlMSkgfHwgdXJpLmVxdWFscyhyZXNvdXJjZTIpIHx8IHVyaS5lcXVhbHMocmVzb3VyY2UzKSkpCi0JCSAgewotCQkJZmFpbCgiVGhlIFVSSSAiICsgdXJpICsgIiBpcyBub3QgZXF1YWwgdG8gYW55IG9mIHRoZSByZXNvdXJjZXMgcHV0IGluIHRoZSBjYWNoZS4iKTsgIAotCQkgIH0KLQkJfQotCQljYWNoZS5jbGVhcigpOwotCQkKLQl9Ci0JCi0JCi0JCi0JCi0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0NhY2hlVVJJUmVzb2x2ZXJFeHRlbnNpb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9DYWNoZVVSSVJlc29sdmVyRXh0ZW5zaW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWYxNjE1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0NhY2hlVVJJUmVzb2x2ZXJFeHRlbnNpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBUZXN0cyBmb3IgdGhlIENhY2hlVVJJUmVzb2x2ZXJFeHRlbnNpb24gY2xhc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBDYWNoZVVSSVJlc29sdmVyRXh0ZW5zaW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBDYWNoZVVSSVJlc29sdmVyRXh0ZW5zaW9uIGNhY2hlUmVzb2x2ZXI7Ci0JCi0JLyoqCi0JICAqIENyZWF0ZSBhIHRlc3RzIHN1aXRlIGZyb20gdGhpcyB0ZXN0IGNsYXNzLgotCSAgKiAKLQkgICogQHJldHVybiBBIHRlc3Qgc3VpdGUgY29udGFpbmluZyB0aGlzIHRlc3QgY2xhc3MuCi0JICAqLwotCSAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLQkgIHsKLQkgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoQ2FjaGVVUklSZXNvbHZlckV4dGVuc2lvblRlc3QuY2xhc3MpOwotCSAgfQotCSAgCi0JICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gCi0JICB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCWNhY2hlUmVzb2x2ZXIgPSBuZXcgQ2FjaGVVUklSZXNvbHZlckV4dGVuc2lvbigpOwotCQkvLyBUaGUgY2FjaGUgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4gV2UgbmVlZCB0byBlbmFibGUgaXQgZm9yIHRoZSB0ZXN0cy4KLQkJQ2FjaGVQbHVnaW4uZ2V0RGVmYXVsdCgpLnNldENhY2hlRW5hYmxlZCh0cnVlKTsKLQkgIH0KLQotCSAgLyoqCi0JICAgKiBUZXN0IHRoYXQgdGhlIHJlc3VsdCByZXR1cm5lZCB3aGVuIGEgbnVsbCBzeXN0ZW1JZCBpcyBnaXZlbiBpcyBudWxsLgotCSAgICovCi0JICBwdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZU51bGxTeXN0ZW1JZCgpCi0JICB7Ci0JICAgIFN0cmluZyByZXN1bHQgPSBjYWNoZVJlc29sdmVyLnJlc29sdmUobnVsbCwiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scyIsIG51bGwsIG51bGwpOwotCQlhc3NlcnROdWxsKCJUaGUgcmVzdWx0IGlzIG5vdCBudWxsLiIsIHJlc3VsdCk7Ci0JICB9Ci0JICAKLQkgIC8qKgotCSAgICogVGVzdCB0aGF0IHRoZSByZXN1bHQgcmV0dXJuZWQgd2hlbiBhIG51bGwgc3lzdGVtSWQgYW5kIGEgbnVsbCBiYXNlbG9jYXRpb24KLQkgICAqIGFyZSBnaXZlbiBpcyBudWxsLgotCSAgICovCi0JICBwdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZU51bGxTeXN0ZW1JZEFuZEJhc2Vsb2NhdGlvbigpCi0JICB7Ci0JICAgIFN0cmluZyByZXN1bHQgPSBjYWNoZVJlc29sdmVyLnJlc29sdmUobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0JCWFzc2VydE51bGwoIlRoZSByZXN1bHQgaXMgbm90IG51bGwuIiwgcmVzdWx0KTsKLQkgIH0KLQkgIAotCSAgLyoqCi0JICAgKiBUZXN0IHRoYXQgdGhlIHJlc3VsdCBpcyBzdWNlc3NmdWxseSBjYWNoZWQgd2hlbiBhbiBhYnNvbHV0ZSBzeXN0ZW1JZAotCSAgICogaXMgZ2l2ZW4uCi0JICAgKi8KLQkgIHB1YmxpYyB2b2lkIHRlc3RBYnNvbHV0ZVN5c3RlbUlkKCkKLQkgIHsKLQkgICAgU3RyaW5nIHJlc3VsdCA9IGNhY2hlUmVzb2x2ZXIucmVzb2x2ZShudWxsLCJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzIiwgbnVsbCwgImh0dHA6Ly93d3cuZWNsaXBzZS5vcmciKTsKLQkJYXNzZXJ0Tm90TnVsbCgiVGhlIHJlc3VsdCBpcyBudWxsLiIsIHJlc3VsdCk7Ci0JICB9Ci0JICAKLQkgIC8qKgotCSAgICogVGVzdCB0aGF0IHRoZSByZXN1bHQgaXMgc3VjZXNzZnVsbHkgY2FjaGVkIHdoZW4gYW4gYWJzb2x1dGUgc3lzdGVtSWQKLQkgICAqIGlzIGdpdmVuIGFuZCBhIG51bGwgYmFzZSBsb2NhdGlvbiBpcyBnaXZlbgotCSAgICovCi0JICBwdWJsaWMgdm9pZCB0ZXN0QWJzb2x1dGVTeXN0ZW1JZE51bGxCYXNlbG9jYXRpb24oKQotCSAgewotCSAgICBTdHJpbmcgcmVzdWx0ID0gY2FjaGVSZXNvbHZlci5yZXNvbHZlKG51bGwsIG51bGwsIG51bGwsICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIik7Ci0JCWFzc2VydE5vdE51bGwoIlRoZSByZXN1bHQgaXMgbnVsbC4iLCByZXN1bHQpOwotCSAgfQotCSAgCi0JICAvKioKLQkgICAqIFRlc3QgdGhhdCB0aGUgcmVzdWx0IGlzIHN1Y2Vzc2Z1bGx5IGNhY2hlZCB3aGVuIGEgcmVsYXRpdmUgc3lzdGVtSWQKLQkgICAqIGlzIGdpdmVuLgotCSAgICovCi0JICBwdWJsaWMgdm9pZCB0ZXN0UmVsYXRpdmVTeXN0ZW1JZCgpCi0JICB7Ci0JICAgIFN0cmluZyByZXN1bHQgPSBjYWNoZVJlc29sdmVyLnJlc29sdmUobnVsbCwiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scy9jb21tdW5pdHkvc29tZWZpbGUueG1sIiwgbnVsbCwgImluZGV4LnBocCIpOwotCQlhc3NlcnROb3ROdWxsKCJUaGUgcmVzdWx0IGlzIG51bGwuIiwgcmVzdWx0KTsKLQkgIH0KLQkgIAotCSAgLyoqCi0JICAgKiBUZXN0IHRoYXQgdGhlIHJlc3VsdCBpcyB1bnN1Y2Vzc2Z1bGx5IGNhY2hlZCB3aGVuIGEgcmVsYXRpdmUgc3lzdGVtSWQKLQkgICAqIGlzIGdpdmVuIGFuZCBhIG51bGwgYmFzZSBsb2NhdGlvbiBpcyBnaXZlbi4KLQkgICAqLwotCSAgcHVibGljIHZvaWQgdGVzdFJlbGF0aXZlU3lzdGVtSWRXaWxsTnVsbEJhc2Vsb2NhdGlvbigpCi0JICB7Ci0JICAgIFN0cmluZyByZXN1bHQgPSBjYWNoZVJlc29sdmVyLnJlc29sdmUobnVsbCwgbnVsbCwgbnVsbCwgImNvbW11bml0eS5odG1sIik7Ci0JCWFzc2VydE51bGwoIlRoZSByZXN1bHQgaXMgbm90IG51bGwuIiwgcmVzdWx0KTsKLQkgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUZXN0IHRoYXQgbnVsbCBpcyByZXR1cm5lZCB3aGVuIHRoZSBjYWNoZSBpcyBkaXNhYmxlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmV0dXJuc051bGxXaGVuRGlzYWJsZWQoKQotICAgIHsKLSAgICAgIENhY2hlUGx1Z2luLmdldERlZmF1bHQoKS5zZXRDYWNoZUVuYWJsZWQoZmFsc2UpOwotICAgICAgU3RyaW5nIHJlc3VsdCA9IGNhY2hlUmVzb2x2ZXIucmVzb2x2ZShudWxsLCAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scy8iLCBudWxsLCAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scy8iKTsKLSAgICAgIGFzc2VydE51bGwoIlRoZSByZXN1bHQgaXMgbm90IG51bGwuIiwgcmVzdWx0KTsKLSAgICAgIENhY2hlUGx1Z2luLmdldERlZmF1bHQoKS5zZXRDYWNoZUVuYWJsZWQodHJ1ZSk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0xpY2Vuc2VSZWdpc3RyeVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0xpY2Vuc2VSZWdpc3RyeVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmViZDAxMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9MaWNlbnNlUmVnaXN0cnlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIExpY2Vuc2VSZWdpc3RyeVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAvKioKLSAgICogQ3JlYXRlIGEgdGVzdHMgc3VpdGUgZnJvbSB0aGlzIHRlc3QgY2xhc3MuCi0gICAqICAKLSAgICogQHJldHVybiBBIHRlc3Qgc3VpdGUgY29udGFpbmluZyB0aGlzIHRlc3QgY2xhc3MuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoTGljZW5zZVJlZ2lzdHJ5VGVzdC5jbGFzcyk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gCi0gIHsKLQlzdXBlci5zZXRVcCgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIAotICB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRlc3QgYWRkaW5nIGEgbGljZW5zZSB0byB0aGUgcmVnaXN0cnkuIFdoZW4gYWRkZWQgdGhlIHJlZ2lzdHJ5IHNob3VsZCBjb250YWluIHRoZSBsaWNlbnNlCi0gICAqIGFuZCB0aGUgbGljZW5zZSBzaG91bGQgaGF2ZSB0aGUgdW5zcGVjaWZpZWQgdmFsdWUuCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0QWRkTGljZW5zZVRvUmVnaXN0cnkoKQotICB7Ci0JU3RyaW5nIGxpY2Vuc2VVUkwgPSAiaHR0cDovL3NvbWVsaWNlbnNlIjsKLQlMaWNlbnNlUmVnaXN0cnlXcmFwcGVyIHJlZ2lzdHJ5ID0gbmV3IExpY2Vuc2VSZWdpc3RyeVdyYXBwZXIoKTsKLQlyZWdpc3RyeS5hZGRMaWNlbnNlKGxpY2Vuc2VVUkwpOwotCWFzc2VydEVxdWFscygiVGhlIHJlZ2lzdHJ5IGRvZXMgbm90IGhhdmUgMSBsaWNlbnNlLiIsIDEsIHJlZ2lzdHJ5LmdldExpY2Vuc2VzSGFzaHRhYmxlKCkuc2l6ZSgpKTsKLQlhc3NlcnRUcnVlKCJUaGUgcmVnaXN0cnkgZG9lcyBub3QgY29uYWluIHRoZSBsaWNlbnNlICIgKyBsaWNlbnNlVVJMLCByZWdpc3RyeS5nZXRMaWNlbnNlc0hhc2h0YWJsZSgpLmNvbnRhaW5zS2V5KGxpY2Vuc2VVUkwpKTsKLQlhc3NlcnRFcXVhbHMoIlRoZSByZWdpc3RyeSBkb2VzIG5vdCBoYXZlIHRoZSBjb3JyZWN0IHZhbHVlIGZvciB0aGUgbGljZW5zZS4iLCBMaWNlbnNlUmVnaXN0cnlXcmFwcGVyLkxJQ0VOU0VfVU5TUEVDSUZJRUQsIHJlZ2lzdHJ5LmdldExpY2Vuc2VzSGFzaHRhYmxlKCkuZ2V0KGxpY2Vuc2VVUkwpKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRlc3QgYWRkaW5nIGEgbGljZW5zZSB0byB0aGUgcmVnaXN0cnkgdHdpY2UuIFRoZSByZWdpc3RyeSBzaG91bGQgb25seSBoYXZlIGEgc2luZ2xlIGVudHJ5Ci0gICAqIGZvciB0aGUgbGljZW5zZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3RBZGRMaWNlbnNlVG9SZWdpc3RyeVR3aWNlKCkKLSAgewotCVN0cmluZyBsaWNlbnNlVVJMID0gImh0dHA6Ly9zb21lbGljZW5zZSI7Ci0JTGljZW5zZVJlZ2lzdHJ5V3JhcHBlciByZWdpc3RyeSA9IG5ldyBMaWNlbnNlUmVnaXN0cnlXcmFwcGVyKCk7Ci0JcmVnaXN0cnkuYWRkTGljZW5zZShsaWNlbnNlVVJMKTsKLQlyZWdpc3RyeS5hZGRMaWNlbnNlKGxpY2Vuc2VVUkwpOwotCWFzc2VydEVxdWFscygiVGhlIHJlZ2lzdHJ5IGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUgbGljZW5zZS4iLCAxLCByZWdpc3RyeS5nZXRMaWNlbnNlc0hhc2h0YWJsZSgpLnNpemUoKSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUZXN0IGFncmVlIHRvIGxpY2Vuc2UgbWV0aG9kLiBUaGUgcmVnaXN0cnkgc2hvdWxkIGhhdmUgJ2FncmVlJyByZWdpc3RlcmVkIGZvciB0aGUgbGljZW5zZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3RBZ3JlZVRvTGljZW5zZSgpCi0gIHsKLSAgICBTdHJpbmcgbGljZW5zZVVSTCA9ICJodHRwOi8vc29tZWxpY2Vuc2UiOwotCUxpY2Vuc2VSZWdpc3RyeVdyYXBwZXIgcmVnaXN0cnkgPSBuZXcgTGljZW5zZVJlZ2lzdHJ5V3JhcHBlcigpOwotCXJlZ2lzdHJ5LmFkZExpY2Vuc2UobGljZW5zZVVSTCk7Ci0JcmVnaXN0cnkuYWdyZWVMaWNlbnNlKGxpY2Vuc2VVUkwpOwotCWFzc2VydEVxdWFscygiVGhlIHJlZ2lzdHJ5IGRvZXMgbm90IGhhdmUgdGhlIGNvcnJlY3QgdmFsdWUgZm9yIHRoZSBsaWNlbnNlLiIsIExpY2Vuc2VSZWdpc3RyeVdyYXBwZXIuTElDRU5TRV9BR1JFRSwgcmVnaXN0cnkuZ2V0TGljZW5zZXNIYXNodGFibGUoKS5nZXQobGljZW5zZVVSTCkpOwotICB9Ci0gIAotICAvKioKLSAgICogVGVzdCBhZ3JlZSB0byBsaWNlbnNlIHRoYXQgaXMgbm90IGluIHRoZSByZWdpc3RyeS4gVGhlIHJlZ2lzdHJ5IHNob3VsZCBub3QgY3JlYXRlCi0gICAqIGFuIGVudHJ5IGZvciB0aGUgbGljZW5zZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3RBZ3JlZVRvTGljZW5zZU5vdEluUmVnaXN0cnkoKQotICB7Ci0gICAgU3RyaW5nIGxpY2Vuc2VVUkwgPSAiaHR0cDovL3NvbWVsaWNlbnNlIjsKLQlMaWNlbnNlUmVnaXN0cnlXcmFwcGVyIHJlZ2lzdHJ5ID0gbmV3IExpY2Vuc2VSZWdpc3RyeVdyYXBwZXIoKTsKLQlyZWdpc3RyeS5hZ3JlZUxpY2Vuc2UobGljZW5zZVVSTCk7Ci0JYXNzZXJ0RXF1YWxzKCJUaGUgcmVnaXN0cnkgcmVnaXN0ZXJlZCB0aGUgbGljZW5zZSBidXQgaXQgc2hvdWxkIG5vdCBoYXZlLiIsIDAsIHJlZ2lzdHJ5LmdldExpY2Vuc2VzSGFzaHRhYmxlKCkuc2l6ZSgpKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRlc3QgZGlzYWdyZWUgdG8gbGljZW5zZSBtZXRob2QuIFRoZSByZWdpc3RyeSBzaG91bGQgaGF2ZSAnZGlzYWdyZWUnIHJlZ2lzdGVyZWQgZm9yIHRoZSBsaWNlbnNlLgotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdERpc2dyZWVUb0xpY2Vuc2UoKQotICB7Ci0gICAgU3RyaW5nIGxpY2Vuc2VVUkwgPSAiaHR0cDovL3NvbWVsaWNlbnNlIjsKLQlMaWNlbnNlUmVnaXN0cnlXcmFwcGVyIHJlZ2lzdHJ5ID0gbmV3IExpY2Vuc2VSZWdpc3RyeVdyYXBwZXIoKTsKLQlyZWdpc3RyeS5hZGRMaWNlbnNlKGxpY2Vuc2VVUkwpOwotCXJlZ2lzdHJ5LmRpc2FncmVlTGljZW5zZShsaWNlbnNlVVJMKTsKLQlhc3NlcnRFcXVhbHMoIlRoZSByZWdpc3RyeSBkb2VzIG5vdCBoYXZlIHRoZSBjb3JyZWN0IHZhbHVlIGZvciB0aGUgbGljZW5zZS4iLCBMaWNlbnNlUmVnaXN0cnlXcmFwcGVyLkxJQ0VOU0VfRElTQUdSRUUsIHJlZ2lzdHJ5LmdldExpY2Vuc2VzSGFzaHRhYmxlKCkuZ2V0KGxpY2Vuc2VVUkwpKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRlc3QgZGlzYWdyZWUgdG8gbGljZW5zZSB0aGF0IGlzIG5vdCBpbiB0aGUgcmVnaXN0cnkuIFRoZSByZWdpc3RyeSBzaG91bGQgbm90IGNyZWF0ZQotICAgKiBhbiBlbnRyeSBmb3IgdGhlIGxpY2Vuc2UuCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0RGlzYWdyZWVUb0xpY2Vuc2VOb3RJblJlZ2lzdHJ5KCkKLSAgewotICAgIFN0cmluZyBsaWNlbnNlVVJMID0gImh0dHA6Ly9zb21lbGljZW5zZSI7Ci0JTGljZW5zZVJlZ2lzdHJ5V3JhcHBlciByZWdpc3RyeSA9IG5ldyBMaWNlbnNlUmVnaXN0cnlXcmFwcGVyKCk7Ci0JcmVnaXN0cnkuYWdyZWVMaWNlbnNlKGxpY2Vuc2VVUkwpOwotCWFzc2VydEVxdWFscygiVGhlIHJlZ2lzdHJ5IHJlZ2lzdGVyZWQgdGhlIGxpY2Vuc2UgYnV0IGl0IHNob3VsZCBub3QgaGF2ZS4iLCAwLCByZWdpc3RyeS5nZXRMaWNlbnNlc0hhc2h0YWJsZSgpLnNpemUoKSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUZXN0IHByb21wdCBmb3IgYWdyZWUgZm9yIGxpY2Vuc2Ugbm90IGluIHJlZ2lzdHJ5LgotICAgKiBUT0RPOiBUaGlzIHRlc3QgZG9lcyBub3QgdGVzdCB3aGF0IGl0IGlzIHN1cHBvc2VkIHRvLgotICAgKiBUaGlzIHRlc3Qgc2hvdWxkIGJlIGNvcnJlY3RlZCBpZiBwb3NzaWJsZS4KLSAgICovCi0vLyAgcHVibGljIHZvaWQgdGVzdFByb21wdEZvckxpY2Vuc2VOb3RJblJlZ2lzdHJ5KCkKLS8vICB7Ci0vLyAgICBTdHJpbmcgbGljZW5zZVVSTCA9ICJodHRwOi8vc29tZWxpY2Vuc2UiOwotLy8JTGljZW5zZVJlZ2lzdHJ5V3JhcHBlciByZWdpc3RyeSA9IG5ldyBMaWNlbnNlUmVnaXN0cnlXcmFwcGVyKCk7Ci0vLwlhc3NlcnRUcnVlKCJUaGUgcHJvbXB0IGZvciBhZ3JlZW1lbnQgbWV0aG9kIGRvZXMgbm90IHJldHVybiB0cnVlIGZvciBhIGxpY2Vuc2Ugbm90IGluIHRoZSByZWdpc3RyeS4iLCByZWdpc3RyeS5wcm9tcHRUb0FjY2VwdExpY2Vuc2UobGljZW5zZVVSTCwgbGljZW5zZVVSTCkpOwotLy8gIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0xpY2Vuc2VSZWdpc3RyeVdyYXBwZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0xpY2Vuc2VSZWdpc3RyeVdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk0YjFlYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9MaWNlbnNlUmVnaXN0cnlXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLS8qKgotICogQSB3cmFwcGVyIGZvciBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuaW50ZXJuYWwuTGljZW5zZVJlZ2lzdHJ5Ci0gKiB0aGF0IGFsbG93cyBmb3IgdGVzdGluZyBvZiBwcm90ZWN0ZWQgbWV0aG9kcy4KLSAqLwotcHVibGljIGNsYXNzIExpY2Vuc2VSZWdpc3RyeVdyYXBwZXIgZXh0ZW5kcyBMaWNlbnNlUmVnaXN0cnkgCi17Ci0gIHByb3RlY3RlZCBzdGF0aWMgSW50ZWdlciBMSUNFTlNFX1VOU1BFQ0lGSUVEID0gTGljZW5zZVJlZ2lzdHJ5LkxJQ0VOU0VfVU5TUEVDSUZJRUQ7Ci0gIHByb3RlY3RlZCBzdGF0aWMgSW50ZWdlciBMSUNFTlNFX0FHUkVFID0gTGljZW5zZVJlZ2lzdHJ5LkxJQ0VOU0VfQUdSRUU7Ci0gIHByb3RlY3RlZCBzdGF0aWMgSW50ZWdlciBMSUNFTlNFX0RJU0FHUkVFID0gTGljZW5zZVJlZ2lzdHJ5LkxJQ0VOU0VfRElTQUdSRUU7Ci0gIHByb3RlY3RlZCBMaWNlbnNlUmVnaXN0cnlXcmFwcGVyKCkKLSAgewotCXN1cGVyKCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBIYXNodGFibGUgZ2V0TGljZW5zZXNIYXNodGFibGUoKQotICB7Ci0JcmV0dXJuIGxpY2Vuc2VzOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYWdyZWVMaWNlbnNlKFN0cmluZyB1cmwpIAotICB7Ci0Jc3VwZXIuYWdyZWVMaWNlbnNlKHVybCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBkaXNhZ3JlZUxpY2Vuc2UoU3RyaW5nIHVybCkgCi0gIHsKLQlzdXBlci5kaXNhZ3JlZUxpY2Vuc2UodXJsKTsKLSAgfQotCi0gIHByb3RlY3RlZCBpbnQgcHJvbXB0VG9BY2NlcHRMaWNlbnNlKFN0cmluZyB1cmwsIFN0cmluZyBsaWNlbnNlVVJMKSAKLSAgewotCXJldHVybiBzdXBlci5wcm9tcHRUb0FjY2VwdExpY2Vuc2UodXJsLCBsaWNlbnNlVVJMKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvdGVzdHMvaW50ZXJuYWwvQWxsQ2FjaGVUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvdGVzdHMvaW50ZXJuYWwvQWxsQ2FjaGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjk4NzJmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL3Rlc3RzL2ludGVybmFsL0FsbENhY2hlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLnRlc3RzLmludGVybmFsOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsLkNhY2hlRW50cnlUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS5pbnRlcm5hbC5DYWNoZVRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsLkNhY2hlVVJJUmVzb2x2ZXJFeHRlbnNpb25UZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS5pbnRlcm5hbC5MaWNlbnNlUmVnaXN0cnlUZXN0OwotLyoqCi0gKiBUaGUgcm9vdCB0ZXN0IHN1aXRlIHRoYXQgY29udGFpbnMgYWxsIG90aGVyIENhY2hlIHRlc3Qgc3VpdGVzLgotICovCi1wdWJsaWMgY2xhc3MgQWxsQ2FjaGVUZXN0cyBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGUKLXsKLSAgLyoqCi0gICAqIENyZWF0ZSB0aGlzIHRlc3Qgc3VpdGUuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoaXMgdGVzdCBzdWl0ZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IEFsbENhY2hlVGVzdHMoKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yCi0gICAqLwotICBwdWJsaWMgQWxsQ2FjaGVUZXN0cygpCi0gIHsKLSAgICBzdXBlcigiQWxsQ2FjaGVUZXN0cyIpOwotCWFkZFRlc3QoQ2FjaGVUZXN0LnN1aXRlKCkpOwotCWFkZFRlc3QoQ2FjaGVFbnRyeVRlc3Quc3VpdGUoKSk7Ci0JYWRkVGVzdChDYWNoZVVSSVJlc29sdmVyRXh0ZW5zaW9uVGVzdC5zdWl0ZSgpKTsKLQlhZGRUZXN0KExpY2Vuc2VSZWdpc3RyeVRlc3Quc3VpdGUoKSk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS90ZXN0cy9pbnRlcm5hbC9DYWNoZVRlc3RzUGx1Z2luLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS90ZXN0cy9pbnRlcm5hbC9DYWNoZVRlc3RzUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0MDRhM2QuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvdGVzdHMvaW50ZXJuYWwvQ2FjaGVUZXN0c1BsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBDYWNoZVRlc3RzUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JLy9UaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIENhY2hlVGVzdHNQbHVnaW4gcGx1Z2luOwotCS8vUmVzb3VyY2UgYnVuZGxlLgotCXByaXZhdGUgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBDYWNoZVRlc3RzUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB1cG9uIHBsdWctaW4gYWN0aXZhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBwbHVnLWluIGlzIHN0b3BwZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXJlc291cmNlQnVuZGxlID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBDYWNoZVRlc3RzUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIGZyb20gdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKiBvciAna2V5JyBpZiBub3QgZm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBDYWNoZVRlc3RzUGx1Z2luLmdldERlZmF1bHQoKS5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotCQl0cnkgewotCQkJcmV0dXJuIChidW5kbGUgIT0gbnVsbCkgPyBidW5kbGUuZ2V0U3RyaW5nKGtleSkgOiBrZXk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJdHJ5IHsKLQkJCWlmIChyZXNvdXJjZUJ1bmRsZSA9PSBudWxsKQotCQkJCXJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS53c3QuaW50ZXJuYWwuY2FjaGUudGVzdHMuQ2FjaGVUZXN0c1BsdWdpblJlc291cmNlcyIpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24geCkgewotCQkJcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZUJ1bmRsZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSBpbWFnZSBmaWxlIGF0IHRoZSBnaXZlbgotCSAqIHBsdWctaW4gcmVsYXRpdmUgcGF0aC4KLQkgKgotCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoCi0JICogQHJldHVybiB0aGUgaW1hZ2UgZGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgcGF0aCkgewotCQlyZXR1cm4gQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKCJvcmcuZWNsaXBzZS53c3QuaW50ZXJuYWwuY2FjaGUudGVzdHMiLCBwYXRoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvdGVzdC54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvdGVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5YTUyMmIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLnRlc3RzL3Rlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdAotICAgIG5hbWU9InRlc3RzdWl0ZSIKLSAgICBkZWZhdWx0PSJydW4iCi0gICAgYmFzZWRpcj0iLiI+Ci0KLSAgICA8IS0tIAotICAgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gCi0gICAgICAgICBUaGVyZSBzaG91bGQgYmUgbm8gbmVlZCB0byBjaGFuZ2Ugd2hhdCdzIGFib3ZlLgotICAgICAgICAgKGlmIHRoZXJlIGlzLCBsZXQgdXMga25vdyBpZiB0aGUgc2NyaXB0IGNhbiBiZSBpbXByb3ZlZC4pCi0gICAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAKLSAgICAtLT4KLQotICAgIDwhLS0gCi0gICAgICAgICBFdmVyeSBzdWl0ZSBuZWVkcyB0byBzcGVjaWZ5IHRocmVlIHRoaW5nOiAKLSAgICAgICAgICAgICBwbHVnaW4tbmFtZSwgCi0gICAgICAgICAgICAgY2xhc3NuYW1lIC0gdGhhdCBwcm92aWRlcyB0aGUgc3VpdGUgdG8gdGVzdCwgYW5kIAotICAgICAgICAgICAgIHRlc3RUeXBlIC0gZWl0aGVyIGNvcmUtdGVzdCwgb3IgdWktdGVzdC4gCi0gICAgICAgICBUaGVyZSBpcyBhbiBvcHRpb25hbCBleHRyYVZNYXJncyBwcm9wZXJ0eSB0aGF0IHNvbWUgdGVzdHMgbmVlZCB0byB1c2UgaW4gb3JkZXIgdG8gc3BlY2lmeSAgCi0gICAgICAgICBleHRyYSwgbm9uLXN0YW5kYXJkIHByb3BlcnRpZXMgdG8gdGhlIFZNIHdoZW4gaXQgcnVucy4gSWYgbm90IG5lZWQsIG5vIG5lZWQgdG8gc3BlY2lmeSBpdC4gCi0gICAgLS0+Ci0gICAgPHByb3BlcnR5Ci0gICAgICAgIG5hbWU9InBsdWdpbi1uYW1lIgotICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLnRlc3RzIiAvPgotICAgIDxwcm9wZXJ0eQotICAgICAgICBuYW1lPSJjbGFzc25hbWUiCi0gICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMuaW50ZXJuYWwuQWxsQ2FjaGVUZXN0cyIgLz4KLSAgICA8cHJvcGVydHkKLSAgICAgICAgbmFtZT0idGVzdFR5cGUiCi0gICAgICAgIHZhbHVlPSJjb3JlLXRlc3QiIC8+Ci0KLSAgICA8IS0tIHNvbWUgdGVzdCBzdWl0ZXMgbmVlZCB0byBhZGQgc3BlY2lhbCB2bSBhcmd1bWVudHMgd2hlbiB0aGV5IHJ1bi4gVGhpcyBpcyBqdXN0IGFuIGV4YW1wbGUuCi0gICAgPHByb3BlcnR5Ci0gICAgICAgIG5hbWU9ImV4dHJhVk1hcmdzIgotICAgICAgICB2YWx1ZT0iLURqc2ZSdW50aW1lSmFyc0RpcmVjdG9yeVYxLjE9JHt0ZXN0RGlyfS8ke2pzZjEuMURpcn0iIC8+Ci0gICAgPGVjaG8KLSAgICAgICAgbWVzc2FnZT0iZXh0cmFWTWFyZ3MgJHtleHRyYVZNYXJnc30iIC8+Ci0gICAgLS0+Ci0gICAgCi0gICAgPCEtLSAKLSAgICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAotICAgICAgICAgVGhlcmUgc2hvdWxkIGJlIG5vIG5lZWQgdG8gY2hhbmdlIHdoYXQncyBiZWxvdy4KLSAgICAgICAgIChpZiB0aGVyZSBpcywgbGV0IHVzIGtub3cgaWYgdGhlIHNjcmlwdCBjYW4gYmUgaW1wcm92ZWQuKQotICAgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gCi0gICAgLS0+Ci0gICAgCi0gICAgPGZhaWwKLSAgICAgICAgbWVzc2FnZT0iRXJyb3I6IG1pc3NpbmcgcHJvcGVydHkuIGVjbGlwc2UtaG9tZSBtdXN0IGJlIHByb3ZlZCIKLSAgICAgICAgdW5sZXNzPSJlY2xpcHNlLWhvbWUiIC8+Ci0gICAgPGZhaWwKLSAgICAgICAgbWVzc2FnZT0iRXJyb3I6IG1pc3NpbmcgcHJvcGVydHkuIGJ1aWxkRGlyZWN0b3J5IG11c3QgYmUgcHJvdmVkIgotICAgICAgICB1bmxlc3M9ImJ1aWxkRGlyZWN0b3J5IiAvPgotICAgIDxmYWlsCi0gICAgICAgIG1lc3NhZ2U9IkVycm9yOiBtaXNzaW5nIHByb3BlcnR5LiBidWlsZExhYmVsIG11c3QgYmUgcHJvdmVkIgotICAgICAgICB1bmxlc3M9ImJ1aWxkTGFiZWwiIC8+Ci0gICAgPGVjaG8KLSAgICAgICAgbWVzc2FnZT0iYmFzZWRpcjogJHtiYXNlZGlyfSIgLz4KLSAgICA8ZWNobwotICAgICAgICBtZXNzYWdlPSJlY2xpcHNlLWhvbWU6ICR7ZWNsaXBzZS1ob21lfSIgLz4KLSAgICA8ZWNobwotICAgICAgICBtZXNzYWdlPSJidWlsZERpcmVjdG9yeTogJHtidWlsZERpcmVjdG9yeX0iIC8+Ci0gICAgPGVjaG8KLSAgICAgICAgbWVzc2FnZT0icGx1Z2luLW5hbWU6ICR7cGx1Z2luLW5hbWV9IiAvPgotICAgIDxlY2hvCi0gICAgICAgIG1lc3NhZ2U9ImNsYXNzbmFtZTogJHtjbGFzc25hbWV9IiAvPgotICAgIDxlY2hvCi0gICAgICAgIG1lc3NhZ2U9InRlc3RUeXBlICR7dGVzdFR5cGV9IiAvPgotICAgIDxwcm9wZXJ0eQotICAgICAgICBuYW1lPSJsaWJyYXJ5LWZpbGUiCi0gICAgICAgIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vcGx1Z2lucy9vcmcuZWNsaXBzZS50ZXN0XzMuMS4wL2xpYnJhcnkueG1sIiAvPgotICAgIDxwcm9wZXJ0eQotICAgICAgICBuYW1lPSJ3b3Jrc3BhY2UiCi0gICAgICAgIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vanVuaXR3b3Jrc3BhY2VzLyR7cGx1Z2luLW5hbWV9IiAvPgotCi0gICAgICA8IS0tIAotICAgIFRoaXMgaW5pdCB0YXJnZXQgaG9sZHMgYWxsIGluaXRpYWxpemF0aW9uIGNvZGUgdGhhdCBuZWVkcyB0byBiZSBkb25lIGZvcgotICAgICAgYWxsIHRlc3RzIHRoYXQgYXJlIHRvIGJlIHJ1bi4gSW5pdGlhbGl6YXRpb24gZm9yIGluZGl2aWR1YWwgdGVzdHMKLSAgICAgIHNob3VsZCBiZSBkb25lIHdpdGhpbiB0aGUgYm9keSBvZiB0aGUgc3VpdGUgdGFyZ2V0LiBIZXJlIGl0J3MgYSBnb29kIGlkZWEgCi0gICAgdG8gZGVsZXRlIHRoaW5ncyB0aGF0IG1pZ2h0IGhhdmUgYmVlbiBjcmVhdGVkIGlmIHRoZSB0ZXN0IGhhcyBhbHJlYWR5IGJlZW4gCi0gICAgcmFuLCBqdXN0IGluIGNhc2UgdGhlIHRlc3QgaXMgYmVpbmcgcmUtcmFuLiAKLSAgICAtLT4KLSAgICA8dGFyZ2V0Ci0gICAgICAgIG5hbWU9ImluaXQiPgotICAgICAgICA8dHN0YW1wIC8+Ci0gICAgICAgIDxkZWxldGU+Ci0gICAgICAgICAgICA8ZmlsZXNldAotICAgICAgICAgICAgICAgIGRpcj0iJHtlY2xpcHNlLWhvbWV9IgotICAgICAgICAgICAgICAgIGluY2x1ZGVzPSIke3BsdWdpbi1uYW1lfS4qeG1sIiAvPgotICAgICAgICA8L2RlbGV0ZT4KLSAgICAgICAgCi0gICAgICAgIDwhLS0gCi0gICAgICAgICBtYWtlIHRoZSB3b3Jrc3BhY2UgZGlyZWN0b3J5LCBpbiBjYXNlIHBhdGggZG9lc24ndCBleGlzdCB5ZXQKLSAgICAgICAgIGJ1dCBkZWxldGUgdG8gbWFrZSBzdXJlIGZyZXNoIGNvbnRlbnRzLCBpZiBpdCBkb2VzIGV4aXN0Ci0gICAgICAgIC0tPgotICAgICAgICA8ZGVsZXRlCi0gICAgICAgICAgICBkaXI9IiR7d29ya3NwYWNlfSIKLSAgICAgICAgICAgIHF1aWV0PSJ0cnVlIiAvPgotICAgICAgICA8bWtkaXIKLSAgICAgICAgICAgIGRpcj0iJHt3b3Jrc3BhY2V9IiAvPgotICAgIDwvdGFyZ2V0PgotCi0gICAgPCEtLSAKLSAgICAgIFRoaXMgc3VpdGUgdGFyZ2V0IGRlZmluZXMgdGhlIHRlc3RzIHRoYXQgbmVlZCB0byBiZSBydW4uCi0gICAgLS0+Ci0gICAgPHRhcmdldAotICAgICAgICBuYW1lPSJzdWl0ZSI+Ci0gICAgICAgIDxhbnQKLSAgICAgICAgICAgIHRhcmdldD0iJHt0ZXN0VHlwZX0iCi0gICAgICAgICAgICBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iCi0gICAgICAgICAgICBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICAgICAgICA8cHJvcGVydHkKLSAgICAgICAgICAgICAgICBuYW1lPSJkYXRhLWRpciIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iJHt3b3Jrc3BhY2V9IiAvPgotICAgICAgICAgICAgPHByb3BlcnR5Ci0gICAgICAgICAgICAgICAgbmFtZT0icGx1Z2luLW5hbWUiCi0gICAgICAgICAgICAgICAgdmFsdWU9IiR7cGx1Z2luLW5hbWV9IiAvPgotICAgICAgICAgICAgPHByb3BlcnR5Ci0gICAgICAgICAgICAgICAgbmFtZT0iY2xhc3NuYW1lIgotICAgICAgICAgICAgICAgIHZhbHVlPSIke2NsYXNzbmFtZX0iIC8+Ci0gICAgICAgICAgICA8cHJvcGVydHkKLSAgICAgICAgICAgICAgICBuYW1lPSJwbHVnaW4tcGF0aCIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3BsdWdpbnMvJHtwbHVnaW4tbmFtZX0iIC8+Ci0gICAgICAgIDwvYW50PgotICAgICAgICA8Y29weQotICAgICAgICAgICAgZmFpbG9uZXJyb3I9ImZhbHNlIgotICAgICAgICAgICAgZmlsZT0iJHt3b3Jrc3BhY2V9Ly5tZXRhZGF0YS8ubG9nIgotICAgICAgICAgICAgdG9maWxlPSIke2J1aWxkRGlyZWN0b3J5fS8ke2J1aWxkTGFiZWx9L3Rlc3RSZXN1bHRzL2NvbnNvbGVsb2dzLyR7cGx1Z2luLW5hbWV9LmNvbnNvbGVsb2cudHh0IiAvPgotICAgIDwvdGFyZ2V0PgotCi0gICAgIDwhLS0gCi0gICAgIFRoaXMgY2xlYW4gdGFyZ2V0IGhvbGRzIGNvZGUgdG8gY2xlYW51cCB0aGUgdGVzdGluZyBlbnZpcm9ubWVudCBhZnRlcgotICAgICBhZnRlciBhbGwgb2YgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4uIFlvdSBjYW4gdXNlIHRoaXMgdGFyZ2V0IHRvIAotICAgICBkZWxldGUgdGVtcG9yYXJ5IGZpbGVzIHRoYXQgaGF2ZSBiZWVuIGNyZWF0ZWQsIGlmIHJlcXVpcmVkLiBCdXQsIAotICAgICBpdCdzIHVzdWFsbHkgYmVzdCB0byBsZWF2ZSBpdCBhbGwsIGluIGNhc2UgeW91J2QgbGlrZSB0byBpbnNwZWN0IGl0IAotICAgICBhZnRlciBhIGZhaWxlZCBydW4uIEl0IHdpbGwgYmUgZGVsZXRlZCBldmVudHVhbGx5IGJ5IHRoZSBuZXh0IGNsZWFuIGJ1aWxkLiAKLSAgICAtLT4KLSAgICA8dGFyZ2V0Ci0gICAgICAgIG5hbWU9ImNsZWFudXAiPgotCi0gICAgPC90YXJnZXQ+Ci0KLSAgICA8IS0tIAotICAgICAgIFRoaXMgcnVuIHRhcmdldCBpcyB0aGUgbWFzdGVyIHRhcmdldCB0aGF0IGdldCdzIGFsbCB0aGUgd29yayBkb25lLiAKLSAgICAgICBNb3N0IGFjdGl2aXR5IGlzIGFjdHVhbGx5IGRvbmUgaW4gdGhlICdkZXBlbmRzJyB0YXNrcywgYnV0IGFueSAKLSAgICAgICBhY3Rpb25zIHRoYXQgbmVlZCB0byBoYXBwZW4gYWZ0ZXIgYWxsIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuIAotICAgICAgIHNob3VsZCBnbyBoZXJlLCBzdWNoIGFzIGNvcHlpbmcgdGhlIHJlc3VsdHMgdG8gYSBjb21tb24gJ3NhdmUnIAotICAgICAgIGRpcmVjdG9yeS4gCi0gICAgLS0+Ci0gICAgPHRhcmdldAotICAgICAgICBuYW1lPSJydW4iCi0gICAgICAgIGRlcGVuZHM9ImluaXQsc3VpdGUsY2xlYW51cCI+Ci0gICAgICAgIDxhbnQKLSAgICAgICAgICAgIHRhcmdldD0iY29sbGVjdCIKLSAgICAgICAgICAgIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIKLSAgICAgICAgICAgIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgICAgICAgIDxwcm9wZXJ0eQotICAgICAgICAgICAgICAgIG5hbWU9ImluY2x1ZGVzIgotICAgICAgICAgICAgICAgIHZhbHVlPSIke3BsdWdpbi1uYW1lfS4qeG1sIiAvPgotICAgICAgICAgICAgPHByb3BlcnR5Ci0gICAgICAgICAgICAgICAgbmFtZT0ib3V0cHV0LWZpbGUiCi0gICAgICAgICAgICAgICAgdmFsdWU9IiR7cGx1Z2luLW5hbWV9LnhtbCIgLz4KLSAgICAgICAgPC9hbnQ+Ci0gICAgPC90YXJnZXQ+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQo=