ZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdGVzdHMuZmVhdHVyZS8uY3ZzaWdub3JlIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl90ZXN0cy5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMDRiNjUuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl90ZXN0cy5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl90ZXN0cy5mZWF0dXJlXzEuMC4wLmJpbi5kaXN0LnppcAotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl90ZXN0cy5mZWF0dXJlXzEuMC4xLjIwMDYwMjE1MDEwNC5iaW4uZGlzdC56aXAKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdGVzdHMuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdGVzdHMuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA2OWE4Mi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3Rlc3RzLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QuY29tbW9uX3Rlc3RzLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3Rlc3RzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzYyNmUyLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl90ZXN0cy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3Rlc3RzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3Rlc3RzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdGVzdHMuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3Rlc3RzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGQ2ZTlhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdGVzdHMuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPVdTVCBDb21tb24gVGVzdHMKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVdTVCBjb21tb24gdGVzdHMKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi0jIGxpY2Vuc2UgYW5kIGxpY2Vuc2VVUkwgcHJvcGVydGllcyB3ZXJlIHJlbW92ZWQgYXMgYSByZXN1bHQgdG8gbWlncmF0aW5nIHRvIG5ldyBQREUgbGljZW5zZSBzdXBwb3J0LiAKLSMgICAgVGhvc2UgcHJvcGVydGllcyBhcmUgbm93IGFkZGVkIGF0IGJ1aWxkIHRpbWUuIFNlZSBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9FcXVpbm94L3AyL0xpY2Vuc2VfTWVjaGFuaXNtLiAKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotIyBsaWNlbnNlIGFuZCBsaWNlbnNlVVJMIHByb3BlcnRpZXMgd2VyZSByZW1vdmVkIGFzIGEgcmVzdWx0IHRvIG1pZ3JhdGluZyB0byBuZXcgUERFIGxpY2Vuc2Ugc3VwcG9ydC4gCi0jICAgIFRob3NlIHByb3BlcnRpZXMgYXJlIG5vdyBhZGRlZCBhdCBidWlsZCB0aW1lLiBTZWUgaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRXF1aW5veC9wMi9MaWNlbnNlX01lY2hhbmlzbS4gCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI3Y2FjZC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3Rlc3RzLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uX3Rlc3RzLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMy4zLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIGxpY2Vuc2UtZmVhdHVyZT0ib3JnLmVjbGlwc2UubGljZW5zZSIKLSAgICAgIGxpY2Vuc2UtZmVhdHVyZS12ZXJzaW9uPSIxLjAuMC5xdWFsaWZpZXIiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3IiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uc25pcHBldHMudGVzdHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS50ZXN0cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS50ZXN0cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24uZ3VhcmQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLnRlc3RzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yLy5jbGFzc3BhdGggYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3Rvci8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTM4MmVjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImNvbGxlY3RvciIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3IvLmN2c2lnbm9yZSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkN2I3NDUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3IvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluCi1idWlsZC54bWwKLXJ1bnRpbWUKLXRlbXAuZm9sZGVyCi1qYXZhQ29tcGlsZXIucnVudGltZV9jb2xsZWN0b3IuamFyLmFyZ3MKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yLy5wcm9qZWN0IGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3IvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NDE3NjkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3IvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3RvcjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3Rvci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3Rvci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0MmRhNDEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3IvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jU3VuIEp1biAwMyAwMjoyMDoyMSBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3IvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3Rvci9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM2MWU1ZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3Rvci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3RvcgotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3I7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMS4wCi1CdW5kbGUtQ2xhc3NQYXRoOiBydW50aW1lL2NvbGxlY3Rvci5qYXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuY29tcGF0aWJpbGl0eS5QbHVnaW5BY3RpdmF0b3IKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5qdW5pdCwKLSBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNApkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3IvYWJvdXQuaHRtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3IvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3IvYnVpbGQucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YjAwN2IuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3IvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBydW50aW1lL2NvbGxlY3Rvci5qYXIsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLXNvdXJjZS5ydW50aW1lL2NvbGxlY3Rvci5qYXIgPSBjb2xsZWN0b3IvCi1vdXRwdXQucnVudGltZS9jb2xsZWN0b3IuamFyID0gYmluLwpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3IvY29sbGVjdG9yL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvY29sbGVjdG9yL1N1aXRlSGVscGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3Rvci9jb2xsZWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy9jb2xsZWN0b3IvU3VpdGVIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQzZjhlYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3Rvci9jb2xsZWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy9jb2xsZWN0b3IvU3VpdGVIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGVkaXQgdGhlIHRlbXBsYXRlIHZhcmlhYmxlICJ0eXBlY29tbWVudCI6Ci0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5UZW1wbGF0ZXMuCi0gKiBUbyBlbmFibGUgYW5kIGRpc2FibGUgdGhlIGNyZWF0aW9uIG9mIHR5cGUgY29tbWVudHMgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFN1aXRlSGVscGVyIHsKLQotICAgIHByaXZhdGUgSGFzaHRhYmxlIGFsbFRlc3RzID0gbmV3IEhhc2h0YWJsZSgpOwotCi0gICAgcHVibGljIFN1aXRlSGVscGVyKFRlc3RTdWl0ZSBzdWl0ZSkgewotICAgICAgICBhZGRUZXN0KHN1aXRlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkVGVzdChUZXN0IHRlc3QpIHsKLSAgICAgICAgaWYgKHRlc3QgaW5zdGFuY2VvZiBUZXN0U3VpdGUpIHsKLSAgICAgICAgICAgIEVudW1lcmF0aW9uIHRlc3RzID0gKChUZXN0U3VpdGUpIHRlc3QpLnRlc3RzKCk7Ci0gICAgICAgICAgICB3aGlsZSAodGVzdHMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICBUZXN0IHQgPSAoVGVzdCkgdGVzdHMubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBhbGxUZXN0cy5wdXQodC50b1N0cmluZygpLCB0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBhbGxUZXN0cy5wdXQodGVzdC50b1N0cmluZygpLCB0ZXN0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0QWxsVGVzdHMoKSB7Ci0gICAgICAgIEFycmF5TGlzdCB0ZXN0TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgRW51bWVyYXRpb24gZW51bWVyYXRpb24gPSBhbGxUZXN0cy5rZXlzKCk7Ci0gICAgICAgIHdoaWxlIChlbnVtZXJhdGlvbi5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgdGVzdExpc3QuYWRkKGVudW1lcmF0aW9uLm5leHRFbGVtZW50KCkpOwotICAgICAgICB9Ci0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQodGVzdExpc3QsIG5ldyBDb21wYXJhdG9yKCkgewotICAgICAgICAgICAgcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICgoU3RyaW5nKSBvMSkuY29tcGFyZVRvKCgoU3RyaW5nKSBvMikpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBTdHJpbmdbXSBzdHJBcnJheSA9IG5ldyBTdHJpbmdbdGVzdExpc3Quc2l6ZSgpXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJBcnJheS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgc3RyQXJyYXlbaV0gPSAoU3RyaW5nKSB0ZXN0TGlzdC5nZXQoaSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3RyQXJyYXk7Ci0gICAgfQotCi0gICAgcHVibGljIFRlc3RTdWl0ZSBidWlsZFN1aXRlKFN0cmluZ1tdIGNvbXBsZXRlVGVzdHMsIFN0cmluZ1tdIHBhcnRpYWxUZXN0cykgewotICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29tcGxldGVUZXN0cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgc3VpdGUuYWRkVGVzdCgoVGVzdCkgYWxsVGVzdHMuZ2V0KGNvbXBsZXRlVGVzdHNbaV0pKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcnRpYWxUZXN0cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgc3VpdGUuYWRkVGVzdChnZXRUZXN0KHBhcnRpYWxUZXN0c1tpXSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdWl0ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VGVzdE1ldGhvZHMoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIEFycmF5TGlzdCBtZXRob2RMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBUZXN0IHRlc3QgPSAoVGVzdCkgYWxsVGVzdHMuZ2V0KHRlc3ROYW1lKTsKLSAgICAgICAgaWYgKHRlc3QgaW5zdGFuY2VvZiBUZXN0U3VpdGUpIHsKLSAgICAgICAgICAgIEVudW1lcmF0aW9uIHRlc3RzRW51bSA9ICgoVGVzdFN1aXRlKSB0ZXN0KS50ZXN0cygpOwotICAgICAgICAgICAgd2hpbGUgKHRlc3RzRW51bS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgIFRlc3QgdCA9IChUZXN0KSB0ZXN0c0VudW0ubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBtZXRob2RMaXN0LmFkZCh0LnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQ29sbGVjdGlvbnMuc29ydChtZXRob2RMaXN0LCBuZXcgQ29tcGFyYXRvcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotICAgICAgICAgICAgICAgIHJldHVybiAoKFN0cmluZykgbzEpLmNvbXBhcmVUbygoKFN0cmluZykgbzIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgU3RyaW5nW10gc3RyQXJyYXkgPSBuZXcgU3RyaW5nW21ldGhvZExpc3Quc2l6ZSgpXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJBcnJheS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgc3RyQXJyYXlbaV0gPSAoU3RyaW5nKSBtZXRob2RMaXN0LmdldChpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzdHJBcnJheTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFRlc3QgZ2V0U3ViVGVzdChUZXN0U3VpdGUgc3VpdGUsIFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICBpZiAobnVsbCAhPSBzdWl0ZSkgewotICAgICAgICAgICAgRW51bWVyYXRpb24gdGVzdHMgPSBzdWl0ZS50ZXN0cygpOwotICAgICAgICAgICAgd2hpbGUgKHRlc3RzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgVGVzdCB0ID0gKFRlc3QpIHRlc3RzLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHQudG9TdHJpbmcoKS5lcXVhbHModGVzdE5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgVGVzdFN1aXRlIHRvIHJ1bgotICAgICAqLwotICAgIHByaXZhdGUgVGVzdCBnZXRUZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICBpbnQgZmlyc3RJbmRleCA9IHRlc3ROYW1lLmluZGV4T2YoIi4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBTdHJpbmcgc3VpdGVOYW1lID0gdGVzdE5hbWUuc3Vic3RyaW5nKDAsIGZpcnN0SW5kZXgpOwotICAgICAgICBTdHJpbmcgc3ViVGVzdE5hbWUgPSB0ZXN0TmFtZS5zdWJzdHJpbmcoZmlyc3RJbmRleCArIDEpOwotCi0gICAgICAgIC8vY2hlY2sgdGhlIG9idmlvdXMgc3VpdGUgZmlyc3QKLSAgICAgICAgVGVzdFN1aXRlIHN1aXRlID0gKFRlc3RTdWl0ZSkgYWxsVGVzdHMuZ2V0KHN1aXRlTmFtZSk7Ci0gICAgICAgIFRlc3QgdGVzdCA9IGdldFN1YlRlc3Qoc3VpdGUsIHN1YlRlc3ROYW1lKTsKLSAgICAgICAgaWYgKHRlc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRlc3Q7Ci0gICAgICAgIH0KLSAgICAgICAgLy9vdGhlcndpc2UgY2hlY2sgYWxsIHN1aXRlcwotICAgICAgICBFbnVtZXJhdGlvbiBrZXlzID0gYWxsVGVzdHMua2V5cygpOwotICAgICAgICB3aGlsZSAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpIGtleXMubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIGlmICh0ZXN0TmFtZS5zdGFydHNXaXRoKGtleSkpIHsKLSAgICAgICAgICAgICAgICBzdWl0ZSA9IChUZXN0U3VpdGUpIGFsbFRlc3RzLmdldChrZXkpOwotICAgICAgICAgICAgICAgIHN1YlRlc3ROYW1lID0gdGVzdE5hbWUuc3Vic3RyaW5nKGtleS5sZW5ndGgoKSArIDEpOwotICAgICAgICAgICAgICAgIHRlc3QgPSBnZXRTdWJUZXN0KHN1aXRlLCBzdWJUZXN0TmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRlc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGVzdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3IvY29sbGVjdG9yL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvY29sbGVjdG9yL1N1aXRlVGVzdFJ1bm5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3IvY29sbGVjdG9yL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvY29sbGVjdG9yL1N1aXRlVGVzdFJ1bm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDU5Y2UyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yL2NvbGxlY3Rvci9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL2NvbGxlY3Rvci9TdWl0ZVRlc3RSdW5uZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3I7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGVkaXQgdGhlIHRlbXBsYXRlIHZhcmlhYmxlICJ0eXBlY29tbWVudCI6Ci0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5UZW1wbGF0ZXMuCi0gKiBUbyBlbmFibGUgYW5kIGRpc2FibGUgdGhlIGNyZWF0aW9uIG9mIHR5cGUgY29tbWVudHMgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFN1aXRlVGVzdFJ1bm5lciBleHRlbmRzIFRlc3RSdW5uZXIgewotCi0gICAgcHJpdmF0ZSBUZXN0U3VpdGUgc3VpdGU7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUGx1Z2luVGVzdFJ1bm5lciBjb25zdHJ1Y3RvciBjb21tZW50LgotICAgICAqLwotICAgIHB1YmxpYyBTdWl0ZVRlc3RSdW5uZXIoVGVzdFN1aXRlIHN1aXRlVG9SdW4pIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgc3VpdGUgPSBzdWl0ZVRvUnVuOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE9ubHkgcmV0dXJuIHRoZSBzcGVjaWZpZWQgc3VpdGUKLSAgICAgKi8KLSAgICBwdWJsaWMgVGVzdCBnZXRUZXN0KFN0cmluZyBzdWl0ZUNsYXNzTmFtZSkgewotICAgICAgICByZXR1cm4gc3VpdGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogY2FsbGVkIGJ5IHRoZSBndWkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBsYXVuY2goKSB7Ci0gICAgICAgIGRvUnVuKHN1aXRlKTsKLSAgICB9Ci0gICAKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yL2NvbGxlY3Rvci9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL2NvbGxlY3Rvci9UZXN0Q29sbGVjdG9yQWN0aW9uRGVsZWdhdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yL2NvbGxlY3Rvci9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL2NvbGxlY3Rvci9UZXN0Q29sbGVjdG9yQWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIyYmQyOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3Rvci9jb2xsZWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy9jb2xsZWN0b3IvVGVzdENvbGxlY3RvckFjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlOwotCi0vKioKLSAqIEBhdXRob3IganNob2xsCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZWRpdCB0aGUgdGVtcGxhdGUgdmFyaWFibGUgInR5cGVjb21tZW50IjoKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPlRlbXBsYXRlcy4KLSAqIFRvIGVuYWJsZSBhbmQgZGlzYWJsZSB0aGUgY3JlYXRpb24gb2YgdHlwZSBjb21tZW50cyBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgVGVzdENvbGxlY3RvckFjdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlIHsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjaW5pdChJV29ya2JlbmNoV2luZG93KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4oSUFjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoKTsKLQkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJc2hlbGwuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQlzaGVsbC5zZXRUZXh0KCJUZXN0IENvbGxlY3RvciIpOyAvLyROT04tTkxTLTEkCi0JCVRlc3RDb2xsZWN0b3JHVUkgdGVzdENvbGxlY3RvckdVSSA9IG5ldyBUZXN0Q29sbGVjdG9yR1VJKHNoZWxsLCBTV1QuTlVMTCk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMTsKLSAgICAgICAgdGVzdENvbGxlY3RvckdVSS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgICAgIAotCQlzaGVsbC5zZXRTaXplKDUwMCwgNTAwKTsKLQkJc2hlbGwub3BlbigpOwotCX0KLQkKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiwgSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yL2NvbGxlY3Rvci9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL2NvbGxlY3Rvci9UZXN0Q29sbGVjdG9yR1VJLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3Rvci9jb2xsZWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy9jb2xsZWN0b3IvVGVzdENvbGxlY3RvckdVSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDYyNTJmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yL2NvbGxlY3Rvci9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL2NvbGxlY3Rvci9UZXN0Q29sbGVjdG9yR1VJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDYsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byAKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqIAotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0Q29sbGVjdG9yR1VJIGV4dGVuZHMgQ29tcG9zaXRlIGltcGxlbWVudHMgTW9kaWZ5TGlzdGVuZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3RvciI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VJVEVTX0VYVF9QVCA9ICJzdWl0ZXMiOyAvLyROT04tTkxTLTEkCi0vLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBDb21wb3NpdGUgaW5uZXJQYW5lcyA9IG51bGw7Ci0JcHJpdmF0ZSBDb21ibyBjb21ibyA9IG51bGw7Ci0KLQlwcml2YXRlIEhhc2h0YWJsZSB0ZXN0U3VpdGVzID0gbmV3IEhhc2h0YWJsZSgpOwotCi0JLyoqCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBzdHlsZQotCSAqLwotCXB1YmxpYyBUZXN0Q29sbGVjdG9yR1VJKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQotCQlsb2FkQ29uZmlndXJhdGlvbigpOwotCi0JCWNyZWF0ZVBhcnRDb250cm9sKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxvYWRDb25maWd1cmF0aW9uKCkgewotCQlJRXh0ZW5zaW9uUG9pbnQgc3VpdGVFeHRQdCA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQoUExVR0lOX0lELCBTVUlURVNfRVhUX1BUKTsKLQkJSUV4dGVuc2lvbltdIHN1aXRlc0V4dGVuc2lvbnMgPSBzdWl0ZUV4dFB0LmdldEV4dGVuc2lvbnMoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHN1aXRlc0V4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gc3VpdGVzRXh0ZW5zaW9uc1tpXTsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIHRlc3RzID0gZXh0ZW5zaW9uLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCB0ZXN0cy5sZW5ndGg7IGorKykgewotCQkJCXRyeSB7Ci0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gdGVzdHNbal07Ci0JCQkJCVN0cmluZyBzdWl0ZU5hbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgibmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCXRlc3RTdWl0ZXMucHV0KHN1aXRlTmFtZSwgZWxlbWVudCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbCgpIHsKLQkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gMTsKLQkJc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMTsKLQotCQljb21ibyA9IG5ldyBDb21ibyh0aGlzLCBTV1QuUkVBRF9PTkxZKTsKLQkJRW51bWVyYXRpb24ga2V5cyA9IHRlc3RTdWl0ZXMua2V5cygpOwotCQlBcnJheUxpc3QgYXJyYXlMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQl3aGlsZSAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJYXJyYXlMaXN0LmFkZChrZXlzLm5leHRFbGVtZW50KCkpOwotCQl9Ci0KLQkJQ29sbGVjdGlvbnMuc29ydChhcnJheUxpc3QsIG5ldyBDb21wYXJhdG9yKCkgewotCQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JCQkJcmV0dXJuICgoU3RyaW5nKSBvMSkuY29tcGFyZVRvKCgoU3RyaW5nKSBvMikpOwotCQkJfQotCQl9KTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5TGlzdC5zaXplKCk7IGkrKykgewotCQkJY29tYm8uYWRkKChTdHJpbmcpIGFycmF5TGlzdC5nZXQoaSkpOwotCQl9Ci0JCWNvbWJvLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQljb21iby5hZGRNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQkJaWYgKGNvbWJvLmdldEl0ZW1Db3VudCgpID4gMCkgewotCQkJY29tYm8uc2VsZWN0KDApOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCWlmIChlLmdldFNvdXJjZSgpID09IGNvbWJvKSB7Ci0JCQl1cGRhdGVDb21ibyhlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVDb21ibyhNb2RpZnlFdmVudCBlKSB7Ci0JCWlmIChudWxsICE9IGlubmVyUGFuZXMpIHsKLQkJCWlubmVyUGFuZXMuZGlzcG9zZSgpOwotCQl9Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgdGVzdE5hbWUgPSBjb21iby5nZXRUZXh0KCk7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA9IChJQ29uZmlndXJhdGlvbkVsZW1lbnQpIHRlc3RTdWl0ZXMuZ2V0KHRlc3ROYW1lKTsKLQkJCVRlc3RTdWl0ZSBzdWl0ZSA9IChUZXN0U3VpdGUpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJaW5uZXJQYW5lcyA9IG5ldyBUZXN0Q29sbGVjdG9ySW5uZXJQYW5lcyh0aGlzLCBTV1QuTlVMTCwgbmV3IFN1aXRlSGVscGVyKHN1aXRlKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJaW5uZXJQYW5lcyA9IG5ldyBDb21wb3NpdGUodGhpcywgU1dULk5VTEwpOwotCQkJaW5uZXJQYW5lcy5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCQlpbm5lclBhbmVzLnNldEJhY2tncm91bmQoZ2V0QmFja2dyb3VuZCgpKTsKLQkJCUxhYmVsIGVycm9yTGFiZWwgPSBuZXcgTGFiZWwoaW5uZXJQYW5lcywgU1dULk5PTkUpOwotCQkJZXJyb3JMYWJlbC5zZXRUZXh0KGV4LmdldE1lc3NhZ2UoKSk7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQkJZXJyb3JMYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCWlubmVyUGFuZXMuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWxheW91dCgpOwotCi0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3Rvci9jb2xsZWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy9jb2xsZWN0b3IvVGVzdENvbGxlY3RvcklubmVyUGFuZXMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yL2NvbGxlY3Rvci9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL2NvbGxlY3Rvci9UZXN0Q29sbGVjdG9ySW5uZXJQYW5lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjJkOTZiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yL2NvbGxlY3Rvci9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL2NvbGxlY3Rvci9UZXN0Q29sbGVjdG9ySW5uZXJQYW5lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2FzaEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGVkaXQgdGhlIHRlbXBsYXRlIHZhcmlhYmxlICJ0eXBlY29tbWVudCI6Ci0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5UZW1wbGF0ZXMuCi0gKiBUbyBlbmFibGUgYW5kIGRpc2FibGUgdGhlIGNyZWF0aW9uIG9mIHR5cGUgY29tbWVudHMgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFRlc3RDb2xsZWN0b3JJbm5lclBhbmVzIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQotICAgIHByaXZhdGUgVGFibGUgdGVzdENsYXNzVGFibGU7Ci0gICAgcHJpdmF0ZSBUYWJsZSB0ZXN0TWV0aG9kVGFibGU7Ci0KLSAgICBwcml2YXRlIEJ1dHRvbiBsYXVuY2hUZXN0QnV0dG9uOwotCi0gICAgcHJpdmF0ZSBTdWl0ZUhlbHBlciBwbHVnaW5UZXN0TG9hZGVyOwotCi0gICAgcHJpdmF0ZSBIYXNoU2V0IHBhcnRpYWxTZXRIYXNoID0gbmV3IEhhc2hTZXQoKTsKLSAgICBwcml2YXRlIEhhc2h0YWJsZSBzaG9ydFRvRnVsbEhhc2h0YWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLSAgICBwcml2YXRlIEhhc2h0YWJsZSBmdWxsVG9TaG9ydEhhc2h0YWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLQotICAgIHB1YmxpYyBUZXN0Q29sbGVjdG9ySW5uZXJQYW5lcyhDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsIFN1aXRlSGVscGVyIGxvYWRlcikgewotICAgICAgICBzdXBlcihwYXJlbnQsIHN0eWxlKTsKLSAgICAgICAgcGx1Z2luVGVzdExvYWRlciA9IGxvYWRlcjsKLSAgICAgICAgY3JlYXRlUGFydENvbnRyb2woKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbCgpIHsKLSAgICAgICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgZ3JpZExheW91dC5udW1Db2x1bW5zID0gMTsKLSAgICAgICAgZ3JpZExheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgICAgIGdyaWRMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICAgICAgc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG51bGw7Ci0KLSAgICAgICAgR3JvdXAgdGFibGVHcm91cCA9IG5ldyBHcm91cCh0aGlzLCBTV1QuTlVMTCk7Ci0gICAgICAgIEdyaWRMYXlvdXQgdGFibGVHcm91cExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIHRhYmxlR3JvdXBMYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gdHJ1ZTsKLSAgICAgICAgdGFibGVHcm91cExheW91dC5udW1Db2x1bW5zID0gMTsKLSAgICAgICAgdGFibGVHcm91cExheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgICAgIHRhYmxlR3JvdXBMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICAgICAgdGFibGVHcm91cC5zZXRMYXlvdXQodGFibGVHcm91cExheW91dCk7Ci0gICAgICAgIHRhYmxlR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLSAgICAgICAgU2FzaEZvcm0gc3BsaXRWaWV3ID0gbmV3IFNhc2hGb3JtKHRhYmxlR3JvdXAsIFNXVC5IT1JJWk9OVEFMKTsKLSAgICAgICAgc3BsaXRWaWV3LnNldEJhY2tncm91bmQoZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9EQVJLX0dSQVkpKTsKLSAgICAgICAgCi0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgc3BsaXRWaWV3LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICAKLSAgICAgICAgQ29tcG9zaXRlIGxlZnRDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHNwbGl0VmlldywgU1dULk5PTkUpOwotICAgICAgICBHcmlkTGF5b3V0IGxlZnRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBsZWZ0TGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotICAgICAgICBsZWZ0Q29tcG9zaXRlLnNldExheW91dChsZWZ0TGF5b3V0KTsKLSAgICAgICAgTGFiZWwgbGFiZWwyID0gbmV3IExhYmVsKGxlZnRDb21wb3NpdGUsIFNXVC5OVUxMKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkNFTlRFUjsKLSAgICAgICAgbGFiZWwyLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICBsYWJlbDIuc2V0VGV4dCgiVGVzdCBTdWl0ZXMiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIENvbXBvc2l0ZSByaWdodENvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoc3BsaXRWaWV3LCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgcmlnaHRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICByaWdodExheW91dC5udW1Db2x1bW5zID0gMTsKLSAgICAgICAgcmlnaHRDb21wb3NpdGUuc2V0TGF5b3V0KHJpZ2h0TGF5b3V0KTsKLSAgICAgICAgTGFiZWwgbGFiZWwzID0gbmV3IExhYmVsKHJpZ2h0Q29tcG9zaXRlLCBTV1QuTlVMTCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5DRU5URVI7Ci0gICAgICAgIGxhYmVsMy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgbGFiZWwzLnNldFRleHQoIlRlc3RzIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICB0ZXN0Q2xhc3NUYWJsZSA9IG5ldyBUYWJsZShsZWZ0Q29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotICAgICAgICB0ZXN0Q2xhc3NUYWJsZS5zZXRCYWNrZ3JvdW5kKGdldEJhY2tncm91bmQoKSk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0gICAgICAgIHRlc3RDbGFzc1RhYmxlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICBTdHJpbmdbXSBhbGxUZXN0cyA9IHBsdWdpblRlc3RMb2FkZXIuZ2V0QWxsVGVzdHMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxUZXN0cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgVGFibGVJdGVtIHRhYmxlSXRlbSA9IG5ldyBUYWJsZUl0ZW0odGVzdENsYXNzVGFibGUsIFNXVC5OVUxMKTsKLSAgICAgICAgICAgIHRhYmxlSXRlbS5zZXRUZXh0KGFsbFRlc3RzW2ldKTsKLSAgICAgICAgfQotICAgICAgICB0ZXN0Q2xhc3NUYWJsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgVGFibGVJdGVtIGl0ZW0gPSAoVGFibGVJdGVtKSBlLml0ZW07Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHRlc3ROYW1lID0gaXRlbS5nZXRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlTWV0aG9kVGFibGUodGVzdE5hbWUsIHBsdWdpblRlc3RMb2FkZXIuZ2V0VGVzdE1ldGhvZHModGVzdE5hbWUpKTsKLSAgICAgICAgICAgICAgICB0ZXN0Q2xhc3NUYWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtdIHsgaXRlbSB9KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSk7Ci0gICAgICAgIAotICAgICAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChsZWZ0Q29tcG9zaXRlLCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwpOwotICAgICAgICBsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIEJ1dHRvbiBzZWxlY3RBbGxDaGVja2JveCA9IG5ldyBCdXR0b24obGVmdENvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLSAgICAgICAgc2VsZWN0QWxsQ2hlY2tib3guc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIHNlbGVjdEFsbENoZWNrYm94LnNldFRleHQoIlNlbGVjdCBBbGwiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBzZWxlY3RBbGxDaGVja2JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpewotICAgICAgICAJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAJCWJvb2xlYW4gY2hlY2tlZCA9IHNlbGVjdEFsbENoZWNrYm94LmdldFNlbGVjdGlvbigpOwotICAgICAgICAJCVRhYmxlSXRlbSBbXSBpdGVtcyA9IHRlc3RDbGFzc1RhYmxlLmdldEl0ZW1zKCk7Ci0gICAgICAgIAkJZm9yKGludCBpPTA7aTxpdGVtcy5sZW5ndGg7IGkrKyl7Ci0gICAgICAgIAkJCWl0ZW1zW2ldLnNldENoZWNrZWQoY2hlY2tlZCk7Ci0gICAgICAgIAkJfQotICAgICAgICAJfQotICAgICAgICB9KTsKLQotICAgICAgICB0ZXN0TWV0aG9kVGFibGUgPSBuZXcgVGFibGUocmlnaHRDb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0gICAgICAgIHRlc3RNZXRob2RUYWJsZS5zZXRCYWNrZ3JvdW5kKGdldEJhY2tncm91bmQoKSk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0gICAgICAgIHRlc3RNZXRob2RUYWJsZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBsYXVuY2hUZXN0QnV0dG9uID0gbmV3IEJ1dHRvbih0aGlzLCBTV1QuUFVTSCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5DRU5URVI7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgbGF1bmNoVGVzdEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgbGF1bmNoVGVzdEJ1dHRvbi5zZXRUZXh0KCJSdW4gVGVzdHMiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBsYXVuY2hUZXN0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBTdWl0ZVRlc3RSdW5uZXIgcnVubmVyID0gbmV3IFN1aXRlVGVzdFJ1bm5lcihidWlsZFN1aXRlKCkpOwotICAgICAgICAgICAgICAgIHJ1bm5lci5sYXVuY2goKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzdG9yZU1ldGhvZHNUYWJsZSgpIHsKLSAgICAgICAgVGFibGVJdGVtW10gaXRlbXMgPSB0ZXN0TWV0aG9kVGFibGUuZ2V0SXRlbXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IG51bGwgIT0gaXRlbXMgJiYgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcGFydGlhbFRlc3ROYW1lID0gKFN0cmluZylzaG9ydFRvRnVsbEhhc2h0YWJsZS5nZXQoaXRlbXNbaV0uZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgIGlmIChpdGVtc1tpXS5nZXRDaGVja2VkKCkgJiYgIXBhcnRpYWxTZXRIYXNoLmNvbnRhaW5zKHBhcnRpYWxUZXN0TmFtZSkpIHsKLSAgICAgICAgICAgICAgICBwYXJ0aWFsU2V0SGFzaC5hZGQocGFydGlhbFRlc3ROYW1lKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIWl0ZW1zW2ldLmdldENoZWNrZWQoKSAmJiBwYXJ0aWFsU2V0SGFzaC5jb250YWlucyhwYXJ0aWFsVGVzdE5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgcGFydGlhbFNldEhhc2gucmVtb3ZlKHBhcnRpYWxUZXN0TmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlTWV0aG9kVGFibGUoU3RyaW5nIHRlc3ROYW1lLCBTdHJpbmdbXSBtZXRob2RBcnJheSkgewotICAgICAgICBzdG9yZU1ldGhvZHNUYWJsZSgpOwotICAgICAgICB0ZXN0TWV0aG9kVGFibGUucmVtb3ZlQWxsKCk7Ci0JCXNob3J0VG9GdWxsSGFzaHRhYmxlLmNsZWFyKCk7Ci0JCWZ1bGxUb1Nob3J0SGFzaHRhYmxlLmNsZWFyKCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IG51bGwgIT0gbWV0aG9kQXJyYXkgJiYgaSA8IG1ldGhvZEFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcGFydGlhbFRlc3ROYW1lID0gdGVzdE5hbWUgKyAiLiIgKyBtZXRob2RBcnJheVtpXTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgaW50IGVuZEluZGV4ID0gbWV0aG9kQXJyYXlbaV0uaW5kZXhPZignKCcpOwotICAgICAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUgPSBlbmRJbmRleCA+IDAgPyBtZXRob2RBcnJheVtpXS5zdWJzdHJpbmcoMCwgZW5kSW5kZXgpIDogbWV0aG9kQXJyYXlbaV07Ci0gICAgICAgICAgICBzaG9ydFRvRnVsbEhhc2h0YWJsZS5wdXQobWV0aG9kTmFtZSwgcGFydGlhbFRlc3ROYW1lKTsKLSAgICAgICAgICAgIGZ1bGxUb1Nob3J0SGFzaHRhYmxlLnB1dChwYXJ0aWFsVGVzdE5hbWUsIG1ldGhvZE5hbWUpOwotICAgICAgICAgICAgVGFibGVJdGVtIHRhYmxlSXRlbSA9IG5ldyBUYWJsZUl0ZW0odGVzdE1ldGhvZFRhYmxlLCBTV1QuTlVMTCk7Ci0gICAgICAgICAgICB0YWJsZUl0ZW0uc2V0VGV4dChtZXRob2ROYW1lKTsKLSAgICAgICAgICAgIHRhYmxlSXRlbS5zZXRDaGVja2VkKHBhcnRpYWxTZXRIYXNoLmNvbnRhaW5zKHBhcnRpYWxUZXN0TmFtZSkpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFRlc3RTdWl0ZSBidWlsZFN1aXRlKCkgewotICAgICAgICBBcnJheUxpc3QgY29tcGxldGVUZXN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgVGFibGVJdGVtW10gaXRlbXMgPSB0ZXN0Q2xhc3NUYWJsZS5nZXRJdGVtcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoaXRlbXNbaV0uZ2V0Q2hlY2tlZCgpKSB7Ci0gICAgICAgICAgICAgICAgY29tcGxldGVUZXN0cy5hZGQoaXRlbXNbaV0uZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZ1tdIGNvbXBsZXRlQXJyYXkgPSBuZXcgU3RyaW5nW2NvbXBsZXRlVGVzdHMuc2l6ZSgpXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb21wbGV0ZUFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBjb21wbGV0ZUFycmF5W2ldID0gKFN0cmluZykgY29tcGxldGVUZXN0cy5nZXQoaSk7Ci0gICAgICAgIH0KLQotICAgICAgICBBcnJheUxpc3QgcGFydGlhbFRlc3RzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBzdG9yZU1ldGhvZHNUYWJsZSgpOwotICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IHBhcnRpYWxTZXRIYXNoLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIHBhcnRpYWxUZXN0cy5hZGQoaXRlcmF0b3IubmV4dCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZ1tdIHBhcnRpYWxBcnJheSA9IG5ldyBTdHJpbmdbcGFydGlhbFRlc3RzLnNpemUoKV07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFydGlhbEFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBwYXJ0aWFsQXJyYXlbaV0gPSAoU3RyaW5nKSBwYXJ0aWFsVGVzdHMuZ2V0KGkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHBsdWdpblRlc3RMb2FkZXIuYnVpbGRTdWl0ZShjb21wbGV0ZUFycmF5LCBwYXJ0aWFsQXJyYXkpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3IvcGx1Z2luLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3Rvci9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ0ZGU3OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3Rvci9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3I9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3IKLXN1aXRlcz1zdWl0ZXMKLVRlc3RfQ29sbGVjdG9yPVRlc3QgQ29sbGVjdG9yCi1XVFBfVGVzdHM9V1RQIFRlc3RzCi1PcGVuPU9wZW4KLVRlc3RfQ29sbGVjdG9yPVRlc3QgQ29sbGVjdG9yClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3IvcGx1Z2luLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4OTg2ZmYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3IvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InN1aXRlcyIgbmFtZT0iJXN1aXRlcyIgc2NoZW1hPSJzY2hlbWEvc3VpdGVzLmV4c2QiLz4KLQotCi0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5hY3Rpb25TZXRzIj4KLSAgICAgIDxhY3Rpb25TZXQKLSAgICAgICAgICAgIGxhYmVsPSIlVGVzdF9Db2xsZWN0b3IiCi0gICAgICAgICAgICB2aXNpYmxlPSJ0cnVlIgotICAgICAgICAgICAgaWQ9InRlc3RDb2xsZWN0b3IiPgotICAgICAgICAgPG1lbnUKLSAgICAgICAgICAgICAgIGxhYmVsPSIlV1RQX1Rlc3RzIgotICAgICAgICAgICAgICAgcGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yLnRlc3RzTWVudSI+Ci0gICAgICAgICAgICA8c2VwYXJhdG9yCi0gICAgICAgICAgICAgICAgICBuYW1lPSJncm91cDEiPgotICAgICAgICAgICAgPC9zZXBhcmF0b3I+Ci0gICAgICAgICA8L21lbnU+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJU9wZW4iCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlVGVzdF9Db2xsZWN0b3IiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3IuVGVzdENvbGxlY3RvckFjdGlvbkRlbGVnYXRlIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yLnRlc3RzTWVudS9ncm91cDEiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3IudGVzdHNBY3Rpb24iPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L2FjdGlvblNldD4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yL3NjaGVtYS9zdWl0ZXMuZXhzZCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yL3NjaGVtYS9zdWl0ZXMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZlYzNjNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3Rvci9zY2hlbWEvc3VpdGVzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3IiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yIiBpZD0ic3VpdGVzIiBuYW1lPSJzdWl0ZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGRlc2NyaXB0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ic3VpdGUiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ic3VpdGUiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgdGhlIGZpcnN0IHJlbGVhc2UgaW4gd2hpY2ggdGhpcyBleHRlbnNpb24gcG9pbnQgYXBwZWFycy5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS8uY2xhc3NwYXRoIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTcyNDU4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uLyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS8uY3ZzaWdub3JlIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmMwYzZkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluCi10ZW1wLmZvbGRlcgotYnVpbGQueG1sCi11aS5qYXIKLWphdmFDb21waWxlci51aS5qYXIuYXJncwpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS8ucHJvamVjdCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlZmU3OGQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM3OGQzZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI1N1biBKdW4gMDMgMDI6MjA6NTQgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDU1MDNkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlVWlfUGx1Zy1pbgotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4xLjMwMC5xdWFsaWZpZXIKLUJ1bmRsZS1DbGFzc1BhdGg6IHVpLmphcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS5VaVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJUVjbGlwc2UKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWksCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS5tYW5hZ2VyLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkud2l6YXJkCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvYWJvdXQuaHRtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvYnVpbGQucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VlMTczOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXNvdXJjZS51aS5qYXIgPSBzcmMvCi1vdXRwdXQudWkuamFyID0gYmluLwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICB1aS5qYXIsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvcGx1Z2luLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzA2OWM4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLVVpX1BsdWctaW49VGVzdCBVaSBQbHVnLWluCi1FY2xpcHNlPUVjbGlwc2Uub3JnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9wbHVnaW4ueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjhjYjYxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3Rvci5zdWl0ZXMiPgotICAgICAgICAgPHN1aXRlCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS5EYXRhTW9kZWxVSUFQSVRlc3RzIgotICAgICAgICAgICAgbmFtZT0iRGF0YU1vZGVsIFVJIEFQSSBUZXN0cyI+Ci0gICAgICAgICA8L3N1aXRlPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpLkRhdGFNb2RlbFdpemFyZEV4dGVuc2lvbiI+Ci0gICAgICA8RGF0YU1vZGVsV2l6YXJkCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS5UZXN0RGF0YU1vZGVsV2l6YXJkIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuSVRlc3REYXRhTW9kZWwiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS53aXphcmRQYWdlR3JvdXAiPgotICAgICAgPHdpemFyZFBhZ2VHcm91cAotICAgICAgICAgICAgcGFnZUdyb3VwSUQ9ImZvbyIKLSAgICAgICAgICAgIHdpemFyZElEPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLndpemFyZC5UZXN0MkRhdGFNb2RlbFByb3ZpZGVyIj4KLSAgICAgICAgIDxmYWN0b3J5IGNsYXNzTmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS53aXphcmQuVGVzdDJEYXRhTW9kZWxXaXphcmRGYWN0b3J5Ii8+Ci0gICAgICA8L3dpemFyZFBhZ2VHcm91cD4KLSAgICAgIDx3aXphcmRQYWdlR3JvdXAKLSAgICAgICAgICAgIHBhZ2VHcm91cElEPSJiYXIiCi0gICAgICAgICAgICB3aXphcmRJRD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS53aXphcmQuVGVzdDJEYXRhTW9kZWxQcm92aWRlciI+Ci0gICAgICAgICA8ZmFjdG9yeSBjbGFzc05hbWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkud2l6YXJkLlRlc3QyRGF0YU1vZGVsV2l6YXJkRmFjdG9yeTIiLz4KLSAgICAgIDwvd2l6YXJkUGFnZUdyb3VwPgotICAgICAgPHdpemFyZFBhZ2VHcm91cAotICAgICAgICAgICAgcGFnZUdyb3VwSUQ9ImZvb2JhciIKLSAgICAgICAgICAgIHdpemFyZElEPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLndpemFyZC5UZXN0MkRhdGFNb2RlbFByb3ZpZGVyIj4KLSAgICAgICAgIDxmYWN0b3J5IGNsYXNzTmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS53aXphcmQuVGVzdDJEYXRhTW9kZWxXaXphcmRGYWN0b3J5MyIvPgotICAgICAgPC93aXphcmRQYWdlR3JvdXA+Ci0gICAgICA8d2l6YXJkUGFnZQotICAgICAgICAgICAgd2l6YXJkSUQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkud2l6YXJkLlRlc3QyRGF0YU1vZGVsUHJvdmlkZXIiPgotICAgICAgICAgPGZhY3RvcnkKLSAgICAgICAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS53aXphcmQuVGVzdDJQYWdlV2l6YXJkRXh0ZW5zaW9uRmFjdG9yeSI+Ci0gICAgICAgICA8L2ZhY3Rvcnk+Ci0gICAgICA8L3dpemFyZFBhZ2U+Ci0gICAgICA8d2l6YXJkUGFnZQotICAgICAgICAgICAgd2l6YXJkSUQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkud2l6YXJkLlRlc3QyRGF0YU1vZGVsUHJvdmlkZXIiPgotICAgICAgICAgPGZhY3RvcnkKLSAgICAgICAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS53aXphcmQuVGVzdDJQYWdlV2l6YXJkRXh0ZW5zaW9uRmFjdG9yeTIiPgotICAgICAgICAgPC9mYWN0b3J5PgotICAgICAgPC93aXphcmRQYWdlPgotICAgPC9leHRlbnNpb24+Ci0gIAotICAgICA8IS0tCi0gICAJCUEgcGljdHVyZSBvZiB0aGUgb3BlcmF0aW9uIHRyZWUKLSAgCQkvKioKLQkJICogT3BlcmF0aW9ucyBhcmUgb3JnYW5pemVkIGFzIGZvbGxvd3M6IDxjb2RlPgotCQkgKgkgICAgRAotCQkgKiAgICAgLyBcCi0JCSAqICAgIC8gICBcCi0JCSAqICAgQiAgICAgRgotCQkgKiAgLyBcICAgLyBcCi0JCSAqIEEgICBDIEUgICBHCi0JCSAqIDwvY29kZT4KLQkJICovCi0gICAgICAgLS0+Ci0gICAKLSAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5PcGVyYXRpb25FeHRlbnNpb24iCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS5tYW5hZ2VyIj4KLSAgICAgIDxvcGVyYXRpb25FeHRlbnNpb24KLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLm1hbmFnZXIuRCIKLSAgICAgICAgICAgIHBvc3RPcGVyYXRpb25DbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS5tYW5hZ2VyLkYiCi0gICAgICAgICAgICBwcmVPcGVyYXRpb25DbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS5tYW5hZ2VyLkIiLz4KLSAgICAgIDxvcGVyYXRpb25FeHRlbnNpb24KLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLm1hbmFnZXIuQiIKLSAgICAgICAgICAgIHBvc3RPcGVyYXRpb25DbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS5tYW5hZ2VyLkMiCi0gICAgICAgICAgICBwcmVPcGVyYXRpb25DbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS5tYW5hZ2VyLkEiLz4KLSAgICAgIDxvcGVyYXRpb25FeHRlbnNpb24KLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLm1hbmFnZXIuRiIKLSAgICAgICAgICAgIHBvc3RPcGVyYXRpb25DbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS5tYW5hZ2VyLkciCi0gICAgICAgICAgICBwcmVPcGVyYXRpb25DbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS5tYW5hZ2VyLkUiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAKLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL0RhdGFNb2RlbFVJQVBJVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvRGF0YU1vZGVsVUlBUElUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjcxZTJkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvRGF0YU1vZGVsVUlBUElUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWk7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5TaW1wbGVUZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS53aXphcmQuVGVzdFdpemFyZFRlc3RjYXNlOwotCi0vKioKLSAqIEBhdXRob3IganNob2xsCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIERhdGFNb2RlbFVJQVBJVGVzdHMgZXh0ZW5kcyBUZXN0U3VpdGUgewotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IERhdGFNb2RlbFVJQVBJVGVzdHMoKTsKLQl9Ci0KLQlwdWJsaWMgRGF0YU1vZGVsVUlBUElUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJYWRkVGVzdChuZXcgU2ltcGxlVGVzdFN1aXRlKERhdGFNb2RlbFVJRmFjdG9yeVRlc3QuY2xhc3MpKTsKLQkJYWRkVGVzdChuZXcgU2ltcGxlVGVzdFN1aXRlKFRlc3RXaXphcmRUZXN0Y2FzZS5jbGFzcykpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvRGF0YU1vZGVsVUlGYWN0b3J5VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS9EYXRhTW9kZWxVSUZhY3RvcnlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmMmQyODEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS9EYXRhTW9kZWxVSUZhY3RvcnlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0cy5JVGVzdERhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzLlRlc3REYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBEYXRhTW9kZWxVSUZhY3RvcnlUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIHZvaWQgdGVzdFZhbGlkRXh0ZW5zaW9uSUQoKSB7Ci0JCUlEYXRhTW9kZWwgZGF0YU1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwoIm9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuSVRlc3REYXRhTW9kZWwiKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKGRhdGFNb2RlbC5pc1Byb3BlcnR5KElUZXN0RGF0YU1vZGVsLkZPTykpOwotCQlEYXRhTW9kZWxXaXphcmQgd2l6YXJkID0gRGF0YU1vZGVsV2l6YXJkRmFjdG9yeS5jcmVhdGVXaXphcmQoIm9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuSVRlc3REYXRhTW9kZWwiKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKHdpemFyZCk7Ci0JCWFzc2VydE5vdE51bGwod2l6YXJkLmdldERhdGFNb2RlbCgpKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWxpZEV4dGVuc2lvbkNsYXNzKCkgewotCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKElUZXN0RGF0YU1vZGVsLmNsYXNzKTsKLQkJYXNzZXJ0VHJ1ZShkYXRhTW9kZWwuaXNQcm9wZXJ0eShJVGVzdERhdGFNb2RlbC5GT08pKTsKLQkJRGF0YU1vZGVsV2l6YXJkIHdpemFyZCA9IERhdGFNb2RlbFdpemFyZEZhY3RvcnkuY3JlYXRlV2l6YXJkKElUZXN0RGF0YU1vZGVsLmNsYXNzKTsKLQkJYXNzZXJ0Tm90TnVsbCh3aXphcmQpOwotCQlhc3NlcnROb3ROdWxsKHdpemFyZC5nZXREYXRhTW9kZWwoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbGlkRXh0ZW5zaW9uSW5zdGFuY2UoKSB7Ci0JCWludCBzdGFydEluc3RhbmNlQ291bnQgPSBUZXN0RGF0YU1vZGVsUHJvdmlkZXIuZ2V0SW5zdGFuY2VDb3VudCgpOwotCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBUZXN0RGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCWFzc2VydFRydWUoZGF0YU1vZGVsLmlzUHJvcGVydHkoSVRlc3REYXRhTW9kZWwuRk9PKSk7Ci0JCURhdGFNb2RlbFdpemFyZCB3aXphcmQgPSBEYXRhTW9kZWxXaXphcmRGYWN0b3J5LmNyZWF0ZVdpemFyZChkYXRhTW9kZWwpOwotCQlhc3NlcnROb3ROdWxsKHdpemFyZCk7Ci0JCWFzc2VydFRydWUoZGF0YU1vZGVsID09IHdpemFyZC5nZXREYXRhTW9kZWwoKSk7Ci0JCWludCBlbmRJbnN0YW5jZUNvdW50ID0gVGVzdERhdGFNb2RlbFByb3ZpZGVyLmdldEluc3RhbmNlQ291bnQoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGVuZEluc3RhbmNlQ291bnQtc3RhcnRJbnN0YW5jZUNvdW50KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvVGVzdERhdGFNb2RlbFdpemFyZC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS9UZXN0RGF0YU1vZGVsV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2MDQ0YzQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS9UZXN0RGF0YU1vZGVsV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzLlRlc3REYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZDsKLQotcHVibGljIGNsYXNzIFRlc3REYXRhTW9kZWxXaXphcmQgZXh0ZW5kcyBEYXRhTW9kZWxXaXphcmQgewotCi0JcHVibGljIFRlc3REYXRhTW9kZWxXaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFRlc3REYXRhTW9kZWxXaXphcmQoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJc3VwZXIoZGF0YU1vZGVsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSURhdGFNb2RlbFByb3ZpZGVyIGdldERlZmF1bHRQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBUZXN0RGF0YU1vZGVsUHJvdmlkZXIoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvVWlQbHVnaW4uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvVWlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc2ZmM2ZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL1VpUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIFVpUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JLy9UaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFVpUGx1Z2luIHBsdWdpbjsKLQkvL1Jlc291cmNlIGJ1bmRsZS4KLQlwcml2YXRlIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgVWlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHVwb24gcGx1Zy1pbiBhY3RpdmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHBsdWctaW4gaXMgc3RvcHBlZAotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQkJcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVpUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIGZyb20gdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKiBvciAna2V5JyBpZiBub3QgZm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBVaVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJdHJ5IHsKLQkJCXJldHVybiAoYnVuZGxlICE9IG51bGwpID8gYnVuZGxlLmdldFN0cmluZyhrZXkpIDoga2V5OwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCXRyeSB7Ci0JCQlpZiAocmVzb3VyY2VCdW5kbGUgPT0gbnVsbCkKLQkJCQlyZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS5VaVBsdWdpblJlc291cmNlcyIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB4KSB7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlQnVuZGxlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gaW1hZ2UgZGVzY3JpcHRvciBmb3IgdGhlIGltYWdlIGZpbGUgYXQgdGhlIGdpdmVuCi0JICogcGx1Zy1pbiByZWxhdGl2ZSBwYXRoLgotCSAqCi0JICogQHBhcmFtIHBhdGggdGhlIHBhdGgKLQkgKiBAcmV0dXJuIHRoZSBpbWFnZSBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBwYXRoKSB7Ci0JCXJldHVybiBBYnN0cmFjdFVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oIm9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkiLCBwYXRoKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvbWFuYWdlci9BLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL21hbmFnZXIvQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGE3ZjU3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvbWFuYWdlci9BLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS5tYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgQSBleHRlbmRzIEJhc2VPcGVyYXRpb24gewotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL21hbmFnZXIvQi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS9tYW5hZ2VyL0IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U2NDFiNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL21hbmFnZXIvQi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkubWFuYWdlcjsKLQotcHVibGljIGNsYXNzIEIgZXh0ZW5kcyBCYXNlT3BlcmF0aW9uIHsKLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS9tYW5hZ2VyL0Jhc2VPcGVyYXRpb24uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvbWFuYWdlci9CYXNlT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MmIxZjYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS9tYW5hZ2VyL0Jhc2VPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLm1hbmFnZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklMb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlT3BlcmF0aW9uIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gewotCXB1YmxpYyBzdGF0aWMgVmVjdG9yIHJlc3VsdExpc3Q7Ci0JcHVibGljIHN0YXRpYyBWZWN0b3IgdW5kb0xpc3Q7Ci0JcHJpdmF0ZSBJU3RhdHVzIHN0YXR1czsKLQlwcml2YXRlIGJvb2xlYW4gY2hlY2tNb2RlbHM7Ci0JcHJpdmF0ZSBib29sZWFuIG1vZGVsc09LID0gZmFsc2U7Ci0KLQlwdWJsaWMgQmFzZU9wZXJhdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTdGF0dXMoSVN0YXR1cyBzdGF0dXMpIHsKLQkJdGhpcy5zdGF0dXMgPSBzdGF0dXM7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXJlc3VsdExpc3QuYWRkKGdldElEKCkpOwotCi0JCWdldERhdGFNb2RlbCgpLnNldFByb3BlcnR5KCJleGVjdXRlZE9wcyIsIHJlc3VsdExpc3QpOwotCQlnZXREYXRhTW9kZWwoKS5zZXRQcm9wZXJ0eSgiZXhlY3V0ZWRVbmRvT3BzIiwgdW5kb0xpc3QpOwotCQlpZiAoY2hlY2tNb2RlbHMpCi0JCQltb2RlbHNPSyA9IGNoZWNrTW9kZWxzKCk7Ci0KLQkJZ2V0RW52aXJvbm1lbnQoKS5nZXRMb2coKS5sb2coSUxvZy5PSywgMTIzNCwgdGhpcywgIkJhc2VPcGVyYXRpb24iLCAoVGhyb3dhYmxlKSBudWxsKTsgLy8kTk9OLU5MUy0xJAotCi0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgcmVkbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHVuZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlyZXN1bHRMaXN0LnJlbW92ZShyZXN1bHRMaXN0LnNpemUoKSAtIDEpOwotCQl1bmRvTGlzdC5hZGQoZ2V0SUQoKSk7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENoZWNrTW9kZWxzKGJvb2xlYW4gY2hlY2tNb2RlbHMpIHsKLQkJdGhpcy5jaGVja01vZGVscyA9IGNoZWNrTW9kZWxzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldE1vZGVsc09LKCkgewotCQlyZXR1cm4gbW9kZWxzT0s7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrTW9kZWxzKCkgewotCQlJRGF0YU1vZGVsIG1vZGVsID0gZ2V0RGF0YU1vZGVsKCk7Ci0KLQkJYm9vbGVhbiBjb250YWluc01vZGVsMSA9IG1vZGVsLmlzTmVzdGVkTW9kZWwoInRlc3Rwcm92aWRlcjEiKTsKLQkJYm9vbGVhbiBjb250YWluc01vZGVsMiA9IG1vZGVsLmlzTmVzdGVkTW9kZWwoInRlc3Rwcm92aWRlcjIiKTsKLQkJYm9vbGVhbiBwcm9wMSA9IG1vZGVsLmlzUHJvcGVydHlTZXQoInByb3ZpZGVyMVByb3AxIik7Ci0JCWJvb2xlYW4gcHJvcDIgPSBtb2RlbC5pc1Byb3BlcnR5U2V0KCJwcm92aWRlcjFQcm9wMiIpOwotCQlib29sZWFuIHByb3AzID0gbW9kZWwuaXNQcm9wZXJ0eVNldCgicHJvdmlkZXIxUHJvcDMiKTsKLQkJYm9vbGVhbiBwcm9wNCA9IG1vZGVsLmlzUHJvcGVydHlTZXQoInByb3ZpZGVyMVByb3A0Iik7Ci0JCWJvb2xlYW4gcHJvcDUgPSBtb2RlbC5pc1Byb3BlcnR5U2V0KCJwcm92aWRlcjJQcm9wMSIpOwotCQlib29sZWFuIHByb3A2ID0gbW9kZWwuaXNQcm9wZXJ0eVNldCgicHJvdmlkZXIyUHJvcDIiKTsKLQkJYm9vbGVhbiBwcm9wNyA9IG1vZGVsLmlzUHJvcGVydHlTZXQoInByb3ZpZGVyMlByb3AzIik7Ci0JCWJvb2xlYW4gcHJvcDggPSBtb2RlbC5pc1Byb3BlcnR5U2V0KCJwcm92aWRlcjJQcm9wNCIpOwotCQlib29sZWFuIHZhbHVlMSA9IG1vZGVsLmdldFByb3BlcnR5KCJwcm92aWRlcjFQcm9wMSIpLmVxdWFscygiMTEiKTsKLQkJYm9vbGVhbiB2YWx1ZTIgPSBtb2RlbC5nZXRQcm9wZXJ0eSgicHJvdmlkZXIxUHJvcDIiKS5lcXVhbHMoIjIyIik7Ci0JCWJvb2xlYW4gdmFsdWUzID0gbW9kZWwuZ2V0UHJvcGVydHkoInByb3ZpZGVyMVByb3AzIikuZXF1YWxzKCIzMyIpOwotCQlib29sZWFuIHZhbHVlNCA9IG1vZGVsLmdldFByb3BlcnR5KCJwcm92aWRlcjFQcm9wNCIpLmVxdWFscygiNDQiKTsKLQkJYm9vbGVhbiB2YWx1ZTUgPSBtb2RlbC5nZXRQcm9wZXJ0eSgicHJvdmlkZXIyUHJvcDEiKS5lcXVhbHMoIjExMTEiKTsKLQkJYm9vbGVhbiB2YWx1ZTYgPSBtb2RlbC5nZXRQcm9wZXJ0eSgicHJvdmlkZXIyUHJvcDIiKS5lcXVhbHMoIjIyMjIiKTsKLQkJYm9vbGVhbiB2YWx1ZTcgPSBtb2RlbC5nZXRQcm9wZXJ0eSgicHJvdmlkZXIyUHJvcDMiKS5lcXVhbHMoIjMzMzMiKTsKLQkJYm9vbGVhbiB2YWx1ZTggPSBtb2RlbC5nZXRQcm9wZXJ0eSgicHJvdmlkZXIyUHJvcDQiKS5lcXVhbHMoIjQ0NDQiKTsKLQotCQlyZXR1cm4gY29udGFpbnNNb2RlbDEgJiYgY29udGFpbnNNb2RlbDIgJiYgcHJvcDEgJiYgcHJvcDIgJiYgcHJvcDMgJiYgcHJvcDQgJiYgcHJvcDUgJiYgcHJvcDYgJiYgcHJvcDcgJiYgcHJvcDggJiYgdmFsdWUxICYmIHZhbHVlMiAmJiB2YWx1ZTMgJiYgdmFsdWU0ICYmIHZhbHVlNSAmJiB2YWx1ZTYgJiYgdmFsdWU3ICYmIHZhbHVlODsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL21hbmFnZXIvQy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS9tYW5hZ2VyL0MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI5NzUxYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL21hbmFnZXIvQy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkubWFuYWdlcjsKLQotcHVibGljIGNsYXNzIEMgZXh0ZW5kcyBCYXNlT3BlcmF0aW9uIHsKLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS9tYW5hZ2VyL0QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvbWFuYWdlci9ELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0YWFkMjIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS9tYW5hZ2VyL0QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLm1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBEIGV4dGVuZHMgQmFzZU9wZXJhdGlvbiB7Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvbWFuYWdlci9FLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL21hbmFnZXIvRS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDBjNjcxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvbWFuYWdlci9FLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS5tYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgRSBleHRlbmRzIEJhc2VPcGVyYXRpb24gewotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL21hbmFnZXIvRi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS9tYW5hZ2VyL0YuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQyMzI4ZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL21hbmFnZXIvRi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkubWFuYWdlcjsKLQotcHVibGljIGNsYXNzIEYgZXh0ZW5kcyBCYXNlT3BlcmF0aW9uIHsKLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS9tYW5hZ2VyL0cuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvbWFuYWdlci9HLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmOGE0MGYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS9tYW5hZ2VyL0cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLm1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBHIGV4dGVuZHMgQmFzZU9wZXJhdGlvbiB7Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvbWFuYWdlci9UZXN0RXh0ZW5kZWRQcm92aWRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS9tYW5hZ2VyL1Rlc3RFeHRlbmRlZFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MTBlMzAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS9tYW5hZ2VyL1Rlc3RFeHRlbmRlZFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkubWFuYWdlcjsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgVGVzdEV4dGVuZGVkUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyCi17Ci0gIHB1YmxpYyBTZXQgZ2V0UHJvcGVydHlOYW1lcygpewotICAgIFNldCBwcm9wZXJ0eU5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwotICAgIHByb3BlcnR5TmFtZXMuYWRkKCJleGVjdXRlZE9wcyIpOwotICAgIHByb3BlcnR5TmFtZXMuYWRkKCJleGVjdXRlZFVuZG9PcHMiKTsKLSAgICAKLSAgICByZXR1cm4gcHJvcGVydHlOYW1lczsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGluaXQoKQotICB7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldElEKCkKLSAgewotICAgIHJldHVybiAiVGVzdEV4dGVuZGVkUHJvdmlkZXIiOwotICB9Ci0gIAotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL21hbmFnZXIvVGVzdEdyb3VwTWFuYWdlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS9tYW5hZ2VyL1Rlc3RHcm91cE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ0M2RlYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL21hbmFnZXIvVGVzdEdyb3VwTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS5tYW5hZ2VyOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuRW52aXJvbm1lbnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLkRhdGFNb2RlbEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC5EYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC5JRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5EYXRhTW9kZWxXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuSURNUGFnZUdyb3VwSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLklETVBhZ2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuU2ltcGxlUGFnZUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5QYWdlR3JvdXBNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgVGVzdEdyb3VwTWFuYWdlciBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXByaXZhdGUgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uIHJvb3RPcGVyYXRpb247Ci0KLQlwcml2YXRlIFBhZ2VHcm91cE1hbmFnZXIgcGFnZUdyb3VwTWFuYWdlcjsKLQlwcml2YXRlIFNpbXBsZVBhZ2VHcm91cCBwZ0E7Ci0JcHJpdmF0ZSBTaW1wbGVQYWdlR3JvdXAgcGdCOwotCXByaXZhdGUgU2ltcGxlUGFnZUdyb3VwIHBnQzsKLQlwcml2YXRlIFNpbXBsZVBhZ2VHcm91cCBwZ0Q7Ci0JcHJpdmF0ZSBTaW1wbGVQYWdlR3JvdXAgcGdFOwotCXByaXZhdGUgU2ltcGxlUGFnZUdyb3VwIHBnRjsKLQlwcml2YXRlIFNpbXBsZVBhZ2VHcm91cCBwZ0c7Ci0JcHJpdmF0ZSBTaW1wbGVQYWdlR3JvdXAgcGdIOwotCXByaXZhdGUgU2ltcGxlUGFnZUdyb3VwIHBnUm9vdDsKLQlwcml2YXRlIFdpemFyZFBhZ2UgcjE7Ci0JcHJpdmF0ZSBXaXphcmRQYWdlIGIxOwotCXByaXZhdGUgV2l6YXJkUGFnZSBiMjsKLQlwcml2YXRlIFdpemFyZFBhZ2UgYzE7Ci0JcHJpdmF0ZSBXaXphcmRQYWdlIGQxOwotCXByaXZhdGUgV2l6YXJkUGFnZSBkMjsKLQlwcml2YXRlIFdpemFyZFBhZ2UgZDM7Ci0JcHJpdmF0ZSBXaXphcmRQYWdlIGYxOwotCXByaXZhdGUgV2l6YXJkUGFnZSBmMjsKLQlwcml2YXRlIFdpemFyZFBhZ2UgZjM7Ci0JcHJpdmF0ZSBXaXphcmRQYWdlIGY0OwotCXByaXZhdGUgV2l6YXJkUGFnZSBmNTsKLQlwcml2YXRlIFdpemFyZFBhZ2UgZjY7Ci0JcHJpdmF0ZSBXaXphcmRQYWdlIGcxOwotCi0JcHJpdmF0ZSBBR3JvdXBIYW5kbGVyIGFHcm91cEhhbmRsZXI7Ci0JcHJpdmF0ZSBGR3JvdXBIYW5kbGVyIGZHcm91cEhhbmRsZXI7Ci0JcHJpdmF0ZSBWZWN0b3IgZXhwZWN0ZWRPcHM7Ci0JcHJpdmF0ZSBWZWN0b3IgZXhwZWN0ZWRVbmRvT3BzOwotCXByaXZhdGUgSURhdGFNb2RlbCBkYXRhTW9kZWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBhID0gQS5jbGFzcy5nZXROYW1lKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgYiA9IEIuY2xhc3MuZ2V0TmFtZSgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGMgPSBDLmNsYXNzLmdldE5hbWUoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBkID0gRC5jbGFzcy5nZXROYW1lKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZSA9IEUuY2xhc3MuZ2V0TmFtZSgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGYgPSBGLmNsYXNzLmdldE5hbWUoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnID0gRy5jbGFzcy5nZXROYW1lKCk7Ci0KLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCUJhc2VPcGVyYXRpb24ucmVzdWx0TGlzdCA9IG5ldyBWZWN0b3IoKTsKLQkJQmFzZU9wZXJhdGlvbi51bmRvTGlzdCA9IG5ldyBWZWN0b3IoKTsKLQotCQlleHBlY3RlZE9wcyA9IG5ldyBWZWN0b3IoKTsKLQkJZXhwZWN0ZWRVbmRvT3BzID0gbmV3IFZlY3RvcigpOwotCQlkYXRhTW9kZWwgPSBuZXcgRGF0YU1vZGVsSW1wbChuZXcgRW1wdHlQcm92aWRlcigpKTsKLQkJZGF0YU1vZGVsLmFkZE5lc3RlZE1vZGVsKCJ0ZXN0cHJvdmlkZXIxIiwgRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IFRlc3RQcm92aWRlcjEoKSkpOwotCQlkYXRhTW9kZWwuYWRkTmVzdGVkTW9kZWwoInRlc3Rwcm92aWRlcjIiLCBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgVGVzdFByb3ZpZGVyMigpKSk7Ci0JCWRhdGFNb2RlbC5hZGROZXN0ZWRNb2RlbCgidGVzdGV4dGVuZGVkcHJvdmlkZXIiLCBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgVGVzdEV4dGVuZGVkUHJvdmlkZXIoKSkpOwotCi0JCS8qKgotCQkgKiBPcGVyYXRpb25zIGFyZSBvcmdhbml6ZWQgYXMgZm9sbG93czogPGNvZGU+Ci0JCSAqCSAgICBECi0JCSAqICAgICAvIFwKLQkJICogICAgLyAgIFwKLQkJICogICBCICAgICBGCi0JCSAqICAvIFwgICAvIFwKLQkJICogQSAgIEMgRSAgIEcKLQkJICogPC9jb2RlPgotCQkgKi8KLQkJcm9vdE9wZXJhdGlvbiA9IG5ldyBEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkltcGwobmV3IEQoKSk7Ci0JCXJvb3RPcGVyYXRpb24uc2V0RGF0YU1vZGVsKGRhdGFNb2RlbCk7Ci0JCXJvb3RPcGVyYXRpb24uc2V0RW52aXJvbm1lbnQoRW52aXJvbm1lbnRTZXJ2aWNlLmdldEVjbGlwc2VDb25zb2xlRW52aXJvbm1lbnQoKSk7Ci0KLQkJLyoqCi0JCSAqIFBhZ2UgZ3JvdXBzIGFyZSBvcmdhbml6ZWQgYXMgZm9sbG93czoKLQkJICogCi0JCSAqIDxjb2RlPgotCQkgKgotCQkgKiAgICAgICAgICAgICAgQiAtIEMKLQkJICogICAgICAgICAgICAgLyAgICAgXAotCQkgKiBSb290IC0gQSAtIEQgICAgICAgXCAgICAgICAgIEcKLQkJICogICAgICAgICAgICAgXCAgICAgICBcICAgICAgLwotCQkgKiAgICAgICAgICAgICAgIC0tLS0tLSBFIC0gRiAtIEgKLQkJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgXCBudWxsCi0JCSAqIDwvY29kZT4KLQkJICovCi0KLQkJLy8gVGhlIHBhZ2UgZ3JvdXAgaGFuZGxlciBmb3IgQSB3aWxsIHJldHVybiBlaXRoZXIgQiBhbmQgdGhlbiBFIG9yIEQgYW5kCi0JCS8vIHRoZW4gRS4gVGhlIGdyb3VwIGhhbmRsZXIgZm9yIEYgd2lsbCByZXR1cm4gZWl0aGVyIEcgb3IgSCBhbmQgdGhlbiBudWxsIG9yCi0JCS8vIGp1c3QgbnVsbC4KLQkJLy8gCi0JCS8vIFNvbWUgb2YgdGhlc2UgZ3JvdXAgcmVxdWlyZSBvcGVyYXRpb25zIHRvIHJ1biBmaXJzdDoKLQkJLy8KLQkJLy8gUGFnZSBncm91cCBCIHJlcXVpcmVzIG9wZXJhdGlvbiBDLgotCQkvLyBQYWdlIGdyb3VwIEQgcmVxdWlyZXMgb3BlcmF0aW9uIEMuCi0JCS8vIFBhZ2UgZ3JvdXAgRSByZXF1aXJlcyBvcGVyYXRpb24gRS4KLQkJLy8gUGFnZSBncm91cCBGIHJlcXVpcmVzIG9wZXJhdGlvbiBDLiggQyB3aWxsIGFscmVhZHkgaGF2ZSBiZWVuIHJ1biBhbmQgc2hvdWxkIG5vdCBiZQotCQkvLyByZXJ1bi4pCi0JCS8vCi0JCS8vIEVhY2ggcGFnZSBncm91cCBoYXMgc29tZSBwYWdlcyBhc3NvY2lhdGVkIHdpdGggaXQgYXMgZm9sbG93czoKLQkJLy8KLQkJLy8gUm9vdCBoYXMgcGFnZSByMS4KLQkJLy8gQSBoYXMgbm8gcGFnZXMuCi0JCS8vIEIgaGFzIGIxIGFuZCBiMi4KLQkJLy8gQyBoYXMgYzEKLQkJLy8gRCBoYXMgZDEsIGQyLCBhbmQgZDMKLQkJLy8gRSBoYXMgbm8gcGFnZXMuCi0JCS8vIEYgaGFzIHBhZ2VzIGYxLCBmMiwgZjMsIGY0LCBmNSwgZjYKLQkJLy8gdGhlIHBhZ2UgaGFuZGxlciBmb3IgRiB3aWxsIHJldHVybiB0aGUgZm9sbG93aW5nOgotCQkvLyBleHBlY3RlZCA9IGYxIHJldHVybnMgZjEKLQkJLy8gZXhwZWN0ZWQgPSBmMiByZXR1cm5zIHNraXAKLQkJLy8gZXhwZWN0ZWQgPSBmMyByZXR1cm5zIGJlZm9yZSBmNgotCQkvLyBleHBlY3RlZCA9IGY0IHJldHVybnMgbnVsbAotCQkvLyBleHBlY3RlZCA9IGY1IHJldHVybnMgYWZ0ZXIgZjUKLQkJLy8gZXhwZWN0ZWQgPSBmNiByZXR1cm5zIGY0Ci0JCS8vIEcgaGFzIHBhZ2VzIGcxCi0JCS8vIEggaGFzIG5vIHBhZ2VzLgotCQlyMSA9IG5ldyBXaXphcmRQYWdlKCJyMSIpOyAvLyROT04tTkxTLTEkCi0JCWIxID0gbmV3IFdpemFyZFBhZ2UoImIxIik7IC8vJE5PTi1OTFMtMSQKLQkJYjIgPSBuZXcgV2l6YXJkUGFnZSgiYjIiKTsgLy8kTk9OLU5MUy0xJAotCQljMSA9IG5ldyBXaXphcmRQYWdlKCJjMSIpOyAvLyROT04tTkxTLTEkCi0JCWQxID0gbmV3IFdpemFyZFBhZ2UoImQxIik7IC8vJE5PTi1OTFMtMSQKLQkJZDIgPSBuZXcgV2l6YXJkUGFnZSgiZDIiKTsgLy8kTk9OLU5MUy0xJAotCQlkMyA9IG5ldyBXaXphcmRQYWdlKCJkMyIpOyAvLyROT04tTkxTLTEkCi0JCWYxID0gbmV3IFdpemFyZFBhZ2UoImYxIik7IC8vJE5PTi1OTFMtMSQKLQkJZjIgPSBuZXcgV2l6YXJkUGFnZSgiZjIiKTsgLy8kTk9OLU5MUy0xJAotCQlmMyA9IG5ldyBXaXphcmRQYWdlKCJmMyIpOyAvLyROT04tTkxTLTEkCi0JCWY0ID0gbmV3IFdpemFyZFBhZ2UoImY0Iik7IC8vJE5PTi1OTFMtMSQKLQkJZjUgPSBuZXcgV2l6YXJkUGFnZSgiZjUiKTsgLy8kTk9OLU5MUy0xJAotCQlmNiA9IG5ldyBXaXphcmRQYWdlKCJmNiIpOyAvLyROT04tTkxTLTEkCi0JCWcxID0gbmV3IFdpemFyZFBhZ2UoImcxIik7IC8vJE5PTi1OTFMtMSQKLQotCQlTdHJpbmcgd2l6YXJkSUQgPSAidGVzdFdpemFyZCI7IC8vJE5PTi1OTFMtMSQKLQotCQlwZ1Jvb3QgPSBuZXcgU2ltcGxlUGFnZUdyb3VwKCJSb290Iiwgd2l6YXJkSUQpOyAvLyROT04tTkxTLTEkCi0JCXBnQSA9IG5ldyBTaW1wbGVQYWdlR3JvdXAoIkEiLCB3aXphcmRJRCk7IC8vJE5PTi1OTFMtMSQKLQkJcGdCID0gbmV3IFNpbXBsZVBhZ2VHcm91cCgiQiIsIHdpemFyZElELCB0cnVlLCBjKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXBnQyA9IG5ldyBTaW1wbGVQYWdlR3JvdXAoIkMiLCB3aXphcmRJRCk7IC8vJE5PTi1OTFMtMSQKLQkJcGdEID0gbmV3IFNpbXBsZVBhZ2VHcm91cCgiRCIsIHdpemFyZElELCB0cnVlLCBjKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXBnRSA9IG5ldyBTaW1wbGVQYWdlR3JvdXAoIkUiLCB3aXphcmRJRCwgdHJ1ZSwgZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlwZ0YgPSBuZXcgU2ltcGxlUGFnZUdyb3VwKCJGIiwgd2l6YXJkSUQsIHRydWUsIGMpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcGdHID0gbmV3IFNpbXBsZVBhZ2VHcm91cCgiRyIsIHdpemFyZElEKTsgLy8kTk9OLU5MUy0xJAotCQlwZ0ggPSBuZXcgU2ltcGxlUGFnZUdyb3VwKCJIIiwgd2l6YXJkSUQpOyAvLyROT04tTkxTLTEkCi0KLQkJcGdSb290LmFkZFBhZ2VzKG5ldyBXaXphcmRQYWdlW117cjF9KTsKLQkJcGdCLmFkZFBhZ2VzKG5ldyBXaXphcmRQYWdlW117YjEsIGIyfSk7Ci0JCXBnQy5hZGRQYWdlcyhuZXcgV2l6YXJkUGFnZVtde2MxfSk7Ci0JCXBnRC5hZGRQYWdlcyhuZXcgV2l6YXJkUGFnZVtde2QxLCBkMiwgZDN9KTsKLQkJcGdGLmFkZFBhZ2VzKG5ldyBXaXphcmRQYWdlW117ZjEsIGYyLCBmMywgZjQsIGY1LCBmNn0pOwotCQlwZ0cuYWRkUGFnZXMobmV3IFdpemFyZFBhZ2VbXXtnMX0pOwotCi0JCXBnRi5zZXRQYWdlSGFuZGxlcihuZXcgRlBhZ2VIYW5kbGVyKCkpOwotCi0JCWFHcm91cEhhbmRsZXIgPSBuZXcgQUdyb3VwSGFuZGxlcigpOwotCQlmR3JvdXBIYW5kbGVyID0gbmV3IEZHcm91cEhhbmRsZXIoKTsKLQotCQlwZ0Euc2V0UGFnZUdyb3VwSGFuZGxlcihhR3JvdXBIYW5kbGVyKTsKLQkJcGdGLnNldFBhZ2VHcm91cEhhbmRsZXIoZkdyb3VwSGFuZGxlcik7Ci0KLQkJcGFnZUdyb3VwTWFuYWdlciA9IG5ldyBQYWdlR3JvdXBNYW5hZ2VyKHJvb3RPcGVyYXRpb24sIHBnUm9vdCk7Ci0JCXBhZ2VHcm91cE1hbmFnZXIuYWRkR3JvdXBBZnRlcigiUm9vdCIsIHBnQSk7IC8vJE5PTi1OTFMtMSQKLQkJcGFnZUdyb3VwTWFuYWdlci5hZGRHcm91cEFmdGVyKCJBIiwgcGdCKTsgLy8kTk9OLU5MUy0xJAotCQlwYWdlR3JvdXBNYW5hZ2VyLmFkZEdyb3VwQWZ0ZXIoIkEiLCBwZ0QpOyAvLyROT04tTkxTLTEkCi0JCXBhZ2VHcm91cE1hbmFnZXIuYWRkR3JvdXBBZnRlcigiQSIsIHBnRSk7IC8vJE5PTi1OTFMtMSQKLQkJcGFnZUdyb3VwTWFuYWdlci5hZGRHcm91cEFmdGVyKCJCIiwgcGdDKTsgLy8kTk9OLU5MUy0xJAotCQlwYWdlR3JvdXBNYW5hZ2VyLmFkZEdyb3VwQWZ0ZXIoIkUiLCBwZ0YpOyAvLyROT04tTkxTLTEkCi0JCXBhZ2VHcm91cE1hbmFnZXIuYWRkR3JvdXBBZnRlcigiRiIsIHBnRyk7IC8vJE5PTi1OTFMtMSQKLQkJcGFnZUdyb3VwTWFuYWdlci5hZGRHcm91cEFmdGVyKCJGIiwgcGdIKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaW1wbGVSdW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSGFzaFNldCBpZHMgPSBuZXcgSGFzaFNldCgpOwotCQlpZHMuYWRkKCJ0ZXN0cHJvdmlkZXIxIik7Ci0JCWlkcy5hZGQoInRlc3Rwcm92aWRlcjIiKTsKLQkJcGdBLnNldERhdGFNb2RlbElEcyhpZHMpOwotCQlhc3NlcnRUcnVlKCJUaGVyZSBzaG91bGQgYmUgYSBuZXh0IHBhZ2UiLCBwYWdlR3JvdXBNYW5hZ2VyLmhhc05leHRQYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlRoZSByb290IHBhZ2Ugc2hvdWxkIGJlIG51bGwiLCBwYWdlR3JvdXBNYW5hZ2VyLmdldEN1cnJlbnRQYWdlKCkgPT0gbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJcGFnZUdyb3VwTWFuYWdlci5tb3ZlQmFja09uZVBhZ2UoKTsgLy8gU2hvdWxkIGRvIG5vdGhpbmcuCi0JCWNoZWNrUmVzdWx0cygpOwotCi0JCXBhZ2VHcm91cE1hbmFnZXIubW92ZUZvcndhcmRPbmVQYWdlKCk7Ci0JCWFHcm91cEhhbmRsZXIuc2V0R3JvdXBJRFRvU2VsZWN0KCJCIik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiVGhlcmUgc2hvdWxkIGJlIGEgbmV4dCBwYWdlIiwgcGFnZUdyb3VwTWFuYWdlci5oYXNOZXh0UGFnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJUaGUgcGFnZSBzaG91bGQgYmUgcjEiLCBwYWdlR3JvdXBNYW5hZ2VyLmdldEN1cnJlbnRQYWdlKCkgPT0gcjEpOyAvLyROT04tTkxTLTEkCi0JCWNoZWNrUmVzdWx0cygpOwotCQlhc3NlcnRUcnVlKCJEYXRhIG1vZGVscyBub3QgT2sgZm9yIHBhZ2UgZ3JvdXAgQSIsIGNoZWNrRGF0YU1vZGVscygpKTsgLy8kTk9OLU5MUy0xJAotCi0JCXBhZ2VHcm91cE1hbmFnZXIubW92ZUZvcndhcmRPbmVQYWdlKCk7Ci0JCWFzc2VydFRydWUoIlRoZXJlIHNob3VsZCBiZSBhIG5leHQgcGFnZSIsIHBhZ2VHcm91cE1hbmFnZXIuaGFzTmV4dFBhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHBhZ2Ugc2hvdWxkIGJlIGIxIiwgcGFnZUdyb3VwTWFuYWdlci5nZXRDdXJyZW50UGFnZSgpID09IGIxKTsgLy8kTk9OLU5MUy0xJAotCQlleHBlY3RlZE9wcy5hZGQoYSk7Ci0JCWV4cGVjdGVkT3BzLmFkZChiKTsKLQkJZXhwZWN0ZWRPcHMuYWRkKGMpOwotCQljaGVja1Jlc3VsdHMoKTsKLQotCQlwYWdlR3JvdXBNYW5hZ2VyLm1vdmVGb3J3YXJkT25lUGFnZSgpOwotCQlhc3NlcnRUcnVlKCJUaGVyZSBzaG91bGQgYmUgYSBuZXh0IHBhZ2UiLCBwYWdlR3JvdXBNYW5hZ2VyLmhhc05leHRQYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlRoZSBwYWdlIHNob3VsZCBiZSBiMiIsIHBhZ2VHcm91cE1hbmFnZXIuZ2V0Q3VycmVudFBhZ2UoKSA9PSBiMik7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tSZXN1bHRzKCk7Ci0KLQkJcGFnZUdyb3VwTWFuYWdlci5tb3ZlRm9yd2FyZE9uZVBhZ2UoKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlcmUgc2hvdWxkIGJlIGEgbmV4dCBwYWdlIiwgcGFnZUdyb3VwTWFuYWdlci5oYXNOZXh0UGFnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJUaGUgcGFnZSBzaG91bGQgYmUgYzEiLCBwYWdlR3JvdXBNYW5hZ2VyLmdldEN1cnJlbnRQYWdlKCkgPT0gYzEpOyAvLyROT04tTkxTLTEkCi0JCWNoZWNrUmVzdWx0cygpOwotCi0JCXBhZ2VHcm91cE1hbmFnZXIubW92ZUZvcndhcmRPbmVQYWdlKCk7Ci0JCWFzc2VydFRydWUoIlRoZXJlIHNob3VsZCBiZSBhIG5leHQgcGFnZSIsIHBhZ2VHcm91cE1hbmFnZXIuaGFzTmV4dFBhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHBhZ2Ugc2hvdWxkIGJlIGYxIiwgcGFnZUdyb3VwTWFuYWdlci5nZXRDdXJyZW50UGFnZSgpID09IGYxKTsgLy8kTk9OLU5MUy0xJAotCQlleHBlY3RlZE9wcy5hZGQoZCk7Ci0JCWV4cGVjdGVkT3BzLmFkZChlKTsKLQkJY2hlY2tSZXN1bHRzKCk7Ci0KLQkJcGFnZUdyb3VwTWFuYWdlci5tb3ZlRm9yd2FyZE9uZVBhZ2UoKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlcmUgc2hvdWxkIGJlIGEgbmV4dCBwYWdlIiwgcGFnZUdyb3VwTWFuYWdlci5oYXNOZXh0UGFnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJUaGUgcGFnZSBzaG91bGQgYmUgZjMiLCBwYWdlR3JvdXBNYW5hZ2VyLmdldEN1cnJlbnRQYWdlKCkgPT0gZjMpOyAvLyROT04tTkxTLTEkCi0JCWNoZWNrUmVzdWx0cygpOwotCi0JCXBhZ2VHcm91cE1hbmFnZXIubW92ZUZvcndhcmRPbmVQYWdlKCk7Ci0JCWFzc2VydFRydWUoIlRoZXJlIHNob3VsZCBiZSBhIG5leHQgcGFnZSIsIHBhZ2VHcm91cE1hbmFnZXIuaGFzTmV4dFBhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHBhZ2Ugc2hvdWxkIGJlIGY1IiwgcGFnZUdyb3VwTWFuYWdlci5nZXRDdXJyZW50UGFnZSgpID09IGY1KTsgLy8kTk9OLU5MUy0xJAotCQljaGVja1Jlc3VsdHMoKTsKLQotCQlwYWdlR3JvdXBNYW5hZ2VyLm1vdmVGb3J3YXJkT25lUGFnZSgpOwotCQlhc3NlcnRUcnVlKCJUaGVyZSBzaG91bGQgYmUgYSBuZXh0IHBhZ2UiLCBwYWdlR3JvdXBNYW5hZ2VyLmhhc05leHRQYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlRoZSBwYWdlIHNob3VsZCBiZSBmNiIsIHBhZ2VHcm91cE1hbmFnZXIuZ2V0Q3VycmVudFBhZ2UoKSA9PSBmNik7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tSZXN1bHRzKCk7Ci0KLQkJcGFnZUdyb3VwTWFuYWdlci5tb3ZlRm9yd2FyZE9uZVBhZ2UoKTsKLQkJZkdyb3VwSGFuZGxlci5zZXRHcm91cElEVG9TZWxlY3QoIkciKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJUaGVyZSBzaG91bGQgYmUgYSBuZXh0IHBhZ2UiLCBwYWdlR3JvdXBNYW5hZ2VyLmhhc05leHRQYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlRoZSBwYWdlIHNob3VsZCBiZSBmNCIsIHBhZ2VHcm91cE1hbmFnZXIuZ2V0Q3VycmVudFBhZ2UoKSA9PSBmNCk7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tSZXN1bHRzKCk7Ci0KLQkJcGFnZUdyb3VwTWFuYWdlci5tb3ZlRm9yd2FyZE9uZVBhZ2UoKTsKLQkJYXNzZXJ0RmFsc2UoIlRoZXJlIHNob3VsZCBub3QgYmUgYSBuZXh0IHBhZ2UiLCBwYWdlR3JvdXBNYW5hZ2VyLmhhc05leHRQYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlRoZSBwYWdlIHNob3VsZCBiZSBnMSIsIHBhZ2VHcm91cE1hbmFnZXIuZ2V0Q3VycmVudFBhZ2UoKSA9PSBnMSk7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tSZXN1bHRzKCk7Ci0KLQkJcGFnZUdyb3VwTWFuYWdlci5tb3ZlQmFja09uZVBhZ2UoKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlcmUgc2hvdWxkIGJlIGEgbmV4dCBwYWdlIiwgcGFnZUdyb3VwTWFuYWdlci5oYXNOZXh0UGFnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJUaGUgcGFnZSBzaG91bGQgYmUgZjQiLCBwYWdlR3JvdXBNYW5hZ2VyLmdldEN1cnJlbnRQYWdlKCkgPT0gZjQpOyAvLyROT04tTkxTLTEkCi0JCWNoZWNrUmVzdWx0cygpOwotCi0JCXBhZ2VHcm91cE1hbmFnZXIubW92ZUJhY2tPbmVQYWdlKCk7Ci0JCWFzc2VydFRydWUoIlRoZXJlIHNob3VsZCBiZSBhIG5leHQgcGFnZSIsIHBhZ2VHcm91cE1hbmFnZXIuaGFzTmV4dFBhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHBhZ2Ugc2hvdWxkIGJlIGY0IiwgcGFnZUdyb3VwTWFuYWdlci5nZXRDdXJyZW50UGFnZSgpID09IGY2KTsgLy8kTk9OLU5MUy0xJAotCQljaGVja1Jlc3VsdHMoKTsKLQotCQlwYWdlR3JvdXBNYW5hZ2VyLm1vdmVCYWNrT25lUGFnZSgpOwotCQlhc3NlcnRUcnVlKCJUaGVyZSBzaG91bGQgYmUgYSBuZXh0IHBhZ2UiLCBwYWdlR3JvdXBNYW5hZ2VyLmhhc05leHRQYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlRoZSBwYWdlIHNob3VsZCBiZSBmNCIsIHBhZ2VHcm91cE1hbmFnZXIuZ2V0Q3VycmVudFBhZ2UoKSA9PSBmNSk7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tSZXN1bHRzKCk7Ci0KLQkJcGFnZUdyb3VwTWFuYWdlci5tb3ZlQmFja09uZVBhZ2UoKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlcmUgc2hvdWxkIGJlIGEgbmV4dCBwYWdlIiwgcGFnZUdyb3VwTWFuYWdlci5oYXNOZXh0UGFnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJUaGUgcGFnZSBzaG91bGQgYmUgZjQiLCBwYWdlR3JvdXBNYW5hZ2VyLmdldEN1cnJlbnRQYWdlKCkgPT0gZjMpOyAvLyROT04tTkxTLTEkCi0JCWNoZWNrUmVzdWx0cygpOwotCi0JCXBhZ2VHcm91cE1hbmFnZXIubW92ZUJhY2tPbmVQYWdlKCk7Ci0JCWFzc2VydFRydWUoIlRoZXJlIHNob3VsZCBiZSBhIG5leHQgcGFnZSIsIHBhZ2VHcm91cE1hbmFnZXIuaGFzTmV4dFBhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHBhZ2Ugc2hvdWxkIGJlIGY0IiwgcGFnZUdyb3VwTWFuYWdlci5nZXRDdXJyZW50UGFnZSgpID09IGYxKTsgLy8kTk9OLU5MUy0xJAotCQljaGVja1Jlc3VsdHMoKTsKLQotCQlwYWdlR3JvdXBNYW5hZ2VyLm1vdmVCYWNrT25lUGFnZSgpOwotCQlhc3NlcnRUcnVlKCJUaGVyZSBzaG91bGQgYmUgYSBuZXh0IHBhZ2UiLCBwYWdlR3JvdXBNYW5hZ2VyLmhhc05leHRQYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlRoZSBwYWdlIHNob3VsZCBiZSBmNCIsIHBhZ2VHcm91cE1hbmFnZXIuZ2V0Q3VycmVudFBhZ2UoKSA9PSBjMSk7IC8vJE5PTi1OTFMtMSQKLQkJZXhwZWN0ZWRPcHMuc2V0U2l6ZSgzKTsKLQkJZXhwZWN0ZWRVbmRvT3BzLmFkZChlKTsKLQkJZXhwZWN0ZWRVbmRvT3BzLmFkZChkKTsKLQkJY2hlY2tSZXN1bHRzKCk7Ci0KLQkJcGFnZUdyb3VwTWFuYWdlci5tb3ZlQmFja09uZVBhZ2UoKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlcmUgc2hvdWxkIGJlIGEgbmV4dCBwYWdlIiwgcGFnZUdyb3VwTWFuYWdlci5oYXNOZXh0UGFnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJUaGUgcGFnZSBzaG91bGQgYmUgYjIiLCBwYWdlR3JvdXBNYW5hZ2VyLmdldEN1cnJlbnRQYWdlKCkgPT0gYjIpOyAvLyROT04tTkxTLTEkCi0JCWNoZWNrUmVzdWx0cygpOwotCi0JCXBhZ2VHcm91cE1hbmFnZXIubW92ZUJhY2tPbmVQYWdlKCk7Ci0JCWFzc2VydFRydWUoIlRoZXJlIHNob3VsZCBiZSBhIG5leHQgcGFnZSIsIHBhZ2VHcm91cE1hbmFnZXIuaGFzTmV4dFBhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHBhZ2Ugc2hvdWxkIGJlIGIxIiwgcGFnZUdyb3VwTWFuYWdlci5nZXRDdXJyZW50UGFnZSgpID09IGIxKTsgLy8kTk9OLU5MUy0xJAotCQljaGVja1Jlc3VsdHMoKTsKLQotCQlwYWdlR3JvdXBNYW5hZ2VyLm1vdmVCYWNrT25lUGFnZSgpOwotCQlhc3NlcnRUcnVlKCJUaGVyZSBzaG91bGQgYmUgYSBuZXh0IHBhZ2UiLCBwYWdlR3JvdXBNYW5hZ2VyLmhhc05leHRQYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlRoZSByb290IHBhZ2Ugc2hvdWxkIGJlIHIxIiwgcGFnZUdyb3VwTWFuYWdlci5nZXRDdXJyZW50UGFnZSgpID09IHIxKTsgLy8kTk9OLU5MUy0xJAotCQlleHBlY3RlZE9wcyA9IG5ldyBWZWN0b3IoKTsKLQkJZXhwZWN0ZWRVbmRvT3BzLmFkZChjKTsKLQkJZXhwZWN0ZWRVbmRvT3BzLmFkZChiKTsKLQkJZXhwZWN0ZWRVbmRvT3BzLmFkZChhKTsKLQkJY2hlY2tSZXN1bHRzKCk7Ci0KLQkJcmVzZXQoKTsKLQkJYUdyb3VwSGFuZGxlci5zZXRHcm91cElEVG9TZWxlY3QoIkQiKTsgLy8kTk9OLU5MUy0xJAotCQlwYWdlR3JvdXBNYW5hZ2VyLm1vdmVGb3J3YXJkT25lUGFnZSgpOwotCQlhc3NlcnRUcnVlKCJUaGVyZSBzaG91bGQgYmUgYSBuZXh0IHBhZ2UiLCBwYWdlR3JvdXBNYW5hZ2VyLmhhc05leHRQYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlRoZSBwYWdlIHNob3VsZCBiZSBkMSIsIHBhZ2VHcm91cE1hbmFnZXIuZ2V0Q3VycmVudFBhZ2UoKSA9PSBkMSk7IC8vJE5PTi1OTFMtMSQKLQkJZXhwZWN0ZWRPcHMuYWRkKGEpOwotCQlleHBlY3RlZE9wcy5hZGQoYik7Ci0JCWV4cGVjdGVkT3BzLmFkZChjKTsKLQkJY2hlY2tSZXN1bHRzKCk7Ci0KLQkJcGFnZUdyb3VwTWFuYWdlci5tb3ZlRm9yd2FyZE9uZVBhZ2UoKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlcmUgc2hvdWxkIGJlIGEgbmV4dCBwYWdlIiwgcGFnZUdyb3VwTWFuYWdlci5oYXNOZXh0UGFnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJUaGUgcGFnZSBzaG91bGQgYmUgZDIiLCBwYWdlR3JvdXBNYW5hZ2VyLmdldEN1cnJlbnRQYWdlKCkgPT0gZDIpOyAvLyROT04tTkxTLTEkCi0JCWNoZWNrUmVzdWx0cygpOwotCi0JCXBhZ2VHcm91cE1hbmFnZXIubW92ZUZvcndhcmRPbmVQYWdlKCk7Ci0JCWFzc2VydFRydWUoIlRoZXJlIHNob3VsZCBiZSBhIG5leHQgcGFnZSIsIHBhZ2VHcm91cE1hbmFnZXIuaGFzTmV4dFBhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHBhZ2Ugc2hvdWxkIGJlIGQzIiwgcGFnZUdyb3VwTWFuYWdlci5nZXRDdXJyZW50UGFnZSgpID09IGQzKTsgLy8kTk9OLU5MUy0xJAotCQljaGVja1Jlc3VsdHMoKTsKLQotCQlwYWdlR3JvdXBNYW5hZ2VyLm1vdmVGb3J3YXJkT25lUGFnZSgpOwotCQlhc3NlcnRUcnVlKCJUaGVyZSBzaG91bGQgYmUgYSBuZXh0IHBhZ2UiLCBwYWdlR3JvdXBNYW5hZ2VyLmhhc05leHRQYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlRoZSBwYWdlIHNob3VsZCBiZSBmMSIsIHBhZ2VHcm91cE1hbmFnZXIuZ2V0Q3VycmVudFBhZ2UoKSA9PSBmMSk7IC8vJE5PTi1OTFMtMSQKLQkJZXhwZWN0ZWRPcHMuYWRkKGQpOwotCQlleHBlY3RlZE9wcy5hZGQoZSk7Ci0JCWNoZWNrUmVzdWx0cygpOwotCi0JCXBhZ2VHcm91cE1hbmFnZXIubW92ZUZvcndhcmRPbmVQYWdlKCk7Ci0JCWFzc2VydFRydWUoIlRoZXJlIHNob3VsZCBiZSBhIG5leHQgcGFnZSIsIHBhZ2VHcm91cE1hbmFnZXIuaGFzTmV4dFBhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHBhZ2Ugc2hvdWxkIGJlIGYzIiwgcGFnZUdyb3VwTWFuYWdlci5nZXRDdXJyZW50UGFnZSgpID09IGYzKTsgLy8kTk9OLU5MUy0xJAotCQljaGVja1Jlc3VsdHMoKTsKLQotCQlwYWdlR3JvdXBNYW5hZ2VyLm1vdmVGb3J3YXJkT25lUGFnZSgpOwotCQlhc3NlcnRUcnVlKCJUaGVyZSBzaG91bGQgYmUgYSBuZXh0IHBhZ2UiLCBwYWdlR3JvdXBNYW5hZ2VyLmhhc05leHRQYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlRoZSBwYWdlIHNob3VsZCBiZSBmNSIsIHBhZ2VHcm91cE1hbmFnZXIuZ2V0Q3VycmVudFBhZ2UoKSA9PSBmNSk7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tSZXN1bHRzKCk7Ci0KLQkJcGFnZUdyb3VwTWFuYWdlci5tb3ZlRm9yd2FyZE9uZVBhZ2UoKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlcmUgc2hvdWxkIGJlIGEgbmV4dCBwYWdlIiwgcGFnZUdyb3VwTWFuYWdlci5oYXNOZXh0UGFnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJUaGUgcGFnZSBzaG91bGQgYmUgZjYiLCBwYWdlR3JvdXBNYW5hZ2VyLmdldEN1cnJlbnRQYWdlKCkgPT0gZjYpOyAvLyROT04tTkxTLTEkCi0JCWNoZWNrUmVzdWx0cygpOwotCi0JCXBhZ2VHcm91cE1hbmFnZXIubW92ZUZvcndhcmRPbmVQYWdlKCk7Ci0JCWZHcm91cEhhbmRsZXIuc2V0R3JvdXBJRFRvU2VsZWN0KG51bGwpOwotCQlhc3NlcnRGYWxzZSgiVGhlcmUgc2hvdWxkIG5vdCBiZSBhIG5leHQgcGFnZSIsIHBhZ2VHcm91cE1hbmFnZXIuaGFzTmV4dFBhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHBhZ2Ugc2hvdWxkIGJlIGY0IiwgcGFnZUdyb3VwTWFuYWdlci5nZXRDdXJyZW50UGFnZSgpID09IGY0KTsgLy8kTk9OLU5MUy0xJAotCQljaGVja1Jlc3VsdHMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tSZXN1bHRzKCkgewotCQlhc3NlcnRUcnVlKCJFeHBlY3RlZD0iICsgZXhwZWN0ZWRPcHMuc2l6ZSgpICsgIiBleGVjdXRlZD0iICsgQmFzZU9wZXJhdGlvbi5yZXN1bHRMaXN0LnNpemUoKSwgQmFzZU9wZXJhdGlvbi5yZXN1bHRMaXN0LnNpemUoKSA9PSBleHBlY3RlZE9wcy5zaXplKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgQmFzZU9wZXJhdGlvbi5yZXN1bHRMaXN0LnNpemUoKTsgaW5kZXgrKykgewotCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkT3BzLmVsZW1lbnRBdChpbmRleCksIEJhc2VPcGVyYXRpb24ucmVzdWx0TGlzdC5lbGVtZW50QXQoaW5kZXgpKTsKLQkJfQotCi0JCWFzc2VydFRydWUoIkV4cGVjdGVkIHVuZG89IiArIGV4cGVjdGVkVW5kb09wcy5zaXplKCkgKyAiIGV4ZWN1dGVkPSIgKyBCYXNlT3BlcmF0aW9uLnVuZG9MaXN0LnNpemUoKSwgQmFzZU9wZXJhdGlvbi51bmRvTGlzdC5zaXplKCkgPT0gZXhwZWN0ZWRVbmRvT3BzLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBCYXNlT3BlcmF0aW9uLnVuZG9MaXN0LnNpemUoKTsgaW5kZXgrKykgewotCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVW5kb09wcy5lbGVtZW50QXQoaW5kZXgpLCBCYXNlT3BlcmF0aW9uLnVuZG9MaXN0LmVsZW1lbnRBdChpbmRleCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlc2V0KCkgewotCQlCYXNlT3BlcmF0aW9uLnJlc3VsdExpc3QucmVtb3ZlQWxsRWxlbWVudHMoKTsKLQkJZXhwZWN0ZWRPcHMucmVtb3ZlQWxsRWxlbWVudHMoKTsKLQkJQmFzZU9wZXJhdGlvbi51bmRvTGlzdC5yZW1vdmVBbGxFbGVtZW50cygpOwotCQlleHBlY3RlZFVuZG9PcHMucmVtb3ZlQWxsRWxlbWVudHMoKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2hlY2tEYXRhTW9kZWxzKCkgewotCQlJRGF0YU1vZGVsIG1vZGVsID0gZGF0YU1vZGVsOwotCi0JCWJvb2xlYW4gY29udGFpbnNNb2RlbDEgPSBtb2RlbC5pc05lc3RlZE1vZGVsKCJ0ZXN0cHJvdmlkZXIxIik7Ci0JCWJvb2xlYW4gY29udGFpbnNNb2RlbDIgPSBtb2RlbC5pc05lc3RlZE1vZGVsKCJ0ZXN0cHJvdmlkZXIyIik7Ci0JCWJvb2xlYW4gcHJvcDEgPSBtb2RlbC5pc1Byb3BlcnR5U2V0KCJwcm92aWRlcjFQcm9wMSIpOwotCQlib29sZWFuIHByb3AyID0gbW9kZWwuaXNQcm9wZXJ0eVNldCgicHJvdmlkZXIxUHJvcDIiKTsKLQkJYm9vbGVhbiBwcm9wMyA9IG1vZGVsLmlzUHJvcGVydHlTZXQoInByb3ZpZGVyMVByb3AzIik7Ci0JCWJvb2xlYW4gcHJvcDQgPSBtb2RlbC5pc1Byb3BlcnR5U2V0KCJwcm92aWRlcjFQcm9wNCIpOwotCQlib29sZWFuIHByb3A1ID0gbW9kZWwuaXNQcm9wZXJ0eVNldCgicHJvdmlkZXIyUHJvcDEiKTsKLQkJYm9vbGVhbiBwcm9wNiA9IG1vZGVsLmlzUHJvcGVydHlTZXQoInByb3ZpZGVyMlByb3AyIik7Ci0JCWJvb2xlYW4gcHJvcDcgPSBtb2RlbC5pc1Byb3BlcnR5U2V0KCJwcm92aWRlcjJQcm9wMyIpOwotCQlib29sZWFuIHByb3A4ID0gbW9kZWwuaXNQcm9wZXJ0eVNldCgicHJvdmlkZXIyUHJvcDQiKTsKLQkJYm9vbGVhbiB2YWx1ZTEgPSBtb2RlbC5nZXRQcm9wZXJ0eSgicHJvdmlkZXIxUHJvcDEiKS5lcXVhbHMoIjExIik7Ci0JCWJvb2xlYW4gdmFsdWUyID0gbW9kZWwuZ2V0UHJvcGVydHkoInByb3ZpZGVyMVByb3AyIikuZXF1YWxzKCIyMiIpOwotCQlib29sZWFuIHZhbHVlMyA9IG1vZGVsLmdldFByb3BlcnR5KCJwcm92aWRlcjFQcm9wMyIpLmVxdWFscygiMzMiKTsKLQkJYm9vbGVhbiB2YWx1ZTQgPSBtb2RlbC5nZXRQcm9wZXJ0eSgicHJvdmlkZXIxUHJvcDQiKS5lcXVhbHMoIjQ0Iik7Ci0JCWJvb2xlYW4gdmFsdWU1ID0gbW9kZWwuZ2V0UHJvcGVydHkoInByb3ZpZGVyMlByb3AxIikuZXF1YWxzKCIxMTExIik7Ci0JCWJvb2xlYW4gdmFsdWU2ID0gbW9kZWwuZ2V0UHJvcGVydHkoInByb3ZpZGVyMlByb3AyIikuZXF1YWxzKCIyMjIyIik7Ci0JCWJvb2xlYW4gdmFsdWU3ID0gbW9kZWwuZ2V0UHJvcGVydHkoInByb3ZpZGVyMlByb3AzIikuZXF1YWxzKCIzMzMzIik7Ci0JCWJvb2xlYW4gdmFsdWU4ID0gbW9kZWwuZ2V0UHJvcGVydHkoInByb3ZpZGVyMlByb3A0IikuZXF1YWxzKCI0NDQ0Iik7Ci0KLQkJcmV0dXJuIGNvbnRhaW5zTW9kZWwxICYmIGNvbnRhaW5zTW9kZWwyICYmIHByb3AxICYmIHByb3AyICYmIHByb3AzICYmIHByb3A0ICYmIHByb3A1ICYmIHByb3A2ICYmIHByb3A3ICYmIHByb3A4ICYmIHZhbHVlMSAmJiB2YWx1ZTIgJiYgdmFsdWUzICYmIHZhbHVlNCAmJiB2YWx1ZTUgJiYgdmFsdWU2ICYmIHZhbHVlNyAmJiB2YWx1ZTg7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBBR3JvdXBIYW5kbGVyIGltcGxlbWVudHMgSURNUGFnZUdyb3VwSGFuZGxlciB7Ci0JCXByaXZhdGUgU3RyaW5nIGdyb3VwSURfOwotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmV4dFBhZ2VHcm91cChTdHJpbmcgY3VycmVudFBhZ2VHcm91cElELCBTdHJpbmdbXSBwYWdlR3JvdXBJRHMpIHsKLQkJCVN0cmluZyByZXN1bHQgPSBudWxsOwotCi0JCQlpZiAoY3VycmVudFBhZ2VHcm91cElEID09IG51bGwpIHsKLQkJCQlyZXN1bHQgPSBncm91cElEXzsKLQkJCX0gZWxzZSBpZiAoY3VycmVudFBhZ2VHcm91cElELmVxdWFscygiRSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXN1bHQgPSBudWxsOwotCQkJfSBlbHNlIHsKLQkJCQlyZXN1bHQgPSAiRSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldEdyb3VwSURUb1NlbGVjdChTdHJpbmcgaWQpIHsKLQkJCWdyb3VwSURfID0gaWQ7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIEZHcm91cEhhbmRsZXIgaW1wbGVtZW50cyBJRE1QYWdlR3JvdXBIYW5kbGVyIHsKLQkJcHJpdmF0ZSBTdHJpbmcgZ3JvdXBJRF87Ci0KLQkJcHVibGljIFN0cmluZyBnZXROZXh0UGFnZUdyb3VwKFN0cmluZyBjdXJyZW50UGFnZUdyb3VwSUQsIFN0cmluZ1tdIHBhZ2VHcm91cElEcykgewotCQkJaWYgKGN1cnJlbnRQYWdlR3JvdXBJRCA9PSBudWxsKQotCQkJCXJldHVybiBncm91cElEXzsKLQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRHcm91cElEVG9TZWxlY3QoU3RyaW5nIGlkKSB7Ci0JCQlncm91cElEXyA9IGlkOwotCQl9Ci0JfQotCi0JLy8KLQkvLyBGIGhhcyBwYWdlcyBmMSwgZjIsIGYzLCBmNCwgZjUsIGY2Ci0JLy8gdGhlIHBhZ2UgaGFuZGxlciBmb3IgRiB3aWxsIHJldHVybiB0aGUgZm9sbG93aW5nOgotCS8vIGV4cGVjdGVkID0gZjEgcmV0dXJucyBmMQotCS8vIGV4cGVjdGVkID0gZjIgcmV0dXJucyBza2lwCi0JLy8gZXhwZWN0ZWQgPSBmMyByZXR1cm5zIGJlZm9yZSBmNgotCS8vIGV4cGVjdGVkID0gZjQgcmV0dXJucyBudWxsCi0JLy8gZXhwZWN0ZWQgPSBmNSByZXR1cm5zIGFmdGVyIGY1Ci0JLy8gZXhwZWN0ZWQgPSBmNiByZXR1cm5zIGY0Ci0JLy8KLQkvLyBUaGlzIGhhbmRsZSBzaG91bGQgY2F1c2UgdGhlIGZvbGxvd2luZyBwYWdlcyB0byBiZSB1c2VkLgotCS8vIGYxLCBmMywgZjUsIGY2LCBmNCwgbnVsbAotCS8vCi0JcHJpdmF0ZSBjbGFzcyBGUGFnZUhhbmRsZXIgaW1wbGVtZW50cyBJRE1QYWdlSGFuZGxlciB7Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0TmV4dFBhZ2UoU3RyaW5nIGN1cnJlbnRQYWdlTmFtZSwgU3RyaW5nIGV4cGVjdGVkTmV4dFBhZ2VOYW1lKSB7Ci0JCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQotCQkJaWYgKGN1cnJlbnRQYWdlTmFtZSA9PSBudWxsKSB7Ci0JCQkJcmVzdWx0ID0gImYxIjsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIGlmIChjdXJyZW50UGFnZU5hbWUuZXF1YWxzKCJmMSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXN1bHQgPSBJRE1QYWdlSGFuZGxlci5TS0lQX1BBR0U7Ci0JCQl9IGVsc2UgaWYgKGN1cnJlbnRQYWdlTmFtZS5lcXVhbHMoImYzIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdCA9IElETVBhZ2VIYW5kbGVyLlBBR0VfQkVGT1JFICsgImY2IjsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIGlmIChjdXJyZW50UGFnZU5hbWUuZXF1YWxzKCJmNCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXN1bHQgPSBudWxsOwotCQkJfSBlbHNlIGlmIChjdXJyZW50UGFnZU5hbWUuZXF1YWxzKCJmNSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXN1bHQgPSBJRE1QYWdlSGFuZGxlci5QQUdFX0FGVEVSICsgImY1IjsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIGlmIChjdXJyZW50UGFnZU5hbWUuZXF1YWxzKCJmNiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXN1bHQgPSAiZjQiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFByZXZpb3VzUGFnZShTdHJpbmcgY3VycmVudFBhZ2VOYW1lLCBTdHJpbmcgZXhwZWN0ZWRQcmV2aW91c1BhZ2VOYW1lKSB7Ci0JCQlyZXR1cm4gZXhwZWN0ZWRQcmV2aW91c1BhZ2VOYW1lOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIEVtcHR5UHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyIHsKLQotCQlwdWJsaWMgU2V0IGdldFByb3BlcnR5TmFtZXMoKSB7Ci0JCQlyZXR1cm4gbmV3IEhhc2hTZXQoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgV2l6YXJkUGFnZSBleHRlbmRzIERhdGFNb2RlbFdpemFyZFBhZ2UgewotCQlwcml2YXRlIGJvb2xlYW4gY2FuRmluaXNoXyA9IHRydWU7Ci0KLQkJcHVibGljIFdpemFyZFBhZ2UoU3RyaW5nIGlkKSB7Ci0JCQlzdXBlcihkYXRhTW9kZWwsIGlkKTsKLQkJfQotCi0JCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKSB7Ci0JCQlyZXR1cm4gbmV3IFN0cmluZ1swXTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldENhbkZpbmlzaChib29sZWFuIGNhbkZpbmlzaCkgewotCQkJY2FuRmluaXNoXyA9IGNhbkZpbmlzaDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGNhblBhZ2VGaW5pc2goKSB7Ci0JCQlyZXR1cm4gY2FuRmluaXNoXzsKLQkJfQotCi0JCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGNyZWF0ZU9wZXJhdGlvbigpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS9tYW5hZ2VyL1Rlc3RQcm92aWRlcjEuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvbWFuYWdlci9UZXN0UHJvdmlkZXIxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5NmIwMmYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS9tYW5hZ2VyL1Rlc3RQcm92aWRlcjEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS5tYW5hZ2VyOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0UHJvdmlkZXIxIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlcgotewotICBwdWJsaWMgU2V0IGdldFByb3BlcnR5TmFtZXMoKXsKLSAgICBTZXQgcHJvcGVydHlOYW1lcyA9IHN1cGVyLmdldFByb3BlcnR5TmFtZXMoKTsKLSAgICBwcm9wZXJ0eU5hbWVzLmFkZCgicHJvdmlkZXIxUHJvcDEiKTsKLSAgICBwcm9wZXJ0eU5hbWVzLmFkZCgicHJvdmlkZXIxUHJvcDIiKTsKLSAgICBwcm9wZXJ0eU5hbWVzLmFkZCgicHJvdmlkZXIxUHJvcDMiKTsKLSAgICBwcm9wZXJ0eU5hbWVzLmFkZCgicHJvdmlkZXIxUHJvcDQiKTsKLSAgICAKLSAgICByZXR1cm4gcHJvcGVydHlOYW1lczsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGluaXQoKQotICB7Ci0gICAgc2V0UHJvcGVydHkoICJwcm92aWRlcjFQcm9wMSIsICIxMSIgKTsKLSAgICBzZXRQcm9wZXJ0eSggInByb3ZpZGVyMVByb3AyIiwgIjIyIiApOwotICAgIHNldFByb3BlcnR5KCAicHJvdmlkZXIxUHJvcDMiLCAiMzMiICk7Ci0gICAgc2V0UHJvcGVydHkoICJwcm92aWRlcjFQcm9wNCIsICI0NCIgKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SUQoKQotICB7Ci0gICAgcmV0dXJuICJ0ZXN0cHJvdmlkZXIxIjsKLSAgfQotICAKLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS9tYW5hZ2VyL1Rlc3RQcm92aWRlcjIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvbWFuYWdlci9UZXN0UHJvdmlkZXIyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MDE0OWQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS9tYW5hZ2VyL1Rlc3RQcm92aWRlcjIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS5tYW5hZ2VyOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0UHJvdmlkZXIyIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlcgotewotICBwdWJsaWMgU2V0IGdldFByb3BlcnR5TmFtZXMoKXsKLSAgICBTZXQgcHJvcGVydHlOYW1lcyA9IHN1cGVyLmdldFByb3BlcnR5TmFtZXMoKTsKLSAgICBwcm9wZXJ0eU5hbWVzLmFkZCgicHJvdmlkZXIyUHJvcDEiKTsKLSAgICBwcm9wZXJ0eU5hbWVzLmFkZCgicHJvdmlkZXIyUHJvcDIiKTsKLSAgICBwcm9wZXJ0eU5hbWVzLmFkZCgicHJvdmlkZXIyUHJvcDMiKTsKLSAgICBwcm9wZXJ0eU5hbWVzLmFkZCgicHJvdmlkZXIyUHJvcDQiKTsKLSAgICAKLSAgICByZXR1cm4gcHJvcGVydHlOYW1lczsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGluaXQoKQotICB7Ci0gICAgc2V0UHJvcGVydHkoICJwcm92aWRlcjJQcm9wMSIsICIxMTExIiApOwotICAgIHNldFByb3BlcnR5KCAicHJvdmlkZXIyUHJvcDIiLCAiMjIyMiIgKTsKLSAgICBzZXRQcm9wZXJ0eSggInByb3ZpZGVyMlByb3AzIiwgIjMzMzMiICk7Ci0gICAgc2V0UHJvcGVydHkoICJwcm92aWRlcjJQcm9wNCIsICI0NDQ0IiApOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldElEKCkKLSAgewotICAgIHJldHVybiAidGVzdHByb3ZpZGVyMiI7Ci0gIH0KLSAgCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL3dpemFyZC9UZXN0MkRhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL3dpemFyZC9UZXN0MkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MTlkNDguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS93aXphcmQvVGVzdDJEYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgVGVzdDJEYXRhTW9kZWxQcm92aWRlciBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXIgewotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL3dpemFyZC9UZXN0MkRhdGFNb2RlbFdpemFyZC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS93aXphcmQvVGVzdDJEYXRhTW9kZWxXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNlYjZlNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL3dpemFyZC9UZXN0MkRhdGFNb2RlbFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5BZGRhYmxlUGFnZUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuRGF0YU1vZGVsV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuU2ltcGxlUGFnZUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5TaW1wbGVQYWdlR3JvdXBIYW5kbGVyOwotCi1wdWJsaWMgY2xhc3MgVGVzdDJEYXRhTW9kZWxXaXphcmQgZXh0ZW5kcyBEYXRhTW9kZWxXaXphcmQgewotCi0JcHJvdGVjdGVkIElEYXRhTW9kZWxQcm92aWRlciBnZXREZWZhdWx0UHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgVGVzdDJEYXRhTW9kZWxQcm92aWRlcigpOwotCX0KLQotCXByb3RlY3RlZCBBZGRhYmxlUGFnZUdyb3VwIGNyZWF0ZVJvb3RQYWdlR3JvdXAoKSB7Ci0JCVNpbXBsZVBhZ2VHcm91cCBwZyA9IChTaW1wbGVQYWdlR3JvdXApIHN1cGVyLmNyZWF0ZVJvb3RQYWdlR3JvdXAoKTsKLQkJcGcuc2V0UGFnZUdyb3VwSGFuZGxlcihuZXcgU2ltcGxlUGFnZUdyb3VwSGFuZGxlcigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TmV4dFBhZ2VHcm91cChTdHJpbmcgY3VycmVudFBhZ2VHcm91cElELCBTdHJpbmdbXSBwYWdlR3JvdXBJRHMpIHsKLQkJCQlpZiAoY3VycmVudFBhZ2VHcm91cElEID09IG51bGwpIHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlR3JvdXBJRHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWlmIChwYWdlR3JvdXBJRHNbaV0uZXF1YWxzKCJiYXIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJcmV0dXJuICJiYXIiOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLmdldE5leHRQYWdlR3JvdXAoY3VycmVudFBhZ2VHcm91cElELCBwYWdlR3JvdXBJRHMpOwotCQkJfQotCQl9KTsKLQkJcmV0dXJuIHBnOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS93aXphcmQvVGVzdDJEYXRhTW9kZWxXaXphcmRGYWN0b3J5LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL3dpemFyZC9UZXN0MkRhdGFNb2RlbFdpemFyZEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIxNWQwZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL3dpemFyZC9UZXN0MkRhdGFNb2RlbFdpemFyZEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5EYXRhTW9kZWxXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb24uZXh0ZW5zaW9udWkuRE1XaXphcmRFeHRlbnNpb25GYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgVGVzdDJEYXRhTW9kZWxXaXphcmRGYWN0b3J5IGV4dGVuZHMgRE1XaXphcmRFeHRlbnNpb25GYWN0b3J5IHsKLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGFnZU5hbWUoKSB7Ci0JCXJldHVybiAiQSBQYWdlIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBJRGF0YU1vZGVsUHJvdmlkZXIgZ2V0UHJvdmlkZXIoKXsKLQkJcmV0dXJuIG5ldyBUZXN0MkRhdGFNb2RlbFByb3ZpZGVyKCl7Ci0JCQlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXREZWZhdWx0T3BlcmF0aW9uKCkgewotCQkJCXJldHVybiBuZXcgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24oKXsKLQkJCQkJcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0UGFnZU5hbWUoKSk7CQotCQkJCQkJcmV0dXJuIE9LX1NUQVRVUzsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXB1YmxpYyBEYXRhTW9kZWxXaXphcmRQYWdlW10gY3JlYXRlUGFnZUdyb3VwKElEYXRhTW9kZWwgZGF0YU1vZGVsLCBTdHJpbmcgcGFnZUdyb3VwSUQpIHsKLQkJcmV0dXJuIG5ldyBEYXRhTW9kZWxXaXphcmRQYWdlW117bmV3IERhdGFNb2RlbFdpemFyZFBhZ2UoRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwoZ2V0UHJvdmlkZXIoKSksIGdldFBhZ2VOYW1lKCkpIHsKLQkJCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTlVMTCk7Ci0JCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCQlsYWJlbC5zZXRUZXh0KGdldFBhZ2VOYW1lKCkpOwotCQkJCXJldHVybiBjb21wb3NpdGU7Ci0JCQl9Ci0JCX19OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS93aXphcmQvVGVzdDJEYXRhTW9kZWxXaXphcmRGYWN0b3J5Mi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS93aXphcmQvVGVzdDJEYXRhTW9kZWxXaXphcmRGYWN0b3J5Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjc1OGE3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvd2l6YXJkL1Rlc3QyRGF0YU1vZGVsV2l6YXJkRmFjdG9yeTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLndpemFyZDsKLQotcHVibGljIGNsYXNzIFRlc3QyRGF0YU1vZGVsV2l6YXJkRmFjdG9yeTIgZXh0ZW5kcyBUZXN0MkRhdGFNb2RlbFdpemFyZEZhY3RvcnkgewotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQYWdlTmFtZSgpIHsKLQkJcmV0dXJuICJBIEJldHRlciBQYWdlIjsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvd2l6YXJkL1Rlc3QyRGF0YU1vZGVsV2l6YXJkRmFjdG9yeTMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvd2l6YXJkL1Rlc3QyRGF0YU1vZGVsV2l6YXJkRmFjdG9yeTMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODkxZTQwMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL3dpemFyZC9UZXN0MkRhdGFNb2RlbFdpemFyZEZhY3RvcnkzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS53aXphcmQ7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0MkRhdGFNb2RlbFdpemFyZEZhY3RvcnkzIGV4dGVuZHMgVGVzdDJEYXRhTW9kZWxXaXphcmRGYWN0b3J5IHsKLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGFnZU5hbWUoKSB7Ci0JCXJldHVybiAiQW5vdGhlciBQYWdlLCBidXQgbm90IGJldHRlciI7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL3dpemFyZC9UZXN0MlBhZ2VXaXphcmRFeHRlbnNpb25GYWN0b3J5LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL3dpemFyZC9UZXN0MlBhZ2VXaXphcmRFeHRlbnNpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMjcxNzQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS93aXphcmQvVGVzdDJQYWdlV2l6YXJkRXh0ZW5zaW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uLmV4dGVuc2lvbnVpLkRNV2l6YXJkUGFnZUV4dGVuc2lvbkZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0MlBhZ2VXaXphcmRFeHRlbnNpb25GYWN0b3J5IGV4dGVuZHMKLQkJRE1XaXphcmRQYWdlRXh0ZW5zaW9uRmFjdG9yeSB7Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVBZGRpdGlvbmFsQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgSURhdGFNb2RlbCBtb2RlbCwKLQkJCVN0cmluZyBwYWdlTmFtZSkgewotCQlTdHJpbmcgbGFiZWxOYW1lOwotCQlpZiAoIkEgQmV0dGVyIFBhZ2UiLmVxdWFscyhwYWdlTmFtZSkpIHsKLQkJCWxhYmVsTmFtZSA9ICJBbiBhZGRpdG9uYWwgdGV4dCBib3ggZm9yIHRoZSBiZXR0ZXIgcGFnZSI7Ci0JCX0gZWxzZSBpZiAoIkFub3RoZXIgUGFnZSwgYnV0IG5vdCBiZXR0ZXIiLmVxdWFscyhwYWdlTmFtZSkpIHsKLQkJCWxhYmVsTmFtZSA9ICJBbiBhZGRpdG9uYWwgdGV4dCBib3ggZm9yIHRoZSBOT1QgYmV0dGVyIHBhZ2UiOwotCQl9IGVsc2UgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChsYWJlbE5hbWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS93aXphcmQvVGVzdDJQYWdlV2l6YXJkRXh0ZW5zaW9uRmFjdG9yeTIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvd2l6YXJkL1Rlc3QyUGFnZVdpemFyZEV4dGVuc2lvbkZhY3RvcnkyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzYzBiMmYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS93aXphcmQvVGVzdDJQYWdlV2l6YXJkRXh0ZW5zaW9uRmFjdG9yeTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb24uZXh0ZW5zaW9udWkuRE1XaXphcmRQYWdlRXh0ZW5zaW9uRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIFRlc3QyUGFnZVdpemFyZEV4dGVuc2lvbkZhY3RvcnkyIGV4dGVuZHMKLQkJRE1XaXphcmRQYWdlRXh0ZW5zaW9uRmFjdG9yeSB7Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVBZGRpdGlvbmFsQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgSURhdGFNb2RlbCBtb2RlbCwKLQkJCVN0cmluZyBwYWdlTmFtZSkgewotCQlpZiAoIkEgQmV0dGVyIFBhZ2UiLmVxdWFscyhwYWdlTmFtZSkpIHsKLQkJCUJ1dHRvbiBjaGVja2JveCA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCQkJY2hlY2tib3guc2V0VGV4dCgiQWRkaXRpb25hbCBjaGVja2JveCBmb3IgYSBiZXR0ZXIgcGFnZSIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL3dpemFyZC9UZXN0RGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvd2l6YXJkL1Rlc3REYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmI3NGY0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvd2l6YXJkL1Rlc3REYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLndpemFyZDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLQotcHVibGljIGNsYXNzIFRlc3REYXRhTW9kZWxQcm92aWRlciBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXIgewotCXB1YmxpYyBTdHJpbmcgZ2V0SUQoKSB7Ci0JCXJldHVybiAiVGVzdFdpemFyZElEIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTZXQgZ2V0UHJvcGVydHlOYW1lcygpIHsKLQkJSGFzaFNldCByZXN1bHQgPSBuZXcgSGFzaFNldCgpOwotCi0JCXJlc3VsdC5hZGQoInByb3AxIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFkZCgicHJvcDIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIElEYXRhTW9kZWxPcGVyYXRpb24gZ2V0RGVmYXVsdE9wZXJhdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBUZXN0T3BlcmF0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS93aXphcmQvVGVzdERhdGFXaXphcmQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvd2l6YXJkL1Rlc3REYXRhV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNmRkZTcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS93aXphcmQvVGVzdERhdGFXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkFkZGFibGVQYWdlR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5EYXRhTW9kZWxXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5TaW1wbGVQYWdlR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLlBhZ2VHcm91cE1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0RGF0YVdpemFyZCBleHRlbmRzIERhdGFNb2RlbFdpemFyZCB7Ci0JcHJpdmF0ZSBTaW1wbGVQYWdlR3JvdXAgcm9vdDsKLQotCXB1YmxpYyBUZXN0RGF0YVdpemFyZCgpIHsKLQkJc2V0Rm9yY2VQcmV2aW91c0FuZE5leHRCdXR0b25zKHRydWUpOwotCQlzZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkb0FkZFBhZ2VzKCkgewotCQlQYWdlR3JvdXBNYW5hZ2VyIHBhZ2VNYW5hZ2VyID0gZ2V0UGFnZUdyb3VwTWFuYWdlcigpOwotCQlwYWdlTWFuYWdlci5hZGRHcm91cEFmdGVyKHJvb3QuZ2V0UGFnZUdyb3VwSUQoKSwgbmV3IFRlc3RQYWdlR3JvdXAyKGdldERhdGFNb2RlbCgpKSk7Ci0KLQkJc3VwZXIuZG9BZGRQYWdlcygpOwotCX0KLQotCXByb3RlY3RlZCBJRGF0YU1vZGVsUHJvdmlkZXIgZ2V0RGVmYXVsdFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IFRlc3REYXRhTW9kZWxQcm92aWRlcigpOwotCX0KLQotCXByb3RlY3RlZCBBZGRhYmxlUGFnZUdyb3VwIGNyZWF0ZVJvb3RQYWdlR3JvdXAoKSB7Ci0JCXJvb3QgPSBuZXcgVGVzdFJvb3RQYWdlR3JvdXAoZ2V0RGF0YU1vZGVsKCkpOwotCi0JCXJldHVybiByb290OwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvd2l6YXJkL1Rlc3RPcGVyYXRpb24uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvd2l6YXJkL1Rlc3RPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNmNGEzNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL3dpemFyZC9UZXN0T3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgVGVzdE9wZXJhdGlvbiBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIHsKLQotCXB1YmxpYyBUZXN0T3BlcmF0aW9uKCkgewotCQlzZXRJRCgiVGVzdE9wZXJhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiSW4gZXhlY3V0ZTogZGF0YSBtb2RlbD0iICsgZ2V0RGF0YU1vZGVsKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJdHJ5IHsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKCJUZXN0IG9wZXJhdGlvbjogIiwgNSk7IC8vJE5PTi1OTFMtMSQKLQkJCWZvciAoaW50IGluZGV4ID0gMTsgaW5kZXggPCA2OyBpbmRleCsrKSB7Ci0JCQkJbW9uaXRvci5zdWJUYXNrKCJwYXJ0ICIgKyBpbmRleCArICIgb2YgNSBjb21wbGV0ZS4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJVGhyZWFkLnNsZWVwKDEwMDApOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjKSB7Ci0JCQl0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKCJleGVjdXRlIHRocmV3IGFuZCBleGNlcHRpb24gIiwgZXhjKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgcmVkbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHVuZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVuZG8gdGVzdCBvcGVyYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCi0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvd2l6YXJkL1Rlc3RQYWdlMS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS93aXphcmQvVGVzdFBhZ2UxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyYTcxYjQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS93aXphcmQvVGVzdFBhZ2UxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5EYXRhTW9kZWxXaXphcmRQYWdlOwotCi1wdWJsaWMgY2xhc3MgVGVzdFBhZ2UxIGV4dGVuZHMgRGF0YU1vZGVsV2l6YXJkUGFnZSB7Ci0JcHVibGljIFRlc3RQYWdlMShJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsLCAiUGFnZTEiKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRUaXRsZSgiVGl0bGUgZm9yIHRlc3QgcGFnZTEiKTsgLy8kTk9OLU5MUy0xJAotCQlzZXREZXNjcmlwdGlvbigiRGVzY3JpcHRpb24gZm9yIHRlc3QgcGFnZSAxIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5QYWdlRmluaXNoKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBjcmVhdGVPcGVyYXRpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgZ3JvdXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlCdXR0b24gYnV0dG9uMSA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5QVVNIKTsKLQkJQnV0dG9uIGJ1dHRvbjIgPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuUFVTSCk7Ci0KLQkJYnV0dG9uMS5zZXRUZXh0KCJCdXR0b24xIik7IC8vJE5PTi1OTFMtMSQKLQkJYnV0dG9uMi5zZXRUZXh0KCJCdXR0b24yIik7IC8vJE5PTi1OTFMtMSQKLQkJZ3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlncm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQlyZXR1cm4gZ3JvdXA7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1swXTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL3dpemFyZC9UZXN0UGFnZTIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvd2l6YXJkL1Rlc3RQYWdlMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODk2M2Y5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvd2l6YXJkL1Rlc3RQYWdlMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuRGF0YU1vZGVsV2l6YXJkUGFnZTsKLQotcHVibGljIGNsYXNzIFRlc3RQYWdlMiBleHRlbmRzIERhdGFNb2RlbFdpemFyZFBhZ2UgewotCXB1YmxpYyBUZXN0UGFnZTIoSURhdGFNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCwgIlBhZ2UyIik7IC8vJE5PTi1OTFMtMSQKLQkJc2V0VGl0bGUoIlRpdGxlIGZvciB0ZXN0IHBhZ2UyIik7IC8vJE5PTi1OTFMtMSQKLQkJc2V0RGVzY3JpcHRpb24oIkRlc2NyaXB0aW9uIGZvciB0ZXN0IHBhZ2UgMiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuUGFnZUZpbmlzaCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIElEYXRhTW9kZWxPcGVyYXRpb24gY3JlYXRlT3BlcmF0aW9uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGdyb3VwID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJQnV0dG9uIGJ1dHRvbjEgPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuUFVTSCk7Ci0JCUJ1dHRvbiBidXR0b24yID0gbmV3IEJ1dHRvbihncm91cCwgU1dULlBVU0gpOwotCi0JCWJ1dHRvbjEuc2V0VGV4dCgiUGFnZSAyIGJ1dHRvbjEiKTsgLy8kTk9OLU5MUy0xJAotCQlidXR0b24yLnNldFRleHQoIlBhZ2UgMiBidXR0b24yIik7IC8vJE5PTi1OTFMtMSQKLQkJZ3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlncm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQlyZXR1cm4gZ3JvdXA7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1swXTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL3dpemFyZC9UZXN0UGFnZUdyb3VwMi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS93aXphcmQvVGVzdFBhZ2VHcm91cDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThhODM1NS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL3dpemFyZC9UZXN0UGFnZUdyb3VwMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5TaW1wbGVQYWdlR3JvdXA7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0UGFnZUdyb3VwMiBleHRlbmRzIFNpbXBsZVBhZ2VHcm91cCB7Ci0JcHJpdmF0ZSBJRGF0YU1vZGVsIGRhdGFNb2RlbDsKLQotCXB1YmxpYyBUZXN0UGFnZUdyb3VwMihJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQlzdXBlcigiZ3JvdXAyIiwgZGF0YU1vZGVsLmdldElEKCksIHRydWUsICJUZXN0T3BlcmF0aW9uIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0aGlzLmRhdGFNb2RlbCA9IGRhdGFNb2RlbDsKLQotCQlhZGRQYWdlcyhuZXcgSVdpemFyZFBhZ2VbXXtuZXcgVGVzdFBhZ2UyKHRoaXMuZGF0YU1vZGVsKX0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvd2l6YXJkL1Rlc3RSb290UGFnZUdyb3VwLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL3dpemFyZC9UZXN0Um9vdFBhZ2VHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDI4NWI5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvd2l6YXJkL1Rlc3RSb290UGFnZUdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLlNpbXBsZVBhZ2VHcm91cDsKLQotcHVibGljIGNsYXNzIFRlc3RSb290UGFnZUdyb3VwIGV4dGVuZHMgU2ltcGxlUGFnZUdyb3VwIHsKLQlwcml2YXRlIElEYXRhTW9kZWwgZGF0YU1vZGVsOwotCi0JcHVibGljIFRlc3RSb290UGFnZUdyb3VwKElEYXRhTW9kZWwgZGF0YU1vZGVsKSB7Ci0JCXN1cGVyKGRhdGFNb2RlbC5nZXRJRCgpLCBkYXRhTW9kZWwuZ2V0SUQoKSk7Ci0JCXRoaXMuZGF0YU1vZGVsID0gZGF0YU1vZGVsOwotCi0JCWFkZFBhZ2VzKG5ldyBJV2l6YXJkUGFnZVtde25ldyBUZXN0UGFnZTEodGhpcy5kYXRhTW9kZWwpfSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS93aXphcmQvVGVzdFdpemFyZFRlc3RjYXNlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL3dpemFyZC9UZXN0V2l6YXJkVGVzdGNhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQwNWE5Yi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL3dpemFyZC9UZXN0V2l6YXJkVGVzdGNhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0V2l6YXJkVGVzdGNhc2UgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBUZXN0RGF0YVdpemFyZCB3aXphcmRfOwotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQotCQl3aXphcmRfID0gbmV3IFRlc3REYXRhV2l6YXJkKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpbXBsZVdpemFyZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhudWxsLCB3aXphcmRfKTsKLQotCQlkaWFsb2cub3BlbigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0MkRhdGFNb2RlbFdpemFyZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyggbmV3IFJ1bm5hYmxlKCl7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2cobnVsbCwgbmV3IFRlc3QyRGF0YU1vZGVsV2l6YXJkKCkpOwotCQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi5ndWFyZC8uY2xhc3NwYXRoIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uLmd1YXJkLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNGU4NjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uLmd1YXJkLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uLmd1YXJkLy5wcm9qZWN0IGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uLmd1YXJkLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTI1NWM5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi5ndWFyZC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi5ndWFyZDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24uZ3VhcmQvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uLmd1YXJkLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNlNGI4ZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24uZ3VhcmQvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jU2F0IE1hciAyOSAwNzo1MzozMSBFRFQgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24uZ3VhcmQvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24uZ3VhcmQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiYmZhOWYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uLmd1YXJkL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi5ndWFyZDtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMjAwLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uLmd1YXJkLkFjdGl2YXRvcgotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMAotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjtidW5kbGUtdmVyc2lvbj0iWzEuMS4xMDMsMS4zLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcwotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24uZ3VhcmQvYWJvdXQuaHRtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi5ndWFyZC9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi5ndWFyZC9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24uZ3VhcmQvYnVpbGQucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi5ndWFyZC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzU0MGZiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi5ndWFyZC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24uZ3VhcmQvcGx1Z2luLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24uZ3VhcmQvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2YmM5YzEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uLmd1YXJkL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1CdW5kbGUtTmFtZS4wID0gVmFsaWRhdGlvbiBGcmFtZXdvcmsgR3VhcmQgVGVzdCBjYXNlcwotQnVuZGxlLVZlbmRvci4wID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uLmd1YXJkL3BsdWdpbi54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24uZ3VhcmQvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRkYWEyYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24uZ3VhcmQvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+Ci08cGx1Z2luPgotICAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi52YWxpZGF0b3JWMiIKLSAgICAgICAgIGlkPSJUM0EiIG5hbWU9IlQzQSI+Ci0gICAgICA8dmFsaWRhdG9yCi0gICAgICAgICAgICBidWlsZD0iZmFsc2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uLmd1YXJkLlQzQSIKLSAgICAgICAgICAgIG1hbnVhbD0iZmFsc2UiPgotICAgICAgPC92YWxpZGF0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLSAgICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udmFsaWRhdG9yVjIiCi0gICAgICAgICBpZD0iVDNCIiBuYW1lPSJUM0IiPgotICAgICAgPHZhbGlkYXRvciBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uLmd1YXJkLlQzQiI+Ci0gICAgICAgICA8aW5jbHVkZT4KLSAgICAgICAgICAgIDxydWxlcz4KLSAgICAgICAgICAgICAgIDxmYWNldAotICAgICAgICAgICAgICAgICAgICAgaWQ9ImEuYm9ndXMuZmFjZXQiPgotICAgICAgICAgICAgICAgPC9mYWNldD4KLSAgICAgICAgICAgIDwvcnVsZXM+Ci0gICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICA8L3ZhbGlkYXRvcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi5ndWFyZC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy92YWxpZGF0aW9uL2d1YXJkL0FjdGl2YXRvci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uLmd1YXJkL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3ZhbGlkYXRpb24vZ3VhcmQvQWN0aXZhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1MTJhZmUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uLmd1YXJkL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3ZhbGlkYXRpb24vZ3VhcmQvQWN0aXZhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi5ndWFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgcHVycG9zZSBvZiB0aGlzIHBsdWctaW4gaXMgdG8gZW5zdXJlIHRoYXQgaXQgbmV2ZXIgZ2V0cyBsb2FkZWQuIElmIGl0IGRvZXMgaXQgbWVhbnMgdGhhdCB3ZSBhcmUKLSAqIGFjdGl2YXRpbmcgdmFsaWRhdG9ycyB0b28gZWFybHkuCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3RpdmF0b3IgZXh0ZW5kcyBQbHVnaW4gewotCi0JLy8gVGhlIHBsdWctaW4gSUQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uLmd1YXJkIjsKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLQlwcml2YXRlIHN0YXRpYyBBY3RpdmF0b3IgcGx1Z2luOwotCQotCXB1YmxpYyBBY3RpdmF0b3IoKSB7Ci0JCVJ1bnRpbWVFeGNlcHRpb24gcmUgPSBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhpcyBwbHVnLWluIHNob3VsZCBuZXZlciBiZSBsb2FkZWQuIElmIGl0IGlzIGl0IG1lYW5zIHRoYXQgd2UgYXJlIGxvYWRpbmcgIiArCi0JCQkidmFsaWRhdG9ycyB0b28gZWFybHksIGFuZCBjYXVzaW5nIHVubmVjY2Vzc2FyeSBwbHVnLWluIGFjdGl2YXRpb24uIik7Ci0JCWhhbmRsZUV4Y2VwdGlvbihyZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2lucyNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFjdGl2YXRvciBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQkKLQkvKioKLQkgKiBXcml0ZSB0aGlzIGV4Y2VwdGlvbiB0byB0aGUgbG9nLgotCSAqIDxwPgotCSAqIFdlIGFyZSBpbiB0aGUgdHJhbnNpdGlvbiBvZiBtb3ZpbmcgdG8gYSBuZXcgYXBwcm9hY2ggZm9yIGxvY2FsaXplZCBtZXNzYWdlcy4gVGhpcyBpcyB0aGUgbmV3IAotCSAqIGFwcHJvYWNoIGZvciBleGNlcHRpb25zLgotCSAqIAotCSAqIEBwYXJhbSBlIHRoZSB0aHJvd2FibGUsIHRoaXMgY2FuIGJlIG51bGwgaW4gd2hpY2ggY2FzZSBpdCBpcyBhIG5vcC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIGUpewotCQlpZiAoZSA9PSBudWxsKXJldHVybjsKLQkJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgZSk7Ci0JCWdldExvZygpLmxvZyhzdGF0dXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uLmd1YXJkL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3ZhbGlkYXRpb24vZ3VhcmQvVDNBLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24uZ3VhcmQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdmFsaWRhdGlvbi9ndWFyZC9UM0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE0NjE4Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24uZ3VhcmQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdmFsaWRhdGlvbi9ndWFyZC9UM0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uLmd1YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLkFic3RyYWN0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXRlOwotCi0vKioKLSAqIEEgdGVzdCB2YWxpZGF0b3IgdGhhdCB3ZSBuZXZlciBleHBlY3QgdG8gYmUgYWN0aXZhdGVkLiBUaGUgcmVhc29uIHdlIG5ldmVyIGV4cGVjdCBpdCB0byBiZSB2YWxpZGF0ZWQgaXMgdGhhdCBieQotICogZGVmYXVsdCBpdCBpcyB0dXJuZWQgb2ZmLiBUaGUgdXNlciBjYW4gc3RpbGwgZXhwbGljaXRseSB0dXJuIGl0IG9uLCBpbiB3aGljaCBjYXNlIGl0IHdpbGwgcnVuLCBhbmQgdGhhdCB3b3VsZCBub3QKLSAqIGJlIGNvbnNpZGVyZWQgYW4gZXJyb3IuCi0gKiBAYXV0aG9yIGthcmFzaXVrCi0gKgotICovCi1wdWJsaWMgY2xhc3MgVDNBIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0b3IgewotCQotCXByaXZhdGUgYm9vbGVhbiBfaW52b2tlZDsKLQkKLQlwdWJsaWMgVmFsaWRhdGlvblJlc3VsdCB2YWxpZGF0ZShJUmVzb3VyY2UgcmVzb3VyY2UsIGludCBraW5kLCBWYWxpZGF0aW9uU3RhdGUgc3RhdGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcil7Ci0JCWlmICghX2ludm9rZWQpewotCQkJX2ludm9rZWQgPSB0cnVlOwotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoZSBUM0EgdmFsaWRhdG9yIHNob3VsZCBuZXZlciBiZSBhY3RpdmF0ZWQgb3IgY2FsbGVkLiBJZiB0aGlzIHZhbGlkYXRvciB3YXMgbWFudWFsbHkgdHVybmVkIG9uICIgKwotCQkJCSJ0aG91Z2ggdGhlIHByZWZlcmVuY2VzLCB0aGVuIHRoaXMgaXMgbm90IGEgcmVhbCBlcnJvci4iKTsKLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7CQkKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uLmd1YXJkL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3ZhbGlkYXRpb24vZ3VhcmQvVDNCLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24uZ3VhcmQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdmFsaWRhdGlvbi9ndWFyZC9UM0IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI2NDlhZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24uZ3VhcmQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdmFsaWRhdGlvbi9ndWFyZC9UM0IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uLmd1YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLkFic3RyYWN0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXRlOwotCi0vKioKLSAqIEEgdGVzdCB2YWxpZGF0b3IgdGhhdCB3ZSBuZXZlciBleHBlY3QgdG8gYmUgYWN0aXZhdGVkLiBUaGUgcmVhc29uIHdlIG5ldmVyIGV4cGVjdCBpdCB0byBiZSB2YWxpZGF0ZWQgaXMgdGhhdCBpdCBoYXMgYSBib2d1cyBmYWNldCBmaWx0ZXIuCi0gKiBAYXV0aG9yIGthcmFzaXVrCi0gKgotICovCi1wdWJsaWMgY2xhc3MgVDNCIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0b3IgewotCQotCXByaXZhdGUgYm9vbGVhbiBfaW52b2tlZDsKLQkKLQlwdWJsaWMgVmFsaWRhdGlvblJlc3VsdCB2YWxpZGF0ZShJUmVzb3VyY2UgcmVzb3VyY2UsIGludCBraW5kLCBWYWxpZGF0aW9uU3RhdGUgc3RhdGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcil7Ci0JCWlmICghX2ludm9rZWQpewotCQkJX2ludm9rZWQgPSB0cnVlOwotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoZSBUM0IgdmFsaWRhdG9yIHNob3VsZCBuZXZlciBiZSBhY3RpdmF0ZWQgb3IgY2FsbGVkLiBJZiB0aGlzIHZhbGlkYXRvciB3YXMgbWFudWFsbHkgY2huYWdlZCAiICsKLQkJCQkidGhvdWdoIHRoZSBwcmVmZXJlbmNlcywgYW5kIHRoZSBib2d1cyBmaWx0ZXIgd2FzIHJlbW92ZWQsIHRoZW4gdGhpcyBpc24ndCBhIHJlYWwgZXJyb3IuIik7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwkJCi0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvLmNsYXNzcGF0aCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM3OTNkNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImNvbW1vbnRlc3RzIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZnJhbWV3b3JrdGVzdHMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJhcGl0b29scyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy8uY3ZzaWdub3JlIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzZhYzI1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluCi1idWlsZC54bWwKLXRlbXAuZm9sZGVyCi1jb21tb250ZXN0cy5qYXIKLWphdmFDb21waWxlci5jb21tb250ZXN0cy5qYXIuYXJncwpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy8ucHJvamVjdCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4YjA5NTEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFmMGEzYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI1RodSBNYXkgMTAgMTg6Mzg6MzEgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZDVhYjguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMjAwLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzUGF0aDogY29tbW9udGVzdHMuamFyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmNvbXBhdGliaWxpdHkuUGx1Z2luQWN0aXZhdG9yCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXRvb2xzLmNvbW1vbi50ZXN0LmFwaXRvb2xzLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudGVzdHMsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5leHRyYXMsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmFydGlmYWN0ZWRpdC50ZXN0cywKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuY29tcG9uZW50Y29yZS50ZXN0cywKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuY29tcG9uZW50Y29yZS52aXJ0dWFscGF0aC50ZXN0cywKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuZXh0ZW5kZWQsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnRlc3RzLmJ2dCwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMueG1sCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmp1bml0O3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5LAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrczt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbiwKLSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZSwKLSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3Rvcjt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5qZW0udXRpbCwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mLAotIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uO2J1bmRsZS12ZXJzaW9uPSIxLjIuMCIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci50ZXN0cwotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLVBsdWdpbi1DbGFzczogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5Db21tb25UZXN0c1BsdWdpbgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvYWJvdXQuaHRtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvYXBpdG9vbHMvb3JnL2VjbGlwc2UvZXRvb2xzL2NvbW1vbi90ZXN0L2FwaXRvb2xzL1Byb2plY3RVbnppcFV0aWwuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvYXBpdG9vbHMvb3JnL2VjbGlwc2UvZXRvb2xzL2NvbW1vbi90ZXN0L2FwaXRvb2xzL1Byb2plY3RVbnppcFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc2N2QyMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2FwaXRvb2xzL29yZy9lY2xpcHNlL2V0b29scy9jb21tb24vdGVzdC9hcGl0b29scy9Qcm9qZWN0VW56aXBVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5ldG9vbHMuY29tbW9uLnRlc3QuYXBpdG9vbHM7Ci0KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlByb2plY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLnJlc291cmNlcy5Qcm9qZWN0RGVzY3JpcHRpb25SZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci0KLXB1YmxpYyBjbGFzcyBQcm9qZWN0VW56aXBVdGlsIHsKLQotCXByaXZhdGUgSVBhdGggemlwTG9jYXRpb247Ci0JcHJpdmF0ZSBTdHJpbmdbXSBwcm9qZWN0TmFtZXM7Ci0JcHJpdmF0ZSBJUGF0aCByb290TG9jYXRpb24gPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldExvY2F0aW9uKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFfUFJPSkVDVF9OQU1FID0gIi5wcm9qZWN0IjsKLQotCi0KLQlwdWJsaWMgUHJvamVjdFVuemlwVXRpbChJUGF0aCBhWmlwTG9jYXRpb24sIFN0cmluZ1tdIGFQcm9qZWN0TmFtZXMpIHsKLQkJemlwTG9jYXRpb24gPSBhWmlwTG9jYXRpb247Ci0JCXByb2plY3ROYW1lcyA9IGFQcm9qZWN0TmFtZXM7Ci0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjcmVhdGVQcm9qZWN0cygpIHsKLQkJdHJ5IHsKLQkJCWV4cGFuZFppcCgpOwotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBudWxsKTsKLQkJCWJ1aWxkUHJvamVjdHMoKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0KLQl9Ci0KLQlwcml2YXRlIElQcm9ncmVzc01vbml0b3IgZ2V0UHJvZ2Vzc01vbml0b3IoKSB7Ci0JCXJldHVybiBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBleHBhbmRaaXAoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgPSBnZXRQcm9nZXNzTW9uaXRvcigpOwotCQlaaXBGaWxlIHppcEZpbGUgPSBudWxsOwotCQl0cnkgewotCQkJemlwRmlsZSA9IG5ldyBaaXBGaWxlKHppcExvY2F0aW9uLnRvRmlsZSgpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZTEpIHsKLQkJCXRocm93IGUxOwotCQl9Ci0JCUVudW1lcmF0aW9uIGVudHJpZXMgPSB6aXBGaWxlLmVudHJpZXMoKTsKLQkJd2hpbGUgKGVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCVppcEVudHJ5IGVudHJ5ID0gKFppcEVudHJ5KSBlbnRyaWVzLm5leHRFbGVtZW50KCk7Ci0JCQltb25pdG9yLnN1YlRhc2soZW50cnkuZ2V0TmFtZSgpKTsKLQkJCUZpbGUgYUZpbGUgPSBjb21wdXRlTG9jYXRpb24oZW50cnkuZ2V0TmFtZSgpKS50b0ZpbGUoKTsKLQkJCUZpbGUgcGFyZW50RmlsZSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJCWFGaWxlLm1rZGlycygpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXBhcmVudEZpbGUgPSBhRmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQkJCWlmICghcGFyZW50RmlsZS5leGlzdHMoKSkKLQkJCQkJCXBhcmVudEZpbGUubWtkaXJzKCk7Ci0JCQkJCWlmICghYUZpbGUuZXhpc3RzKCkpCi0JCQkJCQlhRmlsZS5jcmVhdGVOZXdGaWxlKCk7Ci0JCQkJCWNvcHkoemlwRmlsZS5nZXRJbnB1dFN0cmVhbShlbnRyeSksIG5ldyBGaWxlT3V0cHV0U3RyZWFtKGFGaWxlKSk7Ci0JCQkJCWlmIChlbnRyeS5nZXRUaW1lKCkgPiAwKQotCQkJCQkJYUZpbGUuc2V0TGFzdE1vZGlmaWVkKGVudHJ5LmdldFRpbWUoKSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCXRocm93IGU7Ci0JCQl9Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSVBhdGggY29tcHV0ZUxvY2F0aW9uKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiByb290TG9jYXRpb24uYXBwZW5kKG5hbWUpOwotCX0KLQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvcHkoSW5wdXRTdHJlYW0gaW4sIE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVsxMDI0XTsKLQkJdHJ5IHsKLQkJCWludCBuID0gaW4ucmVhZChidWZmZXIpOwotCQkJd2hpbGUgKG4gPiAwKSB7Ci0JCQkJb3V0LndyaXRlKGJ1ZmZlciwgMCwgbik7Ci0JCQkJbiA9IGluLnJlYWQoYnVmZmVyKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWluLmNsb3NlKCk7Ci0JCQlvdXQuY2xvc2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJvb3RMb2NhdGlvbihJUGF0aCByb290TG9jYXRpb24pIHsKLQkJdGhpcy5yb290TG9jYXRpb24gPSByb290TG9jYXRpb247Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkUHJvamVjdHMoKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3ROYW1lcy5sZW5ndGg7IGkrKykgewotCQkJUHJvamVjdERlc2NyaXB0aW9uUmVhZGVyIHBkID0gbmV3IFByb2plY3REZXNjcmlwdGlvblJlYWRlcigpOwotCQkJSVBhdGggcHJvamVjdFBhdGggPSBuZXcgUGF0aCgiLyIgKyBwcm9qZWN0TmFtZXNbaV0gKyAiLyIgKyBNRVRBX1BST0pFQ1RfTkFNRSk7Ci0JCQlJUGF0aCBwYXRoID0gcm9vdExvY2F0aW9uLmFwcGVuZChwcm9qZWN0UGF0aCk7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lc1tpXSk7Ci0JCQlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb247Ci0JCQl0cnkgewotCQkJCWRlc2NyaXB0aW9uID0gcGQucmVhZChwYXRoKTsKLQkJCQlwcm9qZWN0LmNyZWF0ZShkZXNjcmlwdGlvbiwgKGdldFByb2dlc3NNb25pdG9yKCkpKTsKLQkJCQlwcm9qZWN0Lm9wZW4oZ2V0UHJvZ2Vzc01vbml0b3IoKSk7Ci0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBlOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgZTsKLQkJCX0KLQkJfQotCX0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvYnVpbGQucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhlMWUyMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBjb21tb250ZXN0cy5qYXIsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICB0ZXN0RGF0YS8sXAotICAgICAgICAgICAgICAgdGVzdC54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLXNvdXJjZS5jb21tb250ZXN0cy5qYXIgPSBjb21tb250ZXN0cy8sXAotICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1ld29ya3Rlc3RzLyxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgYXBpdG9vbHMvCi1vdXRwdXQuY29tbW9udGVzdHMuamFyID0gYmluLwpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9idWlsZC9idWlsZGNvbnRyb2wucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvYnVpbGQvYnVpbGRjb250cm9sLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkYjVkZWUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9idWlsZC9idWlsZGNvbnRyb2wucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotQ09OVEFDVD1kYW5iZXJnQHVzLmlibS5jb20KLUNvbXBvbmVudFNob3J0TmFtZT1jb21tb250ZXN0cwotQ29tcG9uZW50RnVsbE5hbWU9Q29tbW9uIFRlc3RzCi1Db21wb25lbnRDb21wZXRlbmN5PUNvbW1vbiBUZXN0cwotSmF2YUNvbXBpbGUuMT1zcmNqYXIKLUJ1aWxkVmVyaWZpY2F0aW9uLjE9Y2FsbCB3ZWJidnQuYmF0Ci1FeHBvcnQuamFyRmlsZT1jb21tb250ZXN0cy5qYXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvYnVpbGQvcGFja2FnZS54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2J1aWxkL3BhY2thZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTk4OGM0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvYnVpbGQvcGFja2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08cHJvamVjdCBuYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzIiBkZWZhdWx0PSJwYWNrYWdpbmdQbHVnaW4iIGJhc2VkaXI9Ii4vLi4iPgotICAgIDx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwYWNrYWdlRGlyIiB2YWx1ZT0iIi8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4uZGlyZWN0b3J5IiAgdmFsdWU9IiR7YmFzZWRpcn0iLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi5pZCIgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMiLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi52ZXJzaW9uIiAgdmFsdWU9IiIvPgotICAgIDwvdGFyZ2V0PgotICAgIDx0YXJnZXQgbmFtZT0icGFja2FnaW5nUGx1Z2luIiBkZXBlbmRzPSJpbml0Ij4KLSAgICAgICAgPGVjaG8gbWVzc2FnZT0iJHtwbHVnaW4uaWR9Ii8+Ci0gICAgICAgIDxjb3B5IHRvZGlyPSIke3BhY2thZ2VEaXJ9L3BsdWdpbnMvJHtwbHVnaW4uaWR9XyR7cGx1Z2luLnZlcnNpb259Ij4KLSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtwbHVnaW4uZGlyZWN0b3J5fSI+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0icGx1Z2luLnhtbCIvPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9InJ1bnRpbWUvY29tbW9udGVzdHMuamFyIi8+Ci0gICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDwvY29weT4KLSAgICA8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvYnVpbGQvd3NCdWlsZC54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2J1aWxkL3dzQnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2MwYjgyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvYnVpbGQvd3NCdWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhRE9DVFlQRSBwcm9qZWN0IFsKLQk8IUVOVElUWSBiYXNlQnVpbGQgU1lTVEVNICJmaWxlOi4uLy4uL3dzQnVpbGREZWYueG1sIj4KLV0+Ci0KLTxwcm9qZWN0IG5hbWU9ImJ1aWxkUGx1Z2luIiBkZWZhdWx0PSJidWlsZCIgYmFzZWRpcj0iLi8uLiI+Ci0KLTwhLS0gaW5jbHVkZSB0aGUgY29tbW9uIHhtbCBidWlsZCBmaWxlIC0tPgotJmJhc2VCdWlsZDsKLQotPHRhcmdldCBuYW1lPSJidWlsZCIgZGVwZW5kcz0icHJlcGFyZSIgaWY9InBsdWdpbi5pZCI+Ci0JPGFudGNhbGwgdGFyZ2V0PSJidWlsZGphciI+Ci0JCTxwYXJhbSBuYW1lPSJqYXJuYW1lIiB2YWx1ZT0iJHtkZWZhdWx0amFybmFtZX0iLz4KLQkJPHBhcmFtIG5hbWU9ImphcmNsYXNzcGF0aCIgdmFsdWU9IiR7cGx1Z2luLmNsYXNzcGF0aH0iLz4KLQk8L2FudGNhbGw+Ci08L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvY29tbW9udGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9leHRyYXMvTWVtb3J5VXNhZ2VUZXN0U3VpdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvY29tbW9udGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9leHRyYXMvTWVtb3J5VXNhZ2VUZXN0U3VpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFkN2M5Ni4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2NvbW1vbnRlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZXh0cmFzL01lbW9yeVVzYWdlVGVzdFN1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmV4dHJhczsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RSZXN1bHQ7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLS8qCi0gKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTSAKLSAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDIgLSBBbGwgUmlnaHRzIFJlc2VydmVkLiAKLSAqIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUgCi0gKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4gCi0gKi8KLXB1YmxpYyBjbGFzcyBNZW1vcnlVc2FnZVRlc3RTdWl0ZSBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0JLy9wcm90ZWN0ZWQgU3RyaW5nIEdMT0JBTF9PVVRQVVRfRklMRU5BTUUgPSAiZDovZWNsaXBzZS9jb21tb25fYXJjaGl2ZS9tZW1vcnlVc2FnZS9Db21tb25BcmNoaXZlX01PRjUub3V0IjsKLQlwcm90ZWN0ZWQgU3RyaW5nIEdMT0JBTF9PVVRQVVRfRklMRU5BTUUgPSAiLi9FTUZfRGF0YS50eHQiOwotCXByb3RlY3RlZCBib29sZWFuIFRSQUNLX01FTU9SWSA9IHRydWU7Ci0JcHJvdGVjdGVkIFN0cmluZyBvdXRwdXRGaWxlTmFtZTsKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTWVtb3J5VXNhZ2VUZXN0U3VpdGUuCi0JICovCi0JcHVibGljIE1lbW9yeVVzYWdlVGVzdFN1aXRlKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTWVtb3J5VXNhZ2VUZXN0U3VpdGUuCi0JICogQHBhcmFtIHRoZUNsYXNzCi0JICovCi0JcHVibGljIE1lbW9yeVVzYWdlVGVzdFN1aXRlKENsYXNzIHRoZUNsYXNzKSB7Ci0JCXN1cGVyKHRoZUNsYXNzKTsKLQl9Ci0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE1lbW9yeVVzYWdlVGVzdFN1aXRlLgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIE1lbW9yeVVzYWdlVGVzdFN1aXRlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkJCi0JcHVibGljIHZvaWQgcnVuKFRlc3RSZXN1bHQgcmVzdWx0KSB7Ci0vLwkJVGltZXJTdGVwIHN0ZXAgPSBudWxsOwotLy8JCWlmIChUUkFDS19NRU1PUlkpIHsKLS8vCQkJc3RlcCA9IFRpbWVyU3RlcC5pbnN0YW5jZSgpOwotLy8JCQlzdGVwLnNldExvZ0ZpbGUoZ2V0T3V0cHV0TmFtZSgpKTsKLS8vCQkJaWYgKCFzdGVwLmlzT24oKSkKLS8vCQkJCXN0ZXAuc2V0SXNPbih0cnVlKTsKLS8vCQkJc3RlcC53cml0ZSgiIiwgIkJlZm9yZSAiICsgZ2V0TWVtb3J5TmFtZSgpICsgIiBUZXN0IFJ1biIpOwotLy8JCQlzdGVwLnRvdGFsTWVtb3J5KDApOwotLy8JCQlzdGVwLnVzZWRNZW1vcnkoMCk7Ci0vLwkJfQotLy8JCXN1cGVyLnJ1bihyZXN1bHQpOwotLy8JCWlmIChUUkFDS19NRU1PUlkpIHsKLS8vCQkJc3RlcC53cml0ZSgiIiwgIkFmdGVyICIgKyBnZXRNZW1vcnlOYW1lKCkgKyAiIFRlc3QgUnVuIik7Ci0vLwkJCXN0ZXAudG90YWxNZW1vcnkoMCk7Ci0vLwkJCXN0ZXAudXNlZE1lbW9yeSgwKTsKLS8vCQl9Ci0JCQotCQlzdXBlci5ydW4ocmVzdWx0KTsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgZ2V0T3V0cHV0TmFtZS4KLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldE91dHB1dE5hbWUoKSB7Ci0JCWlmIChvdXRwdXRGaWxlTmFtZSAhPSBudWxsICYmIG91dHB1dEZpbGVOYW1lLmxlbmd0aCgpID4gMCkKLQkJCXJldHVybiBvdXRwdXRGaWxlTmFtZTsKLQkJcmV0dXJuIEdMT0JBTF9PVVRQVVRfRklMRU5BTUU7Ci0JfQotCi0KLQkvKioKLQkgKiBNZXRob2QgZ2V0TWVtb3J5TmFtZS4KLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldE1lbW9yeU5hbWUoKSB7Ci0JCWlmIChnZXROYW1lKCkgIT0gbnVsbCAmJiBnZXROYW1lKCkubGVuZ3RoKCkgPiAwKQotCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJaWYgKGdldENsYXNzKCkgIT0gbnVsbCkKLQkJCXJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKTsKLQkJcmV0dXJuICJVbmtub3duIFRlc3QiOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG91dHB1dEZpbGVOYW1lLgotCSAqIEBwYXJhbSBvdXRwdXRGaWxlTmFtZSBUaGUgb3V0cHV0RmlsZU5hbWUgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0T3V0cHV0RmlsZU5hbWUoU3RyaW5nIG91dHB1dEZpbGVOYW1lKSB7Ci0JCXRoaXMub3V0cHV0RmlsZU5hbWUgPSBvdXRwdXRGaWxlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBnTE9CQUxfT1VUUFVUX0ZJTEVOQU1FLgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRHTE9CQUxfT1VUUFVUX0ZJTEVOQU1FKCkgewotCQlyZXR1cm4gR0xPQkFMX09VVFBVVF9GSUxFTkFNRTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBnTE9CQUxfT1VUUFVUX0ZJTEVOQU1FLgotCSAqIEBwYXJhbSBnTE9CQUxfT1VUUFVUX0ZJTEVOQU1FIFRoZSBmaWxlTmFtZSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRHTE9CQUxfT1VUUFVUX0ZJTEVOQU1FKFN0cmluZyBmaWxlTmFtZSkgewotCQlHTE9CQUxfT1VUUFVUX0ZJTEVOQU1FID0gZmlsZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdFJBQ0tfTUVNT1JZLgotCSAqIEBwYXJhbSB0UkFDS19NRU1PUlkgVGhlIGFCb29sZWFuIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRSQUNLX01FTU9SWShib29sZWFuIGFCb29sZWFuKSB7Ci0JCVRSQUNLX01FTU9SWSA9IGFCb29sZWFuOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9jb21tb250ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL0Fzc2VydFdhcm4uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvY29tbW9udGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy9Bc3NlcnRXYXJuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiN2U3OWEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9jb21tb250ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL0Fzc2VydFdhcm4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydGlvbkZhaWxlZEVycm9yOwotCi0KLXB1YmxpYyBjbGFzcyBBc3NlcnRXYXJuIGV4dGVuZHMgQXNzZXJ0IHsKLQlwcml2YXRlIHN0YXRpYyBMaXN0PEFzc2VydGlvbkZhaWxlZEVycm9yPiB3YXJuaW5ncyA9IG5ldyBBcnJheUxpc3Q8QXNzZXJ0aW9uRmFpbGVkRXJyb3I+KCk7Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHdhcm5FcXVhbHMoYm9vbGVhbiBleHBlY3RlZCwgYm9vbGVhbiBhY3R1YWwpIHsKLQkJdHJ5ewotCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpOwotCQl9IGNhdGNoKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpewotCQkJd2FybmluZ3MuYWRkKGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCB3YXJuRXF1YWxzKGJ5dGUgZXhwZWN0ZWQsIGJ5dGUgYWN0dWFsKSB7Ci0JCXRyeXsKLQkJCWFzc2VydEVxdWFscyhleHBlY3RlZCwgYWN0dWFsKTsKLQkJfSBjYXRjaChBc3NlcnRpb25GYWlsZWRFcnJvciBlKXsKLQkJCXdhcm5pbmdzLmFkZChlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgd2FybkVxdWFscyhjaGFyIGV4cGVjdGVkLCBjaGFyIGFjdHVhbCkgewotCQl0cnl7Ci0JCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCk7Ci0JCX0gY2F0Y2goQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSl7Ci0JCQl3YXJuaW5ncy5hZGQoZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHdhcm5FcXVhbHMoZG91YmxlIGV4cGVjdGVkLCBkb3VibGUgYWN0dWFsLCBkb3VibGUgZGVsdGEpIHsKLQkJdHJ5ewotCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwsIGRlbHRhKTsKLQkJfSBjYXRjaChBc3NlcnRpb25GYWlsZWRFcnJvciBlKXsKLQkJCXdhcm5pbmdzLmFkZChlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgd2FybkVxdWFscyhmbG9hdCBleHBlY3RlZCwgZmxvYXQgYWN0dWFsLCBmbG9hdCBkZWx0YSkgewotCQl0cnl7Ci0JCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCwgZGVsdGEpOwotCQl9IGNhdGNoKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpewotCQkJd2FybmluZ3MuYWRkKGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCB3YXJuRXF1YWxzKGludCBleHBlY3RlZCwgaW50IGFjdHVhbCkgewotCQl0cnl7Ci0JCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCk7Ci0JCX0gY2F0Y2goQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSl7Ci0JCQl3YXJuaW5ncy5hZGQoZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHdhcm5FcXVhbHMoT2JqZWN0IGV4cGVjdGVkLCBPYmplY3QgYWN0dWFsKSB7Ci0JCXRyeXsKLQkJCWFzc2VydEVxdWFscyhleHBlY3RlZCwgYWN0dWFsKTsKLQkJfSBjYXRjaChBc3NlcnRpb25GYWlsZWRFcnJvciBlKXsKLQkJCXdhcm5pbmdzLmFkZChlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgd2FybkVxdWFscyhsb25nIGV4cGVjdGVkLCBsb25nIGFjdHVhbCkgewotCQl0cnl7Ci0JCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCk7Ci0JCX0gY2F0Y2goQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSl7Ci0JCQl3YXJuaW5ncy5hZGQoZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHdhcm5FcXVhbHMoc2hvcnQgZXhwZWN0ZWQsIHNob3J0IGFjdHVhbCkgewotCQl0cnl7Ci0JCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCk7Ci0JCX0gY2F0Y2goQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSl7Ci0JCQl3YXJuaW5ncy5hZGQoZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHdhcm5FcXVhbHMoU3RyaW5nIG1lc3NhZ2UsIGJvb2xlYW4gZXhwZWN0ZWQsIGJvb2xlYW4gYWN0dWFsKSB7Ci0JCXRyeXsKLQkJCWFzc2VydEVxdWFscyhtZXNzYWdlLCBleHBlY3RlZCwgYWN0dWFsKTsKLQkJfSBjYXRjaChBc3NlcnRpb25GYWlsZWRFcnJvciBlKXsKLQkJCXdhcm5pbmdzLmFkZChlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgd2FybkVxdWFscyhTdHJpbmcgbWVzc2FnZSwgYnl0ZSBleHBlY3RlZCwgYnl0ZSBhY3R1YWwpIHsKLQkJdHJ5ewotCQkJYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIGV4cGVjdGVkLCBhY3R1YWwpOwotCQl9IGNhdGNoKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpewotCQkJd2FybmluZ3MuYWRkKGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCB3YXJuRXF1YWxzKFN0cmluZyBtZXNzYWdlLCBjaGFyIGV4cGVjdGVkLCBjaGFyIGFjdHVhbCkgewotCQl0cnl7Ci0JCQlhc3NlcnRFcXVhbHMobWVzc2FnZSwgZXhwZWN0ZWQsIGFjdHVhbCk7Ci0JCX0gY2F0Y2goQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSl7Ci0JCQl3YXJuaW5ncy5hZGQoZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHdhcm5FcXVhbHMoU3RyaW5nIG1lc3NhZ2UsIGRvdWJsZSBleHBlY3RlZCwgZG91YmxlIGFjdHVhbCwgZG91YmxlIGRlbHRhKSB7Ci0JCXRyeXsKLQkJCWFzc2VydEVxdWFscyhtZXNzYWdlLCBleHBlY3RlZCwgYWN0dWFsLCBkZWx0YSk7Ci0JCX0gY2F0Y2goQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSl7Ci0JCQl3YXJuaW5ncy5hZGQoZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHdhcm5FcXVhbHMoU3RyaW5nIG1lc3NhZ2UsIGZsb2F0IGV4cGVjdGVkLCBmbG9hdCBhY3R1YWwsIGZsb2F0IGRlbHRhKSB7Ci0JCXRyeXsKLQkJCWFzc2VydEVxdWFscyhtZXNzYWdlLCBleHBlY3RlZCwgYWN0dWFsLCBkZWx0YSk7Ci0JCX0gY2F0Y2goQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSl7Ci0JCQl3YXJuaW5ncy5hZGQoZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHdhcm5FcXVhbHMoU3RyaW5nIG1lc3NhZ2UsIGludCBleHBlY3RlZCwgaW50IGFjdHVhbCl7Ci0JCXRyeXsKLQkJCWFzc2VydEVxdWFscyhtZXNzYWdlLCBleHBlY3RlZCwgYWN0dWFsKTsKLQkJfSBjYXRjaChBc3NlcnRpb25GYWlsZWRFcnJvciBlKXsKLQkJCXdhcm5pbmdzLmFkZChlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgd2FybkVxdWFscyhTdHJpbmcgbWVzc2FnZSwgT2JqZWN0IGV4cGVjdGVkLCBPYmplY3QgYWN0dWFsKXsKLQkJdHJ5ewotCQkJYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIGV4cGVjdGVkLCBhY3R1YWwpOwotCQl9IGNhdGNoKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpewotCQkJd2FybmluZ3MuYWRkKGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCB3YXJuRXF1YWxzKFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBhY3R1YWwpewotCQl0cnl7Ci0JCQlhc3NlcnRFcXVhbHMobWVzc2FnZSwgZXhwZWN0ZWQsIGFjdHVhbCk7Ci0JCX0gY2F0Y2goQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSl7Ci0JCQl3YXJuaW5ncy5hZGQoZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHdhcm5FcXVhbHMoU3RyaW5nIG1lc3NhZ2UsIGxvbmcgZXhwZWN0ZWQsIGxvbmcgYWN0dWFsKXsKLQkJdHJ5ewotCQkJYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIGV4cGVjdGVkLCBhY3R1YWwpOwotCQl9IGNhdGNoKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpewotCQkJd2FybmluZ3MuYWRkKGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCB3YXJuRXF1YWxzKFN0cmluZyBtZXNzYWdlLCBzaG9ydCBleHBlY3RlZCwgc2hvcnQgYWN0dWFsKXsKLQkJdHJ5ewotCQkJYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIGV4cGVjdGVkLCBhY3R1YWwpOwotCQl9IGNhdGNoKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpewotCQkJd2FybmluZ3MuYWRkKGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCB3YXJuRmFsc2UoYm9vbGVhbiBjb25kaXRpb24pewotCQl0cnl7Ci0JCQlhc3NlcnRGYWxzZShjb25kaXRpb24pOwotCQl9IGNhdGNoKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpewotCQkJd2FybmluZ3MuYWRkKGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCB3YXJuRmFsc2UoU3RyaW5nIG1lc3NhZ2UsIGJvb2xlYW4gY29uZGl0aW9uKXsKLQkJdHJ5ewotCQkJYXNzZXJ0RmFsc2UobWVzc2FnZSwgY29uZGl0aW9uKTsKLQkJfSBjYXRjaChBc3NlcnRpb25GYWlsZWRFcnJvciBlKXsKLQkJCXdhcm5pbmdzLmFkZChlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgd2Fybk5vdE51bGwoT2JqZWN0IG9iamVjdCkgewotCQl0cnl7Ci0JCQlhc3NlcnROb3ROdWxsKG9iamVjdCk7Ci0JCX0gY2F0Y2goQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSl7Ci0JCQl3YXJuaW5ncy5hZGQoZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHdhcm5Ob3ROdWxsKFN0cmluZyBtZXNzYWdlLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXRyeXsKLQkJCWFzc2VydE5vdE51bGwobWVzc2FnZSwgb2JqZWN0KTsKLQkJfSBjYXRjaChBc3NlcnRpb25GYWlsZWRFcnJvciBlKXsKLQkJCXdhcm5pbmdzLmFkZChlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgd2Fybk5vdFNhbWUoT2JqZWN0IGV4cGVjdGVkLCBPYmplY3QgYWN0dWFsKSB7Ci0JCXRyeXsKLQkJCWFzc2VydE5vdFNhbWUoZXhwZWN0ZWQsIGFjdHVhbCk7Ci0JCX0gY2F0Y2goQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSl7Ci0JCQl3YXJuaW5ncy5hZGQoZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHdhcm5Ob3RTYW1lKFN0cmluZyBtZXNzYWdlLCBPYmplY3QgZXhwZWN0ZWQsIE9iamVjdCBhY3R1YWwpIHsKLQkJdHJ5ewotCQkJYXNzZXJ0Tm90U2FtZShtZXNzYWdlLCBleHBlY3RlZCwgYWN0dWFsKTsKLQkJfSBjYXRjaChBc3NlcnRpb25GYWlsZWRFcnJvciBlKXsKLQkJCXdhcm5pbmdzLmFkZChlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgd2Fybk51bGwoT2JqZWN0IG9iamVjdCkgewotCQl0cnl7Ci0JCQlhc3NlcnROdWxsKG9iamVjdCk7Ci0JCX0gY2F0Y2goQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSl7Ci0JCQl3YXJuaW5ncy5hZGQoZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHdhcm5OdWxsKFN0cmluZyBtZXNzYWdlLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXRyeXsKLQkJCWFzc2VydE51bGwobWVzc2FnZSwgb2JqZWN0KTsKLQkJfSBjYXRjaChBc3NlcnRpb25GYWlsZWRFcnJvciBlKXsKLQkJCXdhcm5pbmdzLmFkZChlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgd2FyblNhbWUoT2JqZWN0IGV4cGVjdGVkLCBPYmplY3QgYWN0dWFsKSB7Ci0JCXRyeXsKLQkJCWFzc2VydFNhbWUoZXhwZWN0ZWQsIGFjdHVhbCk7Ci0JCX0gY2F0Y2goQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSl7Ci0JCQl3YXJuaW5ncy5hZGQoZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHdhcm5TYW1lKFN0cmluZyBtZXNzYWdlLCBPYmplY3QgZXhwZWN0ZWQsIE9iamVjdCBhY3R1YWwpIHsKLQkJdHJ5ewotCQkJYXNzZXJ0U2FtZShtZXNzYWdlLCBleHBlY3RlZCwgYWN0dWFsKTsKLQkJfSBjYXRjaChBc3NlcnRpb25GYWlsZWRFcnJvciBlKXsKLQkJCXdhcm5pbmdzLmFkZChlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgd2FyblRydWUoYm9vbGVhbiBjb25kaXRpb24pewotCQl0cnl7Ci0JCQlhc3NlcnRUcnVlKGNvbmRpdGlvbik7Ci0JCX0gY2F0Y2goQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSl7Ci0JCQl3YXJuaW5ncy5hZGQoZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHdhcm5UcnVlKFN0cmluZyBtZXNzYWdlLCBib29sZWFuIGNvbmRpdGlvbil7Ci0JCXRyeXsKLQkJCWFzc2VydFRydWUobWVzc2FnZSwgY29uZGl0aW9uKTsKLQkJfSBjYXRjaChBc3NlcnRpb25GYWlsZWRFcnJvciBlKXsKLQkJCXdhcm5pbmdzLmFkZChlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgd2FybigpIHsKLQkJdHJ5ewotCQkJZmFpbCgpOwotCQl9IGNhdGNoKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpewotCQkJd2FybmluZ3MuYWRkKGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCB3YXJuKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXRyeXsKLQkJCWZhaWwobWVzc2FnZSk7Ci0JCX0gY2F0Y2goQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSl7Ci0JCQl3YXJuaW5ncy5hZGQoZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGNsZWFyV2FybmluZ3MoKXsKLQkJd2FybmluZ3MuY2xlYXIoKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBMaXN0IDxBc3NlcnRpb25GYWlsZWRFcnJvcj4gZ2V0V2FybmluZ3MoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KHdhcm5pbmdzKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2NvbW1vbnRlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvQmFzZVRlc3RDYXNlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2NvbW1vbnRlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvQmFzZVRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMDI4Y2UuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9jb21tb250ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL0Jhc2VUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotCi1wdWJsaWMgY2xhc3MgQmFzZVRlc3RDYXNlIGV4dGVuZHMgVGVzdENhc2UgewotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZkZhaWxPbkxvZ2dlZFN0YXR1cyA9IHRydWU7Ci0JCi0JLyoqCi0JICogCi0JICovIAotCXB1YmxpYyBCYXNlVGVzdENhc2UoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgQmFzZVRlc3RDYXNlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOyAKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVcFRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsgCi0JCXNldFVwKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgdGVhckRvd25UZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7IAotCQl0ZWFyRG93bigpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjcnVuQmFyZSgpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcnVuQ29yZVRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsgCi0JCXJ1blRlc3QoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJCi0JCS8vVE9ETyByZWdpc3RlciBhbnkgcGx1Z2lucyB3aXRoIHRoZSBKVW5pdExvZ0xpc3RlbmVyIGhlcmUgdGhhdCB5b3Ugd2FudCB0byBmYWlsIG9uIHdoZW4gdGhlaXIgbG9nIGlzIHdyaXR0ZW4gdG9vCi0JCS8vRVg6IENvbW1vblRlc3RzUGx1Z2luLmluc3RhbmNlLmdldExvZygpLmFkZExvZ0xpc3RlbmVyKEpVbml0TG9nTGlzdGVuZXIuSU5TVEFOQ0UpOwotCi0JCS8vbGlzdCBvZiBwbHVnaW5zIHdob3MgbG9ncyBpZiB3cml0dGVuIHRvIHdpbGwgY2F1c2UgSlVuaXRzIHRvIGZhaWwKLS8vCQlBcnJheUxpc3Q8U3RyaW5nPiBwbHVnaW5JRHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCi0JCS8vVE9ETyB1bmNvbW1lbnQgdGhlc2UgdG8gbWFrZSB0ZXN0cyBzdGFydCBmYWlsaW5nIG9uIGxvZ2dlZCBlcnJvcnMKLS8vCQlwbHVnaW5JRHMuYWRkKEpFTVV0aWxQbHVnaW4uSUQpOwotLy8JCXBsdWdpbklEcy5hZGQoIm9yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlciIpOwotLy8JCXBsdWdpbklEcy5hZGQoIm9yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZSIpOwotLy8JCXBsdWdpbklEcy5hZGQoIm9yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkiKTsKLS8vCQlwbHVnaW5JRHMuYWRkKENvbW1vbkZyYW1ld29ya3NQbHVnaW4uUExVR0lOX0lEKTsKLS8vCQlwbHVnaW5JRHMuYWRkKEVKQlVJUGx1Z2luLlBMVUdJTl9JRCk7Ci0vLwkJcGx1Z2luSURzLmFkZChKMkVFUGx1Z2luLlBMVUdJTl9JRCk7Ci0vLwkJcGx1Z2luSURzLmFkZChKMkVFQ29yZVBsdWdpbi5QTFVHSU5fSUQpOwotLy8JCXBsdWdpbklEcy5hZGQoRWpiUGx1Z2luLlBMVUdJTl9JRCk7Ci0vLwkJcGx1Z2luSURzLmFkZChNb2RlbFBsdWdpbi5QTFVHSU5JRCk7Ci0vLwkJcGx1Z2luSURzLmFkZCgib3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmFubm90YXRpb25zLmVtaXR0ZXIiKTsKLS8vCQlwbHVnaW5JRHMuYWRkKFhEb2NsZXRBbm5vdGF0aW9uUGx1Z2luLlBMVUdJTklEKTsKLS8vCQlwbHVnaW5JRHMuYWRkKEpjYVBsdWdpbi5QTFVHSU5fSUQpOwotLy8JCXBsdWdpbklEcy5hZGQoSkNBVUlQbHVnaW4uUExVR0lOX0lEKTsKLS8vCQlwbHVnaW5JRHMuYWRkKEoyRUVOYXZpZ2F0b3JQbHVnaW4uUExVR0lOX0lEKTsKLS8vCQlwbHVnaW5JRHMuYWRkKEoyRUVVSVBsdWdpbi5QTFVHSU5fSUQpOwotLy8JCXBsdWdpbklEcy5hZGQoV2ViUGx1Z2luLlBMVUdJTl9JRCk7Ci0vLwkJcGx1Z2luSURzLmFkZChXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCk7Ci0vLwkJcGx1Z2luSURzLmFkZChXZWJTZXJ2aWNlVUlQbHVnaW4uUExVR0lOX0lEKTsKLS8vCQlwbHVnaW5JRHMuYWRkKEpFRVBsdWdpbi5QTFVHSU5fSUQpOwotLy8JCXBsdWdpbklEcy5hZGQoQWN0aXZhdG9yLlBMVUdJTl9JRCk7Ci0vLwkJcGx1Z2luSURzLmFkZChKMkVFVUlQbHVnaW4uUExVR0lOX0lEKTsKLS8vCQlwbHVnaW5JRHMuYWRkKG9yZy5lY2xpcHNlLmpzdC5qZWUud2ViLkFjdGl2YXRvci5QTFVHSU5fSUQpOwotLy8JCXBsdWdpbklEcy5hZGQoU2VydmxldFVJUGx1Z2luLlBMVUdJTl9JRCk7Ci0vLwkJcGx1Z2luSURzLmFkZChQcm9wZXJ0aWVzVmFsaWRhdG9yUGx1Z2luLlBMVUdJTl9JRCk7Ci0vLwkJcGx1Z2luSURzLmFkZChCVlRWYWxpZGF0aW9uUGx1Z2luLlBMVUdJTl9JRCk7Ci0vLwkJcGx1Z2luSURzLmFkZChFY29yZVV0aWxpdGllc1BsdWdpbi5JRCk7Ci0vLwkJcGx1Z2luSURzLmFkZChFTUZXb3JrYmVuY2hFZGl0UGx1Z2luLklEKTsKLS8vCQlwbHVnaW5JRHMuYWRkKFdUUENvbW1vblBsdWdpbi5QTFVHSU5fSUQpOwotLy8JCXBsdWdpbklEcy5hZGQoV1RQVUlQbHVnaW4uUExVR0lOX0lEKTsKLS8vCQlwbHVnaW5JRHMuYWRkKE1vZHVsZWNvcmVQbHVnaW4uUExVR0lOX0lEKTsKLS8vCQlwbHVnaW5JRHMuYWRkKFZhbGlkYXRpb25QbHVnaW4uUExVR0lOX0lEKTsKLS8vCQlwbHVnaW5JRHMuYWRkKFZhbGlkYXRpb25VSVBsdWdpbi5QTFVHSU5fSUQpOwotLy8JCXBsdWdpbklEcy5hZGQoV1NUV2ViUGx1Z2luLlBMVUdJTl9JRCk7Ci0vLwkJcGx1Z2luSURzLmFkZChXU1RXZWJVSVBsdWdpbi5QTFVHSU5fSUQpOwotLy8JCXBsdWdpbklEcy5hZGQoIm9yZy5lY2xpcHNlLndzdC54bWwuY29yZSIpOwotLy8JCXBsdWdpbklEcy5hZGQoIm9yZy5lY2xpcHNlLmplbSIpOwotLy8JCXBsdWdpbklEcy5hZGQoQmVhbmluZm9QbHVnaW4uUElfQkVBTklORk9fUExVR0lOSUQpOwotLy8JCXBsdWdpbklEcy5hZGQoIm9yZy5lY2xpcHNlLmplbS5wcm94eSIpOwotLy8JCXBsdWdpbklEcy5hZGQoIm9yZy5lY2xpcHNlLmplbS51aSIpOwotLy8JCXBsdWdpbklEcy5hZGQoIm9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2giKTsKLS8vCQlwbHVnaW5JRHMuYWRkKCJvcmcuZWNsaXBzZS5qZW0udGVzdHMiKTsKLS8vCQlwbHVnaW5JRHMuYWRkKCJvcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcyIpOwotLy8JCXBsdWdpbklEcy5hZGQoQ29tbW9uVGVzdHNQbHVnaW4uUExVR0lOX0lEKTsKLS8vCQlwbHVnaW5JRHMuYWRkKCJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3RvciIpOwotLy8JCXBsdWdpbklEcy5hZGQoIm9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkiKTsKLS8vCQlwbHVnaW5JRHMuYWRkKCJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzIik7Ci0vLwkJcGx1Z2luSURzLmFkZCgib3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5wZXJmb3JtYW5jZSIpOwotLy8JCXBsdWdpbklEcy5hZGQoIm9yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzIik7Ci0vLwkJcGx1Z2luSURzLmFkZCgib3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2UiKTsKLS8vCQlwbHVnaW5JRHMuYWRkKCJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cyIpOwkKLQotLy8JCWZvcihTdHJpbmcgcGx1Z2luSUQgOiBwbHVnaW5JRHMpIHsKLS8vCQkJSW50ZXJuYWxQbGF0Zm9ybS5nZXREZWZhdWx0KCkuZ2V0TG9nKEludGVybmFsUGxhdGZvcm0uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZShwbHVnaW5JRCkpLmFkZExvZ0xpc3RlbmVyKEpVbml0TG9nTGlzdGVuZXIuSU5TVEFOQ0UpOwotLy8JCX0KLQl9Ci0JCi0JLyoqCi0JICogU2V0IHdlYXRoZXIgdG8gZmFpbCBqdW5pdCB0ZXN0cyBvbiBzdGF0dXMgbG9nZ2VkIHRvIHBsdWdpbnMgcmVnaXN0ZXJlZCB3aXRoIHRoZSA8Y29kZT5KVW5pdExvZ0xpc3RlbmVyPC9jb2RlPgotCSAqIERlZmF1bHQgdmFsdWUgaXMgc2V0IHRvIHRydWUuCi0JICogCi0JICogQHBhcmFtIGZhaWxPbkxvZ2dlZFN0YXR1cwotCSAqIAkJCWlmIDxjb2RlPnRydWU8L2NvZGU+IHRoZW4gZmFpbCB0ZXN0cyB3aGVuIHN0YXR1c2VzIGxvZ2dlZCB0byBwbHVnaW5zIHJlZ2lzdGVyZWQgd2l0aCA8Y29kZT5KVW5pdExvZ0xpc3RlbmVyPC9jb2RlPiwKLQkgKiAJCQlpZiA8Y29kZT5mYWxzZTwvY29kZT4gdGhlbiBkb250IGZhaWwgb24gbG9nZ2VkIHN0YXR1c2VzLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBmYWlsT25Mb2dnZWRTdGF0dXMoYm9vbGVhbiBmYWlsT25Mb2dnZWRTdGF0dXMpIHsKLQkJZkZhaWxPbkxvZ2dlZFN0YXR1cyA9IGZhaWxPbkxvZ2dlZFN0YXR1czsKLQl9Ci0KLS8vCUBPdmVycmlkZQotLy8JcHVibGljIHZvaWQgcnVuKFRlc3RSZXN1bHQgcmVzdWx0KSB7Ci0vLwkJdHJ5ewotLy8JCQlBc3NlcnRXYXJuLmNsZWFyV2FybmluZ3MoKTsKLS8vCQkJc3VwZXIucnVuKHJlc3VsdCk7Ci0vLwkJCQotLy8JCX0gZmluYWxseSB7Ci0vLwkJCUxpc3QgPFN0YWNrVHJhY2VFbGVtZW50PiBzdGFja1RyYWNlID0gbmV3IEFycmF5TGlzdDxTdGFja1RyYWNlRWxlbWVudD4oKTsKLS8vCQkJCi0vLwkJCS8vY2hlY2sgdG8gc2VlIGlmIHRoaXMgdGVzdCBhbHJlYWR5IGZhaWxlZCB3aXRoIGFuIGVycm9yCi0vLwkJCS8vaWYgc28gYWRkIGVycm9yIHRvIHN0YWNrIHRyYWNlCi0vLwkJCUVudW1lcmF0aW9uIGVycm9yc0VudW0gPSByZXN1bHQuZXJyb3JzKCk7Ci0vLwkJCVRlc3RGYWlsdXJlIGVycm9yT3JGYWlsdXJlID0gbnVsbDsKLS8vCQkJYm9vbGVhbiBoYWRFcnJvciA9IGZhbHNlOwotLy8JCQlmb3IoaW50IGkgPSAwOyBlcnJvcnNFbnVtLmhhc01vcmVFbGVtZW50cygpICYmICFoYWRFcnJvcjsgaSsrKSB7Ci0vLwkJCQlPYmplY3QgbyA9IGVycm9yc0VudW0ubmV4dEVsZW1lbnQoKTsKLS8vCQkJCWVycm9yT3JGYWlsdXJlID0gKFRlc3RGYWlsdXJlKW87Ci0vLwkJCQlpZihlcnJvck9yRmFpbHVyZS5mYWlsZWRUZXN0KCkgPT0gdGhpcykgewotLy8JCQkJCWhhZEVycm9yID0gdHJ1ZTsKLS8vCQkJCQkKLS8vCQkJCQlUaHJvd2FibGUgdGhyb3duID0gZXJyb3JPckZhaWx1cmUudGhyb3duRXhjZXB0aW9uKCk7Ci0vLwkJCQkJTGlzdDxTdGFja1RyYWNlRWxlbWVudD4gZXJyb3JUcmFjZSA9IEFycmF5cy5hc0xpc3QodGhyb3duLmdldFN0YWNrVHJhY2UoKSk7Ci0vLwkJCQkJc3RhY2tUcmFjZS5hZGRBbGwoZXJyb3JUcmFjZSk7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQkJCi0vLwkJCS8vY2hlY2sgdG8gc2VlIGlmIHRoaXMgdGVzdCBhbHJlYWR5IGZhaWxlZCB3aXRoIGEgZmFpbHVyZSBpZiBpdCBkaWRuJ3QKLS8vCQkJLy8gZmFpbCB3aXRoIGFuIGVycm9yLiBpZiBzbyBhZGQgZmFpbHVyZSB0byBzdGFjayB0cmFjZQotLy8JCQlib29sZWFuIGhhZEZhaWx1cmUgPSBmYWxzZTsKLS8vCQkJaWYoIWhhZEVycm9yKSB7Ci0vLwkJCQlFbnVtZXJhdGlvbiBmYWlsdXJlc0VudW0gPSByZXN1bHQuZmFpbHVyZXMoKTsKLS8vCQkJCWZvcihpbnQgaSA9IDA7IGZhaWx1cmVzRW51bS5oYXNNb3JlRWxlbWVudHMoKSAmJiAhaGFkRmFpbHVyZTsgaSsrKSB7Ci0vLwkJCQkJT2JqZWN0IG8gPSBmYWlsdXJlc0VudW0ubmV4dEVsZW1lbnQoKTsKLS8vCQkJCQllcnJvck9yRmFpbHVyZSA9IChUZXN0RmFpbHVyZSlvOwotLy8JCQkJCWlmKGVycm9yT3JGYWlsdXJlLmZhaWxlZFRlc3QoKSA9PSB0aGlzKSB7Ci0vLwkJCQkJCWhhZEZhaWx1cmUgPSB0cnVlOwotLy8JCQkJCQkKLS8vCQkJCQkJVGhyb3dhYmxlIHRocm93biA9IGVycm9yT3JGYWlsdXJlLnRocm93bkV4Y2VwdGlvbigpOwotLy8JCQkJCQlMaXN0PFN0YWNrVHJhY2VFbGVtZW50PiBmYWlsdXJlVHJhY2UgPSBBcnJheXMuYXNMaXN0KHRocm93bi5nZXRTdGFja1RyYWNlKCkpOwotLy8JCQkJCQlzdGFja1RyYWNlLmFkZEFsbChmYWlsdXJlVHJhY2UpOwotLy8JCQkJCX0KLS8vCQkJCX0KLS8vCQkJfQotLy8JCQkKLS8vCQkJLy9hZGQgYW55IHdhcm5pbmdzIHRvIHRoZSBzdGFjayB0cmFjZSBhbmQgZGVhbCB3aXRoIGlmIHRoaXMgdGVzdCBhbHJlYWR5IGZhaWxlZAotLy8JCQlMaXN0IDxBc3NlcnRpb25GYWlsZWRFcnJvcj4gd2FybmluZ3MgPSBBc3NlcnRXYXJuLmdldFdhcm5pbmdzKCk7Ci0vLwkJCWJvb2xlYW4gaGFkV2FybmluZ3MgPSB3YXJuaW5ncy5zaXplKCkgIT0gMDsKLS8vCQkJaWYoaGFkV2FybmluZ3MpIHsKLS8vCQkJCWludCB3YXJuaW5nTnVtID0gMTsKLS8vCQkJCUxpc3Q8U3RhY2tUcmFjZUVsZW1lbnQ+IHdhcm5pbmdUcmFjZSA9IG51bGw7Ci0vLwkJCQlmb3IoQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSA6IHdhcm5pbmdzKXsKLS8vCQkJCQlzdGFja1RyYWNlLmFkZChuZXcgU3RhY2tUcmFjZUVsZW1lbnQoIi0tLS0tLS0tLS0+IiwiIiwgIldBUk5JTkcgTUVTU0FHRTogIiArIGUuZ2V0TWVzc2FnZSgpICsgIikgIChXQVJOSU5HIE5VTUJFUiIsIHdhcm5pbmdOdW0rKykpOwotLy8JCQkJCQotLy8JCQkJCXdhcm5pbmdUcmFjZSA9IEFycmF5cy5hc0xpc3QoZS5nZXRTdGFja1RyYWNlKCkpOwotLy8JCQkJCXN0YWNrVHJhY2UuYWRkQWxsKHdhcm5pbmdUcmFjZSk7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQkJCi0vLwkJCS8vYWRkIGFueSBsb2dnZWQgc3RhdHVzZXMgdG8gdGhlIHN0YWNrIHRyYWNlLCBhcyBsb25nIGFzIGZGYWlsT25Mb2dnZWRTdGF0dXMgPT0gdHJ1ZQotLy8JCQlIYXNoTWFwPElTdGF0dXMsU3RyaW5nPiBsb2dnZWRTdGF0dXNlcyA9IEpVbml0TG9nTGlzdGVuZXIuSU5TVEFOQ0UuZ2V0TG9nZ2VkU3RhdHVzZXMoKTsKLS8vCQkJYm9vbGVhbiBoYWRMb2dnZWRTdGF0dXNlcyA9IGxvZ2dlZFN0YXR1c2VzLnNpemUoKSAhPSAwOwotLy8JCQlpZihoYWRMb2dnZWRTdGF0dXNlcyAmJiBmRmFpbE9uTG9nZ2VkU3RhdHVzKSB7Ci0vLwkJCQlpbnQgbG9nZ2VkTWVzc2FnZU51bSA9IDE7Ci0vLwkJCQlMaXN0PFN0YWNrVHJhY2VFbGVtZW50PiBsb2dnZWRNZXNzYWdlVHJhY2UgPSBudWxsOwotLy8JCQkJCi0vLwkJCQlTZXQ8SVN0YXR1cz4gbG9nZ2VkU3RhdHVzZXNLZXlzID0gbG9nZ2VkU3RhdHVzZXMua2V5U2V0KCk7Ci0vLwkJCQlTdHJpbmcgc3RhdHVzVHlwZTsKLS8vCQkJCWZvcihJU3RhdHVzIHN0YXR1cyA6IGxvZ2dlZFN0YXR1c2VzS2V5cykgewotLy8JCQkJCXN0YWNrVHJhY2UuYWRkKG5ldyBTdGFja1RyYWNlRWxlbWVudCgiLS0tLS0tLS0tLT4iLCIiLCAiTE9HR0VEICIgKyBzdGF0dXNUeXBlVG9TdHJpbmcoc3RhdHVzLmdldFNldmVyaXR5KCkpICsgIiBTVEFUVVM6ICIgKyBsb2dnZWRTdGF0dXNlcy5nZXQoc3RhdHVzKSArICI6ICIgKyBzdGF0dXMuZ2V0TWVzc2FnZSgpICsgIikgIChMT0dHRUQgU1RBVFVTIE5VTUJFUiIsIGxvZ2dlZE1lc3NhZ2VOdW0rKykpOwotLy8JCQkJCQotLy8JCQkJCWlmKHN0YXR1cy5nZXRFeGNlcHRpb24oKSAhPSBudWxsKSB7Ci0vLwkJCQkJCWxvZ2dlZE1lc3NhZ2VUcmFjZSA9IEFycmF5cy5hc0xpc3Qoc3RhdHVzLmdldEV4Y2VwdGlvbigpLmdldFN0YWNrVHJhY2UoKSk7Ci0vLwkJCQkJCXN0YWNrVHJhY2UuYWRkQWxsKGxvZ2dlZE1lc3NhZ2VUcmFjZSk7Ci0vLwkJCQkJfQotLy8JCQkJfQotLy8JCQl9Ci0vLwkJCQotLy8JCQkvL2RlYWwgd2l0aCBtYWtpbmcgYSBuZXcgZm9ybWF0ZWQgZmFpbHVyZSBhbmQgYWRkZWQgaXQgdG8gdGhlIHJlc3VsdAotLy8JCQlTdHJpbmcgbWVzc2FnZSA9ICIiOwotLy8JCQlTdHJpbmcgd2FybmluZ3NNZXNzYWdlID0gIlRlc3QgaGFkICIgKyB3YXJuaW5ncy5zaXplKCkgKyAiIHdhcm5pbmdzIG9jY3VyIjsKLS8vCQkJU3RyaW5nIGxvZ2dlZFN0YXR1c2VzTWVzc2FnZSA9ICJUZXN0IGxvZ2dlZCAiICsgbG9nZ2VkU3RhdHVzZXMuc2l6ZSgpICsgIiBzdGF0dXNlcyI7Ci0vLwkJCWlmKGhhZEVycm9yIHx8IGhhZEZhaWx1cmUpIHsKLS8vCQkJCW1lc3NhZ2UgPSBlcnJvck9yRmFpbHVyZS5leGNlcHRpb25NZXNzYWdlKCk7Ci0vLwkJCQkKLS8vCQkJCWlmKGhhZFdhcm5pbmdzKSB7Ci0vLwkJCQkJbWVzc2FnZSArPSAiICAoIiArIHdhcm5pbmdzTWVzc2FnZSArICIpIjsKLS8vCQkJCX0KLS8vCQkJCQotLy8JCQkJaWYoaGFkTG9nZ2VkU3RhdHVzZXMgJiYgZkZhaWxPbkxvZ2dlZFN0YXR1cykgewotLy8JCQkJCW1lc3NhZ2UgKz0gIiAgKCIgKyBsb2dnZWRTdGF0dXNlc01lc3NhZ2UgKyAiKSI7Ci0vLwkJCQl9Ci0vLwkJCX0gZWxzZSBpZihoYWRXYXJuaW5ncykgewotLy8JCQkJbWVzc2FnZSA9IHdhcm5pbmdzTWVzc2FnZTsKLS8vCQkJCQotLy8JCQkJaWYoaGFkTG9nZ2VkU3RhdHVzZXMgJiYgZkZhaWxPbkxvZ2dlZFN0YXR1cykgewotLy8JCQkJCW1lc3NhZ2UgKz0gIiAgKCIgKyBsb2dnZWRTdGF0dXNlc01lc3NhZ2UgKyAiKSI7Ci0vLwkJCQl9Ci0vLwkJCX0gZWxzZSBpZihoYWRMb2dnZWRTdGF0dXNlcyAmJiBmRmFpbE9uTG9nZ2VkU3RhdHVzKSB7Ci0vLwkJCQltZXNzYWdlID0gbG9nZ2VkU3RhdHVzZXNNZXNzYWdlOwotLy8JCQl9Ci0vLwkJCQotLy8JCQlpZihoYWRFcnJvciB8fCBoYWRGYWlsdXJlIHx8IGhhZFdhcm5pbmdzIHx8IChoYWRMb2dnZWRTdGF0dXNlcyAmJiBmRmFpbE9uTG9nZ2VkU3RhdHVzKSkgewotLy8JCQkJQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZXJyb3IgPSBuZXcgQXNzZXJ0aW9uRmFpbGVkRXJyb3IobWVzc2FnZSk7Ci0vLwkJCQlTdGFja1RyYWNlRWxlbWVudFtdIHN0YWNrVHJhY2VBcnJheSA9IHN0YWNrVHJhY2UudG9BcnJheShuZXcgU3RhY2tUcmFjZUVsZW1lbnRbc3RhY2tUcmFjZS5zaXplKCldKTsKLS8vCQkJCWVycm9yLnNldFN0YWNrVHJhY2Uoc3RhY2tUcmFjZUFycmF5KTsKLS8vCi0vLwkJCQlpZihoYWRFcnJvcikgewotLy8JCQkJCXJlc3VsdC5hZGRFcnJvcih0aGlzLCBlcnJvcik7Ci0vLwkJCQl9IGVsc2UgewotLy8JCQkJCXJlc3VsdC5hZGRGYWlsdXJlKHRoaXMsIGVycm9yKTsKLS8vCQkJCX0KLS8vCQkJfQotLy8KLS8vCi0vLwkJfQotLy8JfQotCQotCXByaXZhdGUgU3RyaW5nIHN0YXR1c1R5cGVUb1N0cmluZyhpbnQgc3RhdHVzVHlwZSkgewotCQlTdHJpbmcgc1N0YXR1c1R5cGUgPSAiIjsKLQkJc3dpdGNoIChzdGF0dXNUeXBlKSB7Ci0JCQljYXNlIElTdGF0dXMuRVJST1IgOgotCQkJCXNTdGF0dXNUeXBlID0gIkVSUk9SIjsKLQkJCQlicmVhazsKLQkJCWNhc2UgSVN0YXR1cy5DQU5DRUwgOgotCQkJCXNTdGF0dXNUeXBlID0gIkNBTkNFTCI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElTdGF0dXMuV0FSTklORyA6IAotCQkJCXNTdGF0dXNUeXBlID0gIldBUk5JTkciOwotCQkJCWJyZWFrOwotCQl9Ci0JCQotCQlyZXR1cm4gc1N0YXR1c1R5cGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9jb21tb250ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL0NvbW1vblRlc3RzUGx1Z2luLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2NvbW1vbnRlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvQ29tbW9uVGVzdHNQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RhZjZjZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2NvbW1vbnRlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvQ29tbW9uVGVzdHNQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIE5vdiAzLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbHVnaW5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqLwotcHVibGljIGNsYXNzIENvbW1vblRlc3RzUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cyI7Ci0JcHVibGljIHN0YXRpYyBDb21tb25UZXN0c1BsdWdpbiBpbnN0YW5jZSA9IG51bGw7Ci0JcHVibGljIElFeHRlbnNpb25Qb2ludCBkYXRhTW9kZWxWZXJpZmllckV4dCA9IG51bGw7Ci0JCi0JLyoqCi0JICogQHBhcmFtIGRlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgQ29tbW9uVGVzdHNQbHVnaW4oSVBsdWdpbkRlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlzdXBlcihkZXNjcmlwdG9yKTsKLQkJaW5zdGFuY2UgPSB0aGlzOwotCQlkYXRhTW9kZWxWZXJpZmllckV4dCA9IGRlc2NyaXB0b3IuZ2V0RXh0ZW5zaW9uUG9pbnQoIkRhdGFNb2RlbFZlcmlmaWVyIik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2NvbW1vbnRlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvRGF0YU1vZGVsVmVyaWZpZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvY29tbW9udGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy9EYXRhTW9kZWxWZXJpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDAzZDUzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvY29tbW9udGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy9EYXRhTW9kZWxWZXJpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gSmFuIDUsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotLyoqCi0gKiBAYXV0aG9yIEFkbWluaXN0cmF0b3IKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBEYXRhTW9kZWxWZXJpZmllciB7Ci0KLSAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoSURhdGFNb2RlbCBtb2RlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7ICAgICAgCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9jb21tb250ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL0RhdGFNb2RlbFZlcmlmaWVyRmFjdG9yeS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9jb21tb250ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL0RhdGFNb2RlbFZlcmlmaWVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWI2NTAxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvY29tbW9udGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy9EYXRhTW9kZWxWZXJpZmllckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBKYW4gNSwgMjAwNAotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi0vKioKLSAqIEBhdXRob3IgQWRtaW5pc3RyYXRvcgotICogQGF1dGhvciBJYW4gVGV3a3NidXJ5IChpY3Rld2tzYkB1cy5pYm0uY29tKQotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0KLSAqIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBEYXRhTW9kZWxWZXJpZmllckZhY3RvcnkgZXh0ZW5kcyBSZWdpc3RyeVJlYWRlcnsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfTU9ERUxfVkVSSUZJRVJfTElTVF9FWFQgPSAiZGF0YU1vZGVsVmVyaWZpZXJMaXN0IjsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIExJU1RfQ0xBU1MgPSAibGlzdENsYXNzIjsKLQlwcml2YXRlIE1hcCBkYXRhTW9kZWxWZXJpZmllcnNNYXAgPSBudWxsOwotCXByaXZhdGUgc3RhdGljIERhdGFNb2RlbFZlcmlmaWVyRmFjdG9yeSBpbnN0YW5jZSA9IG51bGw7Ci0JcHJpdmF0ZSBEYXRhTW9kZWxWZXJpZmllciBkZWZhdWx0RGF0YU1vZGVsVmVyaWZpZXIgPSBuZXcgRGF0YU1vZGVsVmVyaWZpZXIoKTsKLQkKLQlwdWJsaWMgRGF0YU1vZGVsVmVyaWZpZXJGYWN0b3J5KCkgewotCQlzdXBlcihDb21tb25UZXN0c1BsdWdpbi5QTFVHSU5fSUQsICJEYXRhTW9kZWxWZXJpZmllciIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBEYXRhTW9kZWxWZXJpZmllckZhY3RvcnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKXsKLQkJCWluc3RhbmNlID0gbmV3IERhdGFNb2RlbFZlcmlmaWVyRmFjdG9yeSgpOwotCQkJaW5zdGFuY2UucmVhZFJlZ2lzdHJ5KCk7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5SZWdpc3RyeVJlYWRlciNyZWFkRWxlbWVudChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmICghZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKERBVEFfTU9ERUxfVkVSSUZJRVJfTElTVF9FWFQpKQotCQkJcmV0dXJuIGZhbHNlOwotCQl0cnkgewotCQkJRGF0YU1vZGVsVmVyaWZpZXJMaXN0IGxpc3QgPSAoRGF0YU1vZGVsVmVyaWZpZXJMaXN0KWVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihMSVNUX0NMQVNTKTsKLQkJCWFkZFRvRGF0YU1vZGVsVmVyaWZpZXJzTWFwKGxpc3QuZ2V0RGF0YU1vZGVsVmVyaWZpZXJzKCkpOwotCQl9Ci0JCWNhdGNoKENvcmVFeGNlcHRpb24gZSl7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCi0JfQotCQotCXB1YmxpYyB2b2lkIGFkZFRvRGF0YU1vZGVsVmVyaWZpZXJzTWFwKE1hcCBkYXRhTW9kZWxWZXJpZmllcnMpewotCQlpZiAoZGF0YU1vZGVsVmVyaWZpZXJzTWFwID09IG51bGwpCi0JCQlkYXRhTW9kZWxWZXJpZmllcnNNYXAgPSBpbml0RGF0YU1vZGVsVmVyaWZpZXJzTWFwKCk7Ci0JCWRhdGFNb2RlbFZlcmlmaWVyc01hcC5wdXRBbGwoZGF0YU1vZGVsVmVyaWZpZXJzKTsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBkYXRhTW9kZWxWZXJpZmllcnNNYXAuCi0JICovCi0JcHVibGljIE1hcCBnZXREYXRhTW9kZWxWZXJpZmllcnNNYXAoKSB7Ci0JCWlmIChkYXRhTW9kZWxWZXJpZmllcnNNYXAgPT0gbnVsbCkgewotCQkJZGF0YU1vZGVsVmVyaWZpZXJzTWFwID0gaW5pdERhdGFNb2RlbFZlcmlmaWVyc01hcCgpOwotCQl9Ci0JCXJldHVybiBkYXRhTW9kZWxWZXJpZmllcnNNYXA7Ci0JfQotCi0JcHJvdGVjdGVkIE1hcCBpbml0RGF0YU1vZGVsVmVyaWZpZXJzTWFwKCkgewotCQlyZXR1cm4gbmV3IEhhc2hNYXAoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGRlZmF1bHREYXRhTW9kZWxWZXJpZmllci4KLQkgKi8KLQlwcm90ZWN0ZWQgRGF0YU1vZGVsVmVyaWZpZXIgZ2V0RGVmYXVsdERhdGFNb2RlbFZlcmlmaWVyKCkgewotCQlyZXR1cm4gZGVmYXVsdERhdGFNb2RlbFZlcmlmaWVyOwotCX0KLQkKLQkgIC8qcHJpdmF0ZSB2b2lkIGxvYWRDb25maWd1cmF0aW9uKCkgewotICAgICAgICAvL1Rlc3RDb2xsZWN0b3JQbHVnaW4gcGx1Z2luID0gVGVzdENvbGxlY3RvclBsdWdpbi5pbnN0YW5jZTsKLQkgIAlDb21tb25UZXN0c1BsdWdpbiBwbHVnaW4gPSBDb21tb25UZXN0c1BsdWdpbi5pbnN0YW5jZTsKLSAgICAgICAgSUV4dGVuc2lvbltdIGRhdGFNb2RlbFZlcmlmaWVyRXh0cyA9IHBsdWdpbi5kYXRhTW9kZWxWZXJpZmllckV4dC5nZXRFeHRlbnNpb25zKCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhTW9kZWxWZXJpZmllckV4dHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIElFeHRlbnNpb24gZXh0ZW5zaW9uID0gZGF0YU1vZGVsVmVyaWZpZXJFeHRzW2ldOwotICAgICAgICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZmFjdG9yaWVzID0gZXh0ZW5zaW9uLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBmYWN0b3JpZXMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA9IGZhY3Rvcmllc1tqXTsKLSAgICAgICAgICAgICAgICAgICAgRGF0YU1vZGVsVmVyaWZpZXJMaXN0IGxpc3QgPSAoRGF0YU1vZGVsVmVyaWZpZXJMaXN0KWVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigibGlzdENsYXNzIik7Ci0gICAgICAgICAgICAgICAgICAgIC8vQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSAoQ2xhc3NMb2FkZXIpIGV4dGVuc2lvbi5nZXREZWNsYXJpbmdQbHVnaW5EZXNjcmlwdG9yKCkuZ2V0UGx1Z2luQ2xhc3NMb2FkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgLy9EYXRhTW9kZWxWZXJpZmllckxpc3QgbGlzdCA9IChEYXRhTW9kZWxWZXJpZmllckxpc3QpIGNsYXNzTG9hZGVyLmxvYWRDbGFzcyhmYWN0b3J5Q2xhc3MpLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFRvRGF0YU1vZGVsVmVyaWZpZXJzTWFwKGxpc3QuZ2V0RGF0YU1vZGVsVmVyaWZpZXJzKCkpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSovCi0JCi0JcHVibGljIERhdGFNb2RlbFZlcmlmaWVyIGNyZWF0ZVZlcmlmaWVyKElEYXRhTW9kZWwgbW9kZWwpICB7Ci0JCURhdGFNb2RlbFZlcmlmaWVyIHZlcmlmaWVyID0gZ2V0RGVmYXVsdERhdGFNb2RlbFZlcmlmaWVyKCk7Ci0JCQotCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJT2JqZWN0IHZlcmlmaWVyT2JqZWN0ID0gZ2V0RGF0YU1vZGVsVmVyaWZpZXJzTWFwKCkuZ2V0KG1vZGVsLmdldElEKCkpOwotCQkJaWYodmVyaWZpZXJPYmplY3QgIT0gbnVsbCl7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYodmVyaWZpZXJPYmplY3QgaW5zdGFuY2VvZiBDbGFzcyl7Ci0JCQkJCQlyZXR1cm4gKERhdGFNb2RlbFZlcmlmaWVyKSgoQ2xhc3MpdmVyaWZpZXJPYmplY3QpLm5ld0luc3RhbmNlKCk7Ci0JCQkJCX0gZWxzZSBpZih2ZXJpZmllck9iamVjdCBpbnN0YW5jZW9mIFN0cmluZyl7Ci0JCQkJCQlDbGFzcyB2ZXJpZmllckNsYXNzID0gQ2xhc3MuZm9yTmFtZSgoU3RyaW5nKXZlcmlmaWVyT2JqZWN0KTsKLQkJCQkJCXZlcmlmaWVyID0gKERhdGFNb2RlbFZlcmlmaWVyKSB2ZXJpZmllckNsYXNzLm5ld0luc3RhbmNlKCk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeyAKLQkJCQkJdmVyaWZpZXIgPSBnZXREZWZhdWx0RGF0YU1vZGVsVmVyaWZpZXIoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHZlcmlmaWVyOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2NvbW1vbnRlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvRGF0YU1vZGVsVmVyaWZpZXJMaXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2NvbW1vbnRlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvRGF0YU1vZGVsVmVyaWZpZXJMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzODY1ODguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9jb21tb250ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL0RhdGFNb2RlbFZlcmlmaWVyTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIGV0ZXJhdGlvbgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGF0YU1vZGVsVmVyaWZpZXJMaXN0IHsKLQkKLQlwdWJsaWMgYWJzdHJhY3QgTWFwIGdldERhdGFNb2RlbFZlcmlmaWVycygpOwotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2NvbW1vbnRlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvSlVuaXRMb2dMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9jb21tb250ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL0pVbml0TG9nTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IzZjlmMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2NvbW1vbnRlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvSlVuaXRMb2dMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUxvZ0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotCi0vKioKLSAqIEBhdXRob3IgaXRld2sKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBKVW5pdExvZ0xpc3RlbmVyIGltcGxlbWVudHMgSUxvZ0xpc3RlbmVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSlVuaXRMb2dMaXN0ZW5lciBJTlNUQU5DRSA9IG5ldyBKVW5pdExvZ0xpc3RlbmVyKCk7Ci0JcHJpdmF0ZSBIYXNoTWFwPElTdGF0dXMsIFN0cmluZz4gbG9nZ2VkU3RhdHVzZXMgPSBuZXcgSGFzaE1hcDxJU3RhdHVzLCBTdHJpbmc+KCk7Ci0JCi0JcHJpdmF0ZSBKVW5pdExvZ0xpc3RlbmVyKCkgewotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUxvZ0xpc3RlbmVyI2xvZ2dpbmcob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgbG9nZ2luZyhJU3RhdHVzIHN0YXR1cywgU3RyaW5nIHBsdWdpbikgewotCQlpbnQgc2V2ZXJpdHkgPSBzdGF0dXMuZ2V0U2V2ZXJpdHkoKTsKLQkJaWYoc2V2ZXJpdHkgPT0gSVN0YXR1cy5DQU5DRUwgfHwgc2V2ZXJpdHkgPT0gSVN0YXR1cy5FUlJPUiB8fCBzZXZlcml0eSA9PSBJU3RhdHVzLldBUk5JTkcpIHsKLQkJCWxvZ2dlZFN0YXR1c2VzLnB1dChzdGF0dXMsIHBsdWdpbik7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0aGUgY3VycmVudCBsaXN0IG9mIGxvZ2dlZCBzdGF0dXNlcywgY2xlYXJzIGxpc3QgYWZ0ZXIgcmV0dXJuLgotCSAqLwotCXB1YmxpYyBIYXNoTWFwPElTdGF0dXMsU3RyaW5nPiBnZXRMb2dnZWRTdGF0dXNlcygpIHsKLQkJSGFzaE1hcDxJU3RhdHVzLFN0cmluZz4gcmV0dXJuU3RhdHVzZXMgPSBuZXcgSGFzaE1hcDxJU3RhdHVzLFN0cmluZz4obG9nZ2VkU3RhdHVzZXMpOwotCQlsb2dnZWRTdGF0dXNlcy5jbGVhcigpOwotCQlyZXR1cm4gcmV0dXJuU3RhdHVzZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9jb21tb250ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL0xvZ1V0aWxpdHkuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvY29tbW9udGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy9Mb2dVdGlsaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzZDAyOGUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9jb21tb250ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL0xvZ1V0aWxpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEp1biAzMCwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklMb2dMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2dVdGlsaXR5IGltcGxlbWVudHMgSUxvZ0xpc3RlbmVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIExvZ1V0aWxpdHkgaW5zdGFuY2UgPSBuZXcgTG9nVXRpbGl0eSgpOwotICAgIHByaXZhdGUgQXJyYXlMaXN0IGxvZ2dlZE1lc3NhZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHByaXZhdGUgYm9vbGVhbiBsb2dnaW5nID0gZmFsc2U7Ci0KLSAgICBwcml2YXRlIExvZ1V0aWxpdHkoKSB7Ci0gICAgICAgIHJlZ2lzdGVyUGx1Z2lucygpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCByZWdpc3RlclBsdWdpbnMoKSB7Ci0vLyAgICAgIFRPRE8gRENCIERpc2FibGUgZm9yIG5vdyBkdWUgdG8gb3RoZXIgcGx1Z2lucyBmYWlsaW5nLgotLy8gICAgICAgIElQbHVnaW5SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldFBsdWdpblJlZ2lzdHJ5KCk7Ci0vLyAgICAgICAgSVBsdWdpbkRlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IHJlZ2lzdHJ5LmdldFBsdWdpbkRlc2NyaXB0b3JzKCk7Ci0vLyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotLy8gICAgICAgICAgICB0cnkgewotLy8gICAgICAgICAgICAgICAgUGx1Z2luIHBsdWdpbiA9IGRlc2NyaXB0b3JzW2ldLmdldFBsdWdpbigpOwotLy8gICAgICAgICAgICAgICAgSUxvZyBsb2cgPSBwbHVnaW4uZ2V0TG9nKCk7Ci0vLyAgICAgICAgICAgICAgICBsb2cuYWRkTG9nTGlzdGVuZXIodGhpcyk7Ci0vLyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0vLyAgICAgICAgICAgIH0KLS8vICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBMb2dVdGlsaXR5IGdldEluc3RhbmNlKCkgewotICAgICAgICByZXR1cm4gaW5zdGFuY2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xlYXJMb2dzKCkgewotICAgICAgICBsb2dnZWRNZXNzYWdlcy5jbGVhcigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlc2V0TG9nZ2luZygpIHsKLSAgICAgICAgc3RvcExvZ2dpbmcoKTsKLSAgICAgICAgY2xlYXJMb2dzKCk7Ci0gICAgICAgIHN0YXJ0TG9nZ2luZygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0TG9nZ2luZygpIHsKLSAgICAgICAgbG9nZ2luZyA9IHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RvcExvZ2dpbmcoKSB7Ci0gICAgICAgIGxvZ2dpbmcgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2ZXJpZnlOb1dhcm5pbmdzKCkgewotICAgIAkvL1RPRE8gRENCIERpc2FibGUgZm9yIG5vdyBkdWUgdG8gb3RoZXIgcGx1Z2lucyBmYWlsaW5nLgotLy8gICAgICAgIFN0cmluZyB3YXJuaW5ncyA9ICIiOwotLy8gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbG9nZ2VkTWVzc2FnZXMuc2l6ZSgpOyBpKyspIHsKLS8vICAgICAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSAoSVN0YXR1cykgbG9nZ2VkTWVzc2FnZXMuZ2V0KGkpOwotLy8gICAgICAgICAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5XQVJOSU5HIHx8IHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpIHsKLS8vICAgICAgICAgICAgICAgIHdhcm5pbmdzICs9ICJcbkxvZ1V0aWxpdHk6ICIgKyAoKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuV0FSTklORykgPyAiV0FSTklORyAiIDogIkVSUk9SICIpOwotLy8gICAgICAgICAgICAgICAgd2FybmluZ3MgKz0gIlxuRnJvbSBwbHVnaW46ICIgKyAoKG51bGwgIT0gc3RhdHVzLmdldFBsdWdpbigpKSA/IHN0YXR1cy5nZXRQbHVnaW4oKSA6ICJudWxsIik7Ci0vLyAgICAgICAgICAgICAgICB3YXJuaW5ncyArPSAiXG5NZXNzYWdlOiAiICsgKChudWxsICE9IHN0YXR1cy5nZXRNZXNzYWdlKCkpID8gc3RhdHVzLmdldE1lc3NhZ2UoKSA6ICJudWxsIik7Ci0vLyAgICAgICAgICAgICAgICB3YXJuaW5ncyArPSAiXG5TdGFjazpcbiI7Ci0vLyAgICAgICAgICAgICAgICB0cnkgewotLy8gICAgICAgICAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0vLyAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmdldEV4Y2VwdGlvbigpLnByaW50U3RhY2tUcmFjZShuZXcgUHJpbnRTdHJlYW0ob3V0cHV0U3RyZWFtKSk7Ci0vLyAgICAgICAgICAgICAgICAgICAgd2FybmluZ3MgKz0gb3V0cHV0U3RyZWFtLnRvU3RyaW5nKCk7Ci0vLyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotLy8gICAgICAgICAgICAgICAgICAgIHdhcm5pbmdzICs9ICIgU3RhY2sgbm90IGF2YWlsYWJsZSI7Ci0vLyAgICAgICAgICAgICAgICB9Ci0vLwotLy8gICAgICAgICAgICB9Ci0vLyAgICAgICAgfQotLy8gICAgICAgIGlmICghd2FybmluZ3MuZXF1YWxzKCIiKSkgewotLy8gICAgICAgICAgICBBc3NlcnQuZmFpbCh3YXJuaW5ncyk7Ci0vLyAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGxvZ2dpbmcoSVN0YXR1cyBzdGF0dXMsIFN0cmluZyBwbHVnaW4pIHsKLSAgICAgICAgaWYgKGxvZ2dpbmcpIHsKLSAgICAgICAgICAgIGxvZ2dlZE1lc3NhZ2VzLmFkZChzdGF0dXMpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9jb21tb250ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL09wZXJhdGlvblRlc3RDYXNlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2NvbW1vbnRlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvT3BlcmF0aW9uVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ1ODM0OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2NvbW1vbnRlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvT3BlcmF0aW9uVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NSArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBOb3YgNiwgMjAwMwotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZAotICogQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC5JV29ya3NwYWNlUnVubmFibGVXaXRoU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLlZhbGlkYXRpb25CdWlsZGVyOwotCi0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqIEBhdXRob3IgaXRld2sKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE9wZXJhdGlvblRlc3RDYXNlIGV4dGVuZHMgQmFzZVRlc3RDYXNlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRPUl9KT0JfRkFNSUxZID0gInZhbGlkYXRvcnMiOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpbGVTZXAgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImZpbGUuc2VwYXJhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgT0tfU1RBVFVTID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCAib3JnLmVjbGlwc2UuamVtLnV0aWwiLCAwLCAiT0siLCBudWxsKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdHJ5eyAKLQkJCWRlbGV0ZUFsbFByb2plY3RzKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlSZW5kZXJlckZhY3RvcnkuZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpLnNldFZhbGlkYXRpbmcoZmFsc2UpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVBbGxQcm9qZWN0cygpIHsKLQkJdHJ5IHsKLQkJCXdhaXRPbkpvYnMoKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZTEpIHsKLQkJCQotCQl9Ci0JCUlXb3Jrc3BhY2VSdW5uYWJsZVdpdGhTdGF0dXMgd29ya3NwYWNlUnVubmFibGUgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlV2l0aFN0YXR1cyhudWxsKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCXRyeSB7Ci0JCQkJCVByb2plY3RVdGlsaXR5LmRlbGV0ZUFsbFByb2plY3RzKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCXRyeSB7Ci0JCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKHdvcmtzcGFjZVJ1bm5hYmxlLCBudWxsKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkKLQkJfQotCX0KLQotCXB1YmxpYyBPcGVyYXRpb25UZXN0Q2FzZSgpIHsKLQkJc3VwZXIoIk9wZXJhdGlvbnNUZXN0Q2FzZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIE9wZXJhdGlvblRlc3RDYXNlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBydW5BbmRWZXJpZnkoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHRocm93cyBFeGNlcHRpb24gewotCQlPcGVyYXRpb25UZXN0Q2FzZS5ydW5BbmRWZXJpZnkoZGF0YU1vZGVsLCB0cnVlLCB0cnVlKTsKLQl9Ci0JcHVibGljIHN0YXRpYyB2b2lkIHJ1bkRhdGFNb2RlbChJRGF0YU1vZGVsIGRhdGFNb2RlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9wZXJhdGlvblRlc3RDYXNlLnJ1bkRhdGFNb2RlbChkYXRhTW9kZWwsIHRydWUsIHRydWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBydW5EYXRhTW9kZWwoSURhdGFNb2RlbCBkYXRhTW9kZWwsIGJvb2xlYW4gY2hlY2tUYXNrcywgYm9vbGVhbiBjaGVja0xvZykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9wZXJhdGlvblRlc3RDYXNlLnJ1bkRhdGFNb2RlbChkYXRhTW9kZWwsIGNoZWNrVGFza3MsIGNoZWNrTG9nLCBudWxsLCB0cnVlLCBmYWxzZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJ1bkFuZFZlcmlmeShJRGF0YU1vZGVsIGRhdGFNb2RlbCwgYm9vbGVhbiBjaGVja1Rhc2tzLCBib29sZWFuIGNoZWNrTG9nKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcnVuQW5kVmVyaWZ5KGRhdGFNb2RlbCwgY2hlY2tUYXNrcywgY2hlY2tMb2csIG51bGwsIHRydWUsIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcnVuQW5kVmVyaWZ5KElEYXRhTW9kZWwgZGF0YU1vZGVsLCBib29sZWFuIGNoZWNrVGFza3MsIGJvb2xlYW4gY2hlY2tMb2csIGJvb2xlYW4gd2FpdEZvckJ1aWxkVG9Db21wbGV0ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJ1bkFuZFZlcmlmeShkYXRhTW9kZWwsIGNoZWNrVGFza3MsIGNoZWNrTG9nLCBudWxsLCB0cnVlLCB3YWl0Rm9yQnVpbGRUb0NvbXBsZXRlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcnVuQW5kVmVyaWZ5KElEYXRhTW9kZWwgZGF0YU1vZGVsLCBib29sZWFuIGNoZWNrVGFza3MsIGJvb2xlYW4gY2hlY2tMb2csIExpc3QgZXJyb3JPS0xpc3QsIGJvb2xlYW4gcmVwb3J0SWZFeHBlY3RlZEVycm9yTm90Rm91bmQpIHRocm93cyBFeGNlcHRpb24gewotCQlydW5BbmRWZXJpZnkoZGF0YU1vZGVsLCBjaGVja1Rhc2tzLCBjaGVja0xvZywgZXJyb3JPS0xpc3QsIHJlcG9ydElmRXhwZWN0ZWRFcnJvck5vdEZvdW5kLCBmYWxzZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJ1bkFuZFZlcmlmeShJRGF0YU1vZGVsIGRhdGFNb2RlbCwgYm9vbGVhbiBjaGVja1Rhc2tzLCBib29sZWFuIGNoZWNrTG9nLCBMaXN0IGVycm9yT0tMaXN0LCBib29sZWFuIHJlcG9ydElmRXhwZWN0ZWRFcnJvck5vdEZvdW5kLCBib29sZWFuIHdhaXRGb3JCdWlsZFRvQ29tcGxldGUpIHRocm93cyBFeGNlcHRpb24gewotCQlydW5BbmRWZXJpZnkoZGF0YU1vZGVsLCBjaGVja1Rhc2tzLCBjaGVja0xvZywgZXJyb3JPS0xpc3QsIHJlcG9ydElmRXhwZWN0ZWRFcnJvck5vdEZvdW5kLCB3YWl0Rm9yQnVpbGRUb0NvbXBsZXRlLCBmYWxzZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBydW5EYXRhTW9kZWwoSURhdGFNb2RlbCBkYXRhTW9kZWwsIGJvb2xlYW4gY2hlY2tUYXNrcywgYm9vbGVhbiBjaGVja0xvZywgTGlzdCBlcnJvck9LTGlzdCwgYm9vbGVhbiByZXBvcnRJZkV4cGVjdGVkRXJyb3JOb3RGb3VuZCwgYm9vbGVhbiB3YWl0Rm9yQnVpbGRUb0NvbXBsZXRlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcnVuRGF0YU1vZGVsKGRhdGFNb2RlbCwgY2hlY2tUYXNrcywgY2hlY2tMb2csIGVycm9yT0tMaXN0LCByZXBvcnRJZkV4cGVjdGVkRXJyb3JOb3RGb3VuZCwgd2FpdEZvckJ1aWxkVG9Db21wbGV0ZSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEd1YXJhbnRlZWQgdG8gY2xvc2UgdGhlIGRhdGFNb2RlbAotCSAqIAotCSAqIEBwYXJhbSBkYXRhTW9kZWwKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBydW5BbmRWZXJpZnkoSURhdGFNb2RlbCBkYXRhTW9kZWwsIGJvb2xlYW4gY2hlY2tUYXNrcywgYm9vbGVhbiBjaGVja0xvZywgTGlzdCBlcnJvck9LTGlzdCwgYm9vbGVhbiByZXBvcnRJZkV4cGVjdGVkRXJyb3JOb3RGb3VuZCwgYm9vbGVhbiB3YWl0Rm9yQnVpbGRUb0NvbXBsZXRlLCBib29sZWFuIHJlbW92ZUFsbFNhbWVUeXBlc09mRXJyb3JzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUG9zdEJ1aWxkTGlzdGVuZXIgbGlzdGVuZXIgPSBudWxsOwotCQlJV29ya3NwYWNlRGVzY3JpcHRpb24gZGVzYyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAod2FpdEZvckJ1aWxkVG9Db21wbGV0ZSkgewotCQkJCWxpc3RlbmVyID0gbmV3IFBvc3RCdWlsZExpc3RlbmVyKCk7Ci0JCQkJZGVzYyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXREZXNjcmlwdGlvbigpOwotCQkJCWRlc2Muc2V0QXV0b0J1aWxkaW5nKGZhbHNlKTsKLQkJCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuc2V0RGVzY3JpcHRpb24oZGVzYyk7Ci0JCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIsIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQlVJTEQpOwotCQkJfQotCQkJCi0JCQkvL2RlYWwgd2l0aCB3ZWF0aGVyIHRvIGZhaWwgb24gbG9nZ2VkIHN0YXR1c2VzIG9yIG5vdAotCQkJQmFzZVRlc3RDYXNlLmZhaWxPbkxvZ2dlZFN0YXR1cyhjaGVja0xvZyk7Ci0JCQkKLQkJCUlTdGF0dXMgb3BlcmF0aW9uU3RhdHVzID0gZGF0YU1vZGVsLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIG51bGwpOwotCQkJCi0JCQlpZiAod2FpdEZvckJ1aWxkVG9Db21wbGV0ZSkgewotCQkJCWRlc2Muc2V0QXV0b0J1aWxkaW5nKHRydWUpOwotCQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5zZXREZXNjcmlwdGlvbihkZXNjKTsKLQkJCQl3aGlsZSAoIWxpc3RlbmVyLmlzQnVpbGRDb21wbGV0ZSgpKSB7Ci0JCQkJCVRocmVhZC5zbGVlcCgzMDAwKTsvLyBkbyBub3RoaW5nIHRpbGwgYWxsIHRoZSBqb2JzIGFyZSBjb21wbGV0ZWQKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8vIGJ1ZyAxNzM5MzMgLSBydW5BbmRWZXJpZnkoKSBmYWlscyB0byBjaGVjayByZXR1cm4gSVN0YXR1cyAKLQkJCWlmIChvcGVyYXRpb25TdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKSB7Ci0JCQkJVGhyb3dhYmxlIHRocm93YWJsZSA9IG9wZXJhdGlvblN0YXR1cy5nZXRFeGNlcHRpb24oKTsKLQkJCQlTdHJpbmcgdGhyb3dhYmxlU3RyID0gbnVsbDsKLQkJCQlpZih0aHJvd2FibGUgIT0gbnVsbCl7Ci0JCQkJCXRocm93YWJsZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJdGhyb3dhYmxlU3RyID0gZ2V0U3RhY2tUcmFjZSh0aHJvd2FibGUpOwotCQkJCX0KLQkJCQlpZih0aHJvd2FibGVTdHIgPT0gbnVsbCl7Ci0JCQkJCXRocm93YWJsZVN0ciA9ICJubyBtZXNzYWdlIjsKLQkJCQl9Ci0JCQkJQXNzZXJ0LmZhaWwob3BlcmF0aW9uU3RhdHVzLmdldE1lc3NhZ2UoKSsiXG4gICAgY2F1c2VkIGJ5OiAiK3Rocm93YWJsZVN0cik7Ci0JCQl9Ci0JCQkKLQkJCS8vcnVuIGRhdGEgbW9kZWwgdmVyaWZpY2F0aW9ucwotCQkJRGF0YU1vZGVsVmVyaWZpZXJGYWN0b3J5IHZlcmlmaWVyRmFjdG9yeSA9IERhdGFNb2RlbFZlcmlmaWVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpOwotCQkJRGF0YU1vZGVsVmVyaWZpZXIgdmVyaWZpZXIgPSB2ZXJpZmllckZhY3RvcnkuY3JlYXRlVmVyaWZpZXIoZGF0YU1vZGVsKTsKLQkJCXZlcmlmaWVyLnZlcmlmeShkYXRhTW9kZWwpOwotCi0JCQlpZiAoY2hlY2tUYXNrcyAmJiAoZXJyb3JPS0xpc3QgPT0gbnVsbCB8fCBlcnJvck9LTGlzdC5pc0VtcHR5KCkpKSB7Ci0JCQkJY2hlY2tUYXNrc0xpc3QoKTsKLQkJCX0gZWxzZSBpZiAoY2hlY2tUYXNrcyAmJiBlcnJvck9LTGlzdCAhPSBudWxsICYmICFlcnJvck9LTGlzdC5pc0VtcHR5KCkpIHsKLQkJCQlUYXNrVmlld1V0aWxpdHkudmVyaWZ5RXJyb3JzKGVycm9yT0tMaXN0LCByZXBvcnRJZkV4cGVjdGVkRXJyb3JOb3RGb3VuZCwgcmVtb3ZlQWxsU2FtZVR5cGVzT2ZFcnJvcnMpOwotCQkJfQotCQkJCi0JCX0gZmluYWxseSB7Ci0JCQlpZiAobGlzdGVuZXIgIT0gbnVsbCkKLQkJCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQlkYXRhTW9kZWwuZGlzcG9zZSgpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0YWNrVHJhY2UoVGhyb3dhYmxlIHRocm93YWJsZSl7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKHRocm93YWJsZS50b1N0cmluZygpKyJcbiIpOwotCQlTdGFja1RyYWNlRWxlbWVudFtdIHN0YWNrID0gdGhyb3dhYmxlLmdldFN0YWNrVHJhY2UoKTsKLQkJZm9yIChpbnQgaT0wOyBpPHN0YWNrLmxlbmd0aDsgaSsrKQotCQkJYnVmZmVyLmFwcGVuZCgiXHRhdCAiICsgc3RhY2tbaV0rIlxuIik7Ci0KLQkJU3RhY2tUcmFjZUVsZW1lbnRbXSBwYXJlbnRTdGFjayA9IHN0YWNrOwotCQl0aHJvd2FibGUgPSB0aHJvd2FibGUuZ2V0Q2F1c2UoKTsKLQkJd2hpbGUgKHRocm93YWJsZSAhPSBudWxsKSB7Ci0JCQlidWZmZXIuYXBwZW5kKCJDYXVzZWQgYnk6ICIpOwotCQkJYnVmZmVyLmFwcGVuZCh0aHJvd2FibGUpOwotCQkJYnVmZmVyLmFwcGVuZCgiXG4iKTsKLQkJCVN0YWNrVHJhY2VFbGVtZW50W10gY3VycmVudFN0YWNrID0gdGhyb3dhYmxlLmdldFN0YWNrVHJhY2UoKTsKLQkJCXBhcmVudFN0YWNrID0gY3VycmVudFN0YWNrOwotCQkJdGhyb3dhYmxlID0gdGhyb3dhYmxlLmdldENhdXNlKCk7Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQkvKioKLQkgKiBHdWFyYW50ZWVkIHRvIGNsb3NlIHRoZSBkYXRhTW9kZWwKLQkgKiAKLQkgKiBAcGFyYW0gZGF0YU1vZGVsCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcnVuRGF0YU1vZGVsKElEYXRhTW9kZWwgZGF0YU1vZGVsLCBib29sZWFuIGNoZWNrVGFza3MsIGJvb2xlYW4gY2hlY2tMb2csIExpc3QgZXJyb3JPS0xpc3QsIGJvb2xlYW4gcmVwb3J0SWZFeHBlY3RlZEVycm9yTm90Rm91bmQsIGJvb2xlYW4gd2FpdEZvckJ1aWxkVG9Db21wbGV0ZSwgYm9vbGVhbiByZW1vdmVBbGxTYW1lVHlwZXNPZkVycm9ycykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVBvc3RCdWlsZExpc3RlbmVyIGxpc3RlbmVyID0gbnVsbDsKLQkJSVdvcmtzcGFjZURlc2NyaXB0aW9uIGRlc2MgPSBudWxsOwotCQl0cnkgewotCQkJaWYgKHdhaXRGb3JCdWlsZFRvQ29tcGxldGUpIHsKLQkJCQlsaXN0ZW5lciA9IG5ldyBQb3N0QnVpbGRMaXN0ZW5lcigpOwotCQkJCWRlc2MgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCQlkZXNjLnNldEF1dG9CdWlsZGluZyhmYWxzZSk7Ci0JCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnNldERlc2NyaXB0aW9uKGRlc2MpOwotCQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyLCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0JVSUxEKTsKLQkJCX0KLQkJCQotCQkJLy9kZWFsIHdpdGggd2VhdGhlciB0byBmYWlsIG9uIGxvZ2dlZCBzdGF0dXNlcyBvciBub3QKLQkJCUJhc2VUZXN0Q2FzZS5mYWlsT25Mb2dnZWRTdGF0dXMoY2hlY2tMb2cpOwotCQkJCi0JCQlkYXRhTW9kZWwuZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgbnVsbCk7Ci0JCQkKLQkJCWlmICh3YWl0Rm9yQnVpbGRUb0NvbXBsZXRlKSB7Ci0JCQkJZGVzYy5zZXRBdXRvQnVpbGRpbmcodHJ1ZSk7Ci0JCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnNldERlc2NyaXB0aW9uKGRlc2MpOwotCQkJCXdoaWxlICghbGlzdGVuZXIuaXNCdWlsZENvbXBsZXRlKCkpIHsKLQkJCQkJVGhyZWFkLnNsZWVwKDMwMDApOy8vIGRvIG5vdGhpbmcgdGlsbCBhbGwgdGhlIGpvYnMgYXJlIGNvbXBsZXRlbGVkCi0JCQkJfQotCQkJfQotCQkJaWYgKGNoZWNrVGFza3MgJiYgKGVycm9yT0tMaXN0ID09IG51bGwgfHwgZXJyb3JPS0xpc3QuaXNFbXB0eSgpKSkgewotCQkJCWNoZWNrVGFza3NMaXN0KCk7Ci0JCQl9IGVsc2UgaWYgKGNoZWNrVGFza3MgJiYgZXJyb3JPS0xpc3QgIT0gbnVsbCAmJiAhZXJyb3JPS0xpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJVGFza1ZpZXdVdGlsaXR5LnZlcmlmeUVycm9ycyhlcnJvck9LTGlzdCwgcmVwb3J0SWZFeHBlY3RlZEVycm9yTm90Rm91bmQsIHJlbW92ZUFsbFNhbWVUeXBlc09mRXJyb3JzKTsKLQkJCX0KLQotCQl9IGZpbmFsbHkgewotCQkJaWYgKGxpc3RlbmVyICE9IG51bGwpCi0JCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQkJZGF0YU1vZGVsLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGNoZWNrVGFza3NMaXN0KCkgewotCQkvL1Rhc2tWaWV3VXRpbGl0eS52ZXJpZnlOb0Vycm9ycygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB2ZXJpZnlWYWxpZERhdGFNb2RlbChJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQlJU3RhdHVzIHN0YXR1cyA9IGRhdGFNb2RlbC52YWxpZGF0ZSgpOwotCi0JCWlmICghc3RhdHVzLmlzT0soKSAmJiBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKSB7Ci0JCQlBc3NlcnQuYXNzZXJ0VHJ1ZSgiRGF0YU1vZGVsIGlzIGludmFsaWQgb3BlcmF0aW9uIHdpbGwgbm90IHJ1bjoiICsgc3RhdHVzLnRvU3RyaW5nKCksIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHZlcmlmeUludmFsaWREYXRhTW9kZWwoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBkYXRhTW9kZWwudmFsaWRhdGUoKTsKLQkJaWYgKHN0YXR1cy5pc09LKCkpIHsKLQkJCUFzc2VydC5hc3NlcnRUcnVlKCJEYXRhTW9kZWwgc2hvdWxkIGJlIGludmFsaWQ6IiArIHN0YXR1cy5nZXRNZXNzYWdlKCksIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JCS8vIFdhaXQgZm9yIGFsbCB2YWxpZGF0aW9uIGpvYnMgdG8gZW5kIGJlZm9yZSBlbmRpbmcgdGVzdC4uLi4KLQkJd2FpdE9uSm9icygpOwotCQkKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgd2FpdE9uSm9icygpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0W10gcHJvamVjdHMgPSBQcm9qZWN0VXRpbGl0eS5nZXRBbGxQcm9qZWN0cygpOwotCQl0cnkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJCUlQcm9qZWN0IHByb2plY3QgPSBwcm9qZWN0c1tpXTsKLQkJCQlKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4ocHJvamVjdC5nZXROYW1lKCkgKyBWQUxJREFUT1JfSk9CX0ZBTUlMWSxudWxsKTsKLQkJCX0KLQkJCUpvYi5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX01BTlVBTF9CVUlMRCxudWxsKTsKLQkJCUpvYi5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsbnVsbCk7Ci0JCQlKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oVmFsaWRhdGlvbkJ1aWxkZXIuRkFNSUxZX1ZBTElEQVRJT05fSk9CLG51bGwpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotCQkJCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2NvbW1vbnRlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvUGxhdGZvcm1Nb2R1bGVVUkxUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2NvbW1vbnRlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvUGxhdGZvcm1Nb2R1bGVVUkxUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjOTdmNmMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9jb21tb250ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL1BsYXRmb3JtTW9kdWxlVVJMVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLlBsYXRmb3JtVVJMTW9kdWxlQ29ubmVjdGlvbjsKLQotcHVibGljIGNsYXNzIFBsYXRmb3JtTW9kdWxlVVJMVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyBQbGF0Zm9ybU1vZHVsZVVSTFRlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotICAgIAotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoUGxhdGZvcm1Nb2R1bGVVUkxUZXN0LmNsYXNzKTsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geyAKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgUGxhdGZvcm1VUkxNb2R1bGVDb25uZWN0aW9uLnN0YXJ0dXAoKTsKLSAgICB9Ci0gICAgICAgIAotICAgIC8qKgotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RVUkxSZXNvbHZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKCJwbGF0Zm9ybTovbW9kdWxlOi9NeU1vZHVsZS9NRVRBLUlORi9lamItamFyLnhtbCIpOwotICAgICAgICBVUkxDb25uZWN0aW9uIGNvbnggPSB1cmwub3BlbkNvbm5lY3Rpb24oKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGNvbnguZ2V0VVJMKCkpOwotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9jb21tb250ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL1Bvc3RCdWlsZExpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2NvbW1vbnRlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvUG9zdEJ1aWxkTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNmNDE5Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2NvbW1vbnRlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvUG9zdEJ1aWxkTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotCi0vKioKLSAqIEBhdXRob3IgbmlyYXYKLSAqLwotcHVibGljIGNsYXNzIFBvc3RCdWlsZExpc3RlbmVyIGltcGxlbWVudHMgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgewotICAgIHByaXZhdGUgYm9vbGVhbiBidWlsZENvbXBsZXRlID0gZmFsc2U7Ci0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIjcmVzb3VyY2VDaGFuZ2VkKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotICAgICAgICBpZiAoZXZlbnQuZ2V0VHlwZSgpID09IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQlVJTEQpewotICAgICAgICAgIGJ1aWxkQ29tcGxldGUgPSB0cnVlOyAgCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0J1aWxkQ29tcGxldGUoKSB7Ci0gICAgICAgIHJldHVybiBidWlsZENvbXBsZXRlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGUoKSB7Ci0gICAgICAgIGJ1aWxkQ29tcGxldGUgPSBmYWxzZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2NvbW1vbnRlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvUHJvamVjdFV0aWxpdHkuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvY29tbW9udGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy9Qcm9qZWN0VXRpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGZlYmVhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvY29tbW9udGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy9Qcm9qZWN0VXRpbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0czsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICogCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBlZGl0IHRoZSB0ZW1wbGF0ZSB2YXJpYWJsZSAidHlwZWNvbW1lbnQiOiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5UZW1wbGF0ZXMuIFRvCi0gKiBlbmFibGUgYW5kIGRpc2FibGUgdGhlIGNyZWF0aW9uIG9mIHR5cGUgY29tbWVudHMgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgUHJvamVjdFV0aWxpdHkgewotICAgIHB1YmxpYyBzdGF0aWMgSVByb2plY3RbXSBnZXRBbGxQcm9qZWN0cygpIHsKLSAgICAJSVByb2plY3RbXSBwcm9qZWN0cyA9IG5ldyBJUHJvamVjdFswXTsKLSAgICAJdHJ5IHsKLSAgICAgICAgcHJvamVjdHMgPSAgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOwotICAgIAl9IGNhdGNoIChBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24gZXgpIHsKLSAgICAJCS8vIENhdGNoIE1hbGZvcm1lZCB0cmVlIGV4Y2VwdGlvbiB0aGF0IG9jY3VycyBmcm9tIHRpbWUgdG8gdGltZS4uLgotICAgIAl9Ci0gICAgCXJldHVybiBwcm9qZWN0czsKLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHByb2plY3RFeGlzdHMoU3RyaW5nIHByb2plY3ROYW1lKSB7Ci0gICAgICAgIHJldHVybiBnZXRQcm9qZWN0KHByb2plY3ROYW1lKSAhPSBudWxsOwotICAgIH0KLSAgICBwdWJsaWMgc3RhdGljIElQcm9qZWN0IHZlcmlmeUFuZFJldHVyblByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lLCBib29sZWFuIGV4aXN0cykgewotICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0gICAgICAgIGlmIChleGlzdHMpIHsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJQcm9qZWN0IERvZXMgTm90IEV4aXN0OiIgKyBwcm9qZWN0TmFtZSwgcHJvamVjdC5leGlzdHMoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiUHJvamVjdCBFeGlzdHM6IiArIHByb2plY3ROYW1lLCAhcHJvamVjdC5leGlzdHMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHByb2plY3Q7Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2ZXJpZnlQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSwgYm9vbGVhbiBleGlzdHMpIHsKLSAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QocHJvamVjdE5hbWUpOwotICAgICAgICBpZiAoZXhpc3RzKSB7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiUHJvamVjdCBEb2VzIE5vdCBFeGlzdDoiICsgcHJvamVjdE5hbWUsIHByb2plY3QuZXhpc3RzKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIlByb2plY3QgRXhpc3RzOiIgKyBwcm9qZWN0TmFtZSwgIXByb2plY3QuZXhpc3RzKCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMgSVByb2plY3QgZ2V0UHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUpIHsKLSAgICAgICAgSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0gICAgICAgIFN0cmluZyBwYXRoU3RyaW5nID0gcHJvamVjdE5hbWU7Ci0gICAgICAgIGlmICghKHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0UHJvamVjdChwYXRoU3RyaW5nKSA9PSBudWxsKSkKLSAgICAgICAgICAgIHJldHVybiB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldFByb2plY3QocGF0aFN0cmluZyk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmVyaWZ5Tm9Qcm9qZWN0cygpIHsKLSAgICAgICAgSVByb2plY3RbXSBwcm9qZWN0cyA9IGdldEFsbFByb2plY3RzKCk7Ci0gICAgICAgIFN0cmluZyBwcm9qZWN0TmFtZXMgPSAiIjsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgcHJvamVjdE5hbWVzICs9ICIgIiArIHByb2plY3RzW2ldLmdldE5hbWUoKTsKLSAgICAgICAgfQotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiQWxsIHByb2plY3RzIG5vdCBkZWxldGVkIiArIHByb2plY3ROYW1lcywgcHJvamVjdHMubGVuZ3RoID09IDApOwotICAgIH0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlUHJvamVjdElmRXhpc3RzKFN0cmluZyBwcm9qZWN0TmFtZSkgewotICAgICAgICBpZiAocHJvamVjdE5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QocHJvamVjdE5hbWUpOwotICAgICAgICBpZiAocHJvamVjdCAhPSBudWxsICYmIHByb2plY3QuaXNBY2Nlc3NpYmxlKCkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcHJvamVjdC5jbG9zZShudWxsKTsKLSAgICAgICAgICAgICAgICBwcm9qZWN0LmRlbGV0ZSh0cnVlLCB0cnVlLCBudWxsKTsKLSAgICAgICAgICAgICAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsIG51bGwpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBBc3NlcnQuZmFpbChlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZUFsbFByb2plY3RzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vY2xvc2luZyBwcm9qZWN0cyBhbmQgdHJlYWQgd29yayBpbiBoZXJlIGlzIGEgaGFjayBiZWNhdXNlIG9mIGEgQmVhbkluZm8gYnVnIGhvbGRpbmcKLSAgICAgICAgLy9vbnRvIGphcnMgbG9hZGVkIGluIGFub3RoZXIgVk0KLSAgICAgICAgCi0vLyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotLy8gICAgICAgICAgICBpZiAocHJvamVjdHNbaV0uZXhpc3RzKCkpIHsKLS8vICAgICAgICAgICAgICAgIHByb2plY3RzW2ldLmNsb3NlKG51bGwpOyAvLyBUaGlzIHNob3VsZCBzaWduYWwgdGhlIGV4dHJhIFZNIHRvIGtpbGwgaXRzZWxmCi0vLyAgICAgICAgICAgIH0KLS8vICAgICAgICB9Ci0gLy8gICAgICAgVGhyZWFkLnlpZWxkKCk7IC8vIGdpdmUgdGhlIFZNIGEgY2hhbmNlIHRvIGRpZQotICAgICAgICBJV29ya3NwYWNlUnVubmFibGUgcnVubmFibGUgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IGdldEFsbFByb2plY3RzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gcHJvamVjdHNbaV07Ci0JCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGZhbHNlOwotCQkJCQlFeGNlcHRpb24gbGFzdEV4Y2VwdGlvbiA9IG51bGw7Ci0JCQkJCS8vIERvbid0IG1ha2UgMl4xMiBpcyBhYm91dCA0IHNlY29uZHMgd2hpY2ggaXMgdGhlIG1heCB3ZQotCQkJCQkvLyB3aWxsIHdhaXQgZm9yIHRoZSBWTSB0byBkaWUKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCAxMyAmJiAhc3VjY2VzczsgaisrKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWlmIChwcm9qZWN0LmV4aXN0cygpKSB7Ci0JCQkJCQkJCXByb2plY3QuZGVsZXRlKHRydWUsIHRydWUsIG51bGwpOwotCQkJCQkJCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsIG51bGwpOwotCQkJCQkJCX0KLQkJCQkJCQlzdWNjZXNzID0gdHJ1ZTsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJbGFzdEV4Y2VwdGlvbiA9IGU7Ci0JCQkJCQkJaWYgKHByb2plY3QuZXhpc3RzKCkpIHsKLQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCXByb2plY3QuY2xvc2UobnVsbCk7Ci0JCQkJCQkJCQlwcm9qZWN0Lm9wZW4obnVsbCk7Ci0JCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlMikgewotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCVRocmVhZC5zbGVlcCgoaW50KSBNYXRoLnBvdygyLCBqKSk7Ci0JCQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZTEpIHsKLQkJCQkJCQl9IC8vIGlmIHRoZSBWTQotCQkJCQkJCQkJCQkJCQkJCS8vIGlzbid0IGRlYWQsCi0JCQkJCQkJCQkJCQkJCQkJLy8gdHJ5IHNsZWVwaW5nCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKCFzdWNjZXNzICYmIGxhc3RFeGNlcHRpb24gIT0gbnVsbCkgewotCQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZygiUHJvYmxlbSB3aGlsZSBkZWxldGluZzogIiArIGxhc3RFeGNlcHRpb24uZ2V0TWVzc2FnZSgpKTsKLQkJCQkJCS8vIEFzc2VydC5mYWlsKCJDYXVnaHQgRXhjZXB0aW9uPSIgKwotCQkJCQkJLy8gbGFzdEV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkgKyAiIHdoZW4gZGVsZXRpbmcKLQkJCQkJCS8vIHByb2plY3Q9IiArIHByb2plY3QuZ2V0TmFtZSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQkJdHJ5IHsKLQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5ydW4ocnVubmFibGUsIG51bGwpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCX0KLSAgICAgICAgLy92ZXJpZnlOb1Byb2plY3RzKCk7Ci0gICAgfQotICAgIC8qKgotCSAqIFJldHVybiB0aGUgYWJzb2x1dGUgcGF0aCBTdHJpbmdzIHRvIHRoZSBmaWxlcyBiYXNlZCBvbiB0aGUgZmlsZVN1ZmZpeCBhbmQKLQkgKiBwYXRoIHdpdGhpbiB0aGUgcGx1Z2luLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogQHBhcmFtIGZpbGVTdWZmaXgKLQkgKiAgICAgICAgICAgIHRoZSBmaWxlIGVuZGluZyB3aXRoIHRoZSAiLiIgaWYgcmVxdWlyZWQgKHRoZSBzdWZmaXggd2lsbCBiZQotCSAqICAgICAgICAgICAgdXNlZCBhcyBpcykKLQkgKiBAcmV0dXJuCi0JICovCi0gICAgcHVibGljIHN0YXRpYyBMaXN0IGdldFNwZWNpZmljRmlsZXNJbkRpcmVjdG9yeShQbHVnaW4gcGx1Z2luLCBTdHJpbmcgcGF0aCwgZmluYWwgU3RyaW5nIGZpbGVTdWZmaXgpIHsKLSAgICAgICAgVVJMIGVudHJ5ID0gbnVsbDsgCi0gICAgICAgICAgICBlbnRyeSA9IHBsdWdpbi5nZXRCdW5kbGUoKS5nZXRFbnRyeShwYXRoKTsgCi0gICAgICAgIExpc3QgcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgRmlsZSBmb2xkZXIgPSBudWxsOwotICAgICAgICBpZiAoZW50cnkgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBlbnRyeSA9IFBsYXRmb3JtLmFzTG9jYWxVUkwoZW50cnkpOwotICAgICAgICAgICAgICAgIGZvbGRlciA9IG5ldyBGaWxlKG5ldyBVUkkoZW50cnkudG9TdHJpbmcoKSkpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUxKSB7Ci0gICAgICAgICAgICAgICAgZTEucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMaXN0IGZpbGVzID0gQXJyYXlzLmFzTGlzdChmb2xkZXIubGlzdCgpKTsKLSAgICAgICAgICAgIGlmICghZmlsZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGZvbGRlclBhdGggPSBmb2xkZXIuZ2V0QWJzb2x1dGVQYXRoKCkgKyBGaWxlLnNlcGFyYXRvcjsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSAoU3RyaW5nKSBmaWxlcy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghZmlsZU5hbWUuZW5kc1dpdGgoZmlsZVN1ZmZpeCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChmb2xkZXJQYXRoICsgZmlsZU5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICByZXN1bHQgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0SmFyc0luRGlyZWN0b3J5KFBsdWdpbiBwbHVnaW4sIFN0cmluZyBwYXRoKSB7Ci0gICAgICAgIHJldHVybiBnZXRTcGVjaWZpY0ZpbGVzSW5EaXJlY3RvcnkocGx1Z2luLCBwYXRoLCAiLmphciIpOwotICAgIH0KLSAgICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0UmFyc0luRGlyZWN0b3J5KFBsdWdpbiBwbHVnaW4sIFN0cmluZyBwYXRoKSB7Ci0gICAgICAgIHJldHVybiBnZXRTcGVjaWZpY0ZpbGVzSW5EaXJlY3RvcnkocGx1Z2luLCBwYXRoLCAiLnJhciIpOwotICAgIH0KLSAgICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0RWFyc0luRGlyZWN0b3J5KFBsdWdpbiBwbHVnaW4sIFN0cmluZyBwYXRoKSB7Ci0gICAgICAgIHJldHVybiBnZXRTcGVjaWZpY0ZpbGVzSW5EaXJlY3RvcnkocGx1Z2luLCBwYXRoLCAiLmVhciIpOwotICAgIH0KLSAgICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0V2Fyc0luRGlyZWN0b3J5KFBsdWdpbiBwbHVnaW4sIFN0cmluZyBwYXRoKSB7Ci0gICAgICAgIHJldHVybiBnZXRTcGVjaWZpY0ZpbGVzSW5EaXJlY3RvcnkocGx1Z2luLCBwYXRoLCAiLndhciIpOwotICAgIH0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGdWxsRmlsZU5hbWUoUGx1Z2luIHBsdWdpbiwgU3RyaW5nIHBsdWdpblJlbGF0aXZlRmlsZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIElQYXRoIHBhdGggPSBuZXcgUGF0aChwbHVnaW5SZWxhdGl2ZUZpbGVOYW1lKTsKLSAgICAgICAgaWYgKHBhdGguZ2V0RGV2aWNlKCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBwbHVnaW5SZWxhdGl2ZUZpbGVOYW1lOwotICAgICAgICBVUkwgdXJsID0gcGx1Z2luLmdldEJ1bmRsZSgpLmdldEVudHJ5KHBsdWdpblJlbGF0aXZlRmlsZU5hbWUpOwotICAgICAgICBpZiAodXJsICE9IG51bGwpIHsKLSAgICAgICAgICAgIHVybCA9IFBsYXRmb3JtLmFzTG9jYWxVUkwodXJsKTsKLSAgICAgICAgICAgIElQYXRoIGlQYXRoID0gbmV3IFBhdGgodXJsLmdldFBhdGgoKSk7Ci0gICAgICAgICAgICByZXR1cm4gaVBhdGgudG9PU1N0cmluZygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2NvbW1vbnRlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvU2ltcGxlVGVzdFN1aXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2NvbW1vbnRlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvU2ltcGxlVGVzdFN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmZTE2ZTYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9jb21tb250ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL1NpbXBsZVRlc3RTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gRmViIDIsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIEBhdXRob3IganNob2xsCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlVGVzdFN1aXRlIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQotICAgIHB1YmxpYyBTaW1wbGVUZXN0U3VpdGUoQ2xhc3MgdGhlQ2xhc3MpIHsKLSAgICAgICAgc3VwZXIodGhlQ2xhc3MsIGdldFNob3J0TmFtZSh0aGVDbGFzcykpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNob3J0TmFtZShDbGFzcyBjKXsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSBjLmdldE5hbWUoKTsKLSAgICAgICAgaWYobmFtZS5sYXN0SW5kZXhPZignLicpID4gMCl7Ci0gICAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcobmFtZS5sYXN0SW5kZXhPZignLicpKzEpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvY29tbW9udGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy9UYXNrVmlld1V0aWxpdHkuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvY29tbW9udGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy9UYXNrVmlld1V0aWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIxMzU1Yy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2NvbW1vbnRlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvVGFza1ZpZXdVdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi0vKioKLSAqIEBhdXRob3IganNob2xsCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZWRpdCB0aGUgdGVtcGxhdGUgdmFyaWFibGUgInR5cGVjb21tZW50IjoKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPlRlbXBsYXRlcy4KLSAqIFRvIGVuYWJsZSBhbmQgZGlzYWJsZSB0aGUgY3JlYXRpb24gb2YgdHlwZSBjb21tZW50cyBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgVGFza1ZpZXdVdGlsaXR5IHsKLQotICAgIHB1YmxpYyBzdGF0aWMgSVJlc291cmNlIGdldFdvcmtzcGFjZVJvb3QoKSB7Ci0gICAgICAgIHJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2ZXJpZnlOb05ld1Rhc2tzKEhhc2hTZXQgaGFzaFNldCkgewotICAgICAgICB2ZXJpZnlOb05ld1Rhc2tzKG51bGwsIGhhc2hTZXQpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2ZXJpZnlOb05ld1Rhc2tzKElSZXNvdXJjZSByZXNvdXJjZSwgSGFzaFNldCBoYXNoU2V0KSB7Ci0gICAgICAgIHZlcmlmeU5vTmV3VGFza3NJbXBsKHJlc291cmNlLCBoYXNoU2V0LCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHZlcmlmeU5vTmV3VGFza3NJbXBsKElSZXNvdXJjZSByZXNvdXJjZSwgSGFzaFNldCBoYXNoU2V0LCBib29sZWFuIGZhaWxPbkZhaWx1cmUpIHsKLSAgICAgICAgSVJlc291cmNlIG1hcmtlclNvdXJjZSA9IHJlc291cmNlID09IG51bGwgPyBnZXRXb3Jrc3BhY2VSb290KCkgOiByZXNvdXJjZTsKLSAgICAgICAgSU1hcmtlcltdIG1hcmtlcnMgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbWFya2VycyA9IG1hcmtlclNvdXJjZS5maW5kTWFya2VycyhJTWFya2VyLlBST0JMRU0sIHRydWUsIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZTEpIHsKLSAgICAgICAgICAgIGUxLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgQXNzZXJ0LmZhaWwoKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBqID0gMDsgbWFya2VycyAhPSBudWxsICYmIGogPCBtYXJrZXJzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IG1hcmtlcnNbal0udG9TdHJpbmcoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZSA9IChTdHJpbmcpIG1hcmtlcnNbal0uZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobnVsbCA9PSBoYXNoU2V0KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGZhaWxNc2cgPSAiVGFzayBpbiBUYXNrcyBMaXN0OiAiICsgbWVzc2FnZTsKLSAgICAgICAgICAgICAgICBpZiAoZmFpbE9uRmFpbHVyZSkgewotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuZmFpbChmYWlsTXNnKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZmFpbE1zZyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmICghaGFzaFNldC5jb250YWlucyhtYXJrZXJzW2pdKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBmYWlsTXNnID0gIk5ldyBUYXNrIGluIFRhc2tzIExpc3Q6ICIgKyBtZXNzYWdlOwotICAgICAgICAgICAgICAgIGlmIChmYWlsT25GYWlsdXJlKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5mYWlsKGZhaWxNc2cpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihmYWlsTXNnKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2ZXJpZnlOb0Vycm9ycygpIHsKLSAgICAgICAgdmVyaWZ5Tm9FcnJvcnMobnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHZlcmlmeU5vRXJyb3JzKElSZXNvdXJjZSByZXNvdXJjZSkgewotICAgICAgICBMaXN0IG1hcmtlcnMgPSBnZXRFcnJvcnMocmVzb3VyY2UpOwotICAgICAgICBpZiAobnVsbCAhPSBtYXJrZXJzICYmIG1hcmtlcnMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgaW50IHNpemUgPSBtYXJrZXJzLnNpemUoKTsKLSAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gIiIgKyBzaXplICsgIiBlcnJvcnMgaW4gdGFza3MgdmlldzoiOwotICAgICAgICAgICAgSU1hcmtlciBtYXJrZXI7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgICAgIG1hcmtlciA9IChJTWFya2VyKSBtYXJrZXJzLmdldChpKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBtZXNzYWdlICs9ICJcbiIgKyBpICsgIiAiICsgKFN0cmluZykgbWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgQXNzZXJ0LmZhaWwobWVzc2FnZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEVycm9ycyhJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJSVJlc291cmNlIG1hcmtlclNvdXJjZSA9IHJlc291cmNlID09IG51bGwgPyBnZXRXb3Jrc3BhY2VSb290KCkgOiByZXNvdXJjZTsKLSAgICAgICAgTGlzdCBtYXJrZXJzID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1hcmtlcnMgPSBmaW5kU2V2ZXJpdHlNYXJrZXJzKG1hcmtlclNvdXJjZSwgSU1hcmtlci5TRVZFUklUWV9FUlJPUik7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZTEpIHsKLSAgICAgICAgICAgIGUxLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0JCXJldHVybiBtYXJrZXJzOwotCX0KLQotCXByaXZhdGUgc3RhdGljIExpc3QgZmluZFNldmVyaXR5TWFya2VycyhJUmVzb3VyY2UgbWFya2VyU291cmNlLCBpbnQgc2V2ZXJpdHlMZXZlbCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBJTWFya2VyW10gbWFya2VycyA9IG1hcmtlclNvdXJjZS5maW5kTWFya2VycyhJTWFya2VyLlBST0JMRU0sIHRydWUsIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0gICAgICAgIExpc3QgcmVzdWx0cyA9IG51bGw7Ci0gICAgICAgIEludGVnZXIgc2V2ZXJpdHk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgc2V2ZXJpdHkgPSAoSW50ZWdlcikgbWFya2Vyc1tpXS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSk7Ci0gICAgICAgICAgICBpZiAoc2V2ZXJpdHkuaW50VmFsdWUoKSA9PSBzZXZlcml0eUxldmVsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdHMgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICByZXN1bHRzLmFkZChtYXJrZXJzW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAocmVzdWx0cyA9PSBudWxsKQotICAgICAgICAgICAgcmVzdWx0cyA9IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0gICAgICAgIHJldHVybiByZXN1bHRzOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2ZXJpZnlOb1dhcm5pbmdzKCkgewotCi0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHZlcmlmeU5vVGFza3MoKSB7Ci0gICAgICAgIHZlcmlmeU5vVGFza3MobnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHZlcmlmeU5vVGFza3MoSVJlc291cmNlIHJlc291cmNlKSB7Ci0gICAgICAgIHZlcmlmeU5vTmV3VGFza3NJbXBsKHJlc291cmNlLCBudWxsLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmVyaWZ5Tm9UYXNrcyhib29sZWFuIGZhaWxPbkZhaWx1cmUpIHsKLSAgICAgICAgdmVyaWZ5Tm9UYXNrcyhudWxsLCBmYWlsT25GYWlsdXJlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmVyaWZ5Tm9UYXNrcyhJUmVzb3VyY2UgcmVzb3VyY2UsIGJvb2xlYW4gZmFpbE9uRmFpbHVyZSkgewotICAgICAgICB2ZXJpZnlOb05ld1Rhc2tzSW1wbChyZXNvdXJjZSwgbnVsbCwgZmFpbE9uRmFpbHVyZSk7Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2ZXJpZnlFcnJvcnMoTGlzdCBtYXJrZXJEZXNjcmlwdGlvbnNFeHBlY3RlZCkgewotICAgICAgICB2ZXJpZnlFcnJvcnMobWFya2VyRGVzY3JpcHRpb25zRXhwZWN0ZWQsdHJ1ZSxmYWxzZSk7Ci0gICAgfQotCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHZlcmlmeUVycm9ycyhMaXN0IG1hcmtlckRlc2NyaXB0aW9uc0V4cGVjdGVkLCBib29sZWFuIHJlcG9ydElmRXhwZWN0ZWRFcnJvck5vdEZvdW5kLCBib29sZWFuIHJlbW92ZUFsbFNhbWVUeXBlc09mRXJyb3IpIHsKLSAgICAgICAgTGlzdCBtYXJrZXJEZXNjcmlwdGlvbnNGb3VuZCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBMaXN0IG1hcmtlcnNGb3VuZCA9IGZpbmRTZXZlcml0eU1hcmtlcnMoZ2V0V29ya3NwYWNlUm9vdCgpLCBJTWFya2VyLlNFVkVSSVRZX0VSUk9SKTsKLSAgICAgICAgICAgIG1hcmtlckRlc2NyaXB0aW9uc0ZvdW5kID0gbmV3IEFycmF5TGlzdChtYXJrZXJzRm91bmQuc2l6ZSgpKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFya2Vyc0ZvdW5kLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbWFya2VyRGVzY3JpcHRpb25zRm91bmQuYWRkKCgoSU1hcmtlcikgbWFya2Vyc0ZvdW5kLmdldChpKSkuZ2V0QXR0cmlidXRlKCJtZXNzYWdlIikpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUxKSB7Ci0gICAgICAgICAgICBlMS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIEFzc2VydC5mYWlsKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBBcnJheUxpc3QgbWFya2VyRGVzY3JpcHRpb25zTm90Rm91bmQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIExpc3QgbWFya2Vyc0Rlc2NyaXB0aW9uc1RvUmVtb3ZlID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlckRlc2NyaXB0aW9uc0V4cGVjdGVkLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIAlTdHJpbmcgbWVzc2FnZVRvRmluZCA9IChTdHJpbmcpbWFya2VyRGVzY3JpcHRpb25zRXhwZWN0ZWQuZ2V0KGkpOwotICAgICAgICAJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotICAgICAgICAJZm9yKGludCBqPTA7ajxtYXJrZXJEZXNjcmlwdGlvbnNGb3VuZC5zaXplKCkgJiYoIWZvdW5kIHx8IHJlbW92ZUFsbFNhbWVUeXBlc09mRXJyb3IpO2orKyl7Ci0gICAgICAgIAkJaWYobWVzc2FnZVRvRmluZC5lcXVhbHMobWFya2VyRGVzY3JpcHRpb25zRm91bmQuZ2V0KGopKSl7Ci0gICAgICAgIAkJCWZvdW5kID0gdHJ1ZTsKLSAgICAgICAgCQkJbWFya2Vyc0Rlc2NyaXB0aW9uc1RvUmVtb3ZlLmFkZChtYXJrZXJEZXNjcmlwdGlvbnNGb3VuZC5nZXQoaikpOwotICAgICAgICAJCX0KLSAgICAgICAgICAgIH0KLSAgICAgICAgCWlmICghZm91bmQpIHsKLSAgICAgICAgICAgICAgICBtYXJrZXJEZXNjcmlwdGlvbnNOb3RGb3VuZC5hZGQobWVzc2FnZVRvRmluZCk7Ci0gICAgICAgICAgICB9IAotICAgICAgICB9Ci0gICAgICAgIG1hcmtlckRlc2NyaXB0aW9uc0ZvdW5kLnJlbW92ZUFsbChtYXJrZXJzRGVzY3JpcHRpb25zVG9SZW1vdmUpOwotICAgICAgICBpZiAobWFya2VyRGVzY3JpcHRpb25zTm90Rm91bmQuc2l6ZSgpID4gMCB8fCBtYXJrZXJEZXNjcmlwdGlvbnNGb3VuZC5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbWVzc2FnZXMgPSAiIjsKLSAgICAgICAgICAgIGlmIChyZXBvcnRJZkV4cGVjdGVkRXJyb3JOb3RGb3VuZCl7Ci0JICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJEZXNjcmlwdGlvbnNOb3RGb3VuZC5zaXplKCk7IGkrKykgewotCSAgICAgICAgICAgICAgICBtZXNzYWdlcyArPSAiXG5FcnJvciBub3QgZm91bmQ6XCIiICsgbWFya2VyRGVzY3JpcHRpb25zTm90Rm91bmQuZ2V0KGkpKyJcIiI7Ci0JICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJEZXNjcmlwdGlvbnNGb3VuZC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIG1lc3NhZ2VzICs9ICJcblVuZXhwZWN0ZWQgZXJyb3IgZm91bmQ6XCIiICsgbWFya2VyRGVzY3JpcHRpb25zRm91bmQuZ2V0KGkpKyJcIiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIW1lc3NhZ2VzLmVxdWFscygiIikpCi0gICAgICAgICAgICAgICAgQXNzZXJ0LmZhaWwobWVzc2FnZXMpOwotICAgICAgICB9Ci0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9jb21tb250ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL1dpbmRvd1V0aWxpdHkuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvY29tbW9udGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy9XaW5kb3dVdGlsaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZGM3NzkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9jb21tb250ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL1dpbmRvd1V0aWxpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEp1biA1LCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0czsKLQotCi0vKioKLSAqIEBhdXRob3IganNob2xsCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFdpbmRvd1V0aWxpdHkgewotCi0vLyAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2VBbGxPcGVuV2luZG93cygpIHsKLS8vICAgICAgICBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCk7Ci0vLyAgICAgICAgSVdvcmtiZW5jaFdpbmRvd1tdIHdpbmRvd3MgPSB3b3JrYmVuY2guZ2V0V29ya2JlbmNoV2luZG93cygpOwotLy8KLS8vICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdpbmRvd3MubGVuZ3RoOyBpKyspIHsKLS8vICAgICAgICAgICAgZmluYWwgSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSB3aW5kb3dzW2ldOwotLy8gICAgICAgICAgICBmaW5hbCBTaGVsbCBzaGVsbCA9IHdpbmRvdy5nZXRTaGVsbCgpOwotLy8gICAgICAgICAgICBzaGVsbC5nZXREaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotLy8gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotLy8gICAgICAgICAgICAgICAgICAgIFNoZWxsW10gb3RoZXJTaGVsbHMgPSBzaGVsbC5nZXREaXNwbGF5KCkuZ2V0U2hlbGxzKCk7Ci0vLyAgICAgICAgICAgICAgICAgICAgLy90aGlzIGNhbiBiZSBpbXBvcm92ZWQsIGJ1dCBiYXNpY2FsbHkgdGhpcyBpcyB0byB3b3JrIG91dCBzaGVsbCBkZXBlbmRlbmNpZXMuCi0vLyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBvdGhlclNoZWxscy5sZW5ndGg7IGorKykgewotLy8gICAgICAgICAgICAgICAgICAgICAgICAvL3N0ZXAgdGhyb3VnaCBzaGVsbHMgYmFja3dhcmRzIGluIGNhc2Ugb25lIHNoZWxsIG9wZW5zIGFub3RoZXIgLS0gdGhpcyBpcyBob3cgdGhleSBhcmUgdXN1YWxseSBvZGVyZWQKLS8vICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IG90aGVyU2hlbGxzLmxlbmd0aCAtIDE7IGkgPiAwOyBpLS0pIHsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgCWludCBpbmRleCA9IChpK2opICUgb3RoZXJTaGVsbHMubGVuZ3RoOyAvLyBtaXggdGhpbmdzIHVwIGEgbGl0dGxlIHRvIHdvcmsgb3V0IHNoZWxsIGRlcGVuZGVuY2llcwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG90aGVyU2hlbGxzW2luZGV4XSAhPSBzaGVsbCAmJiBvdGhlclNoZWxsc1tpbmRleF0uaXNWaXNpYmxlKCkgJiYgIW90aGVyU2hlbGxzW2luZGV4XS5pc0Rpc3Bvc2VkKCkpIHsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlclNoZWxsc1tpbmRleF0uY2xvc2UoKTsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgICAgICAgICAgICAgfQotLy8gICAgICAgICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgfSk7Ci0vLyAgICAgICAgfQotLy8gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2NvbW1vbnRlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMveG1sL0RvbUNvbXBhcml0b3IuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvY29tbW9udGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy94bWwvRG9tQ29tcGFyaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzhjMmQ4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvY29tbW9udGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy94bWwvRG9tQ29tcGFyaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnhtbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5DaGFyYWN0ZXJEYXRhOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLlByb2Nlc3NpbmdJbnN0cnVjdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcjsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLQotcHVibGljIGNsYXNzIERvbUNvbXBhcml0b3IgewotICAgIHByaXZhdGUgc3RhdGljIEhhc2hTZXQgYXR0cmlidXRlTGlzdDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbXBhcmVEb21zKElucHV0U291cmNlIHNvdXJjZTEsIElucHV0U291cmNlIHNvdXJjZTIsIEhhc2hTZXQgaWdub3JhYmxlQXR0cywgRW50aXR5UmVzb2x2ZXIgZW50aXR5UmVzb2x2ZXIpIHRocm93cyBFeGNlcHRpb24gewotLy8gICAgICAgIGF0dHJpYnV0ZUxpc3QgPSBpZ25vcmFibGVBdHRzOwotLy8gICAgICAgIERPTVBhcnNlciBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7Ci0vLyAgICAgICAgaWYgKGVudGl0eVJlc29sdmVyID09IG51bGwpIHsKLS8vICAgICAgICAgICAgcGFyc2VyLnNldEVudGl0eVJlc29sdmVyKG5ldyBFbnRpdHlSZXNvbHZlcigpIHsKLS8vICAgICAgICAgICAgICAgIHB1YmxpYyBJbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KFN0cmluZyBhcmcwLCBTdHJpbmcgYXJnMSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotLy8gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotLy8gICAgICAgICAgICAgICAgfQotLy8gICAgICAgICAgICB9KTsKLS8vICAgICAgICB9IGVsc2UgewotLy8gICAgICAgICAgICBwYXJzZXIuc2V0RW50aXR5UmVzb2x2ZXIoZW50aXR5UmVzb2x2ZXIpOwotLy8gICAgICAgIH0KLS8vICAgICAgICBwYXJzZXIucGFyc2Uoc291cmNlMSk7Ci0vLyAgICAgICAgRG9jdW1lbnQgZG9jMSA9IHBhcnNlci5nZXREb2N1bWVudCgpOwotLy8gICAgICAgIHBhcnNlci5wYXJzZShzb3VyY2UyKTsKLS8vICAgICAgICBEb2N1bWVudCBkb2MyID0gcGFyc2VyLmdldERvY3VtZW50KCk7Ci0vLyAgICAgICAgcmV0dXJuIGNvbXBhcmVOb2Rlcyhkb2MxLCBkb2MyKTsKLSAgICAJcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbXBhcmVEb21zKElucHV0U291cmNlIHNvdXJjZTEsIElucHV0U291cmNlIHNvdXJjZTIsIEhhc2hTZXQgaWdub3JhYmxlQXR0cykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBjb21wYXJlRG9tcyhzb3VyY2UxLCBzb3VyY2UyLCBpZ25vcmFibGVBdHRzLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb21wYXJlRG9tcyhJbnB1dFNvdXJjZSBzb3VyY2UxLCBJbnB1dFNvdXJjZSBzb3VyY2UyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGNvbXBhcmVEb21zKHNvdXJjZTEsIHNvdXJjZTIsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbXBhcmVOb2RlcyhOb2RlIG5vZGUxLCBOb2RlIG5vZGUyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY2hlY2tpbmcgQToiICsgbm9kZTEpOwotICAgICAgICAvLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjaGVja2luZyBCOiIgKyBub2RlMik7Ci0gICAgICAgIC8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIm5vZGVUeXBlPSIgKyBub2RlMS5nZXROb2RlVHlwZSgpKTsKLSAgICAgICAgLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZ2V0Tm9kZU5hbWU9IiArIG5vZGUxLmdldE5vZGVOYW1lKCkpOwotICAgICAgICAvLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJnZXROb2RlVmFsdWU9IiArIG5vZGUxLmdldE5vZGVWYWx1ZSgpKTsKLQotICAgICAgICAvL0dlbmVyaWMgTm9kZSBUZXN0aW5nIAotICAgICAgICAvLyAgICAgICAgaWYgKG5vZGUxID09IG51bGwgJiYgbm9kZTIgPT0gbnVsbCkKLSAgICAgICAgLy8gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgLy8gICAgICAgIGVsc2UgCi0gICAgICAgIGlmICgobm9kZTEgIT0gbnVsbCAmJiBub2RlMiA9PSBudWxsKSB8fCBub2RlMSA9PSBudWxsICYmIG5vZGUyICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbE5vZGVFbmNvdW50ZXJlZChub2RlMSwgbm9kZTIpOwotICAgICAgICBlbHNlIGlmIChub2RlMS5nZXROb2RlVHlwZSgpICE9IG5vZGUyLmdldE5vZGVUeXBlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBtaXNtYXRjaCgiTm9kZS5nZXROb2RlVHlwZSgpICIgKyBub2RlMS5nZXROb2RlVHlwZSgpICsgIiAiICsgbm9kZTIuZ2V0Tm9kZVR5cGUoKSwgbm9kZTEsIG5vZGUyKTsKLSAgICAgICAgfSBlbHNlIGlmIChub2RlMS5nZXROb2RlTmFtZSgpICE9IG5vZGUyLmdldE5vZGVOYW1lKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBtaXNtYXRjaCgiTm9kZS5nZXROb2RlTmFtZSgpIDwiICsgbm9kZTEuZ2V0Tm9kZU5hbWUoKSArICI+IDwiICsgbm9kZTIuZ2V0Tm9kZU5hbWUoKSArICI+Iiwgbm9kZTEsIG5vZGUyKTsKLSAgICAgICAgfSBlbHNlIGlmICghKG5vZGUxLmdldE5vZGVWYWx1ZSgpID09IG51bGwgJiYgbm9kZTIuZ2V0Tm9kZVZhbHVlKCkgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgIGlmIChub2RlMS5nZXROb2RlVmFsdWUoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1pc21hdGNoKCJOb2RlLmdldE5vZGVWYWx1ZSgpIG5vZGUgQSBpcyBudWxsIiwgbm9kZTEsIG5vZGUyKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZTIuZ2V0Tm9kZVZhbHVlKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtaXNtYXRjaCgiTm9kZS5nZXROb2RlVmFsdWUoKSBub2RlIEIgaXMgbnVsbCIsIG5vZGUxLCBub2RlMik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFub2RlMS5nZXROb2RlVmFsdWUoKS50cmltKCkuZXF1YWxzKG5vZGUyLmdldE5vZGVWYWx1ZSgpLnRyaW0oKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbWlzbWF0Y2goIk5vZGUuZ2V0Tm9kZVZhbHVlKCkgPCIgKyBub2RlMS5nZXROb2RlVmFsdWUoKSArICI+IDwiICsgbm9kZTIuZ2V0Tm9kZVZhbHVlKCkgKyAiPiIsIG5vZGUxLCBub2RlMik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy9UT0RPIHN0cmVuZ3RoZW4gbm9kZSBjb21wYXJpc29ucyBhcyBuZWNlc3NhcnkKLSAgICAgICAgLy9TcGVjaWFsaXplZCBOb2RlIFRlc3RpbmcKLSAgICAgICAgc3dpdGNoIChub2RlMS5nZXROb2RlVHlwZSgpKSB7Ci0gICAgICAgICAgICBjYXNlIE5vZGUuVEVYVF9OT0RFIDoKLSAgICAgICAgICAgIGNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREUgOgotICAgICAgICAgICAgICAgIENoYXJhY3RlckRhdGEgY2RhdGExID0gKENoYXJhY3RlckRhdGEpIG5vZGUxOwotICAgICAgICAgICAgICAgIENoYXJhY3RlckRhdGEgY2RhdGEyID0gKENoYXJhY3RlckRhdGEpIG5vZGUyOwotICAgICAgICAgICAgICAgIGlmICghY2RhdGExLmdldERhdGEoKS50cmltKCkuZXF1YWxzKGNkYXRhMi5nZXREYXRhKCkudHJpbSgpKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWlzbWF0Y2goIkNoYXJhY3RlckRhdGEuZ2V0RGF0YSgpICIgKyBjZGF0YTEuZ2V0RGF0YSgpICsgIiAiICsgY2RhdGEyLmdldERhdGEoKSwgbm9kZTEsIG5vZGUyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE5vZGUuQVRUUklCVVRFX05PREUgOgotICAgICAgICAgICAgICAgIEF0dHIgYXR0cjEgPSAoQXR0cikgbm9kZTE7Ci0gICAgICAgICAgICAgICAgQXR0ciBhdHRyMiA9IChBdHRyKSBub2RlMjsKLSAgICAgICAgICAgICAgICBpZiAoIWF0dHIxLmdldE5hbWUoKS5lcXVhbHMoYXR0cjIuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWlzbWF0Y2goIkF0dHIuZ2V0TmFtZSgpICIgKyBhdHRyMS5nZXROYW1lKCkgKyAiICIgKyBhdHRyMi5nZXROYW1lKCksIG5vZGUxLCBub2RlMik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghYXR0cjEuZ2V0VmFsdWUoKS5lcXVhbHMoYXR0cjIuZ2V0VmFsdWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1pc21hdGNoKCJBdHRyLmdldFZhbHVlKCkgIiArIGF0dHIxLmdldFZhbHVlKCkgKyAiICIgKyBhdHRyMi5nZXRWYWx1ZSgpLCBub2RlMSwgbm9kZTIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXR0cjEuZ2V0U3BlY2lmaWVkKCkgIT0gYXR0cjIuZ2V0U3BlY2lmaWVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1pc21hdGNoKCJBdHRyLmdldFNwZWNpZmllZCgpICIgKyBhdHRyMS5nZXRTcGVjaWZpZWQoKSArICIgIiArIGF0dHIyLmdldFNwZWNpZmllZCgpLCBub2RlMSwgbm9kZTIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTm9kZS5ET0NVTUVOVF9OT0RFIDoKLSAgICAgICAgICAgICAgICBEb2N1bWVudCBkb2MxID0gKERvY3VtZW50KSBub2RlMTsKLSAgICAgICAgICAgICAgICBEb2N1bWVudCBkb2MyID0gKERvY3VtZW50KSBub2RlMjsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVzdWx0ID0gY29tcGFyZU5vZGVzKGRvYzEuZ2V0RG9jdHlwZSgpLCBkb2MyLmdldERvY3R5cGUoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERSA6Ci0gICAgICAgICAgICAgICAgRG9jdW1lbnRUeXBlIGRvY1R5cGUxID0gKERvY3VtZW50VHlwZSkgbm9kZTE7Ci0gICAgICAgICAgICAgICAgRG9jdW1lbnRUeXBlIGRvY1R5cGUyID0gKERvY3VtZW50VHlwZSkgbm9kZTI7Ci0gICAgICAgICAgICAgICAgaWYgKCFkb2NUeXBlMS5nZXRQdWJsaWNJZCgpLmVxdWFscyhkb2NUeXBlMi5nZXRQdWJsaWNJZCgpKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWlzbWF0Y2goIkRvY3VtZW50VHlwZS5nZXRQdWJsaWNJZCgpICIgKyBkb2NUeXBlMS5nZXRQdWJsaWNJZCgpICsgIiAiICsgZG9jVHlwZTIuZ2V0UHVibGljSWQoKSwgbm9kZTEsIG5vZGUyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIDoKLSAgICAgICAgICAgICAgICBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gcEluc3QxID0gKFByb2Nlc3NpbmdJbnN0cnVjdGlvbikgbm9kZTE7Ci0gICAgICAgICAgICAgICAgUHJvY2Vzc2luZ0luc3RydWN0aW9uIHBJbnN0MiA9IChQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24pIG5vZGUyOwotICAgICAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gdG9kbyIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUgOgotICAgICAgICAgICAgICAgIERvY3VtZW50RnJhZ21lbnQgZnJhZzEgPSAoRG9jdW1lbnRGcmFnbWVudCkgbm9kZTE7Ci0gICAgICAgICAgICAgICAgRG9jdW1lbnRGcmFnbWVudCBmcmFnMiA9IChEb2N1bWVudEZyYWdtZW50KSBub2RlMjsKLSAgICAgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiRG9jdW1lbnRGcmFnbWVudCB0b2RvIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTm9kZS5FTEVNRU5UX05PREUgOgotICAgICAgICAgICAgY2FzZSBOb2RlLkNPTU1FTlRfTk9ERSA6Ci0gICAgICAgICAgICBjYXNlIE5vZGUuRU5USVRZX05PREUgOgotICAgICAgICAgICAgY2FzZSBOb2RlLk5PVEFUSU9OX05PREUgOgotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIH0KLQotICAgICAgICAvL1JlY3Vyc2lvbgotICAgICAgICBOYW1lZE5vZGVNYXAgYXR0cmlidXRlczEgPSBub2RlMS5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIE5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzMiA9IG5vZGUyLmdldEF0dHJpYnV0ZXMoKTsKLQotICAgICAgICBpZiAoYXR0cmlidXRlczEgIT0gbnVsbCAmJiBhdHRyaWJ1dGVzMiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZ25vcmVBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMxLCBhdHRyaWJ1dGVzMik7Ci0gICAgICAgICAgICBpZiAoYXR0cmlidXRlczEuZ2V0TGVuZ3RoKCkgIT0gYXR0cmlidXRlczIuZ2V0TGVuZ3RoKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbWlzbWF0Y2goImdldEF0dHJpYnV0ZXMoKS5nZXRMZW5ndGgoKSAiICsgYXR0cmlidXRlczEuZ2V0TGVuZ3RoKCkgKyAiICIgKyBhdHRyaWJ1dGVzMi5nZXRMZW5ndGgoKSwgbm9kZTEsIG5vZGUyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlczEuZ2V0TGVuZ3RoKCk7IGkrKykgewotICAgICAgICAgICAgICAgIEF0dHIgYXR0cjEgPSAoQXR0cikgYXR0cmlidXRlczEuaXRlbShpKTsKLSAgICAgICAgICAgICAgICBBdHRyIGF0dHIyID0gKEF0dHIpIGF0dHJpYnV0ZXMyLml0ZW0oaSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHJlc3VsdHMgPSBjb21wYXJlTm9kZXMoYXR0cjEsIGF0dHIyKTsKLQkJCQlpZiAobnVsbCAhPSByZXN1bHRzKSB7Ci0JCQkJCXJldHVybiByZXN1bHRzOwotCQkJCX0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGVsc2UgaWYgKGF0dHJpYnV0ZXMxICE9IG51bGwgfHwgYXR0cmlidXRlczIgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1pc21hdGNoKCJnZXRBdHRyaWJ1dGVzKCkgbnVsbCIsIG5vZGUxLCBub2RlMik7Ci0gICAgICAgIH0KLQotICAgICAgICBBcnJheUxpc3QgY2hpbGRyZW4xID0gZ2V0QXNBcnJheUxpc3Qobm9kZTEuZ2V0Q2hpbGROb2RlcygpKTsKLSAgICAgICAgQXJyYXlMaXN0IGNoaWxkcmVuMiA9IGdldEFzQXJyYXlMaXN0KG5vZGUyLmdldENoaWxkTm9kZXMoKSk7Ci0KLSAgICAgICAgaWdub3JlQ29tbWVudHMoY2hpbGRyZW4xKTsKLSAgICAgICAgaWdub3JlQ29tbWVudHMoY2hpbGRyZW4yKTsKLQotICAgICAgICBpZ25vcmVFbXB0eVRleHROb2RlcyhjaGlsZHJlbjEpOwotICAgICAgICBpZ25vcmVFbXB0eVRleHROb2RlcyhjaGlsZHJlbjIpOwotCi0gICAgICAgIGlmIChjaGlsZHJlbjEuc2l6ZSgpICE9IGNoaWxkcmVuMi5zaXplKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBtaXNtYXRjaCgiTm9kZS5oYXNDaGlsZE5vZGVzKCkgIiArIGNoaWxkcmVuMS5zaXplKCkgKyAiICIgKyBjaGlsZHJlbjIuc2l6ZSgpLCBub2RlMSwgbm9kZTIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbjEuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIE5vZGUgY2hpbGQxID0gKE5vZGUpIGNoaWxkcmVuMS5nZXQoaSk7Ci0gICAgICAgICAgICBOb2RlIGNoaWxkMiA9IChOb2RlKSBjaGlsZHJlbjIuZ2V0KGkpOwotICAgICAgICAgICAgU3RyaW5nIHJlc3VsdHMgPSBjb21wYXJlTm9kZXMoY2hpbGQxLCBjaGlsZDIpOwotICAgICAgICAgICAgaWYgKG51bGwgIT0gcmVzdWx0cykgewotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIEFycmF5TGlzdCBnZXRBc0FycmF5TGlzdChOb2RlTGlzdCBvcmlnaW5hbExpc3QpIHsKLSAgICAgICAgQXJyYXlMaXN0IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGlmIChvcmlnaW5hbExpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvcmlnaW5hbExpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgewotICAgICAgICAgICAgICAgIG5ld0xpc3QuYWRkKG9yaWdpbmFsTGlzdC5pdGVtKGkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3TGlzdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGlnbm9yZUNvbW1lbnRzKEFycmF5TGlzdCBsaXN0KSB7Ci0gICAgICAgIEFycmF5TGlzdCB0b1JlbW92ZSA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBOb2RlIG5vZGUgPSAoTm9kZSkgbGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuQ09NTUVOVF9OT0RFKSB7Ci0gICAgICAgICAgICAgICAgdG9SZW1vdmUuYWRkKG5vZGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdG9SZW1vdmUuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGxpc3QucmVtb3ZlKHRvUmVtb3ZlLmdldChpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGlnbm9yZUVtcHR5VGV4dE5vZGVzKEFycmF5TGlzdCBsaXN0KSB7Ci0gICAgICAgIEFycmF5TGlzdCB0b1JlbW92ZSA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBOb2RlIG5vZGUgPSAoTm9kZSkgbGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFICYmIChub2RlLmdldE5vZGVWYWx1ZSgpID09IG51bGwgfHwgbm9kZS5nZXROb2RlVmFsdWUoKS50cmltKCkuZXF1YWxzKCIiKSkpIHsKLSAgICAgICAgICAgICAgICB0b1JlbW92ZS5hZGQobm9kZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b1JlbW92ZS5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgbGlzdC5yZW1vdmUodG9SZW1vdmUuZ2V0KGkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVzMQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgaWdub3JlQXR0cmlidXRlcyhOYW1lZE5vZGVNYXAgYXR0cmlidXRlczEsIE5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzMikgewotICAgICAgICBpZiAoYXR0cmlidXRlTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJdGVyYXRvciBpdCA9IGF0dHJpYnV0ZUxpc3QuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIFN0cmluZyBpZ25vcmU7Ci0gICAgICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgaWdub3JlID0gKFN0cmluZykgaXQubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVzMS5nZXROYW1lZEl0ZW0oaWdub3JlKSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzMS5yZW1vdmVOYW1lZEl0ZW0oaWdub3JlKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlczIuZ2V0TmFtZWRJdGVtKGlnbm9yZSkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlczIucmVtb3ZlTmFtZWRJdGVtKGlnbm9yZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBudWxsTm9kZUVuY291bnRlcmVkKE5vZGUgbm9kZTEsIE5vZGUgbm9kZTIpIHsKLSAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiTnVsbCBub2RlIGVuY291bnRlcmVkIjsKLSAgICAgICAgTm9kZSBub25OdWxsTm9kZSA9IG5vZGUxID09IG51bGwgPyBub2RlMiA6IG5vZGUxOwotICAgICAgICBjaGFyIHNvdXJjZSA9IG5vZGUxID09IG51bGwgPyAnQicgOiAnQSc7Ci0gICAgICAgIHdoaWxlIChub25OdWxsTm9kZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtZXNzYWdlICs9IHNvdXJjZSArIG5vbk51bGxOb2RlLmdldE5vZGVOYW1lKCkgKyAiXG4iOwotICAgICAgICAgICAgbm9uTnVsbE5vZGUgPSBub25OdWxsTm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1lc3NhZ2U7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbm9kZU5vdENvbXBhcmVkKE5vZGUgbm9kZSkgewotICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJOb2RlIG5vZGUgY29tcGFyZWQ6IjsKLSAgICAgICAgd2hpbGUgKG5vZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgbWVzc2FnZSArPSBub2RlLmdldE5vZGVOYW1lKCkgKyAiXG4iOwotICAgICAgICAgICAgbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1lc3NhZ2U7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbWlzbWF0Y2goU3RyaW5nIG1pc21hdGNodHlwZSwgTm9kZSBub2RlMSwgTm9kZSBub2RlMikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBtZXNzYWdlID0gIk5vZGVzIEEgYW5kIEIgZG8gbm90IG1hdGNoIGJlY2F1c2Ugb2Ygbm9kZS4iICsgbWlzbWF0Y2h0eXBlICsgIlxuIjsKLSAgICAgICAgd2hpbGUgKG5vZGUxICE9IG51bGwgJiYgbm9kZTIgIT0gbnVsbCkgewotICAgICAgICAgICAgbWVzc2FnZSArPSAiQToiICsgbm9kZTEuZ2V0Tm9kZU5hbWUoKSArICJcbiI7Ci0gICAgICAgICAgICBtZXNzYWdlICs9ICJCOiIgKyBub2RlMi5nZXROb2RlTmFtZSgpICsgIlxuIjsKLSAgICAgICAgICAgIG5vZGUxID0gbm9kZTEuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgICAgICAgbm9kZTIgPSBub2RlMi5nZXRQYXJlbnROb2RlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbWVzc2FnZTsKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2NvbW1vbnRlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMveG1sL0RvbUNvbXBhcml0b3JUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2NvbW1vbnRlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMveG1sL0RvbUNvbXBhcml0b3JUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4YmRkOGQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9jb21tb250ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3htbC9Eb21Db21wYXJpdG9yVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMueG1sOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci0KLQotcHVibGljIGNsYXNzIERvbUNvbXBhcml0b3JUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgU3RyaW5nIGJhc2VEaXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIikgKyBqYXZhLmlvLkZpbGUuc2VwYXJhdG9yQ2hhcjsKLSAgICBTdHJpbmcgdGVzdERhdGEgPSBiYXNlRGlyICsgInRlc3REYXRhIiArIGphdmEuaW8uRmlsZS5zZXBhcmF0b3JDaGFyOwotCi0gICAgcHVibGljIERvbUNvbXBhcml0b3JUZXN0KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFcXVhbERvbXNfMDEoKSB7Ci0gICAgICAgIGNoZWNrRXF1YWwoImJhc2VEYXRhXzAxLnhtbCIsICJiYXNlRGF0YV8wMS54bWwiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxEb21zXzAxXzAxKCkgewotICAgICAgICBjaGVja0VxdWFsKCJiYXNlRGF0YV8wMS54bWwiLCAiZXF1YWxUb18wMV9jYXNlXzAxLnhtbCIpOwotICAgIH0KLQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbERvbXNfMDFfMDIoKSB7Ci0JCWNoZWNrRXF1YWwoImJhc2VEYXRhXzAxLnhtbCIsICJlcXVhbFRvXzAxX2Nhc2VfMDIueG1sIik7Ci0JfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFVuZXF1YWxEb21fMDFfMDEoKSB7Ci0gICAgICAgIGNoZWNrVW5lcXVhbCgiYmFzZURhdGFfMDEueG1sIiwgInVuZXF1YWxUb18wMV9jYXNlXzAxLnhtbCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RVbmVxdWFsRG9tXzAxXzAyKCkgewotICAgICAgICBjaGVja1VuZXF1YWwoImJhc2VEYXRhXzAxLnhtbCIsICJ1bmVxdWFsVG9fMDFfY2FzZV8wMi54bWwiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VW5lcXVhbERvbV8wMV8wMygpIHsKLSAgICAgICAgY2hlY2tVbmVxdWFsKCJiYXNlRGF0YV8wMS54bWwiLCAidW5lcXVhbFRvXzAxX2Nhc2VfMDMueG1sIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFVuZXF1YWxEb21fMDFfMDQoKSB7Ci0gICAgICAgIGNoZWNrVW5lcXVhbCgiYmFzZURhdGFfMDEueG1sIiwgInVuZXF1YWxUb18wMV9jYXNlXzA0LnhtbCIpOwotICAgIH0KLQotICAgIC8vVE9ETyBmaWd1cmUgb3V0IGhvdyB0byBjb21wYXJlIGVuY29kaW5ncwotICAgIC8vCXB1YmxpYyB2b2lkIHRlc3RVbmVxdWFsRG9tXzAxXzA1KCkgewotICAgIC8vCQljaGVja1VuZXF1YWwoImJhc2VEYXRhXzAxLnhtbCIsICJ1bmVxdWFsVG9fMDFfY2FzZV8wNS54bWwiKTsKLSAgICAvLwl9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tFcXVhbChTdHJpbmcgZmlsZU5hbWUxLCBTdHJpbmcgZmlsZU5hbWUyKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJbnB1dFNvdXJjZSBzb3VyY2UxID0gbmV3IElucHV0U291cmNlKG5ldyBGaWxlUmVhZGVyKG5ldyBGaWxlKHRlc3REYXRhICsgZmlsZU5hbWUxKSkpOwotICAgICAgICAgICAgSW5wdXRTb3VyY2Ugc291cmNlMiA9IG5ldyBJbnB1dFNvdXJjZShuZXcgRmlsZVJlYWRlcihuZXcgRmlsZSh0ZXN0RGF0YSArIGZpbGVOYW1lMikpKTsKLS8vICAgICAgICAgICAgU3RyaW5nIHJlc3VsdHMgPSBEb21Db21wYXJpdG9yLmNvbXBhcmVEb21zKHNvdXJjZTEsIHNvdXJjZTIpOwotLy8gICAgICAgICAgICBpZiAocmVzdWx0cyAhPSBudWxsKSB7Ci0vLyAgICAgICAgICAgICAgICBBc3NlcnQuZmFpbCgiRXF1YWwgZG9tcyBjb21wYXJlZCBhcyB1bmVxdWFsICIgKyBmaWxlTmFtZTEgKyAiICIgKyBmaWxlTmFtZTIgKyAiXG5jb21wYXJlIHJlc3VsdHMgPSAiICsgcmVzdWx0cyk7Ci0vLyAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBBc3NlcnQuZmFpbChlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tVbmVxdWFsKFN0cmluZyBmaWxlTmFtZTEsIFN0cmluZyBmaWxlTmFtZTIpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElucHV0U291cmNlIHNvdXJjZTEgPSBuZXcgSW5wdXRTb3VyY2UobmV3IEZpbGVSZWFkZXIobmV3IEZpbGUodGVzdERhdGEgKyBmaWxlTmFtZTEpKSk7Ci0gICAgICAgICAgICBJbnB1dFNvdXJjZSBzb3VyY2UyID0gbmV3IElucHV0U291cmNlKG5ldyBGaWxlUmVhZGVyKG5ldyBGaWxlKHRlc3REYXRhICsgZmlsZU5hbWUyKSkpOwotLy8gICAgICAgICAgICBTdHJpbmcgcmVzdWx0cyA9IERvbUNvbXBhcml0b3IuY29tcGFyZURvbXMoc291cmNlMSwgc291cmNlMik7Ci0vLyAgICAgICAgICAgIGlmIChyZXN1bHRzID09IG51bGwpIHsKLS8vICAgICAgICAgICAgICAgIEFzc2VydC5mYWlsKCJVbmVxdWFsIGRvbXMgY29tcGFyZWQgYXMgZXF1YWwgIiArIGZpbGVOYW1lMSArICIgIiArIGZpbGVOYW1lMik7Ci0vLyAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBBc3NlcnQuZmFpbChlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC90ZXN0cy9FY2xpcHNlU2NoZW1lVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC90ZXN0cy9FY2xpcHNlU2NoZW1lVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YyZmYwYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdGVzdHMvRWNsaXBzZVNjaGVtZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnRlc3RzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5FbnZpcm9ubWVudFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJU2NoZW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLlVSSUV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VTY2hlbWVUZXN0cyBleHRlbmRzIFRlc3RDYXNlCi17Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIHByb2plY3ROYW1lXyA9ICJUZXN0UHJvamVjdCI7Ci0gIAotICBwdWJsaWMgRWNsaXBzZVNjaGVtZVRlc3RzKFN0cmluZyBuYW1lKQotICB7Ci0gICAgc3VwZXIobmFtZSk7Ci0gIH0KLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKLSAgewotICAgIGlmIChhcmdzLmxlbmd0aCA9PSAwKQotICAgIHsKLSAgICAgIHJ1bkFsbCgpOwotICAgIH0KLSAgICBlbHNlIGlmIChhcmdzLmxlbmd0aCA9PSAxKQotICAgIHsKLSAgICAgIFN0cmluZyBtZXRob2RUb1J1biA9IGFyZ3NbMF0udHJpbSgpOwotICAgICAgcnVuT25lKG1ldGhvZFRvUnVuKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoRWNsaXBzZVNjaGVtZVRlc3RzLmNsYXNzKTsKLSAgfQotCi0gIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBydW5BbGwoKQotICB7Ci0gICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIHJ1bk9uZShTdHJpbmcgbWV0aG9kTmFtZSkKLSAgewotICAgIFRlc3RTdWl0ZSB0ZXN0U3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0gICAgVGVzdENhc2UgdGVzdCA9IG5ldyBFY2xpcHNlU2NoZW1lVGVzdHMobWV0aG9kTmFtZSk7Ci0gICAgdGVzdFN1aXRlLmFkZFRlc3QodGVzdCk7Ci0gICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKHRlc3RTdWl0ZSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAc2VlIFRlc3RDYXNlI3NldFVwKCkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbgotICB7Ci0gICAgc3VwZXIuc2V0VXAoKTsKLSAgICAKLSAgICAvLyBDcmVhdGUgYSB0ZXN0IHByb2plY3QgaW4gdGhlIHdvcmtiZW5jaAotICAgIElXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotICAgIElQcm9qZWN0ICAgICAgIHByb2plY3QgICAgICAgPSB3b3Jrc3BhY2VSb290LmdldFByb2plY3QoIHByb2plY3ROYW1lXyApOwotICAgIAotICAgIGlmKCBwcm9qZWN0ICE9IG51bGwgJiYgcHJvamVjdC5leGlzdHMoKSApCi0gICAgewotICAgICAgcHJvamVjdC5kZWxldGUoIHRydWUsIG51bGwgKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gQ3JlYXRlIHRoZSBwcm9qZWN0Ci0gICAgSVByb2plY3REZXNjcmlwdGlvbiBkZXNjID0gd29ya3NwYWNlUm9vdC5nZXRXb3Jrc3BhY2UoKS5uZXdQcm9qZWN0RGVzY3JpcHRpb24oIHByb2plY3ROYW1lXyApOwotICAgIHByb2plY3QuY3JlYXRlKCBkZXNjLCBudWxsICk7Ci0gICAgcHJvamVjdC5vcGVuKCBudWxsICk7Ci0gIH0KLSAgLyoqCi0gICAqIEBzZWUgVGVzdENhc2UjdGVhckRvd24oKQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLSAgICBzdXBlci50ZWFyRG93bigpOwotICAgIAotICAgIC8vIENyZWF0ZSBhIHRlc3QgcHJvamVjdCBpbiB0aGUgd29ya2JlbmNoCi0gICAgSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0gICAgSVByb2plY3QgICAgICAgcHJvamVjdCAgICAgICA9IHdvcmtzcGFjZVJvb3QuZ2V0UHJvamVjdCggcHJvamVjdE5hbWVfICk7Ci0gICAgCi0gICAgcHJvamVjdC5kZWxldGUoIHRydWUsIG51bGwgKTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBUZXN0IGdldFRlc3QoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBFY2xpcHNlU2NoZW1lVGVzdHMoIkVjbGlwc2VTY2hlbWVUZXN0cyIpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0QmFkVVJJcygpIAotICB7Ci0gICAgSVVSSVNjaGVtZSBzY2hlbWUgID0gRW52aXJvbm1lbnRTZXJ2aWNlLmdldEVjbGlwc2VTY2hlbWUoKTsKLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJVVJJIG5ld1VSSSA9IHNjaGVtZS5uZXdVUkkoICJib2d1czovc29tZWZvbGRlci9zb21lZmlsZS50eHQiKTsKLSAgICAgIGFzc2VydFRydWUoICJOb24gcGxhdGZvcm0gcHJvdG9jb2wgc2hvdWxkIGNhdXNlIGFuIGV4Y2VwdGlvbiIsIGZhbHNlICk7Ci0gICAgICAKLSAgICAgIC8vIFRoaXMgY29kZSBzaG91bGQgbmV2ZXIgcnVuLgotICAgICAgbmV3VVJJLmFzRmlsZSgpOwotICAgIH0KLSAgICBjYXRjaCggVVJJRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgIH0gICAKLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJVVJJIG5ld1VSSSA9IHNjaGVtZS5uZXdVUkkoICI6L3NvbWVmb2xkZXIvc29tZWZpbGUudHh0Iik7Ci0gICAgICBhc3NlcnRUcnVlKCAiTm9uIHBsYXRmb3JtIHByb3RvY29sIHNob3VsZCBjYXVzZSBhbiBleGNlcHRpb24iLCBmYWxzZSApOwotICAgICAgCi0gICAgICAvLyBUaGlzIGNvZGUgc2hvdWxkIG5ldmVyIHJ1bi4KLSAgICAgIG5ld1VSSS5hc0ZpbGUoKTsKLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICB9ICAgICAgIAotIAotICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJVVJJIG5ld1VSSSA9IHNjaGVtZS5uZXdVUkkoICAoU3RyaW5nKW51bGwgKTsKLSAgICAgIGFzc2VydFRydWUoICJOb24gcGxhdGZvcm0gcHJvdG9jb2wgc2hvdWxkIGNhdXNlIGFuIGV4Y2VwdGlvbiIsIGZhbHNlICk7Ci0gICAgCi0gICAgICAvLyBUaGlzIGNvZGUgc2hvdWxkIG5ldmVyIHJ1bi4KLSAgICAgIG5ld1VSSS5hc0ZpbGUoKTsKLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICB9ICAgCi0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgSVVSSSBuZXdVUkkgPSBzY2hlbWUubmV3VVJJKCAoVVJMKW51bGwgKTsKLSAgICAgIGFzc2VydFRydWUoICJOb24gcGxhdGZvcm0gcHJvdG9jb2wgc2hvdWxkIGNhdXNlIGFuIGV4Y2VwdGlvbiIsIGZhbHNlICk7Ci0gICAgCi0gICAgICAvLyBUaGlzIGNvZGUgc2hvdWxkIG5ldmVyIHJ1bi4KLSAgICAgIG5ld1VSSS5hc0ZpbGUoKTsKLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICB9ICAKLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJVVJJIG5ld1VSSSA9IHNjaGVtZS5uZXdVUkkoIChJVVJJKW51bGwgKTsKLSAgICAgIGFzc2VydFRydWUoICJOb24gcGxhdGZvcm0gcHJvdG9jb2wgc2hvdWxkIGNhdXNlIGFuIGV4Y2VwdGlvbiIsIGZhbHNlICk7Ci0gICAgCi0gICAgICAvLyBUaGlzIGNvZGUgc2hvdWxkIG5ldmVyIHJ1bi4KLSAgICAgIG5ld1VSSS5hc0ZpbGUoKTsKLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICB9ICAgICAgIAotICB9IAotICAKLSAgcHVibGljIHZvaWQgdGVzdE5ld1VSSSgpCi0gIHsKLSAgICBJVVJJU2NoZW1lICAgc2NoZW1lICAgICAgPSBFbnZpcm9ubWVudFNlcnZpY2UuZ2V0RWNsaXBzZVNjaGVtZSgpIDsKLSAgICAKLSAgICB0cnkKLSAgICB7ICAgICAgCi0gICAgICBJVVJJIHVyaTEgPSBzY2hlbWUubmV3VVJJKCAicGxhdGZvcm06L3Jlc291cmNlLyIgKyBwcm9qZWN0TmFtZV8gKyAgIi9teWZpbGUiICk7Ci0gICAgICBJVVJJIHVyaTIgPSBzY2hlbWUubmV3VVJJKCAicmVsYXRpdmVkaXJlY3RvcnkvcmVsYXRpdmVmaWxlIiApOwotICAgICAgSVVSSSB1cmkzID0gc2NoZW1lLm5ld1VSSSggdXJpMSApOwotICAgICAgSVVSSSB1cmk0ID0gc2NoZW1lLm5ld1VSSSggdXJpMiApOwotICAgICAgSVVSSSB1cmk1ID0gc2NoZW1lLm5ld1VSSSggbmV3IFVSTCggdXJpMS5hc1N0cmluZygpICkgKTsgICAgIAotICAgICAgCi0gICAgICBGaWxlIGZpbGUxID0gdXJpMS5hc0ZpbGUoKTsKLSAgICAgIAotICAgICAgdXJpMS50b3VjaExlYWYoKTsKLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggIklzIGEgZmlsZSIsIGZpbGUxLmlzRmlsZSgpICk7Ci0gICAgICBhc3NlcnRUcnVlKCAiRmlsZSBuYW1lcyBub3QgdGhlIHNhbWUiLCB1cmkxLmFzU3RyaW5nKCkuZXF1YWxzKCB1cmkzLnRvU3RyaW5nKCkgKSk7Ci0gICAgICBhc3NlcnRUcnVlKCAiRmlsZSBuYW1lcyBub3QgdGhlIHNhbWUiLCB1cmkyLmFzU3RyaW5nKCkuZXF1YWxzKCB1cmk0LnRvU3RyaW5nKCkgKSk7Ci0gICAgICBhc3NlcnRUcnVlKCAiRmlsZSBuYW1lcyBub3QgdGhlIHNhbWUiLCB1cmkxLmFzU3RyaW5nKCkuZXF1YWxzKCB1cmk1LnRvU3RyaW5nKCkgKSk7Ci0gICAgICBhc3NlcnRUcnVlKCAiUHJvdG9jb2wgbm90IHBsYXRmb3JtIiwgdXJpMS5nZXRVUklTY2hlbWUoKS50b1N0cmluZygpLmVxdWFscygicGxhdGZvcm0iKSk7Ci0gICAgICBhc3NlcnRUcnVlKCAiUHJvdG9jb2wgbm90IHBsYXRmb3JtIiwgdXJpMy5nZXRVUklTY2hlbWUoKS50b1N0cmluZygpLmVxdWFscygicGxhdGZvcm0iKSk7Ci0gICAgICBhc3NlcnRUcnVlKCAiUHJvdG9jb2wgbm90IHBsYXRmb3JtIiwgdXJpNS5nZXRVUklTY2hlbWUoKS50b1N0cmluZygpLmVxdWFscygicGxhdGZvcm0iKSk7Ci0gICAgICBhc3NlcnRUcnVlKCAiUHJvdG9jb2wgbm90IHJlbGF0aXZlIiwgdXJpMi5nZXRVUklTY2hlbWUoKS50b1N0cmluZygpLmVxdWFscygicmVsYXRpdmUiKSk7Ci0gICAgICBhc3NlcnRUcnVlKCAiUHJvdG9jb2wgbm90IHJlbGF0aXZlIiwgdXJpNC5nZXRVUklTY2hlbWUoKS50b1N0cmluZygpLmVxdWFscygicmVsYXRpdmUiKSk7Ci0gICAgICAKLSAgICAgIHVyaTEuZXJhc2UoKTsKLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICAgIGFzc2VydFRydWUoICJFeGNlcHRpb24gdGhyb3c6IiArIGV4Yy5nZXRNZXNzYWdlKCksIGZhbHNlICk7Ci0gICAgfSAgICAgCi0gICAgY2F0Y2goIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICAgIGFzc2VydFRydWUoICJFeGNlcHRpb24gdGhyb3c6IiArIGV4Yy5nZXRNZXNzYWdlKCksIGZhbHNlICk7ICAgICAgCi0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0SGllcmFyY2hpY2FsKCkKLSAgewotICAgIElVUklTY2hlbWUgc2NoZW1lID0gRW52aXJvbm1lbnRTZXJ2aWNlLmdldEVjbGlwc2VTY2hlbWUoKSA7Ci0gICAgCi0gICAgYXNzZXJ0VHJ1ZSggIk5vdCBoaWVyYXJjaGljYWwiLCBzY2hlbWUuaXNIaWVyYXJjaGljYWwoKSA9PSB0cnVlICk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RWYWxpZFVSSXMoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgSVVSSVNjaGVtZSBzY2hlbWUgPSBFbnZpcm9ubWVudFNlcnZpY2UuZ2V0RWNsaXBzZVNjaGVtZSgpOwotICAgICAgSVVSSSAgICAgICB1cmkxICAgPSBzY2hlbWUubmV3VVJJKCAicGxhdGZvcm06L3Jlc291cmNlL3NvbWVkaXIvc29tZWZpbGUiICk7Ci0gICAgICBJVVJJICAgICAgIHVyaTIgICA9IHNjaGVtZS5uZXdVUkkoICJwbGF0Zm9ybTovcmVzb3VyY2Uvc29tZWRpciIgKTsKLSAgICAgIElVUkkgICAgICAgdXJpMyAgID0gc2NoZW1lLm5ld1VSSSggInNvbWVyZWwiICk7Ci0gICAgICBJVVJJICAgICAgIHVyaTQgICA9IHNjaGVtZS5uZXdVUkkoICJzb21lcmVsL3NvbWVtb3JlcmVsIiApOwotICAgICAgSVVSSSAgICAgICB1cmk1ICAgPSBzY2hlbWUubmV3VVJJKCAiLi9zb21lcmVsL3NvbWVtb3JlIiApOwotICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggIlVSSSBub3QgdmFsaWQiLCBzY2hlbWUuaXNWYWxpZCggdXJpMSApICk7Ci0gICAgICBhc3NlcnRUcnVlKCAiVVJJIG5vdCB2YWxpZCIsIHNjaGVtZS5pc1ZhbGlkKCB1cmkyICkgKTsKLSAgICAgIGFzc2VydFRydWUoICJVUkkgbm90IHZhbGlkIiwgc2NoZW1lLmlzVmFsaWQoIHVyaTMgKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggIlVSSSBub3QgdmFsaWQiLCBzY2hlbWUuaXNWYWxpZCggdXJpNCApICk7Ci0gICAgICBhc3NlcnRUcnVlKCAiVVJJIG5vdCB2YWxpZCIsIHNjaGVtZS5pc1ZhbGlkKCB1cmk1ICkgKTsKLSAgICAgIGFzc2VydFRydWUoICJVUkkgaGFzIG5vdCB2YWxpZCBzdGF0dXMiLCBzY2hlbWUudmFsaWRhdGUoIHVyaTEgKS5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuT0sgKTsKLSAgICAgIGFzc2VydFRydWUoICJVUkkgaGFzIG5vdCB2YWxpZCBzdGF0dXMiLCBzY2hlbWUudmFsaWRhdGUoIHVyaTIgKS5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuT0sgKTsKLSAgICAgIGFzc2VydFRydWUoICJVUkkgaGFzIG5vdCB2YWxpZCBzdGF0dXMiLCBzY2hlbWUudmFsaWRhdGUoIHVyaTMgKS5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuT0sgKTsKLSAgICAgIGFzc2VydFRydWUoICJVUkkgaGFzIG5vdCB2YWxpZCBzdGF0dXMiLCBzY2hlbWUudmFsaWRhdGUoIHVyaTQgKS5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuT0sgKTsKLSAgICAgIGFzc2VydFRydWUoICJVUkkgaGFzIG5vdCB2YWxpZCBzdGF0dXMiLCBzY2hlbWUudmFsaWRhdGUoIHVyaTUgKS5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuT0sgKTsKLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICAgIGFzc2VydFRydWUoICJFeGNlcHRpb24gdGhyb3c6IiArIGV4Yy5nZXRNZXNzYWdlKCksIGZhbHNlICk7ICAgICAgCi0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFVSSXMoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgSVVSSVNjaGVtZSBlY2xpcHNlU2NoZW1lID0gRW52aXJvbm1lbnRTZXJ2aWNlLmdldEVjbGlwc2VTY2hlbWUoKTsKLSAgICAgIElVUklTY2hlbWUgZmlsZVNjaGVtZSAgICA9IEVudmlyb25tZW50U2VydmljZS5nZXRGaWxlU2NoZW1lKCk7Ci0gICAgICAKLSAgICAgIElVUkkgICAgICAgdXJpMSAgID0gZmlsZVNjaGVtZS5uZXdVUkkoICJmaWxlOi9jOi90ZW1wL3NvbWVkaXIvc29tZWZpbGUiICk7Ci0gICAgCi0gICAgICBhc3NlcnRUcnVlKCAiVVJJIHZhbGlkIiwgIWVjbGlwc2VTY2hlbWUuaXNWYWxpZCggdXJpMSApICk7Ci0gICAgICBhc3NlcnRUcnVlKCAiVVJJIGhhcyBhIHZhbGlkIHN0YXR1cyIsIGVjbGlwc2VTY2hlbWUudmFsaWRhdGUoIHVyaTEgKS5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IgKTsKLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICAgIGFzc2VydFRydWUoICJFeGNlcHRpb24gdGhyb3c6IiArIGV4Yy5nZXRNZXNzYWdlKCksIGZhbHNlICk7ICAgICAgCi0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdGVzdHMvRWNsaXBzZVVSSVRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdGVzdHMvRWNsaXBzZVVSSVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NmJkNWYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3Rlc3RzL0VjbGlwc2VVUklUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDIxNyAgIDEyODQ1NiBwbW9vZ2tAY2EuaWJtLmNvbSAtIFBldGVyIE1vb2drCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC50ZXN0czsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5FbnZpcm9ubWVudFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUklTY2hlbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuVVJJRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZVVSSVRlc3RzIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcHJvamVjdE5hbWVfID0gIlRlc3RQcm9qZWN0IjsKLSAgcHJpdmF0ZSBGaWxlICB0ZW1wRmlsZTsKLSAgcHJpdmF0ZSBGaWxlICB0ZW1wRGlyOwotICAKLSAgcHVibGljIEVjbGlwc2VVUklUZXN0cyhTdHJpbmcgbmFtZSkKLSAgewotICAgIHN1cGVyKG5hbWUpOwotICB9Ci0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpCi0gIHsKLSAgICBpZiAoYXJncy5sZW5ndGggPT0gMCkKLSAgICB7Ci0gICAgICBydW5BbGwoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoYXJncy5sZW5ndGggPT0gMSkKLSAgICB7Ci0gICAgICBTdHJpbmcgbWV0aG9kVG9SdW4gPSBhcmdzWzBdLnRyaW0oKTsKLSAgICAgIHJ1bk9uZShtZXRob2RUb1J1bik7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgewotICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKEVjbGlwc2VVUklUZXN0cy5jbGFzcyk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgcnVuQWxsKCkKLSAgewotICAgIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBydW5PbmUoU3RyaW5nIG1ldGhvZE5hbWUpCi0gIHsKLSAgICBUZXN0U3VpdGUgdGVzdFN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotICAgIFRlc3RDYXNlIHRlc3QgPSBuZXcgRWNsaXBzZVVSSVRlc3RzKG1ldGhvZE5hbWUpOwotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ2FsbGluZyBFY2xpcHNlVVJJVGVzdHMuIittZXRob2ROYW1lKTsKLSAgICB0ZXN0U3VpdGUuYWRkVGVzdCh0ZXN0KTsKLSAgICBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5ydW4odGVzdFN1aXRlKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBzZWUgVGVzdENhc2Ujc2V0VXAoKQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLSAgICBzdXBlci5zZXRVcCgpOwotICAgIAotICAgIHRlbXBGaWxlICA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoInRtcCIsICJ0bXAiLCBudWxsICk7Ci0gICAgdGVtcERpciAgID0gbmV3IEZpbGUoIHRlbXBGaWxlLmdldFBhcmVudEZpbGUoKSwgInRtcERpciIgKTsKLSAgICB0ZW1wRGlyLm1rZGlyKCk7Ci0gICAgCi0gICAgLy8gQ3JlYXRlIGEgdGVzdCBwcm9qZWN0IGluIHRoZSB3b3JrYmVuY2gKLSAgICBJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLSAgICBJUHJvamVjdCAgICAgICBwcm9qZWN0ICAgICAgID0gd29ya3NwYWNlUm9vdC5nZXRQcm9qZWN0KCBwcm9qZWN0TmFtZV8gKTsKLSAgICAKLSAgICBpZiggcHJvamVjdCAhPSBudWxsICYmIHByb2plY3QuZXhpc3RzKCkgKQotICAgIHsKLSAgICAgIHByb2plY3QuZGVsZXRlKCB0cnVlLCBudWxsICk7Ci0gICAgfQotICAgIAotICAgIC8vIENyZWF0ZSB0aGUgcHJvamVjdAotICAgIElQcm9qZWN0RGVzY3JpcHRpb24gZGVzYyA9IHdvcmtzcGFjZVJvb3QuZ2V0V29ya3NwYWNlKCkubmV3UHJvamVjdERlc2NyaXB0aW9uKCBwcm9qZWN0TmFtZV8gKTsKLSAgICBwcm9qZWN0LmNyZWF0ZSggZGVzYywgbnVsbCApOwotICAgIHByb2plY3Qub3BlbiggbnVsbCApOwotICB9Ci0gIC8qKgotICAgKiBAc2VlIFRlc3RDYXNlI3RlYXJEb3duKCkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbgotICB7Ci0gICAgc3VwZXIudGVhckRvd24oKTsKLSAgICAKLSAgICAvLyBDcmVhdGUgYSB0ZXN0IHByb2plY3QgaW4gdGhlIHdvcmtiZW5jaAotICAgIElXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotICAgIElQcm9qZWN0ICAgICAgIHByb2plY3QgICAgICAgPSB3b3Jrc3BhY2VSb290LmdldFByb2plY3QoIHByb2plY3ROYW1lXyApOwotICAgIAotICAgIHByb2plY3QuZGVsZXRlKCB0cnVlLCBudWxsICk7Ci0gICAgdGVtcEZpbGUuZGVsZXRlKCk7Ci0gICAgZGVsZXRlRGlyKCB0ZW1wRGlyICk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgVGVzdCBnZXRUZXN0KCkKLSAgewotICAgIHJldHVybiBuZXcgRWNsaXBzZVVSSVRlc3RzKCJFY2xpcHNlVVJJVGVzdHMiKTsKLSAgfQotICBwdWJsaWMgdm9pZCB0ZXN0QXZhaWxhYmxlKCkgCi0gIHsKLSAgICBJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgPSBFbnZpcm9ubWVudFNlcnZpY2UuZ2V0RWNsaXBzZUNvbnNvbGVFbnZpcm9ubWVudCgpOwotICAgIElVUklGYWN0b3J5ICBmYWN0b3J5ICAgICA9IGVudmlyb25tZW50LmdldFVSSUZhY3RvcnkoKTsKLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVjbGlwc2VVUklUZXN0cy50ZXN0QXZhaWxhYmxlKCkiKTsKLSAgICAKLSAgICB0cnkKLSAgICB7ICAgICAgCi0gICAgICBJVVJJIHVyaTEgPSBmYWN0b3J5Lm5ld1VSSSggInBsYXRmb3JtOi9yZXNvdXJjZS8iICsgcHJvamVjdE5hbWVfICsgICIvbXlmaWxlIiApOwotICAgICAgSVVSSSB1cmkyID0gZmFjdG9yeS5uZXdVUkkoIGdldFRtcEZpbGVVUkwoICJzb21lZmlsZSIgKSApOwotICAgICAgSVVSSSB1cmkzID0gZmFjdG9yeS5uZXdVUkkoICJyZWxhdGl2ZWRpcmVjdG9yeS9yZWxhdGl2ZWZpbGUiICk7Ci0gICAgICAKLSAgICAgIGFzc2VydFRydWUoICJOb3QgYXZhaWxhYmxlIGFzIFVSTCIsIHVyaTEuaXNBdmFpbGFibGVBc1VSTCgpICk7Ci0gICAgICBhc3NlcnRUcnVlKCAiTm90IGF2YWlsYWJsZSBhcyBVUkwiLCB1cmkyLmlzQXZhaWxhYmxlQXNVUkwoKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggIkF2YWlsYWJsZSBhcyBVUkwiLCAhdXJpMy5pc0F2YWlsYWJsZUFzVVJMKCkgKTsKLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggIk5vdCBhdmFpbGFibGUgYXMgRmlsZSIsIHVyaTEuaXNBdmFpbGFibGVBc0ZpbGUoKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggIk5vdCBhdmFpbGFibGUgYXMgRmlsZSIsIHVyaTIuaXNBdmFpbGFibGVBc0ZpbGUoKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggIkF2YWlsYWJsZSBhcyBGaWxlIiwgIXVyaTMuaXNBdmFpbGFibGVBc0ZpbGUoKSApOwotICAgICAgCi0gICAgICBGaWxlIGZpbGUxID0gdXJpMS5hc0ZpbGUoKTsKLSAgICAgIEZpbGUgZmlsZTIgPSB1cmkyLmFzRmlsZSgpOwotICAgICAgVVJMICB1cmwxICA9IHVyaTEuYXNVUkwoKTsKLSAgICAgIFVSTCAgdXJsMiAgPSB1cmkyLmFzVVJMKCk7Ci0gICAgICAKLSAgICAgIHVyaTEudG91Y2hMZWFmKCk7Ci0gICAgICB1cmkyLnRvdWNoTGVhZigpOwotICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAiSXMgYSBmaWxlIiwgZmlsZTEuaXNGaWxlKCkgKTsKLSAgICAgIGFzc2VydFRydWUoICJJcyBhIGZpbGUiLCBmaWxlMi5pc0ZpbGUoKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggIldyb25nIHByb3RvY29sIiwgdXJsMS5nZXRQcm90b2NvbCgpLmVxdWFscyggInBsYXRmb3JtIiApKTsKLSAgICAgIGFzc2VydFRydWUoICJXcm9uZyBwcm90b2NvbCIsIHVybDIuZ2V0UHJvdG9jb2woKS5lcXVhbHMoICJmaWxlIiApKTsKLSAgICAgIGFzc2VydFRydWUoIHVyaTEuYXNTdHJpbmcoKS5sZW5ndGgoKSA+IDUgKTsKLSAgICAgIGFzc2VydFRydWUoIHVyaTIuYXNTdHJpbmcoKS5sZW5ndGgoKSA+IDUgKTsKLSAgICAgIGFzc2VydFRydWUoIHVyaTEudG9TdHJpbmcoKS5sZW5ndGgoKSA+IDUgKTsKLSAgICAgIGFzc2VydFRydWUoIHVyaTIudG9TdHJpbmcoKS5sZW5ndGgoKSA+IDUgKTsKLSAgICAgIHVyaTEuZXJhc2UoKTsKLSAgICAgIHVyaTIuZXJhc2UoKTsKLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICAgIGFzc2VydFRydWUoICJFeGNlcHRpb24gdGhyb3c6IiArIGV4Yy5nZXRNZXNzYWdlKCksIGZhbHNlICk7Ci0gICAgfQotICB9ICAgICAgCi0gICAgICAKLSAgcHVibGljIHZvaWQgdGVzdEZhY3RvcnkoKSAKLSAgewotICAgIElFbnZpcm9ubWVudCBlbnZpcm9ubWVudCA9IEVudmlyb25tZW50U2VydmljZS5nZXRFY2xpcHNlQ29uc29sZUVudmlyb25tZW50KCk7Ci0gICAgSVVSSUZhY3RvcnkgIGZhY3RvcnkgICAgID0gZW52aXJvbm1lbnQuZ2V0VVJJRmFjdG9yeSgpOwotICAgIAotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRWNsaXBzZVVSSVRlc3RzLnRlc3RGYWN0b3J5KCkiKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBmYWN0b3J5Lm5ld1VSSVNjaGVtZSggbnVsbCApOwotICAgICAgYXNzZXJ0VHJ1ZSggIk51bGwgVVJJIHNjaGVtZSBzaG91bGQgY2F1c2UgYW4gZXhjZXB0aW9uIiwgZmFsc2UgKTsKLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICB9Ci0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgZmFjdG9yeS5uZXdVUklTY2hlbWUoICJib2d1c1Byb3RvY29sOi9zb21lZm9sZGVyL3NvbWVmaWxlLnR4dCIgKTsKLSAgICAgIGFzc2VydFRydWUoICJBbiB1bmRlZmluZWQgcHJvdG9jb2wgc2hvdWxkIGNhdXNlIGFuIGV4Y2VwdGlvbiIsIGZhbHNlICk7Ci0gICAgfQotICAgIGNhdGNoKCBVUklFeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgfQotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIGZhY3RvcnkubmV3VVJJU2NoZW1lKCAiL3NvbWVmb2xkZXIvc29tZWZpbGUudHh0IiApOwotICAgICAgYXNzZXJ0VHJ1ZSggIkFic29sdXRlIHBhdGggd2l0aCBubyBwcm90b2NvbCBzaG91bGQgY2F1c2UgYW4gZXhjZXB0aW9uIiwgZmFsc2UgKTsKLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICB9Ci0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgSVVSSVNjaGVtZSBzY2hlbWUxID0gZmFjdG9yeS5uZXdVUklTY2hlbWUoICJwbGF0Zm9ybTovcmVzb3VyY2UvbXlwcm9qL215ZmlsZSIgKTsKLSAgICAgIElVUklTY2hlbWUgc2NoZW1lMiA9IGZhY3RvcnkubmV3VVJJU2NoZW1lKCBnZXRUbXBGaWxlVVJMKCAic29tZWZpbGUyIiApICk7Ci0gICAgICBJVVJJU2NoZW1lIHNjaGVtZTMgPSBmYWN0b3J5Lm5ld1VSSVNjaGVtZSggInBsYXRmb3JtIiApOwotICAgICAgSVVSSVNjaGVtZSBzY2hlbWU0ID0gZmFjdG9yeS5uZXdVUklTY2hlbWUoICJmaWxlIiApOwotICAgICAgSVVSSVNjaGVtZSBzY2hlbWU1ID0gZmFjdG9yeS5uZXdVUkkoICJyZWwxL3JlbDIiICkuZ2V0VVJJU2NoZW1lKCk7Ci0gICAgICAKLSAgICAgIElVUkkgdXJpMSA9IGZhY3RvcnkubmV3VVJJKCAicGxhdGZvcm06L3Jlc291cmNlL215cHJvai9teWZpbGUiICk7Ci0gICAgICBJVVJJIHVyaTIgPSBmYWN0b3J5Lm5ld1VSSSggZ2V0VG1wRmlsZVVSTCggInNvbWVmaWxlMyIgKSApOwotICAgICAgSVVSSSB1cmkzID0gZmFjdG9yeS5uZXdVUkkoICJyZWxhdGl2ZWRpcmVjdG9yeS9yZWxhdGl2ZWZpbGUiICk7Ci0gICAgICAKLSAgICAgIElVUkkgdXJpNCA9IGZhY3RvcnkubmV3VVJJKCBuZXcgVVJMKCAicGxhdGZvcm06L3Jlc291cmNlL215cHJvai9teWZpbGUiICkpOwotICAgICAgSVVSSSB1cmk1ID0gZmFjdG9yeS5uZXdVUkkoIG5ldyBVUkwoIGdldFRtcEZpbGVVUkwoICJzb21lZmlsZTQiICkgKSApOwotICAKLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggIlNjaGVtZSBub3QgcGxhdGZvcm0gcHJvdG9jb2wiLCBzY2hlbWUxLnRvU3RyaW5nKCkuZXF1YWxzKCJwbGF0Zm9ybSIpICk7Ci0gICAgICBhc3NlcnRUcnVlKCAiU2NoZW1lIG5vdCBmaWxlIHByb3RvY29sIiwgc2NoZW1lMi50b1N0cmluZygpLmVxdWFscygiZmlsZSIpICk7Ci0gICAgICBhc3NlcnRUcnVlKCAiU2NoZW1lIG5vdCBwbGF0Zm9ybSIsIHNjaGVtZTMudG9TdHJpbmcoKS5lcXVhbHMoInBsYXRmb3JtIikgKTsKLSAgICAgIGFzc2VydFRydWUoICJTY2hlbWUgbm90IGZpbGUiLCBzY2hlbWU0LnRvU3RyaW5nKCkuZXF1YWxzKCJmaWxlIikgKTsKLSAgICAgIGFzc2VydFRydWUoICJTY2hlbWUgbm90IHJlbGF0aXZlIiwgc2NoZW1lNS50b1N0cmluZygpLmVxdWFscygicmVsYXRpdmUiKSApOwotICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAiU2NoZW1lIG5vdCBwbGF0Zm9ybSBwcm90b2NvbCIsIHVyaTEuZ2V0VVJJU2NoZW1lKCkudG9TdHJpbmcoKS5lcXVhbHMoInBsYXRmb3JtIikgKTsKLSAgICAgIGFzc2VydFRydWUoICJTY2hlbWUgbm90IGZpbGUgcHJvdG9jb2wiLCB1cmkyLmdldFVSSVNjaGVtZSgpLnRvU3RyaW5nKCkuZXF1YWxzKCJmaWxlIikgKTsKLSAgICAgIGFzc2VydFRydWUoICJTY2hlbWUgbm90IHJlbGF0aXZlIiwgdXJpMy5nZXRVUklTY2hlbWUoKS50b1N0cmluZygpLmVxdWFscygicmVsYXRpdmUiKSApOwotICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAiU2NoZW1lIG5vdCBwbGF0Zm9ybSBwcm90b2NvbCIsIHVyaTQuZ2V0VVJJU2NoZW1lKCkudG9TdHJpbmcoKS5lcXVhbHMoInBsYXRmb3JtIikgKTsKLSAgICAgIGFzc2VydFRydWUoICJTY2hlbWUgbm90IGZpbGUgcHJvdG9jb2wiLCB1cmk1LmdldFVSSVNjaGVtZSgpLnRvU3RyaW5nKCkuZXF1YWxzKCJmaWxlIikgKTsKLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICAgIGFzc2VydFRydWUoICJFeGNlcHRpb24gdGhyb3c6IiArIGV4Yy5nZXRNZXNzYWdlKCksIGZhbHNlICk7Ci0gICAgfQotICAgIGNhdGNoKCBNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgICBhc3NlcnRUcnVlKCAiRXhjZXB0aW9uIHRocm93OiIgKyBleGMuZ2V0TWVzc2FnZSgpLCBmYWxzZSApOyAgICAgIAotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdFRvdWNoRm9sZGVyKCkgCi0gIHsKLSAgICBJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgPSBFbnZpcm9ubWVudFNlcnZpY2UuZ2V0RWNsaXBzZUNvbnNvbGVFbnZpcm9ubWVudCgpOwotICAgIElVUklGYWN0b3J5ICBmYWN0b3J5ICAgICA9IGVudmlyb25tZW50LmdldFVSSUZhY3RvcnkoKTsKLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVjbGlwc2VVUklUZXN0cy50ZXN0VG91Y2hGb2xkZXIoKSIpOwotICAgIHRyeQotICAgIHsKLSAgICAgIElQYXRoIGZvbGRlclBhdGggID0gbmV3IFBhdGgoIHByb2plY3ROYW1lXyApLmFwcGVuZCggInRvcEZvbGRlciIgKS5tYWtlQWJzb2x1dGUoKTsKLSAgICAgIElQYXRoIGZvbGRlclBhdGgyID0gZm9sZGVyUGF0aC5hcHBlbmQoICJzcGFjZSBmb2xkZXIiICk7Ci0gICAgICBJVVJJICAgdXJpICAgICAgICAgID0gZmFjdG9yeS5uZXdVUkkoIGdldFVSTEZyb21QYXRoKCBmb2xkZXJQYXRoICkudG9TdHJpbmcoKSApOwotICAgICAgSVVSSSAgIHVyaTIgICAgICAgICA9IGZhY3RvcnkubmV3VVJJKCBnZXRVUkxGcm9tUGF0aCggZm9sZGVyUGF0aDIgKS50b1N0cmluZygpICk7Ci0gICAgICAKLSAgICAgIGFzc2VydFRydWUoICJ0b3BGb2xkZXIgc2hvdWxkIG5vdCBleGlzdCIsICF1cmkuaXNQcmVzZW50KCkgKTsKLSAgICAgIAotICAgICAgdXJpLnRvdWNoRm9sZGVyKCk7Ci0gICAKLSAgICAgIGFzc2VydFRydWUoICJ0b3BGb2xkZXIgc2hvdWxkIGV4aXN0IiwgdXJpLmlzUHJlc2VudCgpICk7Ci0gICAgICAKLSAgICAgIElQYXRoIG5lc3RlZFBhdGggPSBmb2xkZXJQYXRoLmFwcGVuZCggImxldmVsMSIgKS5hcHBlbmQoICJsZXZlbDIiICk7Ci0gICAgICBJVVJJICAgbmVzdGVkdXJpICA9IGZhY3RvcnkubmV3VVJJKCBnZXRVUkxGcm9tUGF0aCggbmVzdGVkUGF0aCApLnRvU3RyaW5nKCkgKTsKLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggIm5lc3RlZEZvbGRlciBzaG91bGQgbm90IGV4aXN0IiwgIW5lc3RlZHVyaS5pc1ByZXNlbnQoKSApOwotICAgICAgCi0gICAgICBuZXN0ZWR1cmkudG91Y2hGb2xkZXIoKTsKLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggIm5lc3RlZEZvbGRlciBzaG91bGQgZXhpc3QiLCBuZXN0ZWR1cmkuaXNQcmVzZW50KCkgKTsKLSAgICAgIAotICAgICAgSVVSSSBjaGlsZDEgPSB1cmkyLmFwcGVuZCggZmFjdG9yeS5uZXdVUkkoICJjaGlsZDEiICkgKTsKLSAgICAgIElVUkkgY2hpbGQyID0gdXJpMi5hcHBlbmQoIGZhY3RvcnkubmV3VVJJKCAiY2hpbGQyIiApICk7Ci0gICAgICAKLSAgICAgIGNoaWxkMS50b3VjaExlYWYoKTsKLSAgICAgIGNoaWxkMi50b3VjaExlYWYoKTsKLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSAoICJDaGlsZCAxIGluIGJsYW5rIGZvbGRlciBzaG91bGQgZXhpc3QgIiwgY2hpbGQxLmlzUHJlc2VudCgpICk7Ci0gICAgICBhc3NlcnRUcnVlICggIkNoaWxkIDIgaW4gYmxhbmsgZm9sZGVyIHNob3VsZCBleGlzdCAiLCBjaGlsZDIuaXNQcmVzZW50KCkgKTsKLSAgICAgfQotICAgIGNhdGNoKCBVUklFeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgICBhc3NlcnRUcnVlKCAiRXhjZXB0aW9uIHRocm93OiIgKyBleGMuZ2V0TWVzc2FnZSgpLCBmYWxzZSApOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdExpc3QoKSAKLSAgewotICAgIElFbnZpcm9ubWVudCAgZW52aXJvbm1lbnQgPSBFbnZpcm9ubWVudFNlcnZpY2UuZ2V0RWNsaXBzZUNvbnNvbGVFbnZpcm9ubWVudCgpOwotICAgIElVUklGYWN0b3J5ICAgZmFjdG9yeSAgICAgPSBlbnZpcm9ubWVudC5nZXRVUklGYWN0b3J5KCk7Ci0gICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCJFY2xpcHNlVVJJVGVzdHMudGVzdExpc3QoKSIpOwotICAgIHRyeQotICAgIHsKLSAgICAgIElQYXRoIGZvbGRlclBhdGgwID0gbmV3IFBhdGgoIHByb2plY3ROYW1lXyApLmFwcGVuZCggInRvcEZvbGRlcjIiICkubWFrZUFic29sdXRlKCk7Ci0gICAgICBJUGF0aCBmb2xkZXJQYXRoMSA9IG5ldyBQYXRoKCBwcm9qZWN0TmFtZV8gKS5hcHBlbmQoICJ0b3BGb2xkZXIyIiApLmFwcGVuZCggImxlYWYxIiApLm1ha2VBYnNvbHV0ZSgpOwotICAgICAgSVBhdGggZm9sZGVyUGF0aDIgPSBuZXcgUGF0aCggcHJvamVjdE5hbWVfICkuYXBwZW5kKCAidG9wRm9sZGVyMiIgKS5hcHBlbmQoICJsZWFmMiIgKS5tYWtlQWJzb2x1dGUoKTsKLSAgICAgIElQYXRoIGZvbGRlclBhdGgzID0gbmV3IFBhdGgoIHByb2plY3ROYW1lXyApLmFwcGVuZCggInRvcEZvbGRlcjIiICkuYXBwZW5kKCAibGVhZjMiICkubWFrZUFic29sdXRlKCk7Ci0gICAgICBJVVJJICAgdXJpMCAgICAgICAgPSBmYWN0b3J5Lm5ld1VSSSggZ2V0VVJMRnJvbVBhdGgoIGZvbGRlclBhdGgwICkudG9TdHJpbmcoKSApOwotICAgICAgSVVSSSAgIHVyaTEgICAgICAgID0gZmFjdG9yeS5uZXdVUkkoIGdldFVSTEZyb21QYXRoKCBmb2xkZXJQYXRoMSApLnRvU3RyaW5nKCkgKTsKLSAgICAgIElVUkkgICB1cmkyICAgICAgICA9IGZhY3RvcnkubmV3VVJJKCBnZXRVUkxGcm9tUGF0aCggZm9sZGVyUGF0aDIgKS50b1N0cmluZygpICk7Ci0gICAgICBJVVJJICAgdXJpMyAgICAgICAgPSBmYWN0b3J5Lm5ld1VSSSggZ2V0VVJMRnJvbVBhdGgoIGZvbGRlclBhdGgzICkudG9TdHJpbmcoKSApOwotICAgICAgCi0gICAgICB1cmkxLnRvdWNoRm9sZGVyKCk7Ci0gICAgICB1cmkyLnRvdWNoRm9sZGVyKCk7Ci0gICAgICB1cmkzLnRvdWNoRm9sZGVyKCk7Ci0gICAgICAKLSAgICAgIElVUklbXSBiYWJpZXMgPSB1cmkwLmxpc3QoKTsKLSAgICAgICAgICAKLSAgICAgIGFzc2VydFRydWUoICJmb2xkZXIgcGF0aCBzaG91bGQgaGF2ZSAzIGNoaWxkcmVuIiwgYmFiaWVzLmxlbmd0aCA9PSAzICk7Ci0gICAgICAKLSAgICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCBiYWJpZXMubGVuZ3RoOyBpbmRleCsrICkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nICBmb2xkZXJOYW1lID0gYmFiaWVzW2luZGV4XS50b1N0cmluZygpOwotICAgICAgICBTdHJpbmcgIGxlYWZOYW1lICAgPSBmb2xkZXJOYW1lLnN1YnN0cmluZyggZm9sZGVyTmFtZS5sZW5ndGgoKSAtIDUsIGZvbGRlck5hbWUubGVuZ3RoKCkgKTsKLSAgICAgICAgYm9vbGVhbiBPayAgICAgICAgID0gbGVhZk5hbWUuZXF1YWxzKCAibGVhZjEiKSB8fCBsZWFmTmFtZS5lcXVhbHMoICJsZWFmMiIgKSB8fCBsZWFmTmFtZS5lcXVhbHMoICJsZWFmMyIgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggIldyb25nIGxlYWYgYmFieSB1cmk6IiArIGZvbGRlck5hbWUgKyAiLCIgKyBsZWFmTmFtZSwgT2sgKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgSVVSSVtdIGJhYmllczIgPSB1cmkwLmxpc3QoIG5ldyBJVVJJRmlsdGVyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0cyggSVVSSSB1cmkgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICF1cmkudG9TdHJpbmcoKS5lbmRzV2l0aCggImxlYWYyIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gKTsKLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggImZvbGRlciBwYXRoIHNob3VsZCBoYXZlIDIgZmlsdGVyZWQgY2hpbGRyZW4iLCBiYWJpZXMyLmxlbmd0aCA9PSAyICk7Ci0gICAgICAKLSAgICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCBiYWJpZXMyLmxlbmd0aDsgaW5kZXgrKyApCi0gICAgICAgewotICAgICAgICBTdHJpbmcgIGZvbGRlck5hbWUgPSBiYWJpZXMyW2luZGV4XS50b1N0cmluZygpOwotICAgICAgICBTdHJpbmcgIGxlYWZOYW1lICAgPSBmb2xkZXJOYW1lLnN1YnN0cmluZyggZm9sZGVyTmFtZS5sZW5ndGgoKSAtIDUsIGZvbGRlck5hbWUubGVuZ3RoKCkgKTsKLSAgICAgICAgYm9vbGVhbiBPayAgICAgICAgID0gbGVhZk5hbWUuZXF1YWxzKCAibGVhZjEiKSB8fCBsZWFmTmFtZS5lcXVhbHMoICJsZWFmMyIgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydFRydWUoICJXcm9uZyBsZWFmIGJhYnkgdXJpOiIgKyBmb2xkZXJOYW1lICsgIiwiICsgbGVhZk5hbWUsIE9rICk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoKCBVUklFeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgICBhc3NlcnRUcnVlKCAiRXhjZXB0aW9uIHRocm93OiIgKyBleGMuZ2V0TWVzc2FnZSgpLCBmYWxzZSApOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdEdldFVSSVNjaGVtZSgpCi0gIHsKLSAgICBJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgPSBFbnZpcm9ubWVudFNlcnZpY2UuZ2V0RWNsaXBzZUNvbnNvbGVFbnZpcm9ubWVudCgpOwotICAgIElVUklGYWN0b3J5ICBmYWN0b3J5ICAgICA9IGVudmlyb25tZW50LmdldFVSSUZhY3RvcnkoKTsKLSAgIAotICAgIHRyeQotICAgIHsgCi0gICAgICBJUGF0aCAgICAgIGZvbGRlclBhdGgwICA9IG5ldyBQYXRoKCBwcm9qZWN0TmFtZV8gKS5hcHBlbmQoICJ0ZXN0R2V0U2NoZW1lIiApLm1ha2VBYnNvbHV0ZSgpOwotICAgICAgSVVSSSAgICAgICB1cmkwICAgICAgICAgPSBmYWN0b3J5Lm5ld1VSSSggZ2V0VVJMRnJvbVBhdGgoIGZvbGRlclBhdGgwICkudG9TdHJpbmcoKSApOwotICAgICAgSVVSSVNjaGVtZSBzY2hlbWUgICAgICAgPSB1cmkwLmdldFVSSVNjaGVtZSgpOwotICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAiU2NoZW1lIG5hbWUgaXMgbm90IHBsYXRmb3JtIiwgc2NoZW1lLnRvU3RyaW5nKCkuZXF1YWxzKCAicGxhdGZvcm0iICkgKTsKLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICAgIGFzc2VydFRydWUoICJVbmV4cGVjdGVkIGV4Y2VwdGlvbiIsIGZhbHNlICk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0QXBwZW5kKCkgCi0gIHsKLSAgICBJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgPSBFbnZpcm9ubWVudFNlcnZpY2UuZ2V0RWNsaXBzZUNvbnNvbGVFbnZpcm9ubWVudCgpOwotICAgIElVUklGYWN0b3J5ICBmYWN0b3J5ICAgICA9IGVudmlyb25tZW50LmdldFVSSUZhY3RvcnkoKTsKLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVjbGlwc2VVUklUZXN0cy50ZXN0QXBwZW5kKCkiKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJUGF0aCBmb2xkZXJQYXRoMCAgPSBuZXcgUGF0aCggcHJvamVjdE5hbWVfICkuYXBwZW5kKCAidG9wRm9sZGVyMyIgKS5tYWtlQWJzb2x1dGUoKTsKLSAgICAgIElVUkkgICB1cmkwICAgICAgICAgPSBmYWN0b3J5Lm5ld1VSSSggZ2V0VVJMRnJvbVBhdGgoIGZvbGRlclBhdGgwICkudG9TdHJpbmcoKSApOwotICAgICAgSVVSSSAgIHVyaVJlbGF0aXZlMSA9IGZhY3RvcnkubmV3VVJJKCAibGV2ZWwxIik7Ci0gICAgICBJVVJJICAgdXJpUmVsYXRpdmUyID0gZmFjdG9yeS5uZXdVUkkoICJsZXZlbDIiKTsKLSAgICAgIAotICAgICAgSVVSSSAgIG5ld1VSSSAgICAgICA9IHVyaTAuYXBwZW5kKCB1cmlSZWxhdGl2ZTEgKS5hcHBlbmQoIHVyaVJlbGF0aXZlMiApOwotICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAibmV3VVJJIHNob3VsZCBub3QgZXhpc3QiLCAhbmV3VVJJLmlzUHJlc2VudCgpICk7Ci0gICAgICAKLSAgICAgIG5ld1VSSS50b3VjaEZvbGRlcigpOwotICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAibmV3VVJJIHNob3VsZCBleGlzdCIsIG5ld1VSSS5pc1ByZXNlbnQoKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggIm5ld1VSSSBzaG91bGQgbm90IGJlIGEgbGVhZiIsICFuZXdVUkkuaXNMZWFmKCkgKTsKLSAgICAgIAotICAgICAgLy8gRW5zdXJlIHRoYXQgYXBwZW5kIHBhcmFtZXRlciBpcyByZWxhdGl2ZS4KLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBJVVJJIG5ld1VSSTIgPSB1cmkwLmFwcGVuZCggdXJpMCApOyAgCi0gICAgICAgIGFzc2VydFRydWUoICJBcHBlbmRpbmcgdXNpbmcgYSBub24tcmVsYXRpdmUgc2hvdWxkIHRocm93IGFuZCBleGNlcHRpb24iLCB0cnVlICk7Ci0gICAgICAgIAotICAgICAgICAvLyBUaGlzIGNvZGUgc2hvdWxkIG5ldmVyIHJ1bi4KLSAgICAgICAgbmV3VVJJMi5hc0ZpbGUoKTsgCi0gICAgICB9Ci0gICAgICBjYXRjaCggVVJJRXhjZXB0aW9uIGV4YyApCi0gICAgICB7Ci0gICAgICB9Ci0gICAgICAKLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsgICAKLSAgICAgIGFzc2VydFRydWUoICJFeGNlcHRpb24gdGhyb3c6IiArIGV4Yy5nZXRNZXNzYWdlKCksIGZhbHNlICk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0VG91Y2hMZWFmKCkKLSAgewotICAgIElFbnZpcm9ubWVudCBlbnZpcm9ubWVudCA9IEVudmlyb25tZW50U2VydmljZS5nZXRFY2xpcHNlQ29uc29sZUVudmlyb25tZW50KCk7Ci0gICAgSVVSSUZhY3RvcnkgIGZhY3RvcnkgICAgID0gZW52aXJvbm1lbnQuZ2V0VVJJRmFjdG9yeSgpOwotICAgIAotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRWNsaXBzZVVSSVRlc3RzLnRlc3RUb3VjaExlYWYoKSIpOwotICAgIHRyeQotICAgIHsKLSAgICAgIElQYXRoIGZvbGRlclBhdGgwICA9IG5ldyBQYXRoKCBwcm9qZWN0TmFtZV8gKS5hcHBlbmQoICJ0b3BGb2xkZXI0IiApLm1ha2VBYnNvbHV0ZSgpOwotICAgICAgSVVSSSAgIHVyaTAgICAgICAgICA9IGZhY3RvcnkubmV3VVJJKCBnZXRVUkxGcm9tUGF0aCggZm9sZGVyUGF0aDAgKS50b1N0cmluZygpICk7Ci0gICAgICBJVVJJICAgdXJpUmVsYXRpdmUxID0gZmFjdG9yeS5uZXdVUkkoICJsZXZlbDEiKTsKLSAgICAgIElVUkkgICB1cmlSZWxhdGl2ZTIgPSBmYWN0b3J5Lm5ld1VSSSggImxlYWZGaWxlLnR4dCIpOwotICAgICAgSVVSSSAgIG5ld1VSSSAgICAgICA9IHVyaTAuYXBwZW5kKCB1cmlSZWxhdGl2ZTEgKS5hcHBlbmQoIHVyaVJlbGF0aXZlMiApOwotICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAibmV3VVJJIHNob3VsZCBub3QgZXhpc3QiLCAhbmV3VVJJLmlzUHJlc2VudCgpICk7Ci0gICAgICAKLSAgICAgIG5ld1VSSS50b3VjaExlYWYoKTsKLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggIm5ld1VSSSBzaG91bGQgZXhpc3QiLCBuZXdVUkkuaXNQcmVzZW50KCkgKTsKLSAgICAgIGFzc2VydFRydWUoICJuZXdVUkkgc2hvdWxkIGJlIGEgbGVhZiIsIG5ld1VSSS5pc0xlYWYoKSApOwotICAgICAgCi0gICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gICA9IG5ld1VSSS5nZXRJbnB1dFN0cmVhbSgpOwotICAgICAgaW50ICAgICAgICAgYnl0ZVJlYWQgPSAwOwotICAgICAgCi0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgYnl0ZVJlYWQgPSBzdHJlYW0ucmVhZCgpOyAvLyBSZXR1cm5zIGEgLTEgaWYgbm8gYnl0ZXMgYXJlIHJlYWQsIHdoaWNoIHNob3VsZCBiZSB0aGUgY2FzZSBoZXJlLiAKLSAgICAgIH0KLSAgICAgIGNhdGNoKCBJT0V4Y2VwdGlvbiBleGMgKQotICAgICAgewotICAgICAgICBhc3NlcnRUcnVlKCAiRXhjZXB0aW9uIHRocm93OiIgKyBleGMuZ2V0TWVzc2FnZSgpLCBmYWxzZSApOwotICAgICAgfQotICAgICAgZmluYWxseQotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIHN0cmVhbS5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBJT0V4Y2VwdGlvbiBleGMgKQotICAgICAgICB7Ci0gICAgICAgICAgYXNzZXJ0VHJ1ZSggIkV4Y2VwdGlvbiB0aHJvdzoiICsgZXhjLmdldE1lc3NhZ2UoKSwgZmFsc2UgKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAiVGhlcmUgc2hvdWxkIGJlIG5vIGJ5dGVzIGluIHRoaXMgc3RyZWFtIiwgIGJ5dGVSZWFkID09IC0xICk7Ci0gICAgICAKLSAgICAgfQotICAgIGNhdGNoKCBVUklFeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgICBhc3NlcnRUcnVlKCAiRXhjZXB0aW9uIHRocm93OiIgKyBleGMuZ2V0TWVzc2FnZSgpLCBmYWxzZSApOwotICAgIH0gICAgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0SU9PcGVyYXRpb25zKCkKLSAgewotICAgIElFbnZpcm9ubWVudCBlbnZpcm9ubWVudCA9IEVudmlyb25tZW50U2VydmljZS5nZXRFY2xpcHNlQ29uc29sZUVudmlyb25tZW50KCk7Ci0gICAgSVVSSUZhY3RvcnkgIGZhY3RvcnkgICAgID0gZW52aXJvbm1lbnQuZ2V0VVJJRmFjdG9yeSgpOwotICAgIE91dHB1dFN0cmVhbVdyaXRlciAgICAgICBzdHJlYW0gICAgICA9IG51bGw7Ci0gICAgUHJpbnRXcml0ZXIgICAgICAgICAgICAgIHdyaXRlciAgICAgID0gbnVsbDsKLSAgICBJbnB1dFN0cmVhbVJlYWRlciAgICAgICAgaW5wdXRTdHJlYW0gPSBudWxsOwotICAgIEJ1ZmZlcmVkUmVhZGVyICAgICAgICAgICByZWFkZXIgICAgICA9IG51bGw7Ci0gICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCJFY2xpcHNlVVJJVGVzdHMudGVzdElPT3BlcmF0aW9ucygpIik7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgSVBhdGggZm9sZGVyUGF0aDAgID0gbmV3IFBhdGgoIHByb2plY3ROYW1lXyApLmFwcGVuZCggInRvcEZvbGRlcjUiICkubWFrZUFic29sdXRlKCk7Ci0gICAgICBJVVJJICAgdXJpMCAgICAgICAgID0gZmFjdG9yeS5uZXdVUkkoIGdldFVSTEZyb21QYXRoKCBmb2xkZXJQYXRoMCApLnRvU3RyaW5nKCkgKTsKLSAgICAgIElVUkkgICB1cmlSZWxhdGl2ZTEgPSBmYWN0b3J5Lm5ld1VSSSggImxldmVsMSIpOwotICAgICAgSVVSSSAgIHVyaVJlbGF0aXZlMiA9IGZhY3RvcnkubmV3VVJJKCAibGVhZkZpbGUudHh0Iik7Ci0gICAgICBJVVJJICAgbmV3VVJJICAgICAgID0gdXJpMC5hcHBlbmQoIHVyaVJlbGF0aXZlMSApLmFwcGVuZCggdXJpUmVsYXRpdmUyICk7Ci0gICAgICAKLSAgICAgIGFzc2VydFRydWUoICJuZXdVUkkgc2hvdWxkIG5vdCBleGlzdCIsICFuZXdVUkkuaXNQcmVzZW50KCkgKTsKLSAgICAgIGFzc2VydFRydWUoICJuZXdVUkkgc2hvdWxkIG5vdCBiZSByZWFkYWJsZSIsICFuZXdVUkkuaXNSZWFkYWJsZSgpICk7Ci0gICAgICBhc3NlcnRUcnVlKCAibmV3VVJJIHNob3VsZCBiZSB3cml0YWJsZSIsICFuZXdVUkkuaXNXcml0YWJsZSgpICk7Ci0gICAgICAKLSAgICAgIHN0cmVhbSA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoIG5ld1VSSS5nZXRPdXRwdXRTdHJlYW0oKSApOwotICAgICAgd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKCBzdHJlYW0gKTsKLSAgICAgIAotICAgICAgd3JpdGVyLnByaW50bG4oICJUaGlzIGlzIGxpbmUgMSBvZiB0aGUgZmlsZS4iICk7IAotICAgICAgd3JpdGVyLnByaW50bG4oICJUaGlzIGlzIGxpbmUgMiBvZiB0aGUgZmlsZS4iICk7Ci0gICAgICB3cml0ZXIucHJpbnRsbiggIlRoaXMgaXMgdGhlIGVuZCBvZiB0aGUgZmlsZS4iICk7Ci0gICAgICAKLSAgICAgIHdyaXRlci5jbG9zZSgpOwotICAgICAgc3RyZWFtLmNsb3NlKCk7Ci0gICAgICB3cml0ZXIgPSBudWxsOwotICAgICAgc3RyZWFtID0gbnVsbDsKLSAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAibmV3VVJJIHNob3VsZCBiZSByZWFkYWJsZSIsIG5ld1VSSS5pc1JlYWRhYmxlKCkgKTsKLSAgICAgIGFzc2VydFRydWUoICJuZXdVUkkgc2hvdWxkIGJlIHdyaXRhYmxlIiwgbmV3VVJJLmlzV3JpdGFibGUoKSApOwotICAgICAgCi0gICAgICAvLyBOb3cgcmVhZCBiYWNrIHRoaXMgbmV3IGZpbGUuCi0gICAgICBpbnB1dFN0cmVhbSA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlciggbmV3VVJJLmdldElucHV0U3RyZWFtKCkgKTsKLSAgICAgIHJlYWRlciAgICAgID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKCBpbnB1dFN0cmVhbSApOwotICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAiQmFkIGZpcnN0IGxpbmUgb2YgZmlsZSIsIHJlYWRlci5yZWFkTGluZSgpLmVxdWFscygiVGhpcyBpcyBsaW5lIDEgb2YgdGhlIGZpbGUuIikgKTsgCi0gICAgICBhc3NlcnRUcnVlKCAiQmFkIHNlY29uZCBsaW5lIG9mIGZpbGUiLCByZWFkZXIucmVhZExpbmUoKS5lcXVhbHMoIlRoaXMgaXMgbGluZSAyIG9mIHRoZSBmaWxlLiIpICk7IAotICAgICAgYXNzZXJ0VHJ1ZSggIkJhZCBsYXN0IGxpbmUgb2YgZmlsZSIsIHJlYWRlci5yZWFkTGluZSgpLmVxdWFscygiVGhpcyBpcyB0aGUgZW5kIG9mIHRoZSBmaWxlLiIpICk7Ci0gICAgICBhc3NlcnRUcnVlKCAiRXh0cmEgbGluZXMgZm91bmQgaW4gZmlsZSIsIHJlYWRlci5yZWFkTGluZSgpID09IG51bGwgKTsKLSAgICAgIAotICAgICAgcmVhZGVyLmNsb3NlKCk7Ci0gICAgICAKLSAgICAgIC8vTm93IHJlbmFtZSB0aGUgZm9sZGVyLgotICAgICAgSVVSSSBsZXZlbDEgICA9IHVyaTAuYXBwZW5kKCB1cmlSZWxhdGl2ZTEgKTsKLSAgICAgIElVUkkgbmV3TGV2ZWwgPSB1cmkwLmFwcGVuZCggZmFjdG9yeS5uZXdVUkkoIm5ld0xldmVsMSIpICk7Ci0gICAgICBJVVJJIG9sZEZpbGUgID0gbmV3TGV2ZWwuYXBwZW5kKCB1cmlSZWxhdGl2ZTIgKTsKLSAgICAgIElVUkkgbmV3RmlsZSAgPSBuZXdMZXZlbC5hcHBlbmQoIGZhY3RvcnkubmV3VVJJKCAibmV3RmlsZSIgKSApOwotICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAiVVJJIGlzIG5vdCBwcmVzZW50IiwgbmV3VVJJLmlzUHJlc2VudCgpICk7Ci0gICAgICBhc3NlcnRUcnVlKCAiVVJJIGlzIHByZXNlbnQiLCAhbmV3TGV2ZWwuYXBwZW5kKHVyaVJlbGF0aXZlMikuaXNQcmVzZW50KCkgKTsKLSAgICAgIAotICAgICAgbGV2ZWwxLnJlbmFtZSggbmV3TGV2ZWwgKTsKLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggIlVSSSBpcyBwcmVzZW50IiwgIW5ld1VSSS5pc1ByZXNlbnQoKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggIlVSSSBpcyBub3QgcHJlc2VudCIsIG5ld0xldmVsLmFwcGVuZCh1cmlSZWxhdGl2ZTIpLmlzUHJlc2VudCgpICk7Ci0gICAgICAKLSAgICAgIGFzc2VydFRydWUoICJVUkkgaXMgcHJlc2VudCIsICFuZXdGaWxlLmlzUHJlc2VudCgpICk7Ci0gICAgICBhc3NlcnRUcnVlKCAiVVJJIGlzIG5vdCBwcmVzZW50Iiwgb2xkRmlsZS5pc1ByZXNlbnQoKSApOwotICAgICAgCi0gICAgICBvbGRGaWxlLnJlbmFtZSggbmV3RmlsZSApOwotICAgICAgICAgICAKLSAgICAgIGFzc2VydFRydWUoICJVUkkgaXMgbm90IHByZXNlbnQiLCBuZXdGaWxlLmlzUHJlc2VudCgpICk7Ci0gICAgICBhc3NlcnRUcnVlKCAiVVJJIGlzIHByZXNlbnQiLCAhb2xkRmlsZS5pc1ByZXNlbnQoKSApOyAgICAgIAotICAgIH0KLSAgICBjYXRjaCggVVJJRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgYXNzZXJ0VHJ1ZSggIkV4Y2VwdGlvbiB0aHJvdzoiICsgZXhjLmdldE1lc3NhZ2UoKSwgZmFsc2UgKTsKLSAgICB9Ci0gICAgY2F0Y2goIElPRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgYXNzZXJ0VHJ1ZSggIkV4Y2VwdGlvbiB0aHJvdzoiICsgZXhjLmdldE1lc3NhZ2UoKSwgZmFsc2UgKTsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGlmKCBzdHJlYW0gIT0gbnVsbCApCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgd3JpdGVyLmNsb3NlKCk7Ci0gICAgICAgICAgc3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIElPRXhjZXB0aW9uIGV4YyApCi0gICAgICAgIHsKLSAgICAgICAgICBhc3NlcnRUcnVlKCAiRXhjZXB0aW9uIHRocm93OiIgKyBleGMuZ2V0TWVzc2FnZSgpLCBmYWxzZSApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGlmKCBpbnB1dFN0cmVhbSAhPSBudWxsICkKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBpbnB1dFN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgIHJlYWRlci5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBJT0V4Y2VwdGlvbiBleGMgKQotICAgICAgICB7Ci0gICAgICAgICAgYXNzZXJ0VHJ1ZSggIkV4Y2VwdGlvbiB0aHJvdzoiICsgZXhjLmdldE1lc3NhZ2UoKSwgZmFsc2UgKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdFJlbGF0aXZlKCkKLSAgewotICAgIElFbnZpcm9ubWVudCBlbnZpcm9ubWVudCA9IEVudmlyb25tZW50U2VydmljZS5nZXRFY2xpcHNlQ29uc29sZUVudmlyb25tZW50KCk7Ci0gICAgSVVSSUZhY3RvcnkgIGZhY3RvcnkgICAgID0gZW52aXJvbm1lbnQuZ2V0VVJJRmFjdG9yeSgpOwotICAgIAotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRWNsaXBzZVVSSVRlc3RzLnRlc3RSZWxhdGl2ZSgpIik7Ci0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgSVBhdGggZm9sZGVyUGF0aDAgICA9IG5ldyBQYXRoKCBwcm9qZWN0TmFtZV8gKS5hcHBlbmQoICJyZWxhdGl2ZVByb2oiICkubWFrZUFic29sdXRlKCk7Ci0gICAgICBJVVJJICAgdXJpMCAgICAgICAgID0gZmFjdG9yeS5uZXdVUkkoIGdldFVSTEZyb21QYXRoKCBmb2xkZXJQYXRoMCApLnRvU3RyaW5nKCkgKTsKLSAgICAgIElVUkkgICB1cmlSZWxhdGl2ZTEgPSBmYWN0b3J5Lm5ld1VSSSggImxldmVsMSIpOwotICAgICAgSVVSSSAgIGxldmVsMVVSSSAgICA9IHVyaTAuYXBwZW5kKCB1cmlSZWxhdGl2ZTEgKTsKLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggIlVyaSBpcyByZWxhdGl2ZSIsICF1cmkwLmlzUmVsYXRpdmUoKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggIlVyaSBpcyBub3QgcmVsYXRpdmUiLCB1cmlSZWxhdGl2ZTEuaXNSZWxhdGl2ZSgpICk7Ci0gICAgICBhc3NlcnRUcnVlKCAiVXJpIGlzIHJlbGF0aXZlIiwgIWxldmVsMVVSSS5pc1JlbGF0aXZlKCkgKTsKLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggIlVyaSBpcyBub3QgaGllcmFyY2hpY2FsIiwgdXJpMC5pc0hpZXJhcmNoaWNhbCgpICk7Ci0gICAgICBhc3NlcnRUcnVlKCAiVXJpIGlzIG5vdCBoaWVyYXJjaGljYWwiLCB1cmlSZWxhdGl2ZTEuaXNIaWVyYXJjaGljYWwoKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggIlVyaSBpcyBub3QgaGllcmFyY2hpY2FsIiwgbGV2ZWwxVVJJLmlzSGllcmFyY2hpY2FsKCkgKTsgCi0gICAgfQotICAgIGNhdGNoKCBVUklFeGNlcHRpb24gZXhjKQotICAgIHsKLSAgICAgIGFzc2VydFRydWUoICJFeGNlcHRpb24gdGhyb3c6IiArIGV4Yy5nZXRNZXNzYWdlKCksIGZhbHNlICk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0RXJhc2UxKCkKLSAgewotICAgIElFbnZpcm9ubWVudCBlbnZpcm9ubWVudCA9IEVudmlyb25tZW50U2VydmljZS5nZXRFY2xpcHNlQ29uc29sZUVudmlyb25tZW50KCk7Ci0gICAgSVVSSUZhY3RvcnkgIGZhY3RvcnkgICAgID0gZW52aXJvbm1lbnQuZ2V0VVJJRmFjdG9yeSgpOwotICAgIAotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRWNsaXBzZVVSSVRlc3RzLnRlc3RFcmFzZTEoKSIpOwotICAgIHRyeQotICAgIHsKLSAgICAgIElQYXRoIGZvbGRlclBhdGgwICA9IG5ldyBQYXRoKCBwcm9qZWN0TmFtZV8gKS5hcHBlbmQoICJ0b3BGb2xkZXI2IiApLm1ha2VBYnNvbHV0ZSgpOwotICAgICAgSVVSSSAgIHVyaTAgICAgICAgICA9IGZhY3RvcnkubmV3VVJJKCBnZXRVUkxGcm9tUGF0aCggZm9sZGVyUGF0aDAgKS50b1N0cmluZygpICk7Ci0gICAgICBJVVJJICAgdXJpUmVsYXRpdmUxID0gZmFjdG9yeS5uZXdVUkkoICJsZXZlbDEiKTsKLSAgICAgIElVUkkgICB1cmlSZWxhdGl2ZTIgPSBmYWN0b3J5Lm5ld1VSSSggImxlYWZGaWxlLnR4dCIpOwotICAgICAgSVVSSSAgIG5ld1VSSSAgICAgICA9IHVyaTAuYXBwZW5kKCB1cmlSZWxhdGl2ZTEgKS5hcHBlbmQoIHVyaVJlbGF0aXZlMiApOwotICAgICAgSVVSSSAgIGxldmVsMVVSSSAgICA9IHVyaTAuYXBwZW5kKCB1cmlSZWxhdGl2ZTEgKTsKLSAgICAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggIm5ld1VSSSBzaG91bGQgbm90IGV4aXN0IiwgIW5ld1VSSS5pc1ByZXNlbnQoKSApOwotICAgICAgCi0gICAgICBuZXdVUkkudG91Y2hMZWFmKCk7Ci0gICAgICAKLSAgICAgIGFzc2VydFRydWUoICJuZXdVUkkgc2hvdWxkIGV4aXN0IiwgbmV3VVJJLmlzUHJlc2VudCgpICk7Ci0gICAgICAKLSAgICAgIG5ld1VSSS5lcmFzZSgpOwotICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAibmV3VVJJIHNob3VsZCBub3QgZXhpc3QiLCAhbmV3VVJJLmlzUHJlc2VudCgpICk7Ci0gICAgICAKLSAgICAgIGFzc2VydFRydWUoICJmb2xkZXIgcm9vdCBzaG91bGQgZXhpc3QiLCB1cmkwLmlzUHJlc2VudCgpICk7Ci0gICAgICBhc3NlcnRUcnVlKCAiZm9sZGVyIGxldmVsMSBzaG91bGQgZXhpc3QiLCBsZXZlbDFVUkkuaXNQcmVzZW50KCkgKTsKLSAgICAgIAotICAgICAgdXJpMC5lcmFzZSgpOwotICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAiZm9sZGVyIHJvb3Qgc2hvdWxkIG5vdCBleGlzdCIsICF1cmkwLmlzUHJlc2VudCgpICk7Ci0gICAgICBhc3NlcnRUcnVlKCAiZm9sZGVyIGxldmVsMSBzaG91bGQgbm90IGV4aXN0IiwgIWxldmVsMVVSSS5pc1ByZXNlbnQoKSApOwotICAgICAgCi0gICAgfQotICAgIGNhdGNoKCBVUklFeGNlcHRpb24gZXhjKQotICAgIHsKLSAgICAgIGFzc2VydFRydWUoICJFeGNlcHRpb24gdGhyb3c6IiArIGV4Yy5nZXRNZXNzYWdlKCksIGZhbHNlICk7Ci0gICAgfQotICB9Ci0gIAotICAKLSAgcHVibGljIHZvaWQgdGVzdElzTGVhZigpCi0gIHsKLSAgICBJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgPSBFbnZpcm9ubWVudFNlcnZpY2UuZ2V0RWNsaXBzZUNvbnNvbGVFbnZpcm9ubWVudCgpOwotICAgIElVUklGYWN0b3J5ICBmYWN0b3J5ICAgICA9IGVudmlyb25tZW50LmdldFVSSUZhY3RvcnkoKTsKLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVjbGlwc2VVUklUZXN0cy50ZXN0SXNMZWFmKCkiKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJUGF0aCBmb2xkZXJQYXRoMCAgPSBuZXcgUGF0aCggcHJvamVjdE5hbWVfICkuYXBwZW5kKCAidG9wRm9sZGVyNyIgKS5tYWtlQWJzb2x1dGUoKTsKLSAgICAgIElVUkkgICB1cmkwICAgICAgICAgPSBmYWN0b3J5Lm5ld1VSSSggZ2V0VVJMRnJvbVBhdGgoIGZvbGRlclBhdGgwICkudG9TdHJpbmcoKSApOwotICAgICAgSVVSSSAgIHVyaVJlbGF0aXZlMSA9IGZhY3RvcnkubmV3VVJJKCAibGV2ZWwxIik7Ci0gICAgICBJVVJJICAgdXJpUmVsYXRpdmUyID0gZmFjdG9yeS5uZXdVUkkoICJsZWFmRmlsZS50eHQiKTsKLSAgICAgIElVUkkgICBuZXdVUkkgICAgICAgPSB1cmkwLmFwcGVuZCggdXJpUmVsYXRpdmUxICkuYXBwZW5kKCB1cmlSZWxhdGl2ZTIgKTsKLSAgICAgIElVUkkgICBwYXJlbnQgICAgICAgPSBuZXdVUkkucGFyZW50KCk7Ci0gICAgICAKLSAgICAgIGFzc2VydFRydWUoICJuZXdVUkkgc2hvdWxkIG5vdCBleGlzdCIsICFuZXdVUkkuaXNQcmVzZW50KCkgKTsKLSAgICAgIGFzc2VydFRydWUoICJwYXJlbnQgc2hvdWxkIG5vdCBleGlzdCIsICFwYXJlbnQuaXNQcmVzZW50KCkgKTsKLSAgICAgIGFzc2VydFRydWUoICJuZXdVUkkgc2hvdWxkIG5vdCBiZSBhIGxlYWYgeWV0IiwgIW5ld1VSSS5pc0xlYWYoKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggInBhcmVudCBzaG91bGQgbm90IGJlIGEgbGVhZiIsICFwYXJlbnQuaXNMZWFmKCkgKTsKLSAgICAgIAotICAgICAgbmV3VVJJLnRvdWNoTGVhZigpOwotICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAibmV3VVJJIHNob3VsZCBleGlzdCIsIG5ld1VSSS5pc1ByZXNlbnQoKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggInBhcmVudCBzaG91bGQgZXhpc3QiLCBwYXJlbnQuaXNQcmVzZW50KCkgKTsKLSAgICAgIGFzc2VydFRydWUoICJuZXdVUkkgc2hvdWxkIGJlIGEgbGVhZiIsIG5ld1VSSS5pc0xlYWYoKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggInBhcmVudCBzaG91bGQgbm90IGJlIGEgbGVhZiIsICFwYXJlbnQuaXNMZWFmKCkgKTsKLSAgICAgfQotICAgIGNhdGNoKCBVUklFeGNlcHRpb24gZXhjKQotICAgIHsKLSAgICAgIGFzc2VydFRydWUoICJFeGNlcHRpb24gdGhyb3c6IiArIGV4Yy5nZXRNZXNzYWdlKCksIGZhbHNlICk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0VmlzaXQoKQotICB7Ci0gICAgSUVudmlyb25tZW50IGVudmlyb25tZW50ID0gRW52aXJvbm1lbnRTZXJ2aWNlLmdldEVjbGlwc2VDb25zb2xlRW52aXJvbm1lbnQoKTsKLSAgICBJVVJJRmFjdG9yeSAgZmFjdG9yeSAgICAgPSBlbnZpcm9ubWVudC5nZXRVUklGYWN0b3J5KCk7Ci0gICAgSVVSSVNjaGVtZSAgIHNjaGVtZSAgICAgID0gRW52aXJvbm1lbnRTZXJ2aWNlLmdldEVjbGlwc2VTY2hlbWUoKTsKLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVjbGlwc2VVUklUZXN0cy50ZXN0VmlzaXQoKSIpOwotICAgIHRyeQotICAgIHsKLSAgICAgIElQYXRoIGZvbGRlclBhdGgwICA9IG5ldyBQYXRoKCBwcm9qZWN0TmFtZV8gKS5hcHBlbmQoICJyb290IiApLm1ha2VBYnNvbHV0ZSgpOwotICAgICAgSVVSSSAgIHVyaTAgICAgICAgICA9IGZhY3RvcnkubmV3VVJJKCBnZXRVUkxGcm9tUGF0aCggZm9sZGVyUGF0aDAgKS50b1N0cmluZygpICk7Ci0gICAgICAKLSAgICAgIEhhc2h0YWJsZSB0YWJsZSA9IGJ1aWxkVGVzdEVudHJpZXMoIHNjaGVtZSwgdXJpMCApOwotICAgICAgCi0gICAgICB1cmkwLnZpc2l0KCBuZXcgVGVzdFZpc2l0b3IoIHRhYmxlICkgKTsgICAgICAKLSAgICAgIHZlcmlmeVRhYmxlKCB0YWJsZSApOwotICAgICAgCi0gICAgICByZXNldFRhYmxlRm9yVGVzdDIoIHRhYmxlICk7Ci0gICAgICB1cmkwLnZpc2l0KCBuZXcgVGVzdFZpc2l0b3IoIHRhYmxlICkgKTsKLSAgICAgIHZlcmlmeVRhYmxlKCB0YWJsZSApOwotICAgICAgCi0gICAgICByZXNldFRhYmxlKCB0YWJsZSApOwotICAgICAgdXJpMC52aXNpdCggbmV3IFRlc3RWaXNpdG9yKCB0YWJsZSApLCBuZXcgVGVzdEZpbHRlciggdGFibGUgKSApOwotICAgICAgdmVyaWZ5VGFibGUoIHRhYmxlICk7Ci0gICAgICAKLSAgICAgIHJlc2V0VGFibGVGb3JUZXN0MyggdGFibGUgKTsKLSAgICAgIHVyaTAudmlzaXQoIG5ldyBUZXN0VmlzaXRvciggdGFibGUgKSwgbmV3IFRlc3RGaWx0ZXIoIHRhYmxlICkgKTsKLSAgICAgIHZlcmlmeVRhYmxlKCB0YWJsZSApOyAgICAgCi0gICAgfQotICAgIGNhdGNoKCBVUklFeGNlcHRpb24gZXhjKQotICAgIHsKLSAgICAgIGFzc2VydFRydWUoICJFeGNlcHRpb24gdGhyb3c6IiArIGV4Yy5nZXRNZXNzYWdlKCksIGZhbHNlICk7Ci0gICAgfQotICB9Ci0gCi0gIHByaXZhdGUgY2xhc3MgVGVzdFZpc2l0b3IgaW1wbGVtZW50cyBJVVJJVmlzaXRvcgotICB7Ci0gICAgcHJpdmF0ZSBIYXNodGFibGUgdGFibGVfOwotICAgIAotICAgIHB1YmxpYyBUZXN0VmlzaXRvciggSGFzaHRhYmxlIHRhYmxlKQotICAgIHsKLSAgICAgIHRhYmxlXyA9IHRhYmxlOyAgCi0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIHZpc2l0KCBJVVJJIHVyaSApCi0gICAgewotICAgICAgTm9kZUVudHJ5IGVudHJ5ID0gKE5vZGVFbnRyeSl0YWJsZV8uZ2V0KCBnZXROYW1lKCB1cmkgKSApOwotICAgICAgZW50cnkud2FzVmlzaXRlZF8gPSB0cnVlOwotICAgICAgcmV0dXJuICFlbnRyeS5zdG9wVHJhdmVyc2luZ187Ci0gICAgfSAKLSAgfQotICAKLSAgcHJpdmF0ZSBjbGFzcyBUZXN0RmlsdGVyIGltcGxlbWVudHMgSVVSSUZpbHRlcgotICB7Ci0gICAgcHJpdmF0ZSBIYXNodGFibGUgdGFibGVfOwotICAgIAotICAgIHB1YmxpYyBUZXN0RmlsdGVyKCBIYXNodGFibGUgdGFibGUpCi0gICAgewotICAgICAgdGFibGVfID0gdGFibGU7ICAKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gYWNjZXB0cyggSVVSSSB1cmkgKQotICAgIHsKLSAgICAgIE5vZGVFbnRyeSBlbnRyeSA9IChOb2RlRW50cnkpdGFibGVfLmdldCggZ2V0TmFtZSggdXJpICkgKTsKLSAgICAgIHJldHVybiBlbnRyeS52aXNpdE5vZGVfOwotICAgIH0gCi0gIH0KLSAgCi0gIHByaXZhdGUgSGFzaHRhYmxlIGJ1aWxkVGVzdEVudHJpZXMoIElVUklTY2hlbWUgc2NoZW1lLCBJVVJJIHJvb3RVUkkgKQotICB7Ci0gICAgSGFzaHRhYmxlIHRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotICAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJVVJJIHJvb3RjMSA9IHJvb3RVUkkuYXBwZW5kKCBzY2hlbWUubmV3VVJJKCAicm9vdGMxIikgKTsKLSAgICAgIElVUkkgcm9vdGMyID0gcm9vdFVSSS5hcHBlbmQoIHNjaGVtZS5uZXdVUkkoICJyb290YzIiKSApOwotICAgICAgSVVSSSByb290YzMgPSByb290VVJJLmFwcGVuZCggc2NoZW1lLm5ld1VSSSggInJvb3RjMyIpICk7Ci0gICAgICAKLSAgICAgIElVUkkgcm9vdGMyYzEgPSByb290YzIuYXBwZW5kKCBzY2hlbWUubmV3VVJJKCAicm9vdGMyYzEiKSApOwotICAgICAgSVVSSSByb290YzJjMiA9IHJvb3RjMi5hcHBlbmQoIHNjaGVtZS5uZXdVUkkoICJyb290YzJjMiIpICk7Ci0gICAgICBJVVJJIHJvb3RjMmMzID0gcm9vdGMyLmFwcGVuZCggc2NoZW1lLm5ld1VSSSggInJvb3RjMmMzIikgKTsKLSAgICAgIAotICAgICAgSVVSSSByb290YzJjMmMxID0gcm9vdGMyYzIuYXBwZW5kKCBzY2hlbWUubmV3VVJJKCAicm9vdGMyYzJjMSIpICk7Ci0gICAgICBJVVJJIHJvb3RjMmMyYzIgPSByb290YzJjMi5hcHBlbmQoIHNjaGVtZS5uZXdVUkkoICJyb290YzJjMmMyIikgKTsKLSAgICAgIAotICAgICAgSVVSSSByb290YzNjMSA9IHJvb3RjMy5hcHBlbmQoIHNjaGVtZS5uZXdVUkkoICJyb290YzNjMSIpICk7Ci0gICAgICBJVVJJIHJvb3RjM2MyID0gcm9vdGMzLmFwcGVuZCggc2NoZW1lLm5ld1VSSSggInJvb3RjM2MyIikgKTsKLSAgICAgIAotICAgICAgLy8gTm93IHRoYXQgdGhlIFVSSSdzIGFyZSBjcmVhdGVkIHdlIG5lZWQgdG8gY3JlYXRlIHBoeXNpY2FsIGZvbGRlcnMKLSAgICAgIC8vIGFuZCBmaWxlcyB0byByZXByZXNlbnQgdGhlbS4KLSAgICAgIHJvb3RjM2MxLnRvdWNoTGVhZigpOwotICAgICAgcm9vdGMzYzIudG91Y2hMZWFmKCk7ICAgIAotICAgICAgCi0gICAgICByb290YzJjMmMxLnRvdWNoTGVhZigpOwotICAgICAgcm9vdGMyYzJjMi50b3VjaExlYWYoKTsKLSAgICAgIAotICAgICAgcm9vdGMyYzEudG91Y2hMZWFmKCk7Ci0gICAgICByb290YzJjMy50b3VjaExlYWYoKTsKLSAgICAgIAotICAgICAgcm9vdGMxLnRvdWNoRm9sZGVyKCk7Ci0gICAgICAKLSAgICAgIC8vIE5vdyBjcmVhdGUgdGhlIHRoZSB0YWJsZSBlbnRyaWVzIHRoYXQgd2lsbCBiZSB1c2VkIHRvIHZpc2l0Ci0gICAgICAvLyB0aGUgVVJJIG5vZGVzLgotICAgICAgdGFibGUucHV0KCAicm9vdCIsIG5ldyBOb2RlRW50cnkoKSApOwotICAgICAgdGFibGUucHV0KCAicm9vdGMxIiwgbmV3IE5vZGVFbnRyeSgpICk7Ci0gICAgICB0YWJsZS5wdXQoICJyb290YzIiLCBuZXcgTm9kZUVudHJ5KCkgKTsKLSAgICAgIHRhYmxlLnB1dCggInJvb3RjMyIsIG5ldyBOb2RlRW50cnkoKSApOwotICAgICAgdGFibGUucHV0KCAicm9vdGMyYzEiLCBuZXcgTm9kZUVudHJ5KCkgKTsKLSAgICAgIHRhYmxlLnB1dCggInJvb3RjMmMyIiwgbmV3IE5vZGVFbnRyeSgpICk7Ci0gICAgICB0YWJsZS5wdXQoICJyb290YzJjMyIsIG5ldyBOb2RlRW50cnkoKSApOwotICAgICAgdGFibGUucHV0KCAicm9vdGMyYzJjMSIsIG5ldyBOb2RlRW50cnkoKSApOwotICAgICAgdGFibGUucHV0KCAicm9vdGMyYzJjMiIsIG5ldyBOb2RlRW50cnkoKSApOwotICAgICAgdGFibGUucHV0KCAicm9vdGMzYzEiLCBuZXcgTm9kZUVudHJ5KCkgKTsKLSAgICAgIHRhYmxlLnB1dCggInJvb3RjM2MyIiwgbmV3IE5vZGVFbnRyeSgpICk7Ci0gICAgfQotICAgIGNhdGNoKCBVUklFeGNlcHRpb24gZXhjKQotICAgIHsKLSAgICAgIGFzc2VydFRydWUoICJFeGNlcHRpb24gdGhyb3c6IiArIGV4Yy5nZXRNZXNzYWdlKCksIGZhbHNlICk7Ci0gICAgfSAgCi0gICAgICAKLSAgICByZXR1cm4gdGFibGU7Ci0gIH0KLSAgCi0gIHByaXZhdGUgU3RyaW5nIGdldE5hbWUoIElVUkkgdXJpICkKLSAgeyAKLSAgICBTdHJpbmcgICAgZnVsbE5hbWUgID0gdXJpLnRvU3RyaW5nKCk7Ci0gICAgaW50ICAgICAgIHNsYXNoICAgICA9IGZ1bGxOYW1lLmxhc3RJbmRleE9mKCAnLycgKTsKLSAgICBTdHJpbmcgICAgbmFtZSAgICAgID0gZnVsbE5hbWUuc3Vic3RyaW5nKCBzbGFzaCArIDEsIGZ1bGxOYW1lLmxlbmd0aCgpICk7Ci0gICAgCi0gICAgcmV0dXJuIG5hbWU7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCB2ZXJpZnlUYWJsZSggSGFzaHRhYmxlIHRhYmxlICkKLSAgewotICAgIEl0ZXJhdG9yIGVudHJpZXMgPSB0YWJsZS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgCi0gICAgd2hpbGUoIGVudHJpZXMuaGFzTmV4dCgpICkKLSAgICB7Ci0gICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KWVudHJpZXMubmV4dCgpOwotICAgICAgCi0gICAgICBTdHJpbmcgICAga2V5ICA9IChTdHJpbmcpZW50cnkuZ2V0S2V5KCk7Ci0gICAgICBOb2RlRW50cnkgbm9kZSA9IChOb2RlRW50cnkpZW50cnkuZ2V0VmFsdWUoKTsgCi0gCi0gICAgICBhc3NlcnRUcnVlKCAiQmFkIHRhYmxlIHJlc3VsdCBmb3Iga2V5OiIgKyBrZXkgKyAiIHZpc2l0ZWQ9IiArIG5vZGUud2FzVmlzaXRlZF8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgc2hvdWxkYmU9IiArIG5vZGUuc2hvdWxkQmVWaXNpdGVkXywKLSAgICAgICAgICAgICAgICAgIG5vZGUud2FzVmlzaXRlZF8gPT0gbm9kZS5zaG91bGRCZVZpc2l0ZWRfICk7Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgcmVzZXRUYWJsZUZvclRlc3QyKCBIYXNodGFibGUgdGFibGUgKQotICB7Ci0gICAgcmVzZXRUYWJsZSggdGFibGUgKTsKLSAgICAKLSAgICBOb2RlRW50cnkgcm9vdGMyID0gKE5vZGVFbnRyeSl0YWJsZS5nZXQoICJyb290YzIiICk7Ci0gICAgcm9vdGMyLnN0b3BUcmF2ZXJzaW5nXyA9IHRydWU7Ci0gICAgCi0gICAgTm9kZUVudHJ5IHJvb3RjMmMxID0gKE5vZGVFbnRyeSl0YWJsZS5nZXQoICJyb290YzJjMSIgKTsKLSAgICByb290YzJjMS5zaG91bGRCZVZpc2l0ZWRfID0gZmFsc2U7Ci0gICAgCi0gICAgTm9kZUVudHJ5IHJvb3RjMmMyID0gKE5vZGVFbnRyeSl0YWJsZS5nZXQoICJyb290YzJjMiIgKTsKLSAgICByb290YzJjMi5zaG91bGRCZVZpc2l0ZWRfID0gZmFsc2U7Ci0gICAgCi0gICAgTm9kZUVudHJ5IHJvb3RjMmMzID0gKE5vZGVFbnRyeSl0YWJsZS5nZXQoICJyb290YzJjMyIgKTsKLSAgICByb290YzJjMy5zaG91bGRCZVZpc2l0ZWRfID0gZmFsc2U7Ci0gICAgCi0gICAgTm9kZUVudHJ5IHJvb3RjMmMyYzEgPSAoTm9kZUVudHJ5KXRhYmxlLmdldCggInJvb3RjMmMyYzEiICk7Ci0gICAgcm9vdGMyYzJjMS5zaG91bGRCZVZpc2l0ZWRfID0gZmFsc2U7Ci0gICAgCi0gICAgTm9kZUVudHJ5IHJvb3RjMmMyYzIgPSAoTm9kZUVudHJ5KXRhYmxlLmdldCggInJvb3RjMmMyYzIiICk7Ci0gICAgcm9vdGMyYzJjMi5zaG91bGRCZVZpc2l0ZWRfID0gZmFsc2U7ICAgCi0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCByZXNldFRhYmxlRm9yVGVzdDMoIEhhc2h0YWJsZSB0YWJsZSApCi0gIHsKLSAgICByZXNldFRhYmxlKCB0YWJsZSApOyAgCi0gICAgCi0gICAgTm9kZUVudHJ5IHJvb3RjMyA9IChOb2RlRW50cnkpdGFibGUuZ2V0KCAicm9vdGMzIiApOwotICAgIHJvb3RjMy52aXNpdE5vZGVfID0gZmFsc2U7Ci0gICAgcm9vdGMzLnNob3VsZEJlVmlzaXRlZF8gPSBmYWxzZTsKLSAgICAKLSAgICBOb2RlRW50cnkgcm9vdGMyYzIgPSAoTm9kZUVudHJ5KXRhYmxlLmdldCggInJvb3RjMmMyIiApOwotICAgIHJvb3RjMmMyLnZpc2l0Tm9kZV8gPSBmYWxzZTsKLSAgICByb290YzJjMi5zaG91bGRCZVZpc2l0ZWRfID0gZmFsc2U7Ci0gICAgCi0gICAgTm9kZUVudHJ5IHJvb3RjM2MxID0gKE5vZGVFbnRyeSl0YWJsZS5nZXQoICJyb290YzNjMSIgKTsKLSAgICByb290YzNjMS52aXNpdE5vZGVfID0gZmFsc2U7Ci0gICAgcm9vdGMzYzEuc2hvdWxkQmVWaXNpdGVkXyA9IGZhbHNlOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgcmVzZXRUYWJsZSggSGFzaHRhYmxlIHRhYmxlICkKLSAgewotICAgIEl0ZXJhdG9yIGVudHJpZXMgPSB0YWJsZS52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgIAotICAgIHdoaWxlKCBlbnRyaWVzLmhhc05leHQoKSApCi0gICAgewotICAgICAgTm9kZUVudHJ5IGVudHJ5ID0gKE5vZGVFbnRyeSllbnRyaWVzLm5leHQoKTsKLSAgICAgIGVudHJ5Lndhc1Zpc2l0ZWRfID0gZmFsc2U7Ci0gICAgICBlbnRyeS5zaG91bGRCZVZpc2l0ZWRfPXRydWU7Ci0gICAgICBlbnRyeS5zdG9wVHJhdmVyc2luZ189ZmFsc2U7Ci0gICAgICBlbnRyeS52aXNpdE5vZGVfPXRydWU7Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBnZXRVUkxGcm9tUGF0aCggSVBhdGggYWJzb2x1dGVQYXRoICkKLSAgewotICAgIHJldHVybiAicGxhdGZvcm06L3Jlc291cmNlIiArIGFic29sdXRlUGF0aDsKLSAgfQotICAKLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0VG1wRmlsZVVSTCggU3RyaW5nIGZpbGVOYW1lICkKLSAgewotICAgIEZpbGUgbmV3RmlsZSA9IG5ldyBGaWxlKCB0ZW1wRGlyLCBmaWxlTmFtZSApOyAgCi0gICAgCi0gICAgcmV0dXJuICJmaWxlOi8iICsgbmV3RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGRlbGV0ZURpciggRmlsZSBmaWxlT3JEaXJlY3RvcnkgKQotICB7Ci0gICAgRmlsZVtdIGNoaWxkRmlsZXMgPSBmaWxlT3JEaXJlY3RvcnkubGlzdEZpbGVzKCk7Ci0gICAgCi0gICAgaWYoIGNoaWxkRmlsZXMgIT0gbnVsbCApCi0gICAgewotICAgICAgLy8gRGVsZXRlIGFsbCB0aGUgY2hpbGQgZmlsZXMgb3IgZGlyZWN0b3JpZXMgZmlyc3QgYmVmb3JlIHRoaXMgb25lLgotICAgICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IGNoaWxkRmlsZXMubGVuZ3RoOyBpbmRleCsrICkKLSAgICAgIHsKLSAgICAgICAgZGVsZXRlRGlyKCBjaGlsZEZpbGVzW2luZGV4XSApOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBmaWxlT3JEaXJlY3RvcnkuZGVsZXRlKCk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgY2xhc3MgTm9kZUVudHJ5Ci0gIHsKLSAgICBwdWJsaWMgTm9kZUVudHJ5KCkKLSAgICB7Ci0gICAgICB0aGlzKCB0cnVlLCBmYWxzZSwgdHJ1ZSApOyAKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIE5vZGVFbnRyeSggYm9vbGVhbiB2aXNpdE5vZGUsIGJvb2xlYW4gc3RvcCwgYm9vbGVhbiBzaG91bGRCZVZpc2l0ZWQgKQotICAgIHsKLSAgICAgIHZpc2l0Tm9kZV8gICAgICAgPSB2aXNpdE5vZGU7Ci0gICAgICBzdG9wVHJhdmVyc2luZ18gID0gc3RvcDsKLSAgICAgIHNob3VsZEJlVmlzaXRlZF8gPSBzaG91bGRCZVZpc2l0ZWQ7Ci0gICAgICB3YXNWaXNpdGVkXyAgICAgID0gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIHZpc2l0Tm9kZV87Ci0gICAgcHVibGljIGJvb2xlYW4gc3RvcFRyYXZlcnNpbmdfOwotICAgIAotICAgIHB1YmxpYyBib29sZWFuIHdhc1Zpc2l0ZWRfOwotICAgIHB1YmxpYyBib29sZWFuIHNob3VsZEJlVmlzaXRlZF87Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC90ZXN0cy9FbnZpcm9ubWVudFRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdGVzdHMvRW52aXJvbm1lbnRUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmU4NjQxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC90ZXN0cy9FbnZpcm9ubWVudFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudGVzdHM7Ci0KLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEVudmlyb25tZW50VGVzdHMgZXh0ZW5kcyBUZXN0U3VpdGUgCi17CQotCQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIAotICB7Ci0JCXJldHVybiBuZXcgRW52aXJvbm1lbnRUZXN0cygpOwotCX0KLQotICBwdWJsaWMgRW52aXJvbm1lbnRUZXN0cygpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIAotICAgIGFkZFRlc3QoIEVjbGlwc2VTY2hlbWVUZXN0cy5zdWl0ZSgpICk7Ci0gICAgYWRkVGVzdCggRWNsaXBzZVVSSVRlc3RzLnN1aXRlKCkgKTsKLSAgICBhZGRUZXN0KCBGaWxlU2NoZW1lVGVzdHMuc3VpdGUoKSApOwotICAgIGFkZFRlc3QoIEZpbGVVUklUZXN0cy5zdWl0ZSgpICk7Ci0gICAgYWRkVGVzdCggU3RhdHVzSGFuZGxlclRlc3RzLnN1aXRlKCkgKTsKLSAgICBhZGRUZXN0KCBMb2dnZXJUZXN0cy5zdWl0ZSgpICk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC90ZXN0cy9GaWxlU2NoZW1lVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC90ZXN0cy9GaWxlU2NoZW1lVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRkN2MxNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdGVzdHMvRmlsZVNjaGVtZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnRlc3RzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5FbnZpcm9ubWVudFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJU2NoZW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLlVSSUV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIEZpbGVTY2hlbWVUZXN0cyBleHRlbmRzIFRlc3RDYXNlCi17Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIHByb2plY3ROYW1lXyA9ICJUZXN0UHJvamVjdCI7Ci0gIAotICBwdWJsaWMgRmlsZVNjaGVtZVRlc3RzKFN0cmluZyBuYW1lKQotICB7Ci0gICAgc3VwZXIobmFtZSk7Ci0gIH0KLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKLSAgewotICAgIGlmIChhcmdzLmxlbmd0aCA9PSAwKQotICAgIHsKLSAgICAgIHJ1bkFsbCgpOwotICAgIH0KLSAgICBlbHNlIGlmIChhcmdzLmxlbmd0aCA9PSAxKQotICAgIHsKLSAgICAgIFN0cmluZyBtZXRob2RUb1J1biA9IGFyZ3NbMF0udHJpbSgpOwotICAgICAgcnVuT25lKG1ldGhvZFRvUnVuKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoRmlsZVNjaGVtZVRlc3RzLmNsYXNzKTsKLSAgfQotCi0gIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBydW5BbGwoKQotICB7Ci0gICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIHJ1bk9uZShTdHJpbmcgbWV0aG9kTmFtZSkKLSAgewotICAgIFRlc3RTdWl0ZSB0ZXN0U3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0gICAgVGVzdENhc2UgdGVzdCA9IG5ldyBGaWxlU2NoZW1lVGVzdHMobWV0aG9kTmFtZSk7Ci0gICAgdGVzdFN1aXRlLmFkZFRlc3QodGVzdCk7Ci0gICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKHRlc3RTdWl0ZSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAc2VlIFRlc3RDYXNlI3NldFVwKCkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbgotICB7Ci0gICAgc3VwZXIuc2V0VXAoKTsKLSAgICAKLSAgICAvLyBDcmVhdGUgYSB0ZXN0IHByb2plY3QgaW4gdGhlIHdvcmtiZW5jaAotICAgIElXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotICAgIElQcm9qZWN0ICAgICAgIHByb2plY3QgICAgICAgPSB3b3Jrc3BhY2VSb290LmdldFByb2plY3QoIHByb2plY3ROYW1lXyApOwotICAgIAotICAgIGlmKCBwcm9qZWN0ICE9IG51bGwgJiYgcHJvamVjdC5leGlzdHMoKSApCi0gICAgewotICAgICAgcHJvamVjdC5kZWxldGUoIHRydWUsIG51bGwgKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gQ3JlYXRlIHRoZSBwcm9qZWN0Ci0gICAgSVByb2plY3REZXNjcmlwdGlvbiBkZXNjID0gd29ya3NwYWNlUm9vdC5nZXRXb3Jrc3BhY2UoKS5uZXdQcm9qZWN0RGVzY3JpcHRpb24oIHByb2plY3ROYW1lXyApOwotICAgIHByb2plY3QuY3JlYXRlKCBkZXNjLCBudWxsICk7Ci0gICAgcHJvamVjdC5vcGVuKCBudWxsICk7Ci0gIH0KLSAgLyoqCi0gICAqIEBzZWUgVGVzdENhc2UjdGVhckRvd24oKQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLSAgICBzdXBlci50ZWFyRG93bigpOwotICAgIAotICAgIC8vIENyZWF0ZSBhIHRlc3QgcHJvamVjdCBpbiB0aGUgd29ya2JlbmNoCi0gICAgSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0gICAgSVByb2plY3QgICAgICAgcHJvamVjdCAgICAgICA9IHdvcmtzcGFjZVJvb3QuZ2V0UHJvamVjdCggcHJvamVjdE5hbWVfICk7Ci0gICAgCi0gICAgcHJvamVjdC5kZWxldGUoIHRydWUsIG51bGwgKTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBUZXN0IGdldFRlc3QoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBGaWxlU2NoZW1lVGVzdHMoIkZpbGVTY2hlbWVUZXN0cyIpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0QmFkVVJJcygpIAotICB7Ci0gICAgSVVSSVNjaGVtZSBzY2hlbWUgID0gRW52aXJvbm1lbnRTZXJ2aWNlLmdldEZpbGVTY2hlbWUoKTsKLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJVVJJIG5ld1VSSSA9IHNjaGVtZS5uZXdVUkkoICJib2d1czovc29tZWZvbGRlci9zb21lZmlsZS50eHQiKTsKLSAgICAgIGFzc2VydFRydWUoICJOb24gZmlsZSBwcm90b2NvbCBzaG91bGQgY2F1c2UgYW4gZXhjZXB0aW9uIiwgZmFsc2UgKTsKLSAgICAgIAotICAgICAgLy8gVGhpcyBjb2RlIHNob3VsZCBuZXZlciBydW4uCi0gICAgICBuZXdVUkkuYXNGaWxlKCk7Ci0gICAgfQotICAgIGNhdGNoKCBVUklFeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgfSAgIAotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIElVUkkgbmV3VVJJID0gc2NoZW1lLm5ld1VSSSggIjovc29tZWZvbGRlci9zb21lZmlsZS50eHQiKTsKLSAgICAgIGFzc2VydFRydWUoICJOb24gZmlsZSBwcm90b2NvbCBzaG91bGQgY2F1c2UgYW4gZXhjZXB0aW9uIiwgZmFsc2UgKTsKLSAgICAgIAotICAgICAgLy8gVGhpcyBjb2RlIHNob3VsZCBuZXZlciBydW4uCi0gICAgICBuZXdVUkkuYXNGaWxlKCk7Ci0gICAgfQotICAgIGNhdGNoKCBVUklFeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgfSAgICAgICAKLSAKLSAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgSVVSSSBuZXdVUkkgPSBzY2hlbWUubmV3VVJJKCAgKFN0cmluZyludWxsICk7Ci0gICAgICBhc3NlcnRUcnVlKCAiTm9uIGZpbGUgcHJvdG9jb2wgc2hvdWxkIGNhdXNlIGFuIGV4Y2VwdGlvbiIsIGZhbHNlICk7Ci0gICAgCi0gICAgICAvLyBUaGlzIGNvZGUgc2hvdWxkIG5ldmVyIHJ1bi4KLSAgICAgIG5ld1VSSS5hc0ZpbGUoKTsKLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICB9ICAgCi0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgSVVSSSBuZXdVUkkgPSBzY2hlbWUubmV3VVJJKCAoVVJMKW51bGwgKTsKLSAgICAgIGFzc2VydFRydWUoICJOb24gZmlsZSBwcm90b2NvbCBzaG91bGQgY2F1c2UgYW4gZXhjZXB0aW9uIiwgZmFsc2UgKTsKLSAgICAKLSAgICAgIC8vIFRoaXMgY29kZSBzaG91bGQgbmV2ZXIgcnVuLgotICAgICAgbmV3VVJJLmFzRmlsZSgpOwotICAgIH0KLSAgICBjYXRjaCggVVJJRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgIH0gIAotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIElVUkkgbmV3VVJJID0gc2NoZW1lLm5ld1VSSSggKElVUkkpbnVsbCApOwotICAgICAgYXNzZXJ0VHJ1ZSggIk5vbiBmaWxlIHByb3RvY29sIHNob3VsZCBjYXVzZSBhbiBleGNlcHRpb24iLCBmYWxzZSApOwotICAgIAotICAgICAgLy8gVGhpcyBjb2RlIHNob3VsZCBuZXZlciBydW4uCi0gICAgICBuZXdVUkkuYXNGaWxlKCk7Ci0gICAgfQotICAgIGNhdGNoKCBVUklFeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgfSAgICAgICAKLSAgfSAKLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3ROZXdVUkkoKQotICB7Ci0gICAgSVVSSVNjaGVtZSBzY2hlbWUgPSBFbnZpcm9ubWVudFNlcnZpY2UuZ2V0RmlsZVNjaGVtZSgpIDsKLSAgICAKLSAgICB0cnkKLSAgICB7ICAgICAgCi0gICAgICBJVVJJIHVyaTEgPSBzY2hlbWUubmV3VVJJKCAiZmlsZTovdG1wL215ZmlsZSIgKTsKLSAgICAgIElVUkkgdXJpMiA9IHNjaGVtZS5uZXdVUkkoICJyZWxhdGl2ZWRpcmVjdG9yeS9yZWxhdGl2ZWZpbGUiICk7Ci0gICAgICBJVVJJIHVyaTMgPSBzY2hlbWUubmV3VVJJKCB1cmkxICk7Ci0gICAgICBJVVJJIHVyaTQgPSBzY2hlbWUubmV3VVJJKCB1cmkyICk7Ci0gICAgICBJVVJJIHVyaTUgPSBzY2hlbWUubmV3VVJJKCBuZXcgVVJMKCB1cmkxLmFzU3RyaW5nKCkgKSApOyAgICAgCi0gICAgICAKLSAgICAgIEZpbGUgZmlsZTEgPSB1cmkxLmFzRmlsZSgpOwotICAgICAgCi0gICAgICB1cmkxLnRvdWNoTGVhZigpOwotICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAiSXMgYSBmaWxlIiwgZmlsZTEuaXNGaWxlKCkgKTsKLSAgICAgIGFzc2VydFRydWUoICJGaWxlIG5hbWVzIG5vdCB0aGUgc2FtZSIsIHVyaTEuYXNTdHJpbmcoKS5lcXVhbHMoIHVyaTMudG9TdHJpbmcoKSApKTsKLSAgICAgIGFzc2VydFRydWUoICJGaWxlIG5hbWVzIG5vdCB0aGUgc2FtZSIsIHVyaTIuYXNTdHJpbmcoKS5lcXVhbHMoIHVyaTQudG9TdHJpbmcoKSApKTsKLSAgICAgIGFzc2VydFRydWUoICJGaWxlIG5hbWVzIG5vdCB0aGUgc2FtZSIsIHVyaTEuYXNTdHJpbmcoKS5lcXVhbHMoIHVyaTUudG9TdHJpbmcoKSApKTsKLSAgICAgIGFzc2VydFRydWUoICJQcm90b2NvbCBub3QgZmlsZSIsIHVyaTEuZ2V0VVJJU2NoZW1lKCkudG9TdHJpbmcoKS5lcXVhbHMoImZpbGUiKSk7Ci0gICAgICBhc3NlcnRUcnVlKCAiUHJvdG9jb2wgbm90IGZpbGUiLCB1cmkzLmdldFVSSVNjaGVtZSgpLnRvU3RyaW5nKCkuZXF1YWxzKCJmaWxlIikpOwotICAgICAgYXNzZXJ0VHJ1ZSggIlByb3RvY29sIG5vdCBmaWxlIiwgdXJpNS5nZXRVUklTY2hlbWUoKS50b1N0cmluZygpLmVxdWFscygiZmlsZSIpKTsKLSAgICAgIGFzc2VydFRydWUoICJQcm90b2NvbCBub3QgcmVsYXRpdmUiLCB1cmkyLmdldFVSSVNjaGVtZSgpLnRvU3RyaW5nKCkuZXF1YWxzKCJyZWxhdGl2ZSIpKTsKLSAgICAgIGFzc2VydFRydWUoICJQcm90b2NvbCBub3QgcmVsYXRpdmUiLCB1cmk0LmdldFVSSVNjaGVtZSgpLnRvU3RyaW5nKCkuZXF1YWxzKCJyZWxhdGl2ZSIpKTsKLSAgICAgIAotICAgICAgdXJpMS5lcmFzZSgpOwotICAgIH0KLSAgICBjYXRjaCggVVJJRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgYXNzZXJ0VHJ1ZSggIkV4Y2VwdGlvbiB0aHJvdzoiICsgZXhjLmdldE1lc3NhZ2UoKSwgZmFsc2UgKTsKLSAgICB9ICAgICAKLSAgICBjYXRjaCggTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgYXNzZXJ0VHJ1ZSggIkV4Y2VwdGlvbiB0aHJvdzoiICsgZXhjLmdldE1lc3NhZ2UoKSwgZmFsc2UgKTsgICAgICAKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RIaWVyYXJjaGljYWwoKQotICB7Ci0gICAgSVVSSVNjaGVtZSBzY2hlbWUgPSBFbnZpcm9ubWVudFNlcnZpY2UuZ2V0RmlsZVNjaGVtZSgpIDsKLSAgICAKLSAgICBhc3NlcnRUcnVlKCAiTm90IGhpZXJhcmNoaWNhbCIsIHNjaGVtZS5pc0hpZXJhcmNoaWNhbCgpID09IHRydWUgKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdFZhbGlkVVJJcygpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJVVJJU2NoZW1lIHNjaGVtZSA9IEVudmlyb25tZW50U2VydmljZS5nZXRGaWxlU2NoZW1lKCk7Ci0gICAgICBJVVJJICAgICAgIHVyaTEgICA9IHNjaGVtZS5uZXdVUkkoICJmaWxlOi90bXAvc29tZWRpci9zb21lZmlsZSIgKTsKLSAgICAgIElVUkkgICAgICAgdXJpMiAgID0gc2NoZW1lLm5ld1VSSSggImZpbGU6L3RtcCIgKTsKLSAgICAgIElVUkkgICAgICAgdXJpMyAgID0gc2NoZW1lLm5ld1VSSSggInNvbWVyZWwiICk7Ci0gICAgICBJVVJJICAgICAgIHVyaTQgICA9IHNjaGVtZS5uZXdVUkkoICJzb21lcmVsL3NvbWVtb3JlcmVsIiApOwotICAgICAgSVVSSSAgICAgICB1cmk1ICAgPSBzY2hlbWUubmV3VVJJKCAiLi9zb21lcmVsL3NvbWVtb3JlIiApOwotICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggIlVSSSBub3QgdmFsaWQiLCBzY2hlbWUuaXNWYWxpZCggdXJpMSApICk7Ci0gICAgICBhc3NlcnRUcnVlKCAiVVJJIG5vdCB2YWxpZCIsIHNjaGVtZS5pc1ZhbGlkKCB1cmkyICkgKTsKLSAgICAgIGFzc2VydFRydWUoICJVUkkgbm90IHZhbGlkIiwgc2NoZW1lLmlzVmFsaWQoIHVyaTMgKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggIlVSSSBub3QgdmFsaWQiLCBzY2hlbWUuaXNWYWxpZCggdXJpNCApICk7Ci0gICAgICBhc3NlcnRUcnVlKCAiVVJJIG5vdCB2YWxpZCIsIHNjaGVtZS5pc1ZhbGlkKCB1cmk1ICkgKTsKLSAgICAgIGFzc2VydFRydWUoICJVUkkgaGFzIG5vdCB2YWxpZCBzdGF0dXMiLCBzY2hlbWUudmFsaWRhdGUoIHVyaTEgKS5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuT0sgKTsKLSAgICAgIGFzc2VydFRydWUoICJVUkkgaGFzIG5vdCB2YWxpZCBzdGF0dXMiLCBzY2hlbWUudmFsaWRhdGUoIHVyaTIgKS5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuT0sgKTsKLSAgICAgIGFzc2VydFRydWUoICJVUkkgaGFzIG5vdCB2YWxpZCBzdGF0dXMiLCBzY2hlbWUudmFsaWRhdGUoIHVyaTMgKS5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuT0sgKTsKLSAgICAgIGFzc2VydFRydWUoICJVUkkgaGFzIG5vdCB2YWxpZCBzdGF0dXMiLCBzY2hlbWUudmFsaWRhdGUoIHVyaTQgKS5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuT0sgKTsKLSAgICAgIGFzc2VydFRydWUoICJVUkkgaGFzIG5vdCB2YWxpZCBzdGF0dXMiLCBzY2hlbWUudmFsaWRhdGUoIHVyaTUgKS5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuT0sgKTsKLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICAgIGFzc2VydFRydWUoICJFeGNlcHRpb24gdGhyb3c6IiArIGV4Yy5nZXRNZXNzYWdlKCksIGZhbHNlICk7ICAgICAgCi0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFVSSXMoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgSVVSSVNjaGVtZSBlY2xpcHNlU2NoZW1lID0gRW52aXJvbm1lbnRTZXJ2aWNlLmdldEVjbGlwc2VTY2hlbWUoKTsKLSAgICAgIElVUklTY2hlbWUgZmlsZVNjaGVtZSAgICA9IEVudmlyb25tZW50U2VydmljZS5nZXRGaWxlU2NoZW1lKCk7Ci0gICAgICAKLSAgICAgIElVUkkgICAgICAgdXJpMSAgID0gZWNsaXBzZVNjaGVtZS5uZXdVUkkoICJwbGF0Zm9ybTovcmVzb3VyY2Uvc29tZWRpci9zb21lZmlsZSIgKTsKLSAgICAKLSAgICAgIGFzc2VydFRydWUoICJVUkkgdmFsaWQiLCAhZmlsZVNjaGVtZS5pc1ZhbGlkKCB1cmkxICkgKTsKLSAgICAgIGFzc2VydFRydWUoICJVUkkgaGFzIGEgdmFsaWQgc3RhdHVzIiwgZmlsZVNjaGVtZS52YWxpZGF0ZSggdXJpMSApLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUiApOwotICAgIH0KLSAgICBjYXRjaCggVVJJRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgYXNzZXJ0VHJ1ZSggIkV4Y2VwdGlvbiB0aHJvdzoiICsgZXhjLmdldE1lc3NhZ2UoKSwgZmFsc2UgKTsgICAgICAKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC90ZXN0cy9GaWxlVVJJVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC90ZXN0cy9GaWxlVVJJVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFmMDViMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdGVzdHMvRmlsZVVSSVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwMjE3ICAgMTI4NDU2IHBtb29na0BjYS5pYm0uY29tIC0gUGV0ZXIgTW9vZ2sKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnRlc3RzOwotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuRW52aXJvbm1lbnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJU2NoZW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUklWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLlVSSUV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIEZpbGVVUklUZXN0cyBleHRlbmRzIFRlc3RDYXNlCi17ICAKLSAgcHJpdmF0ZSBGaWxlICB0ZW1wRmlsZTsKLSAgcHJpdmF0ZSBGaWxlICB0ZW1wRGlyOwotICAKLSAgcHVibGljIEZpbGVVUklUZXN0cyhTdHJpbmcgbmFtZSkKLSAgewotICAgIHN1cGVyKG5hbWUpOwotICB9Ci0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpCi0gIHsKLSAgICBpZiAoYXJncy5sZW5ndGggPT0gMCkKLSAgICB7Ci0gICAgICBydW5BbGwoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoYXJncy5sZW5ndGggPT0gMSkKLSAgICB7Ci0gICAgICBTdHJpbmcgbWV0aG9kVG9SdW4gPSBhcmdzWzBdLnRyaW0oKTsKLSAgICAgIHJ1bk9uZShtZXRob2RUb1J1bik7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgewotICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKEZpbGVVUklUZXN0cy5jbGFzcyk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgcnVuQWxsKCkKLSAgewotICAgIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBydW5PbmUoU3RyaW5nIG1ldGhvZE5hbWUpCi0gIHsKLSAgICBUZXN0U3VpdGUgdGVzdFN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotICAgIFRlc3RDYXNlIHRlc3QgPSBuZXcgRmlsZVVSSVRlc3RzKG1ldGhvZE5hbWUpOwotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ2FsbGluZyBGaWxlVVJJVGVzdHMuIittZXRob2ROYW1lKTsKLSAgICB0ZXN0U3VpdGUuYWRkVGVzdCh0ZXN0KTsKLSAgICBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5ydW4odGVzdFN1aXRlKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBzZWUgVGVzdENhc2Ujc2V0VXAoKQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLSAgICBzdXBlci5zZXRVcCgpOyAgCi0gICAgCi0gICAgdGVtcEZpbGUgID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgidG1wIiwgInRtcCIsIG51bGwgKTsKLSAgICB0ZW1wRGlyICAgPSBuZXcgRmlsZSggdGVtcEZpbGUuZ2V0UGFyZW50RmlsZSgpLCAidG1wRGlyIiApOwotICAgIHRlbXBEaXIubWtkaXIoKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBzZWUgVGVzdENhc2UjdGVhckRvd24oKQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLSAgICBzdXBlci50ZWFyRG93bigpOwotICAgIAotICAgIGRlbGV0ZUZpbGVzKCB0ZW1wRGlyICk7Ci0gICAgdGVtcEZpbGUuZGVsZXRlKCk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBkZWxldGVGaWxlcyggRmlsZSBkaXJlY3RvcnkgKQotICB7Ci0JaWYgKGRpcmVjdG9yeSAhPSBudWxsKSB7Ci0JCQlGaWxlW10gY2hpbGRyZW4gPSBkaXJlY3RvcnkubGlzdEZpbGVzKCk7Ci0KLQkJCS8qCi0JCQkgKiBJZiAnZGlyZWN0b3J5JyBpcyBub3QgYSBkaXJlY3RvcnksIGRpcmVjdG9yeS5saXN0RmlsZXMgY2FuCi0JCQkgKiByZXR1cm4gbnVsbC4KLQkJCSAqLwotCQkJaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgY2hpbGRyZW4ubGVuZ3RoOyBpbmRleCsrKSB7Ci0JCQkJCUZpbGUgY2hpbGQgPSBjaGlsZHJlbltpbmRleF07Ci0KLQkJCQkJaWYgKGNoaWxkLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJCWRlbGV0ZUZpbGVzKGNoaWxkKTsKLQkJCQkJfQotCi0JCQkJCWNoaWxkLmRlbGV0ZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBnZXRUbXBGaWxlVVJMKCBTdHJpbmcgZmlsZU5hbWUgKQotICB7Ci0gICAgRmlsZSBuZXdGaWxlID0gbmV3IEZpbGUoIHRlbXBEaXIsIGZpbGVOYW1lICk7ICAKLSAgICAKLSAgICByZXR1cm4gImZpbGU6LyIgKyBuZXdGaWxlLmdldEFic29sdXRlUGF0aCgpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFRlc3QgZ2V0VGVzdCgpCi0gIHsKLSAgICByZXR1cm4gbmV3IEZpbGVVUklUZXN0cygiRmlsZVVSSVRlc3RzIik7Ci0gIH0KLSAgcHVibGljIHZvaWQgdGVzdEF2YWlsYWJsZSgpIAotICB7Ci0gICAgSUVudmlyb25tZW50IGVudmlyb25tZW50ID0gRW52aXJvbm1lbnRTZXJ2aWNlLmdldEVjbGlwc2VDb25zb2xlRW52aXJvbm1lbnQoKTsKLSAgICBJVVJJRmFjdG9yeSAgZmFjdG9yeSAgICAgPSBlbnZpcm9ubWVudC5nZXRVUklGYWN0b3J5KCk7Ci0gICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCJGaWxlVVJJVGVzdHMudGVzdEF2YWlsYWJsZSgpIik7Ci0gICAgCi0gICAgdHJ5Ci0gICAgeyAgICAgIAotICAgICAgSVVSSSB1cmkyID0gZmFjdG9yeS5uZXdVUkkoIGdldFRtcEZpbGVVUkwoICJzb21lZmlsZSIgKSApOwotICAgICAgSVVSSSB1cmkzID0gZmFjdG9yeS5uZXdVUkkoICJyZWxhdGl2ZWRpcmVjdG9yeS9yZWxhdGl2ZWZpbGUiICk7Ci0gICAgICAKLSAgICAgIGFzc2VydFRydWUoICJOb3QgYXZhaWxhYmxlIGFzIFVSTCIsIHVyaTIuaXNBdmFpbGFibGVBc1VSTCgpICk7Ci0gICAgICBhc3NlcnRUcnVlKCAiQXZhaWxhYmxlIGFzIFVSTCIsICF1cmkzLmlzQXZhaWxhYmxlQXNVUkwoKSApOwotICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAiTm90IGF2YWlsYWJsZSBhcyBGaWxlIiwgdXJpMi5pc0F2YWlsYWJsZUFzRmlsZSgpICk7Ci0gICAgICBhc3NlcnRUcnVlKCAiQXZhaWxhYmxlIGFzIEZpbGUiLCAhdXJpMy5pc0F2YWlsYWJsZUFzRmlsZSgpICk7Ci0gICAgICAKLSAgICAgIEZpbGUgZmlsZTIgPSB1cmkyLmFzRmlsZSgpOwotICAgICAgVVJMICB1cmwyICA9IHVyaTIuYXNVUkwoKTsKLSAgICAgIAotICAgICAgdXJpMi50b3VjaExlYWYoKTsKLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggIklzIGEgZmlsZSIsIGZpbGUyLmlzRmlsZSgpICk7Ci0gICAgICBhc3NlcnRUcnVlKCAiV3JvbmcgcHJvdG9jb2wiLCB1cmwyLmdldFByb3RvY29sKCkuZXF1YWxzKCAiZmlsZSIgKSk7Ci0gICAgICBhc3NlcnRUcnVlKCB1cmkyLmFzU3RyaW5nKCkubGVuZ3RoKCkgPiA1ICk7Ci0gICAgICBhc3NlcnRUcnVlKCB1cmkyLnRvU3RyaW5nKCkubGVuZ3RoKCkgPiA1ICk7Ci0gICAgICB1cmkyLmVyYXNlKCk7Ci0gICAgfQotICAgIGNhdGNoKCBVUklFeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgICBhc3NlcnRUcnVlKCAiRXhjZXB0aW9uIHRocm93OiIgKyBleGMuZ2V0TWVzc2FnZSgpLCBmYWxzZSApOwotICAgIH0KLSAgfSAgICAgIAotICAgICAgICAKLSAgcHVibGljIHZvaWQgdGVzdFRvdWNoRm9sZGVyKCkgCi0gIHsKLSAgICBJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgPSBFbnZpcm9ubWVudFNlcnZpY2UuZ2V0RWNsaXBzZUNvbnNvbGVFbnZpcm9ubWVudCgpOwotICAgIElVUklGYWN0b3J5ICBmYWN0b3J5ICAgICA9IGVudmlyb25tZW50LmdldFVSSUZhY3RvcnkoKTsKLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZpbGVVUklUZXN0cy50ZXN0VG91Y2hGb2xkZXIoKSIpOwotICAgIHRyeQotICAgIHsKLSAgICAgIEZpbGUgIGZvbGRlclBhdGggID0gbmV3IEZpbGUoIHRlbXBEaXIsICJ0b3BGb2xkZXIiICk7Ci0gICAgICBGaWxlICBmb2xkZXJQYXRoMiA9IG5ldyBGaWxlKCBmb2xkZXJQYXRoLCAic3BhY2UgZm9sZGVyIiApOwotICAgICAgSVVSSSAgIHVyaSAgICAgICAgPSBmYWN0b3J5Lm5ld1VSSSggZm9sZGVyUGF0aC50b1VSTCgpLnRvU3RyaW5nKCkgKTsKLSAgICAgIElVUkkgICB1cmkyICAgICAgID0gZmFjdG9yeS5uZXdVUkkoIGZvbGRlclBhdGgyLnRvVVJMKCkudG9TdHJpbmcoKSAgKTsKLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggInRvcEZvbGRlciBzaG91bGQgbm90IGV4aXN0IiwgIXVyaS5pc1ByZXNlbnQoKSApOwotICAgICAgCi0gICAgICB1cmkudG91Y2hGb2xkZXIoKTsKLSAgIAotICAgICAgYXNzZXJ0VHJ1ZSggInRvcEZvbGRlciBzaG91bGQgZXhpc3QiLCB1cmkuaXNQcmVzZW50KCkgKTsKLSAgICAgIAotICAgICAgRmlsZSBuZXN0ZWRQYXRoID0gbmV3IEZpbGUoIG5ldyBGaWxlKCBmb2xkZXJQYXRoLCAibGV2ZWwxIiApLCAibGV2ZWwyIiApOwotICAgICAgSVVSSSBuZXN0ZWR1cmkgID0gZmFjdG9yeS5uZXdVUkkoIG5lc3RlZFBhdGgudG9VUkwoKS50b1N0cmluZygpICk7Ci0gICAgICAKLSAgICAgIGFzc2VydFRydWUoICJuZXN0ZWRGb2xkZXIgc2hvdWxkIG5vdCBleGlzdCIsICFuZXN0ZWR1cmkuaXNQcmVzZW50KCkgKTsKLSAgICAgIAotICAgICAgbmVzdGVkdXJpLnRvdWNoRm9sZGVyKCk7Ci0gICAgICAKLSAgICAgIGFzc2VydFRydWUoICJuZXN0ZWRGb2xkZXIgc2hvdWxkIGV4aXN0IiwgbmVzdGVkdXJpLmlzUHJlc2VudCgpICk7Ci0gICAgICAKLSAgICAgIElVUkkgY2hpbGQxID0gdXJpMi5hcHBlbmQoIGZhY3RvcnkubmV3VVJJKCAiY2hpbGQxIiApICk7Ci0gICAgICBJVVJJIGNoaWxkMiA9IHVyaTIuYXBwZW5kKCBmYWN0b3J5Lm5ld1VSSSggImNoaWxkMiIgKSApOwotICAgICAgCi0gICAgICBjaGlsZDEudG91Y2hMZWFmKCk7Ci0gICAgICBjaGlsZDIudG91Y2hMZWFmKCk7Ci0gICAgICAKLSAgICAgIGFzc2VydFRydWUgKCAiQ2hpbGQgMSBpbiBibGFuayBmb2xkZXIgc2hvdWxkIGV4aXN0ICIsIGNoaWxkMS5pc1ByZXNlbnQoKSApOwotICAgICAgYXNzZXJ0VHJ1ZSAoICJDaGlsZCAyIGluIGJsYW5rIGZvbGRlciBzaG91bGQgZXhpc3QgIiwgY2hpbGQyLmlzUHJlc2VudCgpICk7Ci0gICAgIH0KLSAgICBjYXRjaCggVVJJRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgYXNzZXJ0VHJ1ZSggIkV4Y2VwdGlvbiB0aHJvdzoiICsgZXhjLmdldE1lc3NhZ2UoKSwgZmFsc2UgKTsKLSAgICB9Ci0gICAgY2F0Y2goIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICAgIGFzc2VydFRydWUoICJFeGNlcHRpb24gdGhyb3c6IiArIGV4Yy5nZXRNZXNzYWdlKCksIGZhbHNlICk7ICAKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RMaXN0KCkgCi0gIHsKLSAgICBJRW52aXJvbm1lbnQgIGVudmlyb25tZW50ID0gRW52aXJvbm1lbnRTZXJ2aWNlLmdldEVjbGlwc2VDb25zb2xlRW52aXJvbm1lbnQoKTsKLSAgICBJVVJJRmFjdG9yeSAgIGZhY3RvcnkgICAgID0gZW52aXJvbm1lbnQuZ2V0VVJJRmFjdG9yeSgpOwotICAgIAotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmlsZVVSSVRlc3RzLnRlc3RMaXN0KCkiKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBGaWxlIGZvbGRlclBhdGgwID0gbmV3IEZpbGUoIHRlbXBEaXIsICJ0b3BGb2xkZXIyIiApOwotICAgICAgRmlsZSBmb2xkZXJQYXRoMSA9IG5ldyBGaWxlKCBuZXcgRmlsZSggdGVtcERpciwgInRvcEZvbGRlcjIiICksICJsZWFmMSIgKTsKLSAgICAgIEZpbGUgZm9sZGVyUGF0aDIgPSBuZXcgRmlsZSggbmV3IEZpbGUoIHRlbXBEaXIsICJ0b3BGb2xkZXIyIiApLCAibGVhZjIiICk7Ci0gICAgICBGaWxlIGZvbGRlclBhdGgzID0gbmV3IEZpbGUoIG5ldyBGaWxlKCB0ZW1wRGlyLCAidG9wRm9sZGVyMiIgKSwgImxlYWYzIiApOwotICAgICAgSVVSSSAgIHVyaTAgICAgICAgID0gZmFjdG9yeS5uZXdVUkkoIGZvbGRlclBhdGgwLnRvVVJMKCkudG9TdHJpbmcoKSApOwotICAgICAgSVVSSSAgIHVyaTEgICAgICAgID0gZmFjdG9yeS5uZXdVUkkoIGZvbGRlclBhdGgxLnRvVVJMKCkudG9TdHJpbmcoKSApOwotICAgICAgSVVSSSAgIHVyaTIgICAgICAgID0gZmFjdG9yeS5uZXdVUkkoIGZvbGRlclBhdGgyLnRvVVJMKCkudG9TdHJpbmcoKSApOwotICAgICAgSVVSSSAgIHVyaTMgICAgICAgID0gZmFjdG9yeS5uZXdVUkkoIGZvbGRlclBhdGgzLnRvVVJMKCkudG9TdHJpbmcoKSApOwotICAgICAgCi0gICAgICB1cmkxLnRvdWNoRm9sZGVyKCk7Ci0gICAgICB1cmkyLnRvdWNoRm9sZGVyKCk7Ci0gICAgICB1cmkzLnRvdWNoRm9sZGVyKCk7Ci0gICAgICAKLSAgICAgIElVUklbXSBiYWJpZXMgPSB1cmkwLmxpc3QoKTsKLSAgICAgICAgICAKLSAgICAgIGFzc2VydFRydWUoICJmb2xkZXIgcGF0aCBzaG91bGQgaGF2ZSAzIGNoaWxkcmVuIiwgYmFiaWVzLmxlbmd0aCA9PSAzICk7Ci0gICAgICAKLSAgICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCBiYWJpZXMubGVuZ3RoOyBpbmRleCsrICkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nICBmb2xkZXJOYW1lID0gYmFiaWVzW2luZGV4XS50b1N0cmluZygpOwotICAgICAgICBTdHJpbmcgIGxlYWZOYW1lICAgPSBmb2xkZXJOYW1lLnN1YnN0cmluZyggZm9sZGVyTmFtZS5sZW5ndGgoKSAtIDUsIGZvbGRlck5hbWUubGVuZ3RoKCkgKTsKLSAgICAgICAgYm9vbGVhbiBPayAgICAgICAgID0gbGVhZk5hbWUuZXF1YWxzKCAibGVhZjEiKSB8fCBsZWFmTmFtZS5lcXVhbHMoICJsZWFmMiIgKSB8fCBsZWFmTmFtZS5lcXVhbHMoICJsZWFmMyIgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggIldyb25nIGxlYWYgYmFieSB1cmk6IiArIGZvbGRlck5hbWUgKyAiLCIgKyBsZWFmTmFtZSwgT2sgKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgSVVSSVtdIGJhYmllczIgPSB1cmkwLmxpc3QoIG5ldyBJVVJJRmlsdGVyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0cyggSVVSSSB1cmkgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICF1cmkudG9TdHJpbmcoKS5lbmRzV2l0aCggImxlYWYyIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gKTsKLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggImZvbGRlciBwYXRoIHNob3VsZCBoYXZlIDIgZmlsdGVyZWQgY2hpbGRyZW4iLCBiYWJpZXMyLmxlbmd0aCA9PSAyICk7Ci0gICAgICAKLSAgICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCBiYWJpZXMyLmxlbmd0aDsgaW5kZXgrKyApCi0gICAgICAgewotICAgICAgICBTdHJpbmcgIGZvbGRlck5hbWUgPSBiYWJpZXMyW2luZGV4XS50b1N0cmluZygpOwotICAgICAgICBTdHJpbmcgIGxlYWZOYW1lICAgPSBmb2xkZXJOYW1lLnN1YnN0cmluZyggZm9sZGVyTmFtZS5sZW5ndGgoKSAtIDUsIGZvbGRlck5hbWUubGVuZ3RoKCkgKTsKLSAgICAgICAgYm9vbGVhbiBPayAgICAgICAgID0gbGVhZk5hbWUuZXF1YWxzKCAibGVhZjEiKSB8fCBsZWFmTmFtZS5lcXVhbHMoICJsZWFmMyIgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydFRydWUoICJXcm9uZyBsZWFmIGJhYnkgdXJpOiIgKyBmb2xkZXJOYW1lICsgIiwiICsgbGVhZk5hbWUsIE9rICk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoKCBVUklFeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgICBhc3NlcnRUcnVlKCAiRXhjZXB0aW9uIHRocm93OiIgKyBleGMuZ2V0TWVzc2FnZSgpLCBmYWxzZSApOwotICAgIH0KLSAgICBjYXRjaCggTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgYXNzZXJ0VHJ1ZSggIkV4Y2VwdGlvbiB0aHJvdzoiICsgZXhjLmdldE1lc3NhZ2UoKSwgZmFsc2UgKTsgIAotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdEdldFVSSVNjaGVtZSgpCi0gIHsKLSAgICBJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgPSBFbnZpcm9ubWVudFNlcnZpY2UuZ2V0RWNsaXBzZUNvbnNvbGVFbnZpcm9ubWVudCgpOwotICAgIElVUklGYWN0b3J5ICBmYWN0b3J5ICAgICA9IGVudmlyb25tZW50LmdldFVSSUZhY3RvcnkoKTsKLSAgIAotICAgIHRyeQotICAgIHsgCi0gICAgICBGaWxlICAgICAgIGZvbGRlclBhdGgwICA9IG5ldyBGaWxlKCB0ZW1wRGlyLCAidGVzdEdldFNjaGVtZSIgKTsKLSAgICAgIElVUkkgICAgICAgdXJpMCAgICAgICAgID0gZmFjdG9yeS5uZXdVUkkoIGZvbGRlclBhdGgwLnRvVVJMKCkudG9TdHJpbmcoKSApOwotICAgICAgSVVSSVNjaGVtZSBzY2hlbWUgICAgICAgPSB1cmkwLmdldFVSSVNjaGVtZSgpOwotICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAiU2NoZW1lIG5hbWUgaXMgbm90IGZpbGUiLCBzY2hlbWUudG9TdHJpbmcoKS5lcXVhbHMoICJmaWxlIiApICk7Ci0gICAgfQotICAgIGNhdGNoKCBVUklFeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgICBhc3NlcnRUcnVlKCAiVW5leHBlY3RlZCBleGNlcHRpb24iLCBmYWxzZSApOwotICAgIH0KLSAgICBjYXRjaCggTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgYXNzZXJ0VHJ1ZSggIkV4Y2VwdGlvbiB0aHJvdzoiICsgZXhjLmdldE1lc3NhZ2UoKSwgZmFsc2UgKTsgIAotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdEFwcGVuZCgpIAotICB7Ci0gICAgSUVudmlyb25tZW50IGVudmlyb25tZW50ID0gRW52aXJvbm1lbnRTZXJ2aWNlLmdldEVjbGlwc2VDb25zb2xlRW52aXJvbm1lbnQoKTsKLSAgICBJVVJJRmFjdG9yeSAgZmFjdG9yeSAgICAgPSBlbnZpcm9ubWVudC5nZXRVUklGYWN0b3J5KCk7Ci0gICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCJGaWxlVVJJVGVzdHMudGVzdEFwcGVuZCgpIik7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgRmlsZSBmb2xkZXJQYXRoMCAgPSBuZXcgRmlsZSggdGVtcERpciwgInRvcEZvbGRlcjMiICk7Ci0gICAgICBJVVJJICAgdXJpMCAgICAgICAgID0gZmFjdG9yeS5uZXdVUkkoIGZvbGRlclBhdGgwLnRvVVJMKCkudG9TdHJpbmcoKSApOwotICAgICAgSVVSSSAgIHVyaVJlbGF0aXZlMSA9IGZhY3RvcnkubmV3VVJJKCAibGV2ZWwxIik7Ci0gICAgICBJVVJJICAgdXJpUmVsYXRpdmUyID0gZmFjdG9yeS5uZXdVUkkoICJsZXZlbDIiKTsKLSAgICAgIAotICAgICAgSVVSSSAgIG5ld1VSSSAgICAgICA9IHVyaTAuYXBwZW5kKCB1cmlSZWxhdGl2ZTEgKS5hcHBlbmQoIHVyaVJlbGF0aXZlMiApOwotICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAibmV3VVJJIHNob3VsZCBub3QgZXhpc3QiLCAhbmV3VVJJLmlzUHJlc2VudCgpICk7Ci0gICAgICAKLSAgICAgIG5ld1VSSS50b3VjaEZvbGRlcigpOwotICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAibmV3VVJJIHNob3VsZCBleGlzdCIsIG5ld1VSSS5pc1ByZXNlbnQoKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggIm5ld1VSSSBzaG91bGQgbm90IGJlIGEgbGVhZiIsICFuZXdVUkkuaXNMZWFmKCkgKTsKLSAgICAgIAotICAgICAgLy8gRW5zdXJlIHRoYXQgYXBwZW5kIHBhcmFtZXRlciBpcyByZWxhdGl2ZS4KLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBJVVJJIG5ld1VSSTIgPSB1cmkwLmFwcGVuZCggdXJpMCApOyAgCi0gICAgICAgIGFzc2VydFRydWUoICJBcHBlbmRpbmcgdXNpbmcgYSBub24tcmVsYXRpdmUgc2hvdWxkIHRocm93IGFuZCBleGNlcHRpb24iLCB0cnVlICk7Ci0gICAgICAgIAotICAgICAgICAvLyBUaGlzIGNvZGUgc2hvdWxkIG5ldmVyIHJ1bi4KLSAgICAgICAgbmV3VVJJMi5hc0ZpbGUoKTsgCi0gICAgICB9Ci0gICAgICBjYXRjaCggVVJJRXhjZXB0aW9uIGV4YyApCi0gICAgICB7Ci0gICAgICB9Ci0gICAgICAKLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsgICAKLSAgICAgIGFzc2VydFRydWUoICJFeGNlcHRpb24gdGhyb3c6IiArIGV4Yy5nZXRNZXNzYWdlKCksIGZhbHNlICk7Ci0gICAgfQotICAgIGNhdGNoKCBNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgICBhc3NlcnRUcnVlKCAiRXhjZXB0aW9uIHRocm93OiIgKyBleGMuZ2V0TWVzc2FnZSgpLCBmYWxzZSApOyAgCi0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0VG91Y2hMZWFmKCkKLSAgewotICAgIElFbnZpcm9ubWVudCBlbnZpcm9ubWVudCA9IEVudmlyb25tZW50U2VydmljZS5nZXRFY2xpcHNlQ29uc29sZUVudmlyb25tZW50KCk7Ci0gICAgSVVSSUZhY3RvcnkgIGZhY3RvcnkgICAgID0gZW52aXJvbm1lbnQuZ2V0VVJJRmFjdG9yeSgpOwotICAgIAotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmlsZVVSSVRlc3RzLnRlc3RUb3VjaExlYWYoKSIpOwotICAgIHRyeQotICAgIHsKLSAgICAgIEZpbGUgICBmb2xkZXJQYXRoMCAgPSBuZXcgRmlsZSggdGVtcERpciwgInRvcEZvbGRlcjQiICk7Ci0gICAgICBJVVJJICAgdXJpMCAgICAgICAgID0gZmFjdG9yeS5uZXdVUkkoIGZvbGRlclBhdGgwLnRvVVJMKCkudG9TdHJpbmcoKSApOwotICAgICAgSVVSSSAgIHVyaVJlbGF0aXZlMSA9IGZhY3RvcnkubmV3VVJJKCAibGV2ZWwxIik7Ci0gICAgICBJVVJJICAgdXJpUmVsYXRpdmUyID0gZmFjdG9yeS5uZXdVUkkoICJsZWFmRmlsZS50eHQiKTsKLSAgICAgIElVUkkgICBuZXdVUkkgICAgICAgPSB1cmkwLmFwcGVuZCggdXJpUmVsYXRpdmUxICkuYXBwZW5kKCB1cmlSZWxhdGl2ZTIgKTsKLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggIm5ld1VSSSBzaG91bGQgbm90IGV4aXN0IiwgIW5ld1VSSS5pc1ByZXNlbnQoKSApOwotICAgICAgCi0gICAgICBuZXdVUkkudG91Y2hMZWFmKCk7Ci0gICAgICAKLSAgICAgIGFzc2VydFRydWUoICJuZXdVUkkgc2hvdWxkIGV4aXN0IiwgbmV3VVJJLmlzUHJlc2VudCgpICk7Ci0gICAgICBhc3NlcnRUcnVlKCAibmV3VVJJIHNob3VsZCBiZSBhIGxlYWYiLCBuZXdVUkkuaXNMZWFmKCkgKTsKLSAgICAgIAotICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtICAgPSBuZXdVUkkuZ2V0SW5wdXRTdHJlYW0oKTsKLSAgICAgIGludCAgICAgICAgIGJ5dGVSZWFkID0gMDsKLSAgICAgIAotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGJ5dGVSZWFkID0gc3RyZWFtLnJlYWQoKTsgLy8gUmV0dXJucyBhIC0xIGlmIG5vIGJ5dGVzIGFyZSByZWFkLCB3aGljaCBzaG91bGQgYmUgdGhlIGNhc2UgaGVyZS4gCi0gICAgICB9Ci0gICAgICBjYXRjaCggSU9FeGNlcHRpb24gZXhjICkKLSAgICAgIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggIkV4Y2VwdGlvbiB0aHJvdzoiICsgZXhjLmdldE1lc3NhZ2UoKSwgZmFsc2UgKTsKLSAgICAgIH0KLSAgICAgIGZpbmFsbHkKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBzdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggSU9FeGNlcHRpb24gZXhjICkKLSAgICAgICAgewotICAgICAgICAgIGFzc2VydFRydWUoICJFeGNlcHRpb24gdGhyb3c6IiArIGV4Yy5nZXRNZXNzYWdlKCksIGZhbHNlICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggIlRoZXJlIHNob3VsZCBiZSBubyBieXRlcyBpbiB0aGlzIHN0cmVhbSIsICBieXRlUmVhZCA9PSAtMSApOwotICAgICAgCi0gICAgIH0KLSAgICBjYXRjaCggVVJJRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgYXNzZXJ0VHJ1ZSggIkV4Y2VwdGlvbiB0aHJvdzoiICsgZXhjLmdldE1lc3NhZ2UoKSwgZmFsc2UgKTsKLSAgICB9ICAgICAKLSAgICBjYXRjaCggTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgYXNzZXJ0VHJ1ZSggIkV4Y2VwdGlvbiB0aHJvdzoiICsgZXhjLmdldE1lc3NhZ2UoKSwgZmFsc2UgKTsgIAotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdElPT3BlcmF0aW9ucygpCi0gIHsKLSAgICBJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgPSBFbnZpcm9ubWVudFNlcnZpY2UuZ2V0RWNsaXBzZUNvbnNvbGVFbnZpcm9ubWVudCgpOwotICAgIElVUklGYWN0b3J5ICBmYWN0b3J5ICAgICA9IGVudmlyb25tZW50LmdldFVSSUZhY3RvcnkoKTsKLSAgICBPdXRwdXRTdHJlYW1Xcml0ZXIgICAgICAgc3RyZWFtICAgICAgPSBudWxsOwotICAgIFByaW50V3JpdGVyICAgICAgICAgICAgICB3cml0ZXIgICAgICA9IG51bGw7Ci0gICAgSW5wdXRTdHJlYW1SZWFkZXIgICAgICAgIGlucHV0U3RyZWFtID0gbnVsbDsKLSAgICBCdWZmZXJlZFJlYWRlciAgICAgICAgICAgcmVhZGVyICAgICAgPSBudWxsOwotICAgIAotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmlsZVVSSVRlc3RzLnRlc3RJT09wZXJhdGlvbnMoKSIpOwotICAgIHRyeQotICAgIHsKLSAgICAgIEZpbGUgZm9sZGVyUGF0aDAgICAgPSBuZXcgRmlsZSggdGVtcERpciwgInRvcEZvbGRlcjUiICk7Ci0gICAgICBJVVJJICAgdXJpMCAgICAgICAgID0gZmFjdG9yeS5uZXdVUkkoIGZvbGRlclBhdGgwLnRvVVJMKCkudG9TdHJpbmcoKSApOwotICAgICAgSVVSSSAgIHVyaVJlbGF0aXZlMSA9IGZhY3RvcnkubmV3VVJJKCAibGV2ZWwxIik7Ci0gICAgICBJVVJJICAgdXJpUmVsYXRpdmUyID0gZmFjdG9yeS5uZXdVUkkoICJsZWFmRmlsZS50eHQiKTsKLSAgICAgIElVUkkgICBuZXdVUkkgICAgICAgPSB1cmkwLmFwcGVuZCggdXJpUmVsYXRpdmUxICkuYXBwZW5kKCB1cmlSZWxhdGl2ZTIgKTsKLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggIm5ld1VSSSBzaG91bGQgbm90IGV4aXN0IiwgIW5ld1VSSS5pc1ByZXNlbnQoKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggIm5ld1VSSSBzaG91bGQgbm90IGJlIHJlYWRhYmxlIiwgIW5ld1VSSS5pc1JlYWRhYmxlKCkgKTsKLSAgICAgIGFzc2VydFRydWUoICJuZXdVUkkgc2hvdWxkIGJlIHdyaXRhYmxlIiwgIW5ld1VSSS5pc1dyaXRhYmxlKCkgKTsKLSAgICAgIAotICAgICAgc3RyZWFtID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlciggbmV3VVJJLmdldE91dHB1dFN0cmVhbSgpICk7Ci0gICAgICB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoIHN0cmVhbSApOwotICAgICAgCi0gICAgICB3cml0ZXIucHJpbnRsbiggIlRoaXMgaXMgbGluZSAxIG9mIHRoZSBmaWxlLiIgKTsgCi0gICAgICB3cml0ZXIucHJpbnRsbiggIlRoaXMgaXMgbGluZSAyIG9mIHRoZSBmaWxlLiIgKTsKLSAgICAgIHdyaXRlci5wcmludGxuKCAiVGhpcyBpcyB0aGUgZW5kIG9mIHRoZSBmaWxlLiIgKTsKLSAgICAgIAotICAgICAgd3JpdGVyLmNsb3NlKCk7Ci0gICAgICBzdHJlYW0uY2xvc2UoKTsKLSAgICAgIHdyaXRlciA9IG51bGw7Ci0gICAgICBzdHJlYW0gPSBudWxsOwotICAgICAKLSAgICAgIGFzc2VydFRydWUoICJuZXdVUkkgc2hvdWxkIGJlIHJlYWRhYmxlIiwgbmV3VVJJLmlzUmVhZGFibGUoKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggIm5ld1VSSSBzaG91bGQgYmUgd3JpdGFibGUiLCBuZXdVUkkuaXNXcml0YWJsZSgpICk7Ci0gICAgICAKLSAgICAgIC8vIE5vdyByZWFkIGJhY2sgdGhpcyBuZXcgZmlsZS4KLSAgICAgIGlucHV0U3RyZWFtID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKCBuZXdVUkkuZ2V0SW5wdXRTdHJlYW0oKSApOwotICAgICAgcmVhZGVyICAgICAgPSBuZXcgQnVmZmVyZWRSZWFkZXIoIGlucHV0U3RyZWFtICk7Ci0gICAgICAKLSAgICAgIGFzc2VydFRydWUoICJCYWQgZmlyc3QgbGluZSBvZiBmaWxlIiwgcmVhZGVyLnJlYWRMaW5lKCkuZXF1YWxzKCJUaGlzIGlzIGxpbmUgMSBvZiB0aGUgZmlsZS4iKSApOyAKLSAgICAgIGFzc2VydFRydWUoICJCYWQgc2Vjb25kIGxpbmUgb2YgZmlsZSIsIHJlYWRlci5yZWFkTGluZSgpLmVxdWFscygiVGhpcyBpcyBsaW5lIDIgb2YgdGhlIGZpbGUuIikgKTsgCi0gICAgICBhc3NlcnRUcnVlKCAiQmFkIGxhc3QgbGluZSBvZiBmaWxlIiwgcmVhZGVyLnJlYWRMaW5lKCkuZXF1YWxzKCJUaGlzIGlzIHRoZSBlbmQgb2YgdGhlIGZpbGUuIikgKTsKLSAgICAgIGFzc2VydFRydWUoICJFeHRyYSBsaW5lcyBmb3VuZCBpbiBmaWxlIiwgcmVhZGVyLnJlYWRMaW5lKCkgPT0gbnVsbCApOwotICAgICAgCi0gICAgICByZWFkZXIuY2xvc2UoKTsKLSAgICAgIAotICAgICAgLy9Ob3cgcmVuYW1lIHRoZSBmb2xkZXIuCi0gICAgICBJVVJJIGxldmVsMSAgID0gdXJpMC5hcHBlbmQoIHVyaVJlbGF0aXZlMSApOwotICAgICAgSVVSSSBuZXdMZXZlbCA9IHVyaTAuYXBwZW5kKCBmYWN0b3J5Lm5ld1VSSSgibmV3TGV2ZWwxIikgKTsKLSAgICAgIElVUkkgb2xkRmlsZSAgPSBuZXdMZXZlbC5hcHBlbmQoIHVyaVJlbGF0aXZlMiApOwotICAgICAgSVVSSSBuZXdGaWxlICA9IG5ld0xldmVsLmFwcGVuZCggZmFjdG9yeS5uZXdVUkkoICJuZXdGaWxlIiApICk7Ci0gICAgICAKLSAgICAgIGFzc2VydFRydWUoICJVUkkgaXMgbm90IHByZXNlbnQiLCBuZXdVUkkuaXNQcmVzZW50KCkgKTsKLSAgICAgIGFzc2VydFRydWUoICJVUkkgaXMgcHJlc2VudCIsICFuZXdMZXZlbC5hcHBlbmQodXJpUmVsYXRpdmUyKS5pc1ByZXNlbnQoKSApOwotICAgICAgCi0gICAgICBsZXZlbDEucmVuYW1lKCBuZXdMZXZlbCApOwotICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAiVVJJIGlzIHByZXNlbnQiLCAhbmV3VVJJLmlzUHJlc2VudCgpICk7Ci0gICAgICBhc3NlcnRUcnVlKCAiVVJJIGlzIG5vdCBwcmVzZW50IiwgbmV3TGV2ZWwuYXBwZW5kKHVyaVJlbGF0aXZlMikuaXNQcmVzZW50KCkgKTsKLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggIlVSSSBpcyBwcmVzZW50IiwgIW5ld0ZpbGUuaXNQcmVzZW50KCkgKTsKLSAgICAgIGFzc2VydFRydWUoICJVUkkgaXMgbm90IHByZXNlbnQiLCBvbGRGaWxlLmlzUHJlc2VudCgpICk7Ci0gICAgICAKLSAgICAgIG9sZEZpbGUucmVuYW1lKCBuZXdGaWxlICk7Ci0gICAgICAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggIlVSSSBpcyBub3QgcHJlc2VudCIsIG5ld0ZpbGUuaXNQcmVzZW50KCkgKTsKLSAgICAgIGFzc2VydFRydWUoICJVUkkgaXMgcHJlc2VudCIsICFvbGRGaWxlLmlzUHJlc2VudCgpICk7ICAgICAgCi0gICAgfQotICAgIGNhdGNoKCBVUklFeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgICBhc3NlcnRUcnVlKCAiRXhjZXB0aW9uIHRocm93OiIgKyBleGMuZ2V0TWVzc2FnZSgpLCBmYWxzZSApOwotICAgIH0KLSAgICBjYXRjaCggSU9FeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgICBhc3NlcnRUcnVlKCAiRXhjZXB0aW9uIHRocm93OiIgKyBleGMuZ2V0TWVzc2FnZSgpLCBmYWxzZSApOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgaWYoIHN0cmVhbSAhPSBudWxsICkKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICB3cml0ZXIuY2xvc2UoKTsKLSAgICAgICAgICBzdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggSU9FeGNlcHRpb24gZXhjICkKLSAgICAgICAgewotICAgICAgICAgIGFzc2VydFRydWUoICJFeGNlcHRpb24gdGhyb3c6IiArIGV4Yy5nZXRNZXNzYWdlKCksIGZhbHNlICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgICAgaWYoIGlucHV0U3RyZWFtICE9IG51bGwgKQotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIGlucHV0U3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgcmVhZGVyLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIElPRXhjZXB0aW9uIGV4YyApCi0gICAgICAgIHsKLSAgICAgICAgICBhc3NlcnRUcnVlKCAiRXhjZXB0aW9uIHRocm93OiIgKyBleGMuZ2V0TWVzc2FnZSgpLCBmYWxzZSApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0UmVsYXRpdmUoKQotICB7Ci0gICAgSUVudmlyb25tZW50IGVudmlyb25tZW50ID0gRW52aXJvbm1lbnRTZXJ2aWNlLmdldEVjbGlwc2VDb25zb2xlRW52aXJvbm1lbnQoKTsKLSAgICBJVVJJRmFjdG9yeSAgZmFjdG9yeSAgICAgPSBlbnZpcm9ubWVudC5nZXRVUklGYWN0b3J5KCk7Ci0gICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCJGaWxlVVJJVGVzdHMudGVzdFJlbGF0aXZlKCkiKTsKLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBGaWxlICAgZm9sZGVyUGF0aDAgPSBuZXcgRmlsZSggdGVtcERpciwgInJlbGF0aXZlUHJvaiIgKTsKLSAgICAgIElVUkkgICB1cmkwICAgICAgICAgPSBmYWN0b3J5Lm5ld1VSSSggZm9sZGVyUGF0aDAudG9VUkwoKS50b1N0cmluZygpICk7Ci0gICAgICBJVVJJICAgdXJpUmVsYXRpdmUxID0gZmFjdG9yeS5uZXdVUkkoICJsZXZlbDEiKTsKLSAgICAgIElVUkkgICBsZXZlbDFVUkkgICAgPSB1cmkwLmFwcGVuZCggdXJpUmVsYXRpdmUxICk7Ci0gICAgICAKLSAgICAgIGFzc2VydFRydWUoICJVcmkgaXMgcmVsYXRpdmUiLCAhdXJpMC5pc1JlbGF0aXZlKCkgKTsKLSAgICAgIGFzc2VydFRydWUoICJVcmkgaXMgbm90IHJlbGF0aXZlIiwgdXJpUmVsYXRpdmUxLmlzUmVsYXRpdmUoKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggIlVyaSBpcyByZWxhdGl2ZSIsICFsZXZlbDFVUkkuaXNSZWxhdGl2ZSgpICk7Ci0gICAgICAKLSAgICAgIGFzc2VydFRydWUoICJVcmkgaXMgbm90IGhpZXJhcmNoaWNhbCIsIHVyaTAuaXNIaWVyYXJjaGljYWwoKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggIlVyaSBpcyBub3QgaGllcmFyY2hpY2FsIiwgdXJpUmVsYXRpdmUxLmlzSGllcmFyY2hpY2FsKCkgKTsKLSAgICAgIGFzc2VydFRydWUoICJVcmkgaXMgbm90IGhpZXJhcmNoaWNhbCIsIGxldmVsMVVSSS5pc0hpZXJhcmNoaWNhbCgpICk7IAotICAgIH0KLSAgICBjYXRjaCggVVJJRXhjZXB0aW9uIGV4YykKLSAgICB7Ci0gICAgICBhc3NlcnRUcnVlKCAiRXhjZXB0aW9uIHRocm93OiIgKyBleGMuZ2V0TWVzc2FnZSgpLCBmYWxzZSApOwotICAgIH0KLSAgICBjYXRjaCggTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgYXNzZXJ0VHJ1ZSggIkV4Y2VwdGlvbiB0aHJvdzoiICsgZXhjLmdldE1lc3NhZ2UoKSwgZmFsc2UgKTsgIAotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdEVyYXNlMSgpCi0gIHsKLSAgICBJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgPSBFbnZpcm9ubWVudFNlcnZpY2UuZ2V0RWNsaXBzZUNvbnNvbGVFbnZpcm9ubWVudCgpOwotICAgIElVUklGYWN0b3J5ICBmYWN0b3J5ICAgICA9IGVudmlyb25tZW50LmdldFVSSUZhY3RvcnkoKTsKLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZpbGVVUklUZXN0cy50ZXN0RXJhc2UxKCkiKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBGaWxlICAgZm9sZGVyUGF0aDAgID0gbmV3IEZpbGUoIHRlbXBEaXIsICJ0b3BGb2xkZXI2IiApOwotICAgICAgSVVSSSAgIHVyaTAgICAgICAgICA9IGZhY3RvcnkubmV3VVJJKCBmb2xkZXJQYXRoMC50b1VSTCgpLnRvU3RyaW5nKCkgKTsKLSAgICAgIElVUkkgICB1cmlSZWxhdGl2ZTEgPSBmYWN0b3J5Lm5ld1VSSSggImxldmVsMSIpOwotICAgICAgSVVSSSAgIHVyaVJlbGF0aXZlMiA9IGZhY3RvcnkubmV3VVJJKCAibGVhZkZpbGUudHh0Iik7Ci0gICAgICBJVVJJICAgbmV3VVJJICAgICAgID0gdXJpMC5hcHBlbmQoIHVyaVJlbGF0aXZlMSApLmFwcGVuZCggdXJpUmVsYXRpdmUyICk7Ci0gICAgICBJVVJJICAgbGV2ZWwxVVJJICAgID0gdXJpMC5hcHBlbmQoIHVyaVJlbGF0aXZlMSApOwotICAgICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAibmV3VVJJIHNob3VsZCBub3QgZXhpc3QiLCAhbmV3VVJJLmlzUHJlc2VudCgpICk7Ci0gICAgICAKLSAgICAgIG5ld1VSSS50b3VjaExlYWYoKTsKLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggIm5ld1VSSSBzaG91bGQgZXhpc3QiLCBuZXdVUkkuaXNQcmVzZW50KCkgKTsKLSAgICAgIAotICAgICAgbmV3VVJJLmVyYXNlKCk7Ci0gICAgICAKLSAgICAgIGFzc2VydFRydWUoICJuZXdVUkkgc2hvdWxkIG5vdCBleGlzdCIsICFuZXdVUkkuaXNQcmVzZW50KCkgKTsKLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggImZvbGRlciByb290IHNob3VsZCBleGlzdCIsIHVyaTAuaXNQcmVzZW50KCkgKTsKLSAgICAgIGFzc2VydFRydWUoICJmb2xkZXIgbGV2ZWwxIHNob3VsZCBleGlzdCIsIGxldmVsMVVSSS5pc1ByZXNlbnQoKSApOwotICAgICAgCi0gICAgICB1cmkwLmVyYXNlKCk7Ci0gICAgICAKLSAgICAgIGFzc2VydFRydWUoICJmb2xkZXIgcm9vdCBzaG91bGQgbm90IGV4aXN0IiwgIXVyaTAuaXNQcmVzZW50KCkgKTsKLSAgICAgIGFzc2VydFRydWUoICJmb2xkZXIgbGV2ZWwxIHNob3VsZCBub3QgZXhpc3QiLCAhbGV2ZWwxVVJJLmlzUHJlc2VudCgpICk7Ci0gICAgICAKLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMpCi0gICAgewotICAgICAgYXNzZXJ0VHJ1ZSggIkV4Y2VwdGlvbiB0aHJvdzoiICsgZXhjLmdldE1lc3NhZ2UoKSwgZmFsc2UgKTsKLSAgICB9Ci0gICAgY2F0Y2goIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICAgIGFzc2VydFRydWUoICJFeGNlcHRpb24gdGhyb3c6IiArIGV4Yy5nZXRNZXNzYWdlKCksIGZhbHNlICk7ICAKLSAgICB9Ci0gIH0KLSAgCi0gIAotICBwdWJsaWMgdm9pZCB0ZXN0SXNMZWFmKCkKLSAgewotICAgIElFbnZpcm9ubWVudCBlbnZpcm9ubWVudCA9IEVudmlyb25tZW50U2VydmljZS5nZXRFY2xpcHNlQ29uc29sZUVudmlyb25tZW50KCk7Ci0gICAgSVVSSUZhY3RvcnkgIGZhY3RvcnkgICAgID0gZW52aXJvbm1lbnQuZ2V0VVJJRmFjdG9yeSgpOwotICAgIAotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmlsZVVSSVRlc3RzLnRlc3RJc0xlYWYoKSIpOwotICAgIHRyeQotICAgIHsKLSAgICAgIEZpbGUgICBmb2xkZXJQYXRoMCAgPSBuZXcgRmlsZSggdGVtcERpciwgInRvcEZvbGRlcjciICk7Ci0gICAgICBJVVJJICAgdXJpMCAgICAgICAgID0gZmFjdG9yeS5uZXdVUkkoIGZvbGRlclBhdGgwLnRvVVJMKCkudG9TdHJpbmcoKSApOwotICAgICAgSVVSSSAgIHVyaVJlbGF0aXZlMSA9IGZhY3RvcnkubmV3VVJJKCAibGV2ZWwxIik7Ci0gICAgICBJVVJJICAgdXJpUmVsYXRpdmUyID0gZmFjdG9yeS5uZXdVUkkoICJsZWFmRmlsZS50eHQiKTsKLSAgICAgIElVUkkgICBuZXdVUkkgICAgICAgPSB1cmkwLmFwcGVuZCggdXJpUmVsYXRpdmUxICkuYXBwZW5kKCB1cmlSZWxhdGl2ZTIgKTsKLSAgICAgIElVUkkgICBwYXJlbnQgICAgICAgPSBuZXdVUkkucGFyZW50KCk7Ci0gICAgICAKLSAgICAgIGFzc2VydFRydWUoICJuZXdVUkkgc2hvdWxkIG5vdCBleGlzdCIsICFuZXdVUkkuaXNQcmVzZW50KCkgKTsKLSAgICAgIGFzc2VydFRydWUoICJwYXJlbnQgc2hvdWxkIG5vdCBleGlzdCIsICFwYXJlbnQuaXNQcmVzZW50KCkgKTsKLSAgICAgIGFzc2VydFRydWUoICJuZXdVUkkgc2hvdWxkIG5vdCBiZSBhIGxlYWYgeWV0IiwgIW5ld1VSSS5pc0xlYWYoKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggInBhcmVudCBzaG91bGQgbm90IGJlIGEgbGVhZiIsICFwYXJlbnQuaXNMZWFmKCkgKTsKLSAgICAgIAotICAgICAgbmV3VVJJLnRvdWNoTGVhZigpOwotICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAibmV3VVJJIHNob3VsZCBleGlzdCIsIG5ld1VSSS5pc1ByZXNlbnQoKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggInBhcmVudCBzaG91bGQgZXhpc3QiLCBwYXJlbnQuaXNQcmVzZW50KCkgKTsKLSAgICAgIGFzc2VydFRydWUoICJuZXdVUkkgc2hvdWxkIGJlIGEgbGVhZiIsIG5ld1VSSS5pc0xlYWYoKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggInBhcmVudCBzaG91bGQgbm90IGJlIGEgbGVhZiIsICFwYXJlbnQuaXNMZWFmKCkgKTsKLSAgICAgfQotICAgIGNhdGNoKCBVUklFeGNlcHRpb24gZXhjKQotICAgIHsKLSAgICAgIGFzc2VydFRydWUoICJFeGNlcHRpb24gdGhyb3c6IiArIGV4Yy5nZXRNZXNzYWdlKCksIGZhbHNlICk7Ci0gICAgfQotICAgIGNhdGNoKCBNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgICBhc3NlcnRUcnVlKCAiRXhjZXB0aW9uIHRocm93OiIgKyBleGMuZ2V0TWVzc2FnZSgpLCBmYWxzZSApOyAgCi0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0VmlzaXQoKQotICB7Ci0gICAgSUVudmlyb25tZW50IGVudmlyb25tZW50ID0gRW52aXJvbm1lbnRTZXJ2aWNlLmdldEVjbGlwc2VDb25zb2xlRW52aXJvbm1lbnQoKTsKLSAgICBJVVJJRmFjdG9yeSAgZmFjdG9yeSAgICAgPSBlbnZpcm9ubWVudC5nZXRVUklGYWN0b3J5KCk7Ci0gICAgSVVSSVNjaGVtZSAgIHNjaGVtZSAgICAgID0gRW52aXJvbm1lbnRTZXJ2aWNlLmdldEZpbGVTY2hlbWUoKTsKLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZpbGVVUklUZXN0cy50ZXN0VmlzaXQoKSIpOwotICAgIHRyeQotICAgIHsKLSAgICAgIEZpbGUgZm9sZGVyUGF0aDAgPSBuZXcgRmlsZSggdGVtcERpciwgInJvb3QiICk7Ci0gICAgICBJVVJJIHVyaTAgICAgICAgID0gZmFjdG9yeS5uZXdVUkkoIGZvbGRlclBhdGgwLnRvVVJMKCkudG9TdHJpbmcoKSApOwotICAgICAgCi0gICAgICBIYXNodGFibGUgdGFibGUgPSBidWlsZFRlc3RFbnRyaWVzKCBzY2hlbWUsIHVyaTAgKTsKLSAgICAgIAotICAgICAgdXJpMC52aXNpdCggbmV3IFRlc3RWaXNpdG9yKCB0YWJsZSApICk7ICAgICAgCi0gICAgICB2ZXJpZnlUYWJsZSggdGFibGUgKTsKLSAgICAgIAotICAgICAgcmVzZXRUYWJsZUZvclRlc3QyKCB0YWJsZSApOwotICAgICAgdXJpMC52aXNpdCggbmV3IFRlc3RWaXNpdG9yKCB0YWJsZSApICk7Ci0gICAgICB2ZXJpZnlUYWJsZSggdGFibGUgKTsKLSAgICAgIAotICAgICAgcmVzZXRUYWJsZSggdGFibGUgKTsKLSAgICAgIHVyaTAudmlzaXQoIG5ldyBUZXN0VmlzaXRvciggdGFibGUgKSwgbmV3IFRlc3RGaWx0ZXIoIHRhYmxlICkgKTsKLSAgICAgIHZlcmlmeVRhYmxlKCB0YWJsZSApOwotICAgICAgCi0gICAgICByZXNldFRhYmxlRm9yVGVzdDMoIHRhYmxlICk7Ci0gICAgICB1cmkwLnZpc2l0KCBuZXcgVGVzdFZpc2l0b3IoIHRhYmxlICksIG5ldyBUZXN0RmlsdGVyKCB0YWJsZSApICk7Ci0gICAgICB2ZXJpZnlUYWJsZSggdGFibGUgKTsgICAgIAotICAgIH0KLSAgICBjYXRjaCggVVJJRXhjZXB0aW9uIGV4YykKLSAgICB7Ci0gICAgICBhc3NlcnRUcnVlKCAiRXhjZXB0aW9uIHRocm93OiIgKyBleGMuZ2V0TWVzc2FnZSgpLCBmYWxzZSApOwotICAgIH0KLSAgICBjYXRjaCggTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgYXNzZXJ0VHJ1ZSggIkV4Y2VwdGlvbiB0aHJvdzoiICsgZXhjLmdldE1lc3NhZ2UoKSwgZmFsc2UgKTsgIAotICAgIH0KLSAgfQotIAotICBwcml2YXRlIGNsYXNzIFRlc3RWaXNpdG9yIGltcGxlbWVudHMgSVVSSVZpc2l0b3IKLSAgewotICAgIHByaXZhdGUgSGFzaHRhYmxlIHRhYmxlXzsKLSAgICAKLSAgICBwdWJsaWMgVGVzdFZpc2l0b3IoIEhhc2h0YWJsZSB0YWJsZSkKLSAgICB7Ci0gICAgICB0YWJsZV8gPSB0YWJsZTsgIAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiB2aXNpdCggSVVSSSB1cmkgKQotICAgIHsKLSAgICAgIE5vZGVFbnRyeSBlbnRyeSA9IChOb2RlRW50cnkpdGFibGVfLmdldCggZ2V0TmFtZSggdXJpICkgKTsKLSAgICAgIGVudHJ5Lndhc1Zpc2l0ZWRfID0gdHJ1ZTsKLSAgICAgIHJldHVybiAhZW50cnkuc3RvcFRyYXZlcnNpbmdfOwotICAgIH0gCi0gIH0KLSAgCi0gIHByaXZhdGUgY2xhc3MgVGVzdEZpbHRlciBpbXBsZW1lbnRzIElVUklGaWx0ZXIKLSAgewotICAgIHByaXZhdGUgSGFzaHRhYmxlIHRhYmxlXzsKLSAgICAKLSAgICBwdWJsaWMgVGVzdEZpbHRlciggSGFzaHRhYmxlIHRhYmxlKQotICAgIHsKLSAgICAgIHRhYmxlXyA9IHRhYmxlOyAgCi0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdHMoIElVUkkgdXJpICkKLSAgICB7Ci0gICAgICBOb2RlRW50cnkgZW50cnkgPSAoTm9kZUVudHJ5KXRhYmxlXy5nZXQoIGdldE5hbWUoIHVyaSApICk7Ci0gICAgICByZXR1cm4gZW50cnkudmlzaXROb2RlXzsKLSAgICB9IAotICB9Ci0gIAotICBwcml2YXRlIEhhc2h0YWJsZSBidWlsZFRlc3RFbnRyaWVzKCBJVVJJU2NoZW1lIHNjaGVtZSwgSVVSSSByb290VVJJICkKLSAgewotICAgIEhhc2h0YWJsZSB0YWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLSAgICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgSVVSSSByb290YzEgPSByb290VVJJLmFwcGVuZCggc2NoZW1lLm5ld1VSSSggInJvb3RjMSIpICk7Ci0gICAgICBJVVJJIHJvb3RjMiA9IHJvb3RVUkkuYXBwZW5kKCBzY2hlbWUubmV3VVJJKCAicm9vdGMyIikgKTsKLSAgICAgIElVUkkgcm9vdGMzID0gcm9vdFVSSS5hcHBlbmQoIHNjaGVtZS5uZXdVUkkoICJyb290YzMiKSApOwotICAgICAgCi0gICAgICBJVVJJIHJvb3RjMmMxID0gcm9vdGMyLmFwcGVuZCggc2NoZW1lLm5ld1VSSSggInJvb3RjMmMxIikgKTsKLSAgICAgIElVUkkgcm9vdGMyYzIgPSByb290YzIuYXBwZW5kKCBzY2hlbWUubmV3VVJJKCAicm9vdGMyYzIiKSApOwotICAgICAgSVVSSSByb290YzJjMyA9IHJvb3RjMi5hcHBlbmQoIHNjaGVtZS5uZXdVUkkoICJyb290YzJjMyIpICk7Ci0gICAgICAKLSAgICAgIElVUkkgcm9vdGMyYzJjMSA9IHJvb3RjMmMyLmFwcGVuZCggc2NoZW1lLm5ld1VSSSggInJvb3RjMmMyYzEiKSApOwotICAgICAgSVVSSSByb290YzJjMmMyID0gcm9vdGMyYzIuYXBwZW5kKCBzY2hlbWUubmV3VVJJKCAicm9vdGMyYzJjMiIpICk7Ci0gICAgICAKLSAgICAgIElVUkkgcm9vdGMzYzEgPSByb290YzMuYXBwZW5kKCBzY2hlbWUubmV3VVJJKCAicm9vdGMzYzEiKSApOwotICAgICAgSVVSSSByb290YzNjMiA9IHJvb3RjMy5hcHBlbmQoIHNjaGVtZS5uZXdVUkkoICJyb290YzNjMiIpICk7Ci0gICAgICAKLSAgICAgIC8vIE5vdyB0aGF0IHRoZSBVUkkncyBhcmUgY3JlYXRlZCB3ZSBuZWVkIHRvIGNyZWF0ZSBwaHlzaWNhbCBmb2xkZXJzCi0gICAgICAvLyBhbmQgZmlsZXMgdG8gcmVwcmVzZW50IHRoZW0uCi0gICAgICByb290YzNjMS50b3VjaExlYWYoKTsKLSAgICAgIHJvb3RjM2MyLnRvdWNoTGVhZigpOyAgICAKLSAgICAgIAotICAgICAgcm9vdGMyYzJjMS50b3VjaExlYWYoKTsKLSAgICAgIHJvb3RjMmMyYzIudG91Y2hMZWFmKCk7Ci0gICAgICAKLSAgICAgIHJvb3RjMmMxLnRvdWNoTGVhZigpOwotICAgICAgcm9vdGMyYzMudG91Y2hMZWFmKCk7Ci0gICAgICAKLSAgICAgIHJvb3RjMS50b3VjaEZvbGRlcigpOwotICAgICAgCi0gICAgICAvLyBOb3cgY3JlYXRlIHRoZSB0aGUgdGFibGUgZW50cmllcyB0aGF0IHdpbGwgYmUgdXNlZCB0byB2aXNpdAotICAgICAgLy8gdGhlIFVSSSBub2Rlcy4KLSAgICAgIHRhYmxlLnB1dCggInJvb3QiLCBuZXcgTm9kZUVudHJ5KCkgKTsKLSAgICAgIHRhYmxlLnB1dCggInJvb3RjMSIsIG5ldyBOb2RlRW50cnkoKSApOwotICAgICAgdGFibGUucHV0KCAicm9vdGMyIiwgbmV3IE5vZGVFbnRyeSgpICk7Ci0gICAgICB0YWJsZS5wdXQoICJyb290YzMiLCBuZXcgTm9kZUVudHJ5KCkgKTsKLSAgICAgIHRhYmxlLnB1dCggInJvb3RjMmMxIiwgbmV3IE5vZGVFbnRyeSgpICk7Ci0gICAgICB0YWJsZS5wdXQoICJyb290YzJjMiIsIG5ldyBOb2RlRW50cnkoKSApOwotICAgICAgdGFibGUucHV0KCAicm9vdGMyYzMiLCBuZXcgTm9kZUVudHJ5KCkgKTsKLSAgICAgIHRhYmxlLnB1dCggInJvb3RjMmMyYzEiLCBuZXcgTm9kZUVudHJ5KCkgKTsKLSAgICAgIHRhYmxlLnB1dCggInJvb3RjMmMyYzIiLCBuZXcgTm9kZUVudHJ5KCkgKTsKLSAgICAgIHRhYmxlLnB1dCggInJvb3RjM2MxIiwgbmV3IE5vZGVFbnRyeSgpICk7Ci0gICAgICB0YWJsZS5wdXQoICJyb290YzNjMiIsIG5ldyBOb2RlRW50cnkoKSApOwotICAgIH0KLSAgICBjYXRjaCggVVJJRXhjZXB0aW9uIGV4YykKLSAgICB7Ci0gICAgICBhc3NlcnRUcnVlKCAiRXhjZXB0aW9uIHRocm93OiIgKyBleGMuZ2V0TWVzc2FnZSgpLCBmYWxzZSApOwotICAgIH0gIAotICAgICAgCi0gICAgcmV0dXJuIHRhYmxlOwotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBnZXROYW1lKCBJVVJJIHVyaSApCi0gIHsgCi0gICAgU3RyaW5nICAgIGZ1bGxOYW1lICA9IHVyaS50b1N0cmluZygpOwotICAgIGludCAgICAgICBzbGFzaCAgICAgPSBmdWxsTmFtZS5sYXN0SW5kZXhPZiggJy8nICk7Ci0gICAgCi0gICAgaWYoIHNsYXNoID09IC0xICkgc2xhc2ggPSBmdWxsTmFtZS5sYXN0SW5kZXhPZiggJ1xcJyApOwotICAgIAotICAgIFN0cmluZyBuYW1lID0gZnVsbE5hbWUuc3Vic3RyaW5nKCBzbGFzaCArIDEsIGZ1bGxOYW1lLmxlbmd0aCgpICk7Ci0gICAgCi0gICAgcmV0dXJuIG5hbWU7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCB2ZXJpZnlUYWJsZSggSGFzaHRhYmxlIHRhYmxlICkKLSAgewotICAgIEl0ZXJhdG9yIGVudHJpZXMgPSB0YWJsZS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgCi0gICAgd2hpbGUoIGVudHJpZXMuaGFzTmV4dCgpICkKLSAgICB7Ci0gICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KWVudHJpZXMubmV4dCgpOwotICAgICAgCi0gICAgICBTdHJpbmcgICAga2V5ICA9IChTdHJpbmcpZW50cnkuZ2V0S2V5KCk7Ci0gICAgICBOb2RlRW50cnkgbm9kZSA9IChOb2RlRW50cnkpZW50cnkuZ2V0VmFsdWUoKTsgCi0gCi0gICAgICBhc3NlcnRUcnVlKCAiQmFkIHRhYmxlIHJlc3VsdCBmb3Iga2V5OiIgKyBrZXkgKyAiIHZpc2l0ZWQ9IiArIG5vZGUud2FzVmlzaXRlZF8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgc2hvdWxkYmU9IiArIG5vZGUuc2hvdWxkQmVWaXNpdGVkXywKLSAgICAgICAgICAgICAgICAgIG5vZGUud2FzVmlzaXRlZF8gPT0gbm9kZS5zaG91bGRCZVZpc2l0ZWRfICk7Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgcmVzZXRUYWJsZUZvclRlc3QyKCBIYXNodGFibGUgdGFibGUgKQotICB7Ci0gICAgcmVzZXRUYWJsZSggdGFibGUgKTsKLSAgICAKLSAgICBOb2RlRW50cnkgcm9vdGMyID0gKE5vZGVFbnRyeSl0YWJsZS5nZXQoICJyb290YzIiICk7Ci0gICAgcm9vdGMyLnN0b3BUcmF2ZXJzaW5nXyA9IHRydWU7Ci0gICAgCi0gICAgTm9kZUVudHJ5IHJvb3RjMmMxID0gKE5vZGVFbnRyeSl0YWJsZS5nZXQoICJyb290YzJjMSIgKTsKLSAgICByb290YzJjMS5zaG91bGRCZVZpc2l0ZWRfID0gZmFsc2U7Ci0gICAgCi0gICAgTm9kZUVudHJ5IHJvb3RjMmMyID0gKE5vZGVFbnRyeSl0YWJsZS5nZXQoICJyb290YzJjMiIgKTsKLSAgICByb290YzJjMi5zaG91bGRCZVZpc2l0ZWRfID0gZmFsc2U7Ci0gICAgCi0gICAgTm9kZUVudHJ5IHJvb3RjMmMzID0gKE5vZGVFbnRyeSl0YWJsZS5nZXQoICJyb290YzJjMyIgKTsKLSAgICByb290YzJjMy5zaG91bGRCZVZpc2l0ZWRfID0gZmFsc2U7Ci0gICAgCi0gICAgTm9kZUVudHJ5IHJvb3RjMmMyYzEgPSAoTm9kZUVudHJ5KXRhYmxlLmdldCggInJvb3RjMmMyYzEiICk7Ci0gICAgcm9vdGMyYzJjMS5zaG91bGRCZVZpc2l0ZWRfID0gZmFsc2U7Ci0gICAgCi0gICAgTm9kZUVudHJ5IHJvb3RjMmMyYzIgPSAoTm9kZUVudHJ5KXRhYmxlLmdldCggInJvb3RjMmMyYzIiICk7Ci0gICAgcm9vdGMyYzJjMi5zaG91bGRCZVZpc2l0ZWRfID0gZmFsc2U7ICAgCi0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCByZXNldFRhYmxlRm9yVGVzdDMoIEhhc2h0YWJsZSB0YWJsZSApCi0gIHsKLSAgICByZXNldFRhYmxlKCB0YWJsZSApOyAgCi0gICAgCi0gICAgTm9kZUVudHJ5IHJvb3RjMyA9IChOb2RlRW50cnkpdGFibGUuZ2V0KCAicm9vdGMzIiApOwotICAgIHJvb3RjMy52aXNpdE5vZGVfID0gZmFsc2U7Ci0gICAgcm9vdGMzLnNob3VsZEJlVmlzaXRlZF8gPSBmYWxzZTsKLSAgICAKLSAgICBOb2RlRW50cnkgcm9vdGMyYzIgPSAoTm9kZUVudHJ5KXRhYmxlLmdldCggInJvb3RjMmMyIiApOwotICAgIHJvb3RjMmMyLnZpc2l0Tm9kZV8gPSBmYWxzZTsKLSAgICByb290YzJjMi5zaG91bGRCZVZpc2l0ZWRfID0gZmFsc2U7Ci0gICAgCi0gICAgTm9kZUVudHJ5IHJvb3RjM2MxID0gKE5vZGVFbnRyeSl0YWJsZS5nZXQoICJyb290YzNjMSIgKTsKLSAgICByb290YzNjMS52aXNpdE5vZGVfID0gZmFsc2U7Ci0gICAgcm9vdGMzYzEuc2hvdWxkQmVWaXNpdGVkXyA9IGZhbHNlOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgcmVzZXRUYWJsZSggSGFzaHRhYmxlIHRhYmxlICkKLSAgewotICAgIEl0ZXJhdG9yIGVudHJpZXMgPSB0YWJsZS52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgIAotICAgIHdoaWxlKCBlbnRyaWVzLmhhc05leHQoKSApCi0gICAgewotICAgICAgTm9kZUVudHJ5IGVudHJ5ID0gKE5vZGVFbnRyeSllbnRyaWVzLm5leHQoKTsKLSAgICAgIGVudHJ5Lndhc1Zpc2l0ZWRfID0gZmFsc2U7Ci0gICAgICBlbnRyeS5zaG91bGRCZVZpc2l0ZWRfPXRydWU7Ci0gICAgICBlbnRyeS5zdG9wVHJhdmVyc2luZ189ZmFsc2U7Ci0gICAgICBlbnRyeS52aXNpdE5vZGVfPXRydWU7Ci0gICAgfQotICB9Ci0gICAgCi0gIHByaXZhdGUgY2xhc3MgTm9kZUVudHJ5Ci0gIHsKLSAgICBwdWJsaWMgTm9kZUVudHJ5KCkKLSAgICB7Ci0gICAgICB0aGlzKCB0cnVlLCBmYWxzZSwgdHJ1ZSApOyAKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIE5vZGVFbnRyeSggYm9vbGVhbiB2aXNpdE5vZGUsIGJvb2xlYW4gc3RvcCwgYm9vbGVhbiBzaG91bGRCZVZpc2l0ZWQgKQotICAgIHsKLSAgICAgIHZpc2l0Tm9kZV8gICAgICAgPSB2aXNpdE5vZGU7Ci0gICAgICBzdG9wVHJhdmVyc2luZ18gID0gc3RvcDsKLSAgICAgIHNob3VsZEJlVmlzaXRlZF8gPSBzaG91bGRCZVZpc2l0ZWQ7Ci0gICAgICB3YXNWaXNpdGVkXyAgICAgID0gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIHZpc2l0Tm9kZV87Ci0gICAgcHVibGljIGJvb2xlYW4gc3RvcFRyYXZlcnNpbmdfOwotICAgIAotICAgIHB1YmxpYyBib29sZWFuIHdhc1Zpc2l0ZWRfOwotICAgIHB1YmxpYyBib29sZWFuIHNob3VsZEJlVmlzaXRlZF87Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC90ZXN0cy9Mb2dnZXJUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3Rlc3RzL0xvZ2dlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NWM3NzcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3Rlc3RzL0xvZ2dlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuRW52aXJvbm1lbnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LlN0YXR1c0V4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIExvZ2dlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgcHVibGljIExvZ2dlclRlc3RzKFN0cmluZyBuYW1lKQotICB7Ci0gICAgc3VwZXIobmFtZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpCi0gIHsKLSAgICBpZiAoYXJncy5sZW5ndGggPT0gMCkKLSAgICB7Ci0gICAgICBydW5BbGwoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoYXJncy5sZW5ndGggPT0gMSkKLSAgICB7Ci0gICAgICBTdHJpbmcgbWV0aG9kVG9SdW4gPSBhcmdzWzBdLnRyaW0oKTsKLSAgICAgIHJ1bk9uZShtZXRob2RUb1J1bik7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgewotICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKExvZ2dlclRlc3RzLmNsYXNzKTsKLSAgfQotCi0gIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBydW5BbGwoKQotICB7Ci0gICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIHJ1bk9uZShTdHJpbmcgbWV0aG9kTmFtZSkKLSAgewotICAgIFRlc3RTdWl0ZSB0ZXN0U3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0gICAgVGVzdENhc2UgdGVzdCA9IG5ldyBMb2dnZXJUZXN0cyhtZXRob2ROYW1lKTsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNhbGxpbmcgTG9nZ2VyVGVzdHMuIittZXRob2ROYW1lKTsKLSAgICB0ZXN0U3VpdGUuYWRkVGVzdCh0ZXN0KTsKLSAgICBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5ydW4odGVzdFN1aXRlKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdExvZ2dlcigpCi0gIHsKLSAgICBJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgPSBFbnZpcm9ubWVudFNlcnZpY2UuZ2V0RWNsaXBzZUNvbnNvbGVFbnZpcm9ubWVudCgpOwotICAgIElMb2cgICAgICAgICBsb2dnZXIgICAgICA9IGVudmlyb25tZW50LmdldExvZygpOwotICAgIAotCS8vYXNzZXJ0VHJ1ZSgiTG9nZ2luZyBlbmFibGVkIiwgIWxvZ2dlci5pc0VuYWJsZWQoKSk7Ci0JLy8gV2UgbWF5IG9yIG1heSBub3QgYmUgY2FsbGVkIHdpdGggdGhlIC1kZWJ1ZyBvcHRpb24sIAotCS8vIHNvIHdlIGNhbiBub3QgdGVzdCBmb3IgaXQsIGJ1dCB3ZSBjYW4gd3JpdGUgYW4gYXBwcm9wcmlhdGUgCi0JLy8gbWVzc2FnZSwgdG8gaGVscCBpbnRlcnByZXQgcmVzdWx0cywgaWYgbmVlZGVkLgotCWlmIChsb2dnZXIuaXNFbmFibGVkKCkpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCIgTG9nZ2luZyBpcyBlbmFibGVkIik7Ci0JfSBlbHNlIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCIgTG9nZ2luZyBpcyBpcyBub3QgZW5hYmxlZCIpOwkJCQotCX0KLSAgICBhc3NlcnRUcnVlKCAiTG9nZ2luZyBmZWF0dXJlIGVuYWJsZWQiLCAhbG9nZ2VyLmlzRW5hYmxlZCggImJhZCBvcHRpb24iICkgKTsKLSAgICAKLSAgICBsb2dnZXIubG9nKCBJTG9nLkVSUk9SLCAwLCB0aGlzLCAidGVzdCBsb2dnZXIiLCBTdGF0dXMuQ0FOQ0VMX1NUQVRVUyApOwotICAgIGxvZ2dlci5sb2coIElMb2cuSU5GTywgMSwgdGhpcywgImFub3RoZXIgbWV0aG9kIiwgIm9iamVjdCIgKTsKLSAgICBsb2dnZXIubG9nKCBJTG9nLldBUk5JTkcsIDMsIHRoaXMsICJvbmUgbW9yZSBtZXRob2QiLCBuZXcgU3RhdHVzRXhjZXB0aW9uKCBTdGF0dXMuT0tfU1RBVFVTICkpOwotICAgIGxvZ2dlci5sb2coIElMb2cuRVJST1IsICJvcHRpb24xIiwgMCwgdGhpcywgInRlc3QgbG9nZ2VyIiwgU3RhdHVzLkNBTkNFTF9TVEFUVVMgKTsKLSAgICBsb2dnZXIubG9nKCBJTG9nLklORk8sICJvcHRpb24yIiwgMSwgdGhpcywgImFub3RoZXIgbWV0aG9kIiwgIm9iamVjdCIgKTsKLSAgICBsb2dnZXIubG9nKCBJTG9nLldBUk5JTkcsICJvcHRpb24zIiwgMywgdGhpcywgIm9uZSBtb3JlIG1ldGhvZCIsIG5ldyBTdGF0dXNFeGNlcHRpb24oIFN0YXR1cy5PS19TVEFUVVMgKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC90ZXN0cy9TdGF0dXNIYW5kbGVyVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC90ZXN0cy9TdGF0dXNIYW5kbGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY4Yjk4OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdGVzdHMvU3RhdHVzSGFuZGxlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnRlc3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LkNob2ljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LkVudmlyb25tZW50U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklTdGF0dXNIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuU3RhdHVzRXhjZXB0aW9uOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgU3RhdHVzSGFuZGxlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgcHJpdmF0ZSBJU3RhdHVzIGVycm9yOwotICBwcml2YXRlIElTdGF0dXMgaW5mbzsKLSAgcHJpdmF0ZSBJU3RhdHVzIHdhcm5pbmc7Ci0gIAotICBwdWJsaWMgU3RhdHVzSGFuZGxlclRlc3RzKFN0cmluZyBuYW1lKQotICB7Ci0gICAgc3VwZXIobmFtZSk7Ci0gICAgCi0gICAgZXJyb3IgICA9IG5ldyBTdGF0dXMoIElTdGF0dXMuRVJST1IsICJpZCIsIDAsICJlcnJvciBtZXNzYWdlIiwgbnVsbCApOwotICAgIGluZm8gICAgPSBuZXcgU3RhdHVzKCBJU3RhdHVzLklORk8sICJpZCIsIDAsICJpbmZvIG1lc3NhZ2UiLCBudWxsICk7Ci0gICAgd2FybmluZyA9IG5ldyBTdGF0dXMoIElTdGF0dXMuV0FSTklORywgImlkIiwgMCwgIndhcm5pbmcgbWVzc2FnZSIsIG51bGwgKTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKLSAgewotICAgIGlmIChhcmdzLmxlbmd0aCA9PSAwKQotICAgIHsKLSAgICAgIHJ1bkFsbCgpOwotICAgIH0KLSAgICBlbHNlIGlmIChhcmdzLmxlbmd0aCA9PSAxKQotICAgIHsKLSAgICAgIFN0cmluZyBtZXRob2RUb1J1biA9IGFyZ3NbMF0udHJpbSgpOwotICAgICAgcnVuT25lKG1ldGhvZFRvUnVuKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoU3RhdHVzSGFuZGxlclRlc3RzLmNsYXNzKTsKLSAgfQotCi0gIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBydW5BbGwoKQotICB7Ci0gICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIHJ1bk9uZShTdHJpbmcgbWV0aG9kTmFtZSkKLSAgewotICAgIFRlc3RTdWl0ZSB0ZXN0U3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0gICAgVGVzdENhc2UgdGVzdCA9IG5ldyBTdGF0dXNIYW5kbGVyVGVzdHMobWV0aG9kTmFtZSk7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCJDYWxsaW5nIFN0YXR1c0hhbmRsZXJUZXN0cy4iK21ldGhvZE5hbWUpOwotICAgIHRlc3RTdWl0ZS5hZGRUZXN0KHRlc3QpOwotICAgIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLnJ1bih0ZXN0U3VpdGUpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0RW52aXJvbm1lbnRTdGF0dXNIYW5kbGVyKCkKLSAgewotICAgIElFbnZpcm9ubWVudCAgIGVudmlyb25tZW50ID0gRW52aXJvbm1lbnRTZXJ2aWNlLmdldEVjbGlwc2VDb25zb2xlRW52aXJvbm1lbnQoKTsKLSAgICBJU3RhdHVzSGFuZGxlciBoYW5kbGVyICAgICA9IGVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKTsKLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBDaG9pY2UgY2hvaWNlMSA9IG5ldyBDaG9pY2UoKTsKLSAgICAgIENob2ljZSBjaG9pY2UyID0gbmV3IENob2ljZSggJ28nLCAiT2siLCAiZGVzY3JpcHRpb24iICk7Ci0gICAgICAKLSAgICAgIFN0YXR1c0V4Y2VwdGlvbiBzb21lRXhjZXB0aW9uID0gbmV3IFN0YXR1c0V4Y2VwdGlvbiggZXJyb3IgKTsKLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggIlN0YXR1cyBub3QgdGhlIHNhbWUgIiwgc29tZUV4Y2VwdGlvbi5nZXRTdGF0dXMoKSA9PSBlcnJvciApOwotICAgICAgCi0gICAgICBoYW5kbGVyLnJlcG9ydCggU3RhdHVzLk9LX1NUQVRVUyApOwotICAgICAgaGFuZGxlci5yZXBvcnQoIGVycm9yICk7Ci0gICAgICBoYW5kbGVyLnJlcG9ydCggd2FybmluZyApOwotICAgICAgaGFuZGxlci5yZXBvcnQoIGluZm8gKTsKLSAgICAgIGNob2ljZTEuc2V0U2hvcnRjdXQoICdjJyApOwotICAgICAgY2hvaWNlMS5zZXRMYWJlbCggImNhbmNlbCIgKTsKLSAgICAgIGNob2ljZTEuc2V0RGVzY3JpcHRpb24oICJjYW5jZWwgZGVzY3JpcHRpb24iICk7Ci0gICAgICAKLSAgICAgIENob2ljZSByZXN1bHQgPSBoYW5kbGVyLnJlcG9ydCggZXJyb3IsIG51bGwgKTsKLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggInJlc3VsdCBub3QgbnVsbCAiLCByZXN1bHQgPT0gbnVsbCApOwotICAgICAgCi0gICAgICByZXN1bHQgPSBoYW5kbGVyLnJlcG9ydCggZXJyb3IsIG5ldyBDaG9pY2VbMF0gKTsKLSAgICAgIGFzc2VydFRydWUoICJyZXN1bHQgbm90IG51bGwgIiwgcmVzdWx0ID09IG51bGwgKTsKLSAgICAgIAotICAgICAgcmVzdWx0ID0gaGFuZGxlci5yZXBvcnQoIGVycm9yLCBuZXcgQ2hvaWNlW117IGNob2ljZTIsIGNob2ljZTEgfSApOwotICAgICAgYXNzZXJ0VHJ1ZSggIkZpcnN0IGNob2ljZSBzaG9ydGN1dCBub3QgdGhlIHNhbWUiLCByZXN1bHQuZ2V0U2hvcnRjdXQoKSA9PSBjaG9pY2UyLmdldFNob3J0Y3V0KCkpOwotICAgICAgYXNzZXJ0VHJ1ZSggIkZpcnN0IGNob2ljZSBsYWJlbCBub3QgdGhlIHNhbWUiLCByZXN1bHQuZ2V0TGFiZWwoKS5lcXVhbHMoIGNob2ljZTIuZ2V0TGFiZWwoKSkpOwotICAgICAgYXNzZXJ0VHJ1ZSggIkZpcnN0IGNob2ljZSBkZXNjcmlwdGlvbiBub3QgdGhlIHNhbWUiLCByZXN1bHQuZ2V0RGVzY3JpcHRpb24oKS5lcXVhbHMoIGNob2ljZTIuZ2V0RGVzY3JpcHRpb24oKSkpOwotICAgICAgCi0gICAgICBoYW5kbGVyLnJlcG9ydEVycm9yKCBlcnJvciApOwotICAgICAgaGFuZGxlci5yZXBvcnRJbmZvKCBpbmZvICk7Ci0gICAgICAKLSAgICB9Ci0gICAgY2F0Y2goIFN0YXR1c0V4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICAgIGFzc2VydFRydWUoICJ1bmV4cGVjdGVkIGV4Y2VwdGlvbjoiLCBmYWxzZSApOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvYXJ0aWZhY3RlZGl0L3Rlc3RzL0FydGlmYWN0RWRpdEFQSVRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9hcnRpZmFjdGVkaXQvdGVzdHMvQXJ0aWZhY3RFZGl0QVBJVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE1MDYzZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9hcnRpZmFjdGVkaXQvdGVzdHMvQXJ0aWZhY3RFZGl0QVBJVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmFydGlmYWN0ZWRpdC50ZXN0czsKLQotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgQXJ0aWZhY3RFZGl0QVBJVGVzdHMgZXh0ZW5kcyBUZXN0U3VpdGUgewotCQotCQotCQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBBcnRpZmFjdEVkaXRBUElUZXN0cygpOwotCX0KLQotCXB1YmxpYyBBcnRpZmFjdEVkaXRBUElUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJLy9hZGRUZXN0KG5ldyBTaW1wbGVUZXN0U3VpdGUoQXJ0aWZhY3RFZGl0VGVzdC5jbGFzcykpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvYXJ0aWZhY3RlZGl0L3Rlc3RzL0FydGlmYWN0RWRpdFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2FydGlmYWN0ZWRpdC90ZXN0cy9BcnRpZmFjdEVkaXRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2MzkxMTkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvYXJ0aWZhY3RlZGl0L3Rlc3RzL0FydGlmYWN0RWRpdFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwNiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5hcnRpZmFjdGVkaXQudGVzdHM7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbHVnaW5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmV0b29scy5jb21tb24udGVzdC5hcGl0b29scy5Qcm9qZWN0VW56aXBVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5BcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLlVucmVzb2x2ZWFibGVVUklFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkFydGlmYWN0RWRpdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbnMuSU9wZXJhdGlvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guRU1GV29ya2JlbmNoQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLkNvbW1vblRlc3RzUGx1Z2luOwotCi0KLQotcHVibGljIGNsYXNzIEFydGlmYWN0RWRpdFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmlsZVNlcCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiZmlsZS5zZXBhcmF0b3IiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX05BTUUgPSAiVGVzdEFydGlmYWN0RWRpdCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX01PRFVMRV9OQU1FID0gIldlYk1vZHVsZTEiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVVJJIG1vZHVsZVVSSSA9IFVSSS5jcmVhdGVVUkkoIm1vZHVsZTovcmVzb3VyY2UvVGVzdEFydGlmYWN0RWRpdC9XZWJNb2R1bGUxIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVF9NT0RFTF9JRCA9ICJqc3Qud2ViIjsKLQlwcml2YXRlIEFydGlmYWN0RWRpdE1vZGVsIGFydGlmYWN0RWRpdE1vZGVsRm9yUmVhZDsKLQlwcml2YXRlIEFydGlmYWN0RWRpdE1vZGVsIGFydGlmYWN0RWRpdE1vZGVsRm9yV3JpdGU7Ci0JcHJpdmF0ZSBBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0Rm9yUmVhZDsKLQlwcml2YXRlIEFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXRGb3JXcml0ZTsKLQlwcml2YXRlIEVkaXRNb2RlbExpc3RlbmVyIGVtTGlzdGVuZXI7Ci0JcHJpdmF0ZSBQYXRoIHppcEZpbGVQYXRoID0gbmV3IFBhdGgoIlRlc3REYXRhIiArIGZpbGVTZXAgKyAiVGVzdEFydGlmYWN0RWRpdC56aXAiKTsKLQlwcml2YXRlIElQcm9qZWN0IHByb2plY3Q7Ci0KLQotCi0JcHJpdmF0ZSBJT3BlcmF0aW9uSGFuZGxlciBoYW5kbGVyID0gbmV3IElPcGVyYXRpb25IYW5kbGVyKCkgewotCi0KLQkJcHVibGljIGJvb2xlYW4gY2FuQ29udGludWUoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0KLQkJcHVibGljIGJvb2xlYW4gY2FuQ29udGludWUoU3RyaW5nIG1lc3NhZ2UsIFN0cmluZ1tdIGl0ZW1zKSB7Ci0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgY2FuQ29udGludWVXaXRoQWxsQ2hlY2soU3RyaW5nIG1lc3NhZ2UpIHsKLQotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGNhbkNvbnRpbnVlV2l0aEFsbENoZWNrQWxsb3dDYW5jZWwoU3RyaW5nIG1lc3NhZ2UpIHsKLQotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBlcnJvcihTdHJpbmcgbWVzc2FnZSkgewotCi0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGluZm9ybShTdHJpbmcgbWVzc2FnZSkgewotCi0KLQkJfQotCi0KLQkJcHVibGljIE9iamVjdCBnZXRDb250ZXh0KCkgewotCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX07Ci0KLQlwdWJsaWMgQXJ0aWZhY3RFZGl0VGVzdCgpIHsKLQkJc3VwZXIoKTsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmICghZ2V0VGFyZ2V0UHJvamVjdCgpLmV4aXN0cygpKQotCQkJaWYgKCFjcmVhdGVQcm9qZWN0KCkpCi0JCQkJZmFpbCgpOwotCQlwcm9qZWN0ID0gZ2V0VGFyZ2V0UHJvamVjdCgpOwotCX0KLQotCi0JcHVibGljIElQcm9qZWN0IGdldFRhcmdldFByb2plY3QoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoUFJPSkVDVF9OQU1FKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjcmVhdGVQcm9qZWN0KCkgewotCQlJUGF0aCBsb2NhbFppcFBhdGggPSBnZXRMb2NhbFBhdGgoKTsKLQkJUHJvamVjdFVuemlwVXRpbCB1dGlsID0gbmV3IFByb2plY3RVbnppcFV0aWwobG9jYWxaaXBQYXRoLCBuZXcgU3RyaW5nW117UFJPSkVDVF9OQU1FfSk7Ci0JCXJldHVybiB1dGlsLmNyZWF0ZVByb2plY3RzKCk7Ci0JfQotCi0KLQotCXByaXZhdGUgSVBhdGggZ2V0TG9jYWxQYXRoKCkgewotCi0JCUlQbHVnaW5EZXNjcmlwdG9yIHBsdWdpbkRlc2NyaXB0b3IgPSBQbGF0Zm9ybS5nZXRQbHVnaW5SZWdpc3RyeSgpLmdldFBsdWdpbkRlc2NyaXB0b3IoIm9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMiKTsKLQkJVVJMIHVybCA9IHBsdWdpbkRlc2NyaXB0b3IuZ2V0SW5zdGFsbFVSTCgpOwotCi0JCXRyeSB7Ci0JCQl1cmwgPSBuZXcgVVJMKHVybC50b1N0cmluZygpICsgemlwRmlsZVBhdGgpOwotCi0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlMSkgewotCQkJZTEucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCQl0cnkgewotCQkJdXJsID0gUGxhdGZvcm0uYXNMb2NhbFVSTCh1cmwpOwotCQkJcHJpbnRMb2NhbFBhdGgodXJsKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gbmV3IFBhdGgodXJsLmdldFBhdGgoKSk7Ci0JfQotCi0KLQotCXByaXZhdGUgdm9pZCBwcmludExvY2FsUGF0aChVUkwgdXJsKSB7Ci0JCUlQYXRoIHBhdGggPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldExvY2F0aW9uKCk7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHBhdGguYXBwZW5kKCJQbGF0Zm9ybUluZm8udHh0IikudG9PU1N0cmluZygpKTsKLQkJQnVmZmVyZWRXcml0ZXIgYnc7Ci0JCVN0cmluZyBvc05hbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKTsKLQkJU3RyaW5nIGZpbGVTZXBlcmF0b3IgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInBhdGguc2VwYXJhdG9yIik7Ci0JCVVSTCB1cmxGaW5kVXNpbmdQbHVnaW4gPSBDb21tb25UZXN0c1BsdWdpbi5pbnN0YW5jZS5maW5kKHppcEZpbGVQYXRoKTsKLQkJdHJ5IHsKLQkJCXVybEZpbmRVc2luZ1BsdWdpbiA9IFBsYXRmb3JtLmFzTG9jYWxVUkwodXJsRmluZFVzaW5nUGx1Z2luKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZTEpIHsKLQkJCWUxLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCVN0cmluZyBqYXZhRmlsZVNlcGVyYXRvciA9IG5ldyBDaGFyYWN0ZXIoRmlsZS5wYXRoU2VwYXJhdG9yQ2hhcikudG9TdHJpbmcoKTsKLQotCi0JCXRyeSB7Ci0JCQlidyA9IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgRmlsZVdyaXRlcihmaWxlKSk7Ci0JCQlidy53cml0ZSgicGx1Z2luRGVzY3JpcHRvciBVUkwgIiArIHVybC50b1N0cmluZygpKTsKLQkJCWJ3LndyaXRlKCJcbiIpOwotCQkJYncud3JpdGUoIk9wZXJhdGluZyBTeXN0ZW06ICIgKyBvc05hbWUpOwotCQkJYncud3JpdGUoIlxuIik7Ci0JCQlidy53cml0ZSgiU3lzdGVtIGZpbGUgc2VwZXJhdG9yOiAiICsgZmlsZVNlcGVyYXRvcik7Ci0JCQlidy53cml0ZSgiXG4iKTsKLQkJCWJ3LndyaXRlKCJVc2luZyBQbHVpZ24uZmluZCBVUkw6IiArIHVybEZpbmRVc2luZ1BsdWdpbi50b1N0cmluZygpKTsKLQkJCWJ3LndyaXRlKCJcbiIpOwotCQkJYncud3JpdGUoIkphdmEgZmlsZSBzZXBlcmF0b3I6ICIgKyBqYXZhRmlsZVNlcGVyYXRvcik7Ci0JCQlidy53cml0ZSgiXG4iKTsKLQkJCWJ3LmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCi0JfQotCi0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBcnRpZmFjdEVkaXRGb3JSZWFkV29ya2JlbmNoQ29tcG9uZW50KCkgewotCQlBcnRpZmFjdEVkaXQgZWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllZGl0ID0gQXJ0aWZhY3RFZGl0LmdldEFydGlmYWN0RWRpdEZvclJlYWQocHJvamVjdCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZWRpdCAhPSBudWxsKSB7Ci0JCQkJZWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlhc3NlcnRUcnVlKGVkaXQgIT0gbnVsbCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QXJ0aWZhY3RFZGl0Rm9yV3JpdGVXb3JrYmVuY2hDb21wb25lbnQoKSB7Ci0JCUFydGlmYWN0RWRpdCBlZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVkaXQgPSBBcnRpZmFjdEVkaXQuZ2V0QXJ0aWZhY3RFZGl0Rm9yV3JpdGUocHJvamVjdCk7Ci0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChlZGl0ICE9IG51bGwpIHsKLQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJCX0KLQkJCWFzc2VydFRydWUoZWRpdCAhPSBudWxsKTsKLQkJfQotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdEdldEFydGlmYWN0RWRpdEZvclJlYWRDb21wb25lbnRIYW5kbGUoKSB7Ci0JCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0JCUFydGlmYWN0RWRpdCBlZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKHByb2plY3QpOwotCQkJV29ya2JlbmNoQ29tcG9uZW50IHdiQ29tcG9uZW50ID0gbW9kdWxlQ29yZS5nZXRDb21wb25lbnQoKTsKLQkJCWVkaXQgPSBBcnRpZmFjdEVkaXQuZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZChwcm9qZWN0KTsKLQotCQl9IGZpbmFsbHkgewotCQkJaWYgKG1vZHVsZUNvcmUgIT0gbnVsbCkgewotCQkJCW1vZHVsZUNvcmUuZGlzcG9zZSgpOwotCQkJCWVkaXQuZGlzcG9zZSgpOwotCQkJfQotCQkJYXNzZXJ0VHJ1ZShlZGl0ICE9IG51bGwpOwotCQl9Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QXJ0aWZhY3RFZGl0Rm9yV3JpdGVDb21wb25lbnRIYW5kbGUoKSB7Ci0JCUFydGlmYWN0RWRpdCBlZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVkaXQgPSBBcnRpZmFjdEVkaXQuZ2V0QXJ0aWZhY3RFZGl0Rm9yV3JpdGUocHJvamVjdCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZWRpdCAhPSBudWxsKSB7Ci0JCQkJZWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlhc3NlcnRUcnVlKGVkaXQgIT0gbnVsbCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNWYWxpZEVkaXRhYmxlTW9kdWxlKCkgewotCQlhc3NlcnRUcnVlKEFydGlmYWN0RWRpdC5pc1ZhbGlkRWRpdGFibGVNb2R1bGUoQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJ0aWZhY3RFZGl0QXJ0aWZhY3RFZGl0TW9kZWwoKSB7Ci0JCUFydGlmYWN0RWRpdCBlZGl0ID0gbmV3IEFydGlmYWN0RWRpdChnZXRBcnRpZmFjdEVkaXRNb2RlbGZvclJlYWQoKSk7Ci0JCWFzc2VydE5vdE51bGwoZWRpdCk7Ci0JCWVkaXQuZGlzcG9zZSgpOwotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdEFydGlmYWN0RWRpdE1vZHVsZUNvcmVOYXR1cmVXb3JrYmVuY2hDb21wb25lbnRib29sZWFuKCkgewotCQl0cnkgewotCQkJU3RydWN0dXJlRWRpdC5nZXRNb2R1bGVDb3JlTmF0dXJlKG1vZHVsZVVSSSk7Ci0JCX0gIGNhdGNoIChVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoKTsKLQkJfQotCQlBcnRpZmFjdEVkaXQgZWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllZGl0ID0gbmV3IEFydGlmYWN0RWRpdChwcm9qZWN0LCB0cnVlKTsKLQkJCWFzc2VydE5vdE51bGwoZWRpdCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZWRpdCAhPSBudWxsKQotCQkJCWVkaXQuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNhdmUoKSB7Ci0JCUFydGlmYWN0RWRpdCBlZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVkaXQgPSBBcnRpZmFjdEVkaXQuZ2V0QXJ0aWZhY3RFZGl0Rm9yV3JpdGUocHJvamVjdCk7Ci0JCQl0cnkgewotCQkJCWVkaXQuc2F2ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZmFpbChlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZWRpdCAhPSBudWxsKSB7Ci0JCQkJZWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlhc3NlcnRUcnVlKGVkaXQgIT0gbnVsbCk7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSh0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2F2ZUlmTmVjZXNzYXJ5KCkgewotCQlBcnRpZmFjdEVkaXQgZWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllZGl0ID0gQXJ0aWZhY3RFZGl0LmdldEFydGlmYWN0RWRpdEZvcldyaXRlKHByb2plY3QpOwotCQkJdHJ5IHsKLQkJCQllZGl0LnNhdmVJZk5lY2Vzc2FyeShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZmFpbChlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChlZGl0ICE9IG51bGwpIHsKLQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCQlwYXNzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNhdmVJZk5lY2Vzc2FyeVdpdGhQcm9tcHQoKSB7Ci0JCUFydGlmYWN0RWRpdCBlZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVkaXQgPSBBcnRpZmFjdEVkaXQuZ2V0QXJ0aWZhY3RFZGl0Rm9yV3JpdGUocHJvamVjdCk7Ci0JCQl0cnkgewotCQkJCWVkaXQuc2F2ZUlmTmVjZXNzYXJ5V2l0aFByb21wdChuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCBoYW5kbGVyLCB0cnVlKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZmFpbChlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZWRpdCAhPSBudWxsKSB7Ci0JCQkJZWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlwYXNzKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlzcG9zZSgpIHsKLQkJQXJ0aWZhY3RFZGl0IGVkaXQ7Ci0JCXRyeSB7Ci0JCQllZGl0ID0gbmV3IEFydGlmYWN0RWRpdChnZXRBcnRpZmFjdEVkaXRNb2RlbGZvclJlYWQoKSk7Ci0JCQllZGl0LmRpc3Bvc2UoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXBhc3MoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29udGVudE1vZGVsUm9vdCgpIHsKLQkJQXJ0aWZhY3RFZGl0IGVkaXQgPSBudWxsOwotCQl0cnkgewotCQkJZWRpdCA9IEFydGlmYWN0RWRpdC5nZXRBcnRpZmFjdEVkaXRGb3JSZWFkKHByb2plY3QpOwotCQkJT2JqZWN0IG9iamVjdCA9IGVkaXQuZ2V0Q29udGVudE1vZGVsUm9vdCgpOwotCQkJLy8gYXNzZXJ0Tm90TnVsbChvYmplY3QpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETyBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChlZGl0ICE9IG51bGwpIHsKLQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRMaXN0ZW5lcigpIHsKLQkJQXJ0aWZhY3RFZGl0IGVkaXQgPSBnZXRBcnRpZmFjdEVkaXRGb3JSZWFkKCk7Ci0JCXRyeSB7Ci0JCQllZGl0LmFkZExpc3RlbmVyKGdldEVtTGlzdGVuZXIoKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlwYXNzKCk7Ci0JCWVkaXQuZGlzcG9zZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVMaXN0ZW5lcigpIHsKLQkJQXJ0aWZhY3RFZGl0IGVkaXQgPSBnZXRBcnRpZmFjdEVkaXRGb3JSZWFkKCk7Ci0JCXRyeSB7Ci0JCQllZGl0LnJlbW92ZUxpc3RlbmVyKGdldEVtTGlzdGVuZXIoKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlwYXNzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0VkaXRNb2RlbCgpIHsKLQotCQlBcnRpZmFjdEVkaXQgZWRpdCA9IGdldEFydGlmYWN0RWRpdEZvclJlYWQoKTsKLQkJYXNzZXJ0VHJ1ZShlZGl0Lmhhc0VkaXRNb2RlbChhcnRpZmFjdEVkaXRNb2RlbEZvclJlYWQpKTsKLQkJZWRpdC5kaXNwb3NlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEFydGlmYWN0RWRpdE1vZGVsKCkgewotCQlBcnRpZmFjdEVkaXQgZWRpdCA9IGdldEFydGlmYWN0RWRpdEZvclJlYWQoKTsKLQkJYXNzZXJ0VHJ1ZShlZGl0Lmhhc0VkaXRNb2RlbChhcnRpZmFjdEVkaXRNb2RlbEZvclJlYWQpKTsKLQkJZWRpdC5kaXNwb3NlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9iamVjdCgpIHsKLQkJcGFzcygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDbGFzcygpIHsKLQkJQXJ0aWZhY3RFZGl0IGVkaXQgPSBnZXRBcnRpZmFjdEVkaXRGb3JSZWFkKCk7Ci0JCWFzc2VydE5vdE51bGwoZWRpdC5nZXRDbGFzcygpKTsKLQkJZWRpdC5kaXNwb3NlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc2hDb2RlKCkgewotCQlBcnRpZmFjdEVkaXQgZWRpdCA9IGdldEFydGlmYWN0RWRpdEZvclJlYWQoKTsKLQkJaW50IHkgPSAtOTk5OTk5OTk5OwotCQlpbnQgeCA9IGVkaXQuaGFzaENvZGUoKTsKLQkJYXNzZXJ0VHJ1ZSh4ICE9IHkpOwotCQllZGl0LmRpc3Bvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzKCkgewotCQlhc3NlcnRUcnVlKGdldEFydGlmYWN0RWRpdEZvclJlYWQoKS5lcXVhbHMoYXJ0aWZhY3RFZGl0Rm9yUmVhZCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbG9uZSgpIHsKLQkJcGFzcygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHsKLQkJYXNzZXJ0VHJ1ZShnZXRBcnRpZmFjdEVkaXRGb3JSZWFkKCkudG9TdHJpbmcoKSAhPSBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm90aWZ5KCkgewotCQl0cnkgewotCQkJc3luY2hyb25pemVkIChnZXRBcnRpZmFjdEVkaXRGb3JSZWFkKCkpIHsKLQkJCQlhcnRpZmFjdEVkaXRGb3JSZWFkLm5vdGlmeSgpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbChlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJcGFzcygpOwotCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vdGlmeUFsbCgpIHsKLQkJdHJ5IHsKLQkJCXN5bmNocm9uaXplZCAoZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZCgpKSB7Ci0JCQkJYXJ0aWZhY3RFZGl0Rm9yUmVhZC5ub3RpZnlBbGwoKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXBhc3MoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0V2FpdGxvbmcoKSB7Ci0JCWxvbmcgeCA9IDI7Ci0JCXRyeSB7Ci0JCQlzeW5jaHJvbml6ZWQgKGdldEFydGlmYWN0RWRpdEZvclJlYWQoKSkgewotCQkJCWdldEFydGlmYWN0RWRpdEZvclJlYWQoKS53YWl0KHgpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gZmFpbChlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJcGFzcygpOwotCX0KLQotCS8qCi0JICogQ2xhc3MgdW5kZXIgdGVzdCBmb3Igdm9pZCB3YWl0KGxvbmcsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0V2FpdGxvbmdpbnQoKSB7Ci0JCWludCB4ID0gMjsKLQkJdHJ5IHsKLQkJCXN5bmNocm9uaXplZCAoZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZCgpKSB7Ci0JCQkJZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZCgpLndhaXQoeCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlwYXNzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFdhaXQoKSB7Ci0JCXRyeSB7Ci0JCQlzeW5jaHJvbml6ZWQgKGdldEFydGlmYWN0RWRpdEZvclJlYWQoKSkgewotCQkJCWdldEFydGlmYWN0RWRpdEZvclJlYWQoKS53YWl0KCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlwYXNzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbmFsaXplKCkgewotCQlwYXNzKCk7Ci0JfQotCi0KLQlwdWJsaWMgQXJ0aWZhY3RFZGl0TW9kZWwgZ2V0QXJ0aWZhY3RFZGl0TW9kZWxmb3JSZWFkKCkgewotCQlFTUZXb3JrYmVuY2hDb250ZXh0IGNvbnRleHQgPSBuZXcgRU1GV29ya2JlbmNoQ29udGV4dChwcm9qZWN0KTsKLQkJYXJ0aWZhY3RFZGl0TW9kZWxGb3JSZWFkID0gbmV3IEFydGlmYWN0RWRpdE1vZGVsKEVESVRfTU9ERUxfSUQsIGNvbnRleHQsIHRydWUsIG1vZHVsZVVSSSk7Ci0JCXJldHVybiBhcnRpZmFjdEVkaXRNb2RlbEZvclJlYWQ7Ci0JfQotCi0KLQotCXB1YmxpYyBBcnRpZmFjdEVkaXQgZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZCgpIHsKLQkJYXJ0aWZhY3RFZGl0Rm9yUmVhZCA9IG5ldyBBcnRpZmFjdEVkaXQoZ2V0QXJ0aWZhY3RFZGl0TW9kZWxmb3JSZWFkKCkpOwotCQlyZXR1cm4gYXJ0aWZhY3RFZGl0Rm9yUmVhZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwYXNzKCkgewotCQlhc3NlcnRUcnVlKHRydWUpOwotCX0KLQotCXB1YmxpYyBFZGl0TW9kZWxMaXN0ZW5lciBnZXRFbUxpc3RlbmVyKCkgewotCQlpZiAoZW1MaXN0ZW5lciA9PSBudWxsKQotCQkJZW1MaXN0ZW5lciA9IG5ldyBFZGl0TW9kZWxMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBlZGl0TW9kZWxDaGFuZ2VkKEVkaXRNb2RlbEV2ZW50IGFuRXZlbnQpIHsKLQkJCQl9Ci0JCQl9OwotCQlyZXR1cm4gZW1MaXN0ZW5lcjsKLQl9Ci0KLQlwdWJsaWMgQXJ0aWZhY3RFZGl0TW9kZWwgZ2V0QXJ0aWZhY3RFZGl0TW9kZWxGb3JXcml0ZSgpIHsKLQkJRU1GV29ya2JlbmNoQ29udGV4dCBjb250ZXh0ID0gbmV3IEVNRldvcmtiZW5jaENvbnRleHQocHJvamVjdCk7Ci0JCXJldHVybiBuZXcgQXJ0aWZhY3RFZGl0TW9kZWwoRURJVF9NT0RFTF9JRCwgY29udGV4dCwgZmFsc2UsIG1vZHVsZVVSSSk7Ci0KLQl9Ci0KLQlwdWJsaWMgQXJ0aWZhY3RFZGl0IGdldEFydGlmYWN0RWRpdEZvcldyaXRlKCkgewotCQlyZXR1cm4gbmV3IEFydGlmYWN0RWRpdChnZXRBcnRpZmFjdEVkaXRNb2RlbEZvcldyaXRlKCkpOwotCi0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS90ZXN0cy9BbGxUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS90ZXN0cy9BbGxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODYwM2ZkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdGVzdHMvQWxsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmNvbXBvbmVudGNvcmUudGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEFsbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JCi0JcHVibGljIHN0YXRpYyBUZXN0U3VpdGUgc3VpdGUoKSB7Ci0JCQotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7IAotCQkKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKElWaXJ0dWFsRm9sZGVyQVBJVGVzdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShNb2R1bGVDb3JlQVBJRlZUVGVzdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShNb2R1bGVDb3JlVVJJQ29udmVydGVyVW5pdFRlc3QuY2xhc3MpOwotCQkvL3N1aXRlLmFkZFRlc3RTdWl0ZShTdHJ1Y3R1cmVFZGl0QVBJVGVzdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTdHJ1Y3R1cmVFZGl0U3RyZXNzVGVzdC5jbGFzcyk7Ci0JCQotCQkKLQkJcmV0dXJuIHN1aXRlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdGVzdHMvQmFzZVZpcnR1YWxUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3Rlc3RzL0Jhc2VWaXJ0dWFsVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDBjYjZjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdGVzdHMvQmFzZVZpcnR1YWxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5jb21wb25lbnRjb3JlLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmNvbXBvbmVudGNvcmUudmlydHVhbHBhdGgudGVzdHMuVGVzdFdvcmtzcGFjZTsKLQotcHVibGljIGNsYXNzIEJhc2VWaXJ0dWFsVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVByb2plY3QgVEVTVF9QUk9KRUNUID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KFRlc3RXb3Jrc3BhY2UuUFJPSkVDVF9OQU1FKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfRk9MREVSX05BTUUgPSAiV0VCLUlORiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBhdGggV0VCSU5GX0ZPTERFUl9SRUFMX1BBVEggPSBuZXcgUGF0aCgiL1dlYk1vZHVsZTEvV2ViQ29udGVudC8iK1RFU1RfRk9MREVSX05BTUUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBhdGggV0VCSU5GX0ZPTERFUl9SVU5USU1FX1BBVEggPSBuZXcgUGF0aCgiLyIrVEVTVF9GT0xERVJfTkFNRSk7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBhdGggVEVTVERBVEFfRk9MREVSX1JFQUxfUEFUSCA9IG5ldyBQYXRoKCJXZWJNb2R1bGUxL3Rlc3RkYXRhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGF0aCBURVNUREFUQV9GT0xERVJfUlVOVElNRV9QQVRIID0gbmV3IFBhdGgoIi8iKTsgLy8kTk9OLU5MUy0xJAotCQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSVBhdGggREVMRVRFTUVfUEFUSCA9IG5ldyBQYXRoKCIvZGVsZXRlbWUiKTsgLy8kTk9OLU5MUy0xJAotCQotCXByb3RlY3RlZCBJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQ7Ci0JCi0JcHJvdGVjdGVkIElWaXJ0dWFsRm9sZGVyIHdlYkluZkZvbGRlcjsKLQlwcm90ZWN0ZWQgSUNvbnRhaW5lciByZWFsV2ViSW5mRm9sZGVyOwotCQotCXByb3RlY3RlZCBJVmlydHVhbEZvbGRlciBkZWxldGVtZVZpcnR1YWxGb2xkZXI7Ci0JcHJvdGVjdGVkIElDb250YWluZXIgZGVsZXRlbWVGb2xkZXI7CQotCi0JcHJvdGVjdGVkIElWaXJ0dWFsRm9sZGVyIHRlc3RkYXRhRm9sZGVyOwotCXByb3RlY3RlZCBJQ29udGFpbmVyIHJlYWxUZXN0ZGF0YUZvbGRlcjsKLQkKLQkKLQotCXB1YmxpYyBCYXNlVmlydHVhbFRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfSAKLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCQotCQlpZiAoIVRlc3RXb3Jrc3BhY2UuZ2V0VGFyZ2V0UHJvamVjdCgpLmV4aXN0cygpKQotCQkJaWYgKCFUZXN0V29ya3NwYWNlLmNyZWF0ZVByb2plY3QoKSkKLQkJCQlmYWlsKCk7Ci0KLQkJCi0JCXJlYWxXZWJJbmZGb2xkZXIgPSBURVNUX1BST0pFQ1QuZ2V0Rm9sZGVyKFdFQklORl9GT0xERVJfUkVBTF9QQVRIKTsKLQkJCi0JCWNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KFRFU1RfUFJPSkVDVCk7Ci0JCQotCQlJVmlydHVhbEZvbGRlciByb290Rm9sZGVyID0gY29tcG9uZW50LmdldFJvb3RGb2xkZXIoKTsKLQkJCi0JCXdlYkluZkZvbGRlciA9IHJvb3RGb2xkZXIuZ2V0Rm9sZGVyKFdFQklORl9GT0xERVJfUlVOVElNRV9QQVRIKTsgCQkKLQotCQl0ZXN0ZGF0YUZvbGRlciA9IHJvb3RGb2xkZXIuZ2V0Rm9sZGVyKFRFU1REQVRBX0ZPTERFUl9SVU5USU1FX1BBVEgpOyAKLQkJcmVhbFRlc3RkYXRhRm9sZGVyID0gVEVTVF9QUk9KRUNULmdldEZvbGRlcihURVNUREFUQV9GT0xERVJfUkVBTF9QQVRIKTsKLQkJCi0JCWRlbGV0ZW1lVmlydHVhbEZvbGRlciA9IHJvb3RGb2xkZXIuZ2V0Rm9sZGVyKERFTEVURU1FX1BBVEgpOwotCQlkZWxldGVtZVZpcnR1YWxGb2xkZXIuY3JlYXRlKElWaXJ0dWFsUmVzb3VyY2UuRk9SQ0UsIG51bGwpOwotCQkKLQkJZGVsZXRlbWVGb2xkZXIgPSBkZWxldGVtZVZpcnR1YWxGb2xkZXIuZ2V0VW5kZXJseWluZ0ZvbGRlcigpOwkJCi0JCQotCX0KLQkKLQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JCQotCQlpZihkZWxldGVtZUZvbGRlci5leGlzdHMoKSkKLQkJCWRlbGV0ZW1lRm9sZGVyLmRlbGV0ZShJVmlydHVhbFJlc291cmNlLkZPUkNFLCBudWxsKTsKLQkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS90ZXN0cy9Db21wb25lbnRDb3JlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS90ZXN0cy9Db21wb25lbnRDb3JlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWExY2M1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdGVzdHMvQ29tcG9uZW50Q29yZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5jb21wb25lbnRjb3JlLnRlc3RzOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ldG9vbHMuY29tbW9uLnRlc3QuYXBpdG9vbHMuUHJvamVjdFVuemlwVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLkNvbW1vblRlc3RzUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgQ29tcG9uZW50Q29yZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmlsZVNlcCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiZmlsZS5zZXBhcmF0b3IiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX05BTUUgPSAiVGVzdEFydGlmYWN0RWRpdCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX01PRFVMRV9OQU1FID0gIldlYk1vZHVsZTEiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVVJJIG1vZHVsZVVSSSA9IFVSSS5jcmVhdGVVUkkoIm1vZHVsZTovcmVzb3VyY2UvVGVzdEFydGlmYWN0RWRpdC9XZWJNb2R1bGUxIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVF9NT0RFTF9JRCA9ICJqc3Qud2ViIjsKLQlwcml2YXRlIFBhdGggemlwRmlsZVBhdGggPSBuZXcgUGF0aCgiVGVzdERhdGEiICsgZmlsZVNlcCArICJUZXN0QXJ0aWZhY3RFZGl0LnppcCIpOwotCXByaXZhdGUgSVByb2plY3QgcHJvamVjdDsKLQlwcml2YXRlIGludCBpLCBzZWVkID0gMDsKLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmICghZ2V0VGFyZ2V0UHJvamVjdCgpLmV4aXN0cygpKQotCQkJaWYgKCFjcmVhdGVQcm9qZWN0KCkpCi0JCQkJZmFpbCgpOwotCQlwcm9qZWN0ID0gZ2V0VGFyZ2V0UHJvamVjdCgpOwotCX0KLQotCi0JcHVibGljIElQcm9qZWN0IGdldFRhcmdldFByb2plY3QoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoUFJPSkVDVF9OQU1FKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjcmVhdGVQcm9qZWN0KCkgewotCQlJUGF0aCBsb2NhbFppcFBhdGggPSBnZXRMb2NhbFBhdGgoKTsKLQkJUHJvamVjdFVuemlwVXRpbCB1dGlsID0gbmV3IFByb2plY3RVbnppcFV0aWwobG9jYWxaaXBQYXRoLCBuZXcgU3RyaW5nW117UFJPSkVDVF9OQU1FfSk7Ci0JCXJldHVybiB1dGlsLmNyZWF0ZVByb2plY3RzKCk7Ci0JfQotCi0JcHJpdmF0ZSBJUGF0aCBnZXRMb2NhbFBhdGgoKSB7Ci0JCVVSTCB1cmwgPSBDb21tb25UZXN0c1BsdWdpbi5pbnN0YW5jZS5maW5kKHppcEZpbGVQYXRoKTsKLQkJdHJ5IHsKLQkJCXVybCA9IFBsYXRmb3JtLmFzTG9jYWxVUkwodXJsKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gbmV3IFBhdGgodXJsLmdldFBhdGgoKSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlQ29tcG9uZW50KCkgewotCQl0cnkgewotCQkJbmV3IENvbXBvbmVudENvcmUoKTsKLQkJCUNvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QsICJ0ZXN0Iik7Ci0JCQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbChlLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVDb21wb25lbnRVc2luZ0NyZWF0ZSgpIHsKLQkJCi0JCUpvYltdIGNyZWF0ZUNvbXBvbmVudEpvYiA9IG5ldyBKb2JbNTAwXTsKLQkJZm9yICggIGkgPSAwOyBpIDwgNTAwOyBpKyspIHsKLQkJCQotCQkgY3JlYXRlQ29tcG9uZW50Sm9iW2ldID0gbmV3IEpvYigiQ3JlYXRlQ29tcG9uZW50IFRlc3QiKSB7Ci0JCSAgICAgICAgcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkgICAgICAgIAl0cnkgewotCQkgICAgCQkJSVZpcnR1YWxDb21wb25lbnQgYwotCQkgICAgICAgICAgICAgICAgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudCggcHJvamVjdCwgcHJvamVjdC5nZXROYW1lKCkgKyBnZXROZXh0U2VlZCgpICk7Ci0JCSAgICAJCQljLmNyZWF0ZSggMCwgbnVsbCApOwotCQkgICAgCQkKLQkJICAgIAkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJICAgIAkJCWZhaWwoZS50b1N0cmluZygpKTsKLQkJICAgIAkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJICAgIAkJfQotCQkgICAgICAgICAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJICAgICAgICB9Ci0JCSAgICB9OwotCQl9Ci0JCWZvciAoaW50IG4gPSAwOyBuIDwgY3JlYXRlQ29tcG9uZW50Sm9iLmxlbmd0aDsgbisrKSB7Ci0JCQljcmVhdGVDb21wb25lbnRKb2Jbbl0uc2V0UnVsZShwcm9qZWN0KTsKLQkJCWNyZWF0ZUNvbXBvbmVudEpvYltuXS5zY2hlZHVsZSgpOwotCQl9Ci0JCQotCX0KLQotCXByb3RlY3RlZCBpbnQgZ2V0TmV4dFNlZWQoKSB7Ci0JCXJldHVybiBzZWVkKys7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlRm9sZGVyKCkgewotCQl0cnkgewotCQkJQ29tcG9uZW50Q29yZS5jcmVhdGVGb2xkZXIocHJvamVjdCwgbmV3IFBhdGgoInRlc3QvcnVudGltZVBhdGgiKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKGUudG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlRmlsZSgpIHsKLQkJdHJ5IHsKLQkJCUNvbXBvbmVudENvcmUuY3JlYXRlRmlsZShwcm9qZWN0LCBuZXcgUGF0aCgidGVzdC9ydW50aW1lUGF0aC9maWxlIikpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbChlLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZVJlZmVyZW5jZSgpIHsKLQkJSVZpcnR1YWxDb21wb25lbnQgY29udGFpbmVyID0gbmV3IFZpcnR1YWxDb21wb25lbnQocHJvamVjdCwgbmV3IFBhdGgoInRlc3QvcnVudGltZVBhdGgvZmlsZSIpKTsKLQkJCi0JCXRyeSB7Ci0JCQlDb21wb25lbnRDb3JlLmNyZWF0ZVJlZmVyZW5jZShjb250YWluZXIsY29udGFpbmVyKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoZS50b1N0cmluZygpKTsKLQkJfQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlUmVzb3VyY2VzKCkgewotCQlJUmVzb3VyY2UgcmVzID0gcHJvamVjdC5nZXRGaWxlKG5ldyBQYXRoKCJXZWJNb2R1bGUxL1dlYkNvbnRlbnQvV0VCLUlORi93ZWIueG1sIikpOwotCQkKLQkJdHJ5IHsKLQkJCUNvbXBvbmVudENvcmUuY3JlYXRlUmVzb3VyY2VzKHJlcyk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKGUudG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdGVzdHMvSUVkaXRNb2RlbEhhbmRsZXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3Rlc3RzL0lFZGl0TW9kZWxIYW5kbGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjUzMjU0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdGVzdHMvSUVkaXRNb2RlbEhhbmRsZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5jb21wb25lbnRjb3JlLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLklFZGl0TW9kZWxIYW5kbGVyOwotCi1wdWJsaWMgY2xhc3MgSUVkaXRNb2RlbEhhbmRsZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCXB1YmxpYyBjbGFzcyBFZGl0TW9kZWxIYW5kbGVyVGVzdCBpbXBsZW1lbnRzIElFZGl0TW9kZWxIYW5kbGVyIHsKLQkJcHVibGljIEVkaXRNb2RlbEhhbmRsZXJUZXN0KCkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2F2ZShJUHJvZ3Jlc3NNb25pdG9yIGFNb25pdG9yKSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzYXZlSWZOZWNlc3NhcnkoSVByb2dyZXNzTW9uaXRvciBhTW9uaXRvcikgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTYXZlKCkgewotCQlJRWRpdE1vZGVsSGFuZGxlciBoYW5kbGVyID0gbmV3IEVkaXRNb2RlbEhhbmRsZXJUZXN0KCk7Ci0JCWhhbmRsZXIuc2F2ZShudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2F2ZUlmTmVjZXNzYXJ5KCkgewotCQlJRWRpdE1vZGVsSGFuZGxlciBoYW5kbGVyID0gbmV3IEVkaXRNb2RlbEhhbmRsZXJUZXN0KCk7Ci0JCWhhbmRsZXIuc2F2ZUlmTmVjZXNzYXJ5KG51bGwpOwotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlzcG9zZSgpIHsKLQkJSUVkaXRNb2RlbEhhbmRsZXIgaGFuZGxlciA9IG5ldyBFZGl0TW9kZWxIYW5kbGVyVGVzdCgpOwotCQloYW5kbGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdGVzdHMvSVZpcnR1YWxDb21wb25lbnRBUElUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3Rlc3RzL0lWaXJ0dWFsQ29tcG9uZW50QVBJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2FkOTYxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdGVzdHMvSVZpcnR1YWxDb21wb25lbnRBUElUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5jb21wb25lbnRjb3JlLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVzb3VyY2U7Ci0KLXB1YmxpYyBjbGFzcyBJVmlydHVhbENvbXBvbmVudEFQSVRlc3QgZXh0ZW5kcyBCYXNlVmlydHVhbFRlc3QgewotCi0JcHVibGljIElWaXJ0dWFsQ29tcG9uZW50QVBJVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHsKLQkJCi0JCVN0cmluZyBuYW1lID0gY29tcG9uZW50LmdldE5hbWUoKTsKLQl9Ci0KLS8vCXB1YmxpYyB2b2lkIHRlc3RHZXRDb21wb25lbnRUeXBlSWQoKSB7Ci0vLwkJU3RyaW5nIGlkID0gY29tcG9uZW50LmdldENvbXBvbmVudFR5cGVJZCgpIDsKLS8vCX0KLS8vCi0vLwlwdWJsaWMgdm9pZCB0ZXN0U2V0Q29tcG9uZW50VHlwZUlkKCkgewotLy8JCVN0cmluZyBpZCA9ICJqc3QuZWpiIjsKLS8vCQljb21wb25lbnQuc2V0Q29tcG9uZW50VHlwZUlkKGlkKSA7Ci0vLwl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWV0YVByb3BlcnRpZXMoKSB7Ci0JCVByb3BlcnRpZXMgcHJvcGVydGllcyA9IGNvbXBvbmVudC5nZXRNZXRhUHJvcGVydGllcygpIDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWV0YVJlc291cmNlcygpIHsKLQkJSVBhdGhbXSBtZXRhcmVzb3VyY2VzID0gY29tcG9uZW50LmdldE1ldGFSZXNvdXJjZXMoKSA7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TWV0YVJlc291cmNlcygpIHsKLQkJCi0JCUlQYXRoW10gbWV0YXJlc291cmNlcyA9IG5ldyBJUGF0aFsxXTsKLQkJbWV0YXJlc291cmNlc1swXSA9IG5ldyBQYXRoKCIvdGVzdCIpOwotCQljb21wb25lbnQuc2V0TWV0YVJlc291cmNlcyhtZXRhcmVzb3VyY2VzKSA7Ci0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFJlc291cmNlcygpIHsKLQkJU3RyaW5nIHJlc291cmNlID0gIi90ZXN0IjsKLQkJSVZpcnR1YWxGb2xkZXIgcm9vdEZvbGRlciA9IGNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCk7CQkKLQkJSVZpcnR1YWxSZXNvdXJjZVtdIHZpcnR1YWxSZXNvdXJjZSA9IHJvb3RGb2xkZXIuZ2V0UmVzb3VyY2VzKHJlc291cmNlKSA7Ci0KLQl9Ci0JCi0JcHVibGljIHZvaWQgIHRlc3RFeGlzdHMoKXsKLQkJYm9vbGVhbiBleGlzdHMgPSBjb21wb25lbnQuZXhpc3RzKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRSb290Rm9sZGVyKCl7Ci0JCWNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRQcm9qZWN0KCl7Ci0JCWNvbXBvbmVudC5nZXRQcm9qZWN0KCk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRNZXRhUHJvcGVydHkoKXsKLQkJY29tcG9uZW50LnNldE1ldGFQcm9wZXJ0eSgiVGVzdDEiLCAidGVzdDFWYWx1ZSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRQcm9wZXJ0aWVzKCl7Ci0JCVByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwotCQlwcm9wcy5zZXRQcm9wZXJ0eSgiVGVzdDIiLCAiVmFsdWUyIik7Ci0JCWNvbXBvbmVudC5zZXRNZXRhUHJvcGVydGllcyhwcm9wcyk7Ci0JfQkKLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS90ZXN0cy9JVmlydHVhbENvbnRhaW5lclRlc3RBUEkuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdGVzdHMvSVZpcnR1YWxDb250YWluZXJUZXN0QVBJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNzRlYmIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS90ZXN0cy9JVmlydHVhbENvbnRhaW5lclRlc3RBUEkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5jb21wb25lbnRjb3JlLnRlc3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVzb3VyY2U7Ci0KLXB1YmxpYyBjbGFzcyBJVmlydHVhbENvbnRhaW5lclRlc3RBUEkgZXh0ZW5kcyBCYXNlVmlydHVhbFRlc3QgewotCQotCXByb3RlY3RlZCBJVmlydHVhbENvbnRhaW5lciBkZWxldGVtZVZpcnR1YWxGb2xkZXIyOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSVBhdGggREVMRVRFTUVfUEFUSDIgPSBuZXcgUGF0aCgiL2RlbGV0ZW1lMiIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgSVZpcnR1YWxDb250YWluZXJUZXN0QVBJKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0gCi0JCi0KLQlwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZSgpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQotCQlJVmlydHVhbEZvbGRlciByb290Rm9sZGVyID0gY29tcG9uZW50LmdldFJvb3RGb2xkZXIoKTsKLQkJZGVsZXRlbWVWaXJ0dWFsRm9sZGVyMiA9IHJvb3RGb2xkZXIuZ2V0Rm9sZGVyKERFTEVURU1FX1BBVEgyKTsKLQkJZGVsZXRlbWVWaXJ0dWFsRm9sZGVyMi5jcmVhdGUoSVZpcnR1YWxSZXNvdXJjZS5GT1JDRSwgbnVsbCk7Ci0JCWRlbGV0ZW1lVmlydHVhbEZvbGRlcjIuZGVsZXRlKElWaXJ0dWFsUmVzb3VyY2UuRk9SQ0UsIG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RfZXhpc3RzKCkgewotCQlJVmlydHVhbENvbnRhaW5lciBjb250YWluZXIgPSB3ZWJJbmZGb2xkZXI7Ci0JCUlQYXRoIHBhdGggPSBuZXcgUGF0aCgiL2RlbGV0ZW1lIik7Ci0JCWJvb2xlYW4gYlJldFZhbHVlID0gY29udGFpbmVyLmV4aXN0cyhwYXRoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0X2ZpbmRNZW1iZXIoKSB7Ci0JCVN0cmluZyBuYW1lID0gImxpYiI7Ci0JCUlWaXJ0dWFsQ29udGFpbmVyIGNvbnRhaW5lciA9IHdlYkluZkZvbGRlcjsKLQkJSVZpcnR1YWxSZXNvdXJjZSByZXNvdXJjZT0gY29udGFpbmVyLmZpbmRNZW1iZXIobmFtZSk7Ci0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RfZmluZE1lbWJlcjIoKSB7Ci0JCVN0cmluZyBuYW1lID0gImxpYiI7Ci0JCWludCBzZWFyY2hGbGFncyA9IDA7Ci0JCUlWaXJ0dWFsQ29udGFpbmVyIGNvbnRhaW5lciA9IHdlYkluZkZvbGRlcjsKLQkJSVZpcnR1YWxSZXNvdXJjZSByZXNvdXJjZT0gY29udGFpbmVyLmZpbmRNZW1iZXIobmFtZSxzZWFyY2hGbGFncyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RfZmluZE1lbWJlcjMoKSB7Ci0JCUlQYXRoIHBhdGggPSBuZXcgUGF0aCgiL2xpYiIpOwotCQlJVmlydHVhbENvbnRhaW5lciBjb250YWluZXIgPSB3ZWJJbmZGb2xkZXI7Ci0JCUlWaXJ0dWFsUmVzb3VyY2UgcmVzb3VyY2U9IGNvbnRhaW5lci5maW5kTWVtYmVyKHBhdGgpOwotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0X2ZpbmRNZW1iZXI0KCkgewotCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgoIi9saWIiKTsKLQkJaW50IHNlYXJjaEZsYWdzID0gMDsKLQkJSVZpcnR1YWxDb250YWluZXIgY29udGFpbmVyID0gd2ViSW5mRm9sZGVyOwotCQlJVmlydHVhbFJlc291cmNlIHJlc291cmNlPSBjb250YWluZXIuZmluZE1lbWJlcihwYXRoLHNlYXJjaEZsYWdzKTsKLQl9Ci0KLQkKLQotCXB1YmxpYyB2b2lkIHRlc3RfZ2V0RmlsZSgpIHsKLQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKCIvZGVsZXRlbWUiKTsKLQkJSVZpcnR1YWxDb250YWluZXIgY29udGFpbmVyID0gd2ViSW5mRm9sZGVyOwotCQlJVmlydHVhbFJlc291cmNlIHJlc291cmNlPSBjb250YWluZXIuZ2V0RmlsZShwYXRoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0X2dldEZvbGRlcigpIHsKLQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKCIvZGVsZXRlbWUiKTsKLQkJSVZpcnR1YWxDb250YWluZXIgY29udGFpbmVyID0gd2ViSW5mRm9sZGVyOwotCQlJVmlydHVhbFJlc291cmNlIHJlc291cmNlPSBjb250YWluZXIuZ2V0Rm9sZGVyKHBhdGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RfZ2V0RmlsZTIoKSB7Ci0JCVN0cmluZyBuYW1lID0gIi9kZWxldGVtZSI7Ci0JCUlWaXJ0dWFsQ29udGFpbmVyIGNvbnRhaW5lciA9IHdlYkluZkZvbGRlcjsKLQkJSVZpcnR1YWxSZXNvdXJjZSByZXNvdXJjZT0gY29udGFpbmVyLmdldEZpbGUobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdF9nZXRGb2xkZXIyKCkgewotCQlTdHJpbmcgbmFtZSA9ICIvZGVsZXRlbWUiOwotCQlJVmlydHVhbENvbnRhaW5lciBjb250YWluZXIgPSB3ZWJJbmZGb2xkZXI7Ci0JCUlWaXJ0dWFsUmVzb3VyY2UgcmVzb3VyY2U9IGNvbnRhaW5lci5nZXRGb2xkZXIobmFtZSk7Ci0JfQotCi0JcHVibGljICB2b2lkIHRlc3RfbWVtYmVycygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVZpcnR1YWxDb250YWluZXIgY29udGFpbmVyID0gd2ViSW5mRm9sZGVyOwotCQlJVmlydHVhbFJlc291cmNlW10gcmVzb3VyY2U9IGNvbnRhaW5lci5tZW1iZXJzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbWVtYmVycygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVZpcnR1YWxDb250YWluZXIgY29udGFpbmVyID0gd2ViSW5mRm9sZGVyOwotCQlpbnQgbWVtYmVyRmxhZ3MgPSAwOwotCQlJVmlydHVhbFJlc291cmNlW10gcmVzb3VyY2U9IGNvbnRhaW5lci5tZW1iZXJzKG1lbWJlckZsYWdzKTsKLQkJCi0KLQl9Ci0KLQkKLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS90ZXN0cy9JVmlydHVhbEZpbGVBUElUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3Rlc3RzL0lWaXJ0dWFsRmlsZUFQSVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM0YzMxMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3Rlc3RzL0lWaXJ0dWFsRmlsZUFQSVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmNvbXBvbmVudGNvcmUudGVzdHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZXNvdXJjZTsKLQotCi1wdWJsaWMgY2xhc3MgSVZpcnR1YWxGaWxlQVBJVGVzdCBleHRlbmRzIEJhc2VWaXJ0dWFsVGVzdCB7Ci0KLQlwcm90ZWN0ZWQgSVZpcnR1YWxGaWxlIHRlc3RGaWxlMTsKLQlwcm90ZWN0ZWQgSUZpbGUgcmVhbFRlc3RGaWxlMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBhdGggVEVTVF9GSUxFX1JFQUxfUEFUSCA9IG5ldyBQYXRoKCJXZWJNb2R1bGUxL3Rlc3RkYXRhL1Rlc3RGaWxlMS50eHQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQYXRoIFRFU1RfRklMRV9SVU5USU1FX1BBVEggPSBuZXcgUGF0aCgiLyIpOyAvLyROT04tTkxTLTEkCi0KLQotCXB1YmxpYyBJVmlydHVhbEZpbGVBUElUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCQkKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJSVZpcnR1YWxGb2xkZXIgcm9vdEZvbGRlciA9IGNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCk7Ci0JCXRlc3RGaWxlMSA9IHJvb3RGb2xkZXIuZ2V0RmlsZShURVNUREFUQV9GT0xERVJfUlVOVElNRV9QQVRIKTsgCi0JCXJlYWxUZXN0RmlsZTEgPSBURVNUX1BST0pFQ1QuZ2V0RmlsZShURVNUREFUQV9GT0xERVJfUkVBTF9QQVRIKTsKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFVuZGVybHlpbmdGaWxlKCkgewotCQlJRmlsZSBmaWxlID0gdGVzdEZpbGUxLmdldFVuZGVybHlpbmdGaWxlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFVuZGVybHlpbmdGaWxlcygpIHsKLQkJSUZpbGVbXSBmaWxlID0gdGVzdEZpbGUxLmdldFVuZGVybHlpbmdGaWxlcygpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNBY2Nlc3NpYmxlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoKChJVmlydHVhbFJlc291cmNlKWRlbGV0ZW1lVmlydHVhbEZvbGRlcikuaXNBY2Nlc3NpYmxlKCksdHJ1ZSk7Ci0JCSgoSVZpcnR1YWxSZXNvdXJjZSlkZWxldGVtZVZpcnR1YWxGb2xkZXIpLmRlbGV0ZShJVmlydHVhbFJlc291cmNlLkZPUkNFLCBudWxsKTsKLQkJLy9hc3NlcnRFcXVhbHMoZGVsZXRlbWVWaXJ0dWFsRm9sZGVyLmlzQWNjZXNzaWJsZSgpLGZhbHNlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdGVzdHMvSVZpcnR1YWxGb2xkZXJBUElUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3Rlc3RzL0lWaXJ0dWFsRm9sZGVyQVBJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTM2NzlkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdGVzdHMvSVZpcnR1YWxGb2xkZXJBUElUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuY29tcG9uZW50Y29yZS50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLlNpbXBsZVRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIElWaXJ0dWFsRm9sZGVyQVBJVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElQcm9qZWN0IFRFU1RfUFJPSkVDVCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChUZXN0V29ya3NwYWNlLlBST0pFQ1RfTkFNRSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0ZPTERFUl9OQU1FID0gIldFQi1JTkYiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQYXRoIFdFQklORl9GT0xERVJfUkVBTF9QQVRIID0gbmV3IFBhdGgoIi9XZWJNb2R1bGUxL1dlYkNvbnRlbnQvIitURVNUX0ZPTERFUl9OQU1FKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQYXRoIFdFQklORl9GT0xERVJfUlVOVElNRV9QQVRIID0gbmV3IFBhdGgoIi8iK1RFU1RfRk9MREVSX05BTUUpOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQYXRoIFRFU1REQVRBX0ZPTERFUl9SRUFMX1BBVEggPSBuZXcgUGF0aCgiV2ViTW9kdWxlMS90ZXN0ZGF0YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBhdGggVEVTVERBVEFfRk9MREVSX1JVTlRJTUVfUEFUSCA9IG5ldyBQYXRoKCIvIik7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJUGF0aCBERUxFVEVNRV9QQVRIID0gbmV3IFBhdGgoIi9kZWxldGVtZSIpOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQ7Ci0JCi0JcHJpdmF0ZSBJVmlydHVhbEZvbGRlciB3ZWJJbmZGb2xkZXI7Ci0JcHJpdmF0ZSBJQ29udGFpbmVyIHJlYWxXZWJJbmZGb2xkZXI7Ci0JCi0JcHJpdmF0ZSBJVmlydHVhbEZvbGRlciBkZWxldGVtZVZpcnR1YWxGb2xkZXI7Ci0JcHJpdmF0ZSBJQ29udGFpbmVyIGRlbGV0ZW1lRm9sZGVyOwkKLQotCXB1YmxpYyBJVmlydHVhbEZvbGRlckFQSVRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfSAKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUZXN0U3VpdGUoSVZpcnR1YWxGb2xkZXJBUElUZXN0LmNsYXNzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlUZXN0V29ya3NwYWNlLmluaXQoKTsJCQotCQkKLQkJcmVhbFdlYkluZkZvbGRlciA9IFRFU1RfUFJPSkVDVC5nZXRGb2xkZXIoV0VCSU5GX0ZPTERFUl9SRUFMX1BBVEgpOwotCQkKLQkJY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoVEVTVF9QUk9KRUNUKTsKLQkJSVZpcnR1YWxGb2xkZXIgcm9vdEZvbGRlciA9IGNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCk7Ci0JCQotCQl3ZWJJbmZGb2xkZXIgPSByb290Rm9sZGVyLmdldEZvbGRlcihXRUJJTkZfRk9MREVSX1JVTlRJTUVfUEFUSCk7IAkJCi0KLQkJcm9vdEZvbGRlci5nZXRGb2xkZXIoVEVTVERBVEFfRk9MREVSX1JVTlRJTUVfUEFUSCk7IAotCQlURVNUX1BST0pFQ1QuZ2V0Rm9sZGVyKFRFU1REQVRBX0ZPTERFUl9SRUFMX1BBVEgpOwotCQkKLQkJZGVsZXRlbWVWaXJ0dWFsRm9sZGVyID0gcm9vdEZvbGRlci5nZXRGb2xkZXIoREVMRVRFTUVfUEFUSCk7Ci0JCWRlbGV0ZW1lVmlydHVhbEZvbGRlci5jcmVhdGUoSVZpcnR1YWxSZXNvdXJjZS5GT1JDRSwgbnVsbCk7Ci0JCQotCQlkZWxldGVtZUZvbGRlciA9IGRlbGV0ZW1lVmlydHVhbEZvbGRlci5nZXRVbmRlcmx5aW5nRm9sZGVyKCk7CQkKLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWxldGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygoKElWaXJ0dWFsUmVzb3VyY2UpZGVsZXRlbWVWaXJ0dWFsRm9sZGVyKS5leGlzdHMoKSx0cnVlKTsKLQkJKChJVmlydHVhbFJlc291cmNlKWRlbGV0ZW1lVmlydHVhbEZvbGRlcikuZGVsZXRlKElWaXJ0dWFsUmVzb3VyY2UuRk9SQ0UsIG51bGwpOwotCQkvLyBhc3NlcnRFcXVhbHMoZGVsZXRlbWVGb2xkZXIuZXhpc3RzKCksZmFsc2UpOwotCQkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVhckRvd24oKTsKLQkJCi0JCWlmKGRlbGV0ZW1lRm9sZGVyLmV4aXN0cygpKQotCQkJZGVsZXRlbWVGb2xkZXIuZGVsZXRlKElWaXJ0dWFsUmVzb3VyY2UuRk9SQ0UsIG51bGwpOwotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RmlsZUV4dGVuc2lvbigpIHsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIC9XRUItSU5GIGZvbGRlciBzaG91bGQgaGF2ZSBubyBmaWxlIGV4dGVuc2lvbi4iLCAoKElWaXJ0dWFsUmVzb3VyY2Upd2ViSW5mRm9sZGVyKS5nZXRGaWxlRXh0ZW5zaW9uKCkgPT0gbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFVuZGVybHlpbmdGb2xkZXJzKCkgewotCQlJQ29udGFpbmVyW10gYURlbGV0ZW1lRm9sZGVyID0gZGVsZXRlbWVWaXJ0dWFsRm9sZGVyLmdldFVuZGVybHlpbmdGb2xkZXJzKCk7Ci0JCWFzc2VydEVxdWFscyhhRGVsZXRlbWVGb2xkZXIubGVuZ3RoPT0xLHRydWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VW5kZXJseWluZ1Jlc291cmNlcygpIHsKLQkJSVJlc291cmNlW10gYURlbGV0ZW1lRm9sZGVyID0gKChJVmlydHVhbFJlc291cmNlKWRlbGV0ZW1lVmlydHVhbEZvbGRlcikuZ2V0VW5kZXJseWluZ1Jlc291cmNlcygpOwotCQlhc3NlcnRFcXVhbHMoYURlbGV0ZW1lRm9sZGVyLmxlbmd0aD09MSx0cnVlKTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdEdldFZpcnR1YWxDb21wb25lbnRGcm9tUmVzb3VyY2UoKSB7Ci0JCUlSZXNvdXJjZSBhRGVsZXRlbWVGb2xkZXIgPSAoKElWaXJ0dWFsUmVzb3VyY2UpZGVsZXRlbWVWaXJ0dWFsRm9sZGVyKS5nZXRVbmRlcmx5aW5nUmVzb3VyY2VzKClbMF07Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXAgPSAoSVZpcnR1YWxDb21wb25lbnQpYURlbGV0ZW1lRm9sZGVyLmdldEFkYXB0ZXIoSVZpcnR1YWxDb21wb25lbnQuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoY29tcC5nZXROYW1lKCksVGVzdFdvcmtzcGFjZS5QUk9KRUNUX05BTUUpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VW5kZXJseWluZ0ZvbGRlcigpIHsKLQkJSUNvbnRhaW5lciBhRGVsZXRlbWVGb2xkZXIgPSBkZWxldGVtZVZpcnR1YWxGb2xkZXIuZ2V0VW5kZXJseWluZ0ZvbGRlcigpOwotCQlhc3NlcnROb3ROdWxsKGFEZWxldGVtZUZvbGRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFVuZGVybHlpbmdSZXNvdXJjZSgpIHsKLQkJSVJlc291cmNlIGFEZWxldGVtZUZvbGRlciA9ICgoSVZpcnR1YWxSZXNvdXJjZSlkZWxldGVtZVZpcnR1YWxGb2xkZXIpLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpOwotCQlhc3NlcnROb3ROdWxsKGFEZWxldGVtZUZvbGRlcik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRXb3Jrc3BhY2VSZWxhdGl2ZVBhdGgoKSB7Ci0JCUlQYXRoIHJlYWxQYXRoID0gcmVhbFdlYkluZkZvbGRlci5nZXRGdWxsUGF0aCgpOwotCQlJUGF0aCB2aXJ0dWFsUGF0aCA9ICgoSVZpcnR1YWxSZXNvdXJjZSl3ZWJJbmZGb2xkZXIpLmdldFdvcmtzcGFjZVJlbGF0aXZlUGF0aCgpOwotCQlhc3NlcnRFcXVhbHMoIlRoZSB3b3Jrc3BhY2UgcmVsYXRpdmUgcGF0aCBvZiB0aGUgdmlydHVhbCByZXNvdXJjZSBtdXN0IG1hdGNoIHRoZSByZWFsIHJlc291cmNlIiwgcmVhbFBhdGgsIHZpcnR1YWxQYXRoKTsgLy8kTk9OLU5MUy0xJAotCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb21wb25lbnQoKSB7IAotCQlhc3NlcnROb3ROdWxsKCgoSVZpcnR1YWxSZXNvdXJjZSl3ZWJJbmZGb2xkZXIpLmdldENvbXBvbmVudCgpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkgewotCQlJUGF0aCByZWFsUGF0aCA9IHJlYWxXZWJJbmZGb2xkZXIuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpOwotCQlJUGF0aCB2aXJ0dWFsUGF0aCA9IHdlYkluZkZvbGRlci5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCk7Ci0JCWFzc2VydEVxdWFscygiVGhlIHByb2plY3QgcmVsYXRpdmUgcGF0aCBvZiB0aGUgdmlydHVhbCByZXNvdXJjZSBtdXN0IG1hdGNoIHRoZSByZWFsIHJlc291cmNlIiwgcmVhbFBhdGgsIHZpcnR1YWxQYXRoKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRSdW50aW1lUGF0aCgpIHsgCi0JCUlQYXRoIHZpcnR1YWxQYXRoID0gKChJVmlydHVhbFJlc291cmNlKXdlYkluZkZvbGRlcikuZ2V0UnVudGltZVBhdGgoKTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgcnVudGltZSBwYXRoIG9mIHRoZSB2aXJ0dWFsIHJlc291cmNlIG11c3QgbWF0Y2ggdGhlIHJlYWwgcmVzb3VyY2UiLCBXRUJJTkZfRk9MREVSX1JVTlRJTUVfUEFUSCwgdmlydHVhbFBhdGgpOyAvLyROT04tTkxTLTEkCi0JCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgewotCQlhc3NlcnRFcXVhbHMoIlRoZSBuYW1lIG9mIHRoZSB2aXJ0dWFsIHJlc291cmNlIG11c3QgbWF0Y2ggdGhlIGV4cGVjdGVkIG5hbWUuIiwgVEVTVF9GT0xERVJfTkFNRSwgd2ViSW5mRm9sZGVyLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UGFyZW50KCkgewotCQlhc3NlcnRFcXVhbHMoIlRoZSBwYXJlbnQgb2YgdGhlIHZpcnR1YWwgcmVzb3VyY2UgbXVzdCBtYXRjaCB0aGUgY29tcG9uZW50cyByb290IGZvbGRlci4iLCBjb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpLCB3ZWJJbmZGb2xkZXIuZ2V0UGFyZW50KCkpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHMoKSB7Ci0JCUlWaXJ0dWFsUmVzb3VyY2UgcmVzb3VyY2UgPSB3ZWJJbmZGb2xkZXIuZ2V0UGFyZW50KCk7Ci0JCWJvb2xlYW4gYlJldFZhbHVlID0gcmVzb3VyY2UuZXF1YWxzKGNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkpOwotCQlhc3NlcnRUcnVlKGJSZXRWYWx1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFByb2plY3QoKSB7Ci0JCWFzc2VydEVxdWFscygiVGhlIHByb2plY3Qgb2YgdGhlIHZpcnR1YWwgcmVzb3VyY2UgbXVzdCBtYXRjaCB0aGUgdGVzdCBwcm9qZWN0LiIsIFRFU1RfUFJPSkVDVCwgKChJVmlydHVhbFJlc291cmNlKXdlYkluZkZvbGRlcikuZ2V0UHJvamVjdCgpKTsgLy8kTk9OLU5MUy0xJAotCX0gIAotCi0JcHVibGljIHZvaWQgdGVzdEdldFR5cGUoKSB7Ci0JCWFzc2VydEVxdWFscygiVGhlIHR5cGUgb2YgdGhlIHZpcnR1YWwgcmVzb3VyY2UgbXVzdCBtYXRjaCB0aGUgdHlwZSBvZiB0aGUgdGVzdCBwcm9qZWN0LiIsIElWaXJ0dWFsUmVzb3VyY2UuRk9MREVSLCAoKElWaXJ0dWFsUmVzb3VyY2Upd2ViSW5mRm9sZGVyKS5nZXRUeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCQotCS8qcHVibGljIHZvaWQgdGVzdEdldEZpbGVQYXRoKCkgewotCQlJVmlydHVhbEZpbGUgdGVzdDNqc3AgPSB0ZXN0ZGF0YUZvbGRlci5nZXRGaWxlKG5ldyBQYXRoKCIvanNwcy9UZXN0SnNwMy5qc3AiKSk7Ci0JCQotCQlJUGF0aCBleHBlY3RlZFBhdGggPSBURVNUREFUQV9GT0xERVJfUkVBTF9QQVRILmFwcGVuZChuZXcgUGF0aCgiL2pzcHMvVGVzdEpzcDMuanNwIikpOwotCQlhc3NlcnRFcXVhbHMoIlRoZSB0ZXN0IGZpbGUgcHJvamVjdCByZWxhdGl2ZSBwYXRoIG11c3QgbWF0Y2guIiwgZXhwZWN0ZWRQYXRoLCB0ZXN0M2pzcC5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkpOyAvLyROT04tTkxTLTEkCi0JfSovCi0JCi0KLQotCS8qCi0JICogQ2xhc3MgdW5kZXIgdGVzdCBmb3Igdm9pZCBkZWxldGUoaW50LCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCS8qcHVibGljIHZvaWQgdGVzdERlbGV0ZWludElQcm9ncmVzc01vbml0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZGVsZXRlbWVWaXJ0dWFsRm9sZGVyLmRlbGV0ZSgwLCBudWxsKTsKLQkJCi0JCWFzc2VydFRydWUoIlRoZSByZWFsIGZvbGRlciBzaG91bGQgYmUgZGVsZXRlZCB3aGVuIElWaXJ0dWFsUmVzb3VyY2UuREVMRVRFX01FVEFNT0RFTF9PTkxZIGlzIE5PVCBzdXBwbGllZC4iLCAhZGVsZXRlbWVGb2xkZXIuZXhpc3RzKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCi0JCUlWaXJ0dWFsUmVzb3VyY2VbXSBtZW1iZXJzID0gY29tcG9uZW50Lm1lbWJlcnMoKTsKLQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVycy5sZW5ndGg7IGkrKykgewotCQkJaWYobWVtYmVyc1tpXS5nZXRSdW50aW1lUGF0aCgpLmVxdWFscyhkZWxldGVtZVZpcnR1YWxGb2xkZXIuZ2V0UnVudGltZVBhdGgoKSkpIHsKLQkJCQlmYWlsKCJGb3VuZCBkZWxldGVkIGZvbGRlciBpbiBtZW1iZXJzKCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9CQkKLQl9Ki8KLQkKLQkvKgotCSAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIHZvaWQgZGVsZXRlKGludCwgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQkvKnB1YmxpYyB2b2lkIHRlc3REZWxldGVpbnRJUHJvZ3Jlc3NNb25pdG9yMigpIHRocm93cyBFeGNlcHRpb24gewotCQlkZWxldGVtZVZpcnR1YWxGb2xkZXIuZGVsZXRlKElWaXJ0dWFsUmVzb3VyY2UuSUdOT1JFX1VOREVSTFlJTkdfUkVTT1VSQ0UsIG51bGwpOwotCQkKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHJlYWwgZm9sZGVyIHNob3VsZCBub3QgYmUgZGVsZXRlZCB3aGVuIElWaXJ0dWFsUmVzb3VyY2UuREVMRVRFX01FVEFNT0RFTF9PTkxZIGlzIHN1cHBsaWVkLiIsIGRlbGV0ZW1lRm9sZGVyLmV4aXN0cygpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQotCQkvLyBvbmx5IGhhbmRsZXMgZXhwbGljaXQgbWFwcGluZ3MKLQkJU3RydWN0dXJlRWRpdCBtb2R1bGVDb3JlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCVVSSSBydW50aW1lVVJJID0gVVJJLmNyZWF0ZVVSSShkZWxldGVtZVZpcnR1YWxGb2xkZXIuZ2V0UnVudGltZVBhdGgoKS50b1N0cmluZygpKTsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShURVNUX1BST0pFQ1QpOwotCQkJV29ya2JlbmNoQ29tcG9uZW50IHdiQ29tcG9uZW50ID0gbW9kdWxlQ29yZS5maW5kQ29tcG9uZW50QnlOYW1lKFRlc3RXb3Jrc3BhY2UuV0VCX01PRFVMRV8xX05BTUUpOwotCQkJQ29tcG9uZW50UmVzb3VyY2VbXSByZXNvdXJjZXMgPSB3YkNvbXBvbmVudC5maW5kV29ya2JlbmNoTW9kdWxlUmVzb3VyY2VCeURlcGxveVBhdGgocnVudGltZVVSSSk7Ci0JCQlhc3NlcnRUcnVlKCJUaGVyZSBzaG91bGQgYmUgbm8gbWF0Y2hpbmcgY29tcG9uZW50cyBmb3VuZCBpbiB0aGUgbW9kZWwuIiwgcmVzb3VyY2VzLmxlbmd0aCA9PSAwKTsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCX0gZmluYWxseSB7Ci0JCQlpZiAobW9kdWxlQ29yZSAhPSBudWxsKSB7Ci0JCQkJbW9kdWxlQ29yZS5zYXZlSWZOZWNlc3NhcnkobnVsbCk7Ci0JCQkJbW9kdWxlQ29yZS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ki8KLQkKLQkvKgotCSAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIHZvaWQgZGVsZXRlKGJvb2xlYW4sIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JLypwdWJsaWMgdm9pZCB0ZXN0RGVsZXRlYm9vbGVhbklQcm9ncmVzc01vbml0b3IoKSAgdGhyb3dzIEV4Y2VwdGlvbiAgewotCQlkZWxldGVtZVZpcnR1YWxGb2xkZXIuZGVsZXRlKElWaXJ0dWFsUmVzb3VyY2UuRk9SQ0UsIG51bGwpOwotCQkKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHJlYWwgZm9sZGVyIHNob3VsZCBiZSBkZWxldGVkIHdoZW4gSVZpcnR1YWxSZXNvdXJjZS5ERUxFVEVfTUVUQU1PREVMX09OTFkgaXMgTk9UIHN1cHBsaWVkLiIsICFkZWxldGVtZUZvbGRlci5leGlzdHMoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkKLQkJSVZpcnR1YWxSZXNvdXJjZVtdIG1lbWJlcnMgPSBjb21wb25lbnQubWVtYmVycygpOwotCQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZW1iZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZihtZW1iZXJzW2ldLmdldFJ1bnRpbWVQYXRoKCkuZXF1YWxzKGRlbGV0ZW1lVmlydHVhbEZvbGRlci5nZXRSdW50aW1lUGF0aCgpKSkgewotCQkJCWZhaWwoIkZvdW5kIGRlbGV0ZWQgZm9sZGVyIGluIG1lbWJlcnMoKSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0JCi0JfQkqLyAKLQkgCQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3Rlc3RzL0lWaXJ0dWFsUmVmZXJlbmNlQVBJVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS90ZXN0cy9JVmlydHVhbFJlZmVyZW5jZUFQSVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThhMTAxMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3Rlc3RzL0lWaXJ0dWFsUmVmZXJlbmNlQVBJVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuY29tcG9uZW50Y29yZS50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlZpcnR1YWxSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotCi1wdWJsaWMgY2xhc3MgSVZpcnR1YWxSZWZlcmVuY2VBUElUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGUoKSB7Ci0JCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZmVyZW5jZSA9IG5ldyBWaXJ0dWFsUmVmZXJlbmNlKCk7Ci0JCXJlZmVyZW5jZS5jcmVhdGUoMCxudWxsKTsKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFJ1bnRpbWVQYXRoKCkgewotCQlJVmlydHVhbFJlZmVyZW5jZSByZWZlcmVuY2UgPSBuZXcgVmlydHVhbFJlZmVyZW5jZSgpOwotCQlyZWZlcmVuY2Uuc2V0UnVudGltZVBhdGgobmV3IFBhdGgoIi8iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFJ1bnRpbWVQYXRoKCkgewotCQlJVmlydHVhbFJlZmVyZW5jZSByZWZlcmVuY2UgPSBuZXcgVmlydHVhbFJlZmVyZW5jZSgpOwotCQlJUGF0aCBwYXRoID0gcmVmZXJlbmNlLmdldFJ1bnRpbWVQYXRoKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldERlcGVuZGVuY3lUeXBlKCkgewotCQlJVmlydHVhbFJlZmVyZW5jZSByZWZlcmVuY2UgPSBuZXcgVmlydHVhbFJlZmVyZW5jZSgpOwotCQlpbnQgZGVwZW5kZW5jeVR5cGUgPSAwOwotCQlyZWZlcmVuY2Uuc2V0RGVwZW5kZW5jeVR5cGUoZGVwZW5kZW5jeVR5cGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZXBlbmRlbmN5VHlwZSgpIHsKLQkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmZXJlbmNlID0gbmV3IFZpcnR1YWxSZWZlcmVuY2UoKTsKLQkJaW50IGRlcGVuZGVuY3lUeXBlID0gMDsKLQkJZGVwZW5kZW5jeVR5cGUgPSByZWZlcmVuY2UuZ2V0RGVwZW5kZW5jeVR5cGUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXhpc3RzKCkgewotCQlJVmlydHVhbFJlZmVyZW5jZSByZWZlcmVuY2UgPSBuZXcgVmlydHVhbFJlZmVyZW5jZSgpOwotCQlib29sZWFuIGV4aXN0cyA9IHJlZmVyZW5jZS5leGlzdHMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RW5jbG9zaW5nQ29tcG9uZW50KCkgewotCQlJVmlydHVhbFJlZmVyZW5jZSByZWZlcmVuY2UgPSBuZXcgVmlydHVhbFJlZmVyZW5jZSgpOwotCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSByZWZlcmVuY2UuZ2V0RW5jbG9zaW5nQ29tcG9uZW50KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFJlZmVyZW5jZWRDb21wb25lbnQoKSB7Ci0JCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZmVyZW5jZSA9IG5ldyBWaXJ0dWFsUmVmZXJlbmNlKCk7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IHJlZmVyZW5jZS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdGVzdHMvTW9kdWxlQ29yZUFQSUZWVFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdGVzdHMvTW9kdWxlQ29yZUFQSUZWVFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM1YzkwMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3Rlc3RzL01vZHVsZUNvcmVBUElGVlRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuY29tcG9uZW50Y29yZS50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50UmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlN0cnVjdHVyZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5jb21wb25lbnRjb3JlLnZpcnR1YWxwYXRoLnRlc3RzLlRlc3RXb3Jrc3BhY2U7Ci0KLS8qKgotICogCi0gKiA8cD4KLSAqIFRvIHJ1biB0aGlzIHRlc3QsIGV4dHJhY3QgdGhlIC90ZXN0RGF0YS92aXJ0dWFsLWFwaS10ZXN0X3dvcmtzcGFjZS56aXAgZm91bmQgdW5kZXIgdGhlIHNhbWUKLSAqIHBsdWdpbiwgYW5kIHVzZSAiUnVuIEFzIC0+IEpVbml0IFBsdWdpbiBUZXN0Ii4gQmUgc3VyZSB0byBwb2ludCB0aGUgY29uZmlndXJhdGlvbiBhdCB0aGUKLSAqIGV4dHJhY3RlZCB3b3Jrc3BhY2UsIGFuZCBtYWtlIHN1cmUgdGhhdCAiQ2xlYXIgd29ya3NwYWNlIGNvbnRlbnRzIiBpcyBOT1QgY2hlY2tlZC4gVGhlIHRlc3QgbWF5Ci0gKiBiZSBydW4gdXNpbmcgYSBIZWFkbGVzcyBFY2xpcHNlLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgTW9kdWxlQ29yZUFQSUZWVFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzcyBJRk9MREVSX0NMQVNTID0gSVZpcnR1YWxGb2xkZXIuY2xhc3M7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3MgSUZJTEVfQ0xBU1MgPSBJVmlydHVhbEZpbGUuY2xhc3M7Ci0KLQlwcml2YXRlIGZpbmFsIE1hcCB2aXJ0dWFsUmVzb3VyY2VUcmVlID0gbmV3IEhhc2hNYXAoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgSUdOT1JFID0gbmV3IEhhc2hNYXAoKTsKLQotCi0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5TaW1wbGVUZXN0U3VpdGUoTW9kdWxlQ29yZUFQSUZWVFRlc3QuY2xhc3MpOwotCX0KLQotCXB1YmxpYyBNb2R1bGVDb3JlQVBJRlZUVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCi0JCXNldHVwTmF2aWdhdGVDb21wb25lbnRUZXN0KCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlYXJEb3duKCk7IAotCQl0ZWFyRG93bkNyZWF0ZU5ld01vZHVsZVRlc3QoKTsKLQkJdGVhckRvd25DcmVhdGVMaW5rVGVzdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlYXJEb3duQ3JlYXRlTmV3TW9kdWxlVGVzdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJRm9sZGVyIHJvb3RGb2xkZXIgPSBUZXN0V29ya3NwYWNlLmdldFRhcmdldFByb2plY3QoKS5nZXRGb2xkZXIoVGVzdFdvcmtzcGFjZS5ORVdfV0VCX01PRFVMRV9OQU1FKTsKLQkJaWYgKHJvb3RGb2xkZXIuZXhpc3RzKCkpCi0JCQlyb290Rm9sZGVyLmRlbGV0ZShJUmVzb3VyY2UuRk9SQ0UgfCBJUmVzb3VyY2UuQUxXQVlTX0RFTEVURV9QUk9KRUNUX0NPTlRFTlQsIG51bGwpOwotCi0JCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0KLQkJdHJ5IHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShUZXN0V29ya3NwYWNlLmdldFRhcmdldFByb2plY3QoKSk7Ci0JCQlXb3JrYmVuY2hDb21wb25lbnQgd2JDb21wb25lbnQgPSBtb2R1bGVDb3JlLmdldENvbXBvbmVudCgpOwotCi0JCQlpZiAod2JDb21wb25lbnQgIT0gbnVsbCkgewotCQkJCUNvbXBvbmVudFJlc291cmNlW10gY29tcG9uZW50UmVzb3VyY2VzID0gd2JDb21wb25lbnQuZmluZFJlc291cmNlc0J5UnVudGltZVBhdGgobmV3IFBhdGgoIi8iKSk7IC8vJE5PTi1OTFMtMSQJCQkJCi0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbXBvbmVudFJlc291cmNlcy5sZW5ndGg7IGkrKykgewotCQkJCQl3YkNvbXBvbmVudC5nZXRSZXNvdXJjZXMoKS5yZW1vdmUoY29tcG9uZW50UmVzb3VyY2VzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChtb2R1bGVDb3JlICE9IG51bGwpIHsKLQkJCQltb2R1bGVDb3JlLnNhdmUobnVsbCk7Ci0JCQkJbW9kdWxlQ29yZS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIE1hcCBzdHJ1Y3R1cmUgdGhhdCBtaW1pY3MgdGhlIGV4cGVjdGVkIHN0cnVjdHVyZSBvbiBkaXNrLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldHVwTmF2aWdhdGVDb21wb25lbnRUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlQYXRoIGltYWdlczsKLQkJSVBhdGgganNwczsKLQkJSVBhdGggV0VCX0lORjsKLQkJVGVzdFdvcmtzcGFjZS5pbml0KCk7Ci0JCXZpcnR1YWxSZXNvdXJjZVRyZWUucHV0KChpbWFnZXMgPSBuZXcgUGF0aCgiaW1hZ2VzIikpLCBuZXcgSGFzaE1hcCgpKTsgLy8kTk9OLU5MUy0xJAotCQl2aXJ0dWFsUmVzb3VyY2VUcmVlLnB1dCgoanNwcyA9IG5ldyBQYXRoKCJqc3BzIikpLCBuZXcgSGFzaE1hcCgpKTsgLy8kTk9OLU5MUy0xJAotCQl2aXJ0dWFsUmVzb3VyY2VUcmVlLnB1dChuZXcgUGF0aChUZXN0V29ya3NwYWNlLk1FVEFfSU5GKSwgbmV3IEhhc2hNYXAoKSk7IC8vJE5PTi1OTFMtMSQKLQkJdmlydHVhbFJlc291cmNlVHJlZS5wdXQoKFdFQl9JTkYgPSBuZXcgUGF0aChUZXN0V29ya3NwYWNlLldFQl9JTkYpKSwgbmV3IEhhc2hNYXAoKSk7IC8vJE5PTi1OTFMtMSQKLQkJdmlydHVhbFJlc291cmNlVHJlZS5wdXQobmV3IFBhdGgoIlRlc3RGaWxlMS50eHQiKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJdmlydHVhbFJlc291cmNlVHJlZS5wdXQobmV3IFBhdGgoIlRlc3RGaWxlMi50eHQiKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQotCQkoKE1hcCkgdmlydHVhbFJlc291cmNlVHJlZS5nZXQoaW1hZ2VzKSkucHV0KG5ldyBQYXRoKCJpY29uLmdpZiIpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCi0JCSgoTWFwKSB2aXJ0dWFsUmVzb3VyY2VUcmVlLmdldChqc3BzKSkucHV0KG5ldyBQYXRoKCJUZXN0SnNwMS5qc3AiKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJKChNYXApIHZpcnR1YWxSZXNvdXJjZVRyZWUuZ2V0KGpzcHMpKS5wdXQobmV3IFBhdGgoIlRlc3RKc3AyLmpzcCIpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkoKE1hcCkgdmlydHVhbFJlc291cmNlVHJlZS5nZXQoanNwcykpLnB1dChuZXcgUGF0aCgiVGVzdEpzcDMuanNwIiksIG51bGwpOyAvLyROT04tTkxTLTEkCi0KLQkJKChNYXApIHZpcnR1YWxSZXNvdXJjZVRyZWUuZ2V0KFdFQl9JTkYpKS5wdXQobmV3IFBhdGgoIndlYi54bWwiKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJKChNYXApIHZpcnR1YWxSZXNvdXJjZVRyZWUuZ2V0KFdFQl9JTkYpKS5wdXQobmV3IFBhdGgoImNsYXNzZXMiKSwgSUdOT1JFKTsgLy8kTk9OLU5MUy0xJAotCQkoKE1hcCkgdmlydHVhbFJlc291cmNlVHJlZS5nZXQoV0VCX0lORikpLnB1dChuZXcgUGF0aCgibGliIiksIG5ldyBIYXNoTWFwKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGZvciBhbmQgcmVtb3ZlcyB0aGUgbWFwcGluZyBhbmQgZm9sZGVyIHRoYXQgd2lsbCBiZSBjcmVhdGVkIGJ5Ci0JICoge0BsaW5rIE1vZHVsZUNvcmVBUElGVlRUZXN0I3Rlc3RDcmVhdGVMaW5rKCl9LgotCSAqLwotCXB1YmxpYyB2b2lkIHRlYXJEb3duQ3JlYXRlTGlua1Rlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUZvbGRlciBtb2R1bGUySW1hZ2VzID0gVGVzdFdvcmtzcGFjZS5nZXRUYXJnZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKG5ldyBQYXRoKCIvV2ViTW9kdWxlMi9pbWFnZXMiKSk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG1vZHVsZTJJbWFnZXMuZXhpc3RzKCkpCi0JCQltb2R1bGUySW1hZ2VzLmRlbGV0ZShJUmVzb3VyY2UuRk9SQ0UgfCBJUmVzb3VyY2UuQUxXQVlTX0RFTEVURV9QUk9KRUNUX0NPTlRFTlQsIG51bGwpOwotCi0JCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0KLQkJdHJ5IHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShUZXN0V29ya3NwYWNlLmdldFRhcmdldFByb2plY3QoKSk7Ci0JCQlXb3JrYmVuY2hDb21wb25lbnQgd2JDb21wb25lbnQgPSBtb2R1bGVDb3JlLmdldENvbXBvbmVudCgpOwotCi0JCQlDb21wb25lbnRSZXNvdXJjZVtdIGNvbXBvbmVudFJlc291cmNlcyA9IHdiQ29tcG9uZW50LmZpbmRSZXNvdXJjZXNCeVJ1bnRpbWVQYXRoKG5ldyBQYXRoKCIvaW1hZ2VzIikpOyAvLyROT04tTkxTLTEkCi0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29tcG9uZW50UmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJd2JDb21wb25lbnQuZ2V0UmVzb3VyY2VzKCkucmVtb3ZlKGNvbXBvbmVudFJlc291cmNlc1tpXSk7Ci0JCQl9Ci0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChtb2R1bGVDb3JlICE9IG51bGwpIHsKLQkJCQltb2R1bGVDb3JlLnNhdmUobnVsbCk7Ci0JCQkJbW9kdWxlQ29yZS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGFzc2VydFRyZWUoTWFwIHJlc291cmNlVHJlZSwgSVZpcnR1YWxGb2xkZXIgdmlydHVhbEZvbGRlcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRyZWUocmVzb3VyY2VUcmVlLCB2aXJ0dWFsRm9sZGVyLCAiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBBbGwgbWV0aG9kcyBsaXNlZCBpbiB0aGUgInNlZSIgY2xhdXNlcyBhcmUgdGVzdGVkIGJ5IHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIElDb250YWluZXIjbWVtYmVycygpCi0JICogQHNlZSBJUmVzb3VyY2UjZ2V0TmFtZSgpCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlVHJlZQotCSAqIEBwYXJhbSB2aXJ0dWFsRm9sZGVyCi0JICogQHBhcmFtIGluZGVudAotCSAqLwotCXB1YmxpYyB2b2lkIGFzc2VydFRyZWUoTWFwIHJlc291cmNlVHJlZSwgSVZpcnR1YWxGb2xkZXIgdmlydHVhbEZvbGRlciwgU3RyaW5nIGluZGVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIEFQSV9URVNUIFZpcnR1YWxDb250YWluZXIubWVtYmVycygpCi0JCUlWaXJ0dWFsUmVzb3VyY2VbXSBtZW1iZXJzID0gdmlydHVhbEZvbGRlci5tZW1iZXJzKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJUaGUgbnVtYmVyIG9mIHJlc291cmNlcyBjb250YWluZWQgYnkgXCIiICsgdmlydHVhbEZvbGRlci5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkgKyAiXCIiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJcmVzb3VyY2VUcmVlLnNpemUoKSwgbWVtYmVycy5sZW5ndGgpOwotCQlJUGF0aCByZWxhdGl2ZVBhdGg7Ci0JCU1hcCBzdWJUcmVlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlcnMubGVuZ3RoOyBpKyspIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihpbmRlbnQgKyBtZW1iZXJzW2ldKTsKLQkJCXJlbGF0aXZlUGF0aCA9IG5ldyBQYXRoKG1lbWJlcnNbaV0uZ2V0TmFtZSgpKTsKLQotCQkJc3ViVHJlZSA9IChNYXApIHJlc291cmNlVHJlZS5nZXQocmVsYXRpdmVQYXRoKTsKLQkJCWlmIChzdWJUcmVlICE9IG51bGwpIHsKLQkJCQlhc3NlcnRUeXBlKG1lbWJlcnNbaV0sIElGT0xERVJfQ0xBU1MpOwotCQkJCWlmIChzdWJUcmVlICE9IElHTk9SRSkKLQkJCQkJYXNzZXJ0VHJlZShzdWJUcmVlLCAoSVZpcnR1YWxGb2xkZXIpIG1lbWJlcnNbaV0sIGluZGVudCArICJcdCIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgewotCQkJCWFzc2VydFR5cGUobWVtYmVyc1tpXSwgSUZJTEVfQ0xBU1MpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgYXNzZXJ0VHlwZShJVmlydHVhbFJlc291cmNlIHJlc291cmNlLCBDbGFzcyB0eXBlKSB7Ci0JCWFzc2VydFRydWUoIkV4cGVjdGVkIGEobikgIiArIHR5cGUuZ2V0TmFtZSgpICsgIiBmb3IgbWVtYmVyOiAiICsgcmVzb3VyY2UuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJdHlwZS5pc0luc3RhbmNlKHJlc291cmNlKSk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQWxsIG1ldGhvZHMgbGlzZWQgaW4gdGhlICJzZWUiIGNsYXVzZXMgYXJlIHRlc3RlZCBieSB0aGlzIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBDb21wb25lbnRDb3JlI2NyZWF0ZUNvbXBvbmVudChJUHJvamVjdCwgU3RyaW5nKQotCSAqIEBzZWUgSUNvbnRhaW5lciNnZXRGb2xkZXIob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoKQotCSAqIEBzZWUgSUNvbnRhaW5lciNtZW1iZXJzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0TmF2aWdhdGVDb21wb25lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChUZXN0V29ya3NwYWNlLmdldFRhcmdldFByb2plY3QoKSwgVGVzdFdvcmtzcGFjZS5XRUJfTU9EVUxFXzFfTkFNRSk7Ci0JCUlWaXJ0dWFsRm9sZGVyIHJvb3RGb2xkZXIgPSBjb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpOwotCQlJVmlydHVhbEZvbGRlciByb290ID0gcm9vdEZvbGRlci5nZXRGb2xkZXIobmV3IFBhdGgoIi8iKSk7IC8vJE5PTi1OTFMtMSQgCi0JCS8vIFRPRE8KLQkJLy9hc3NlcnRUcmVlKHZpcnR1YWxSZXNvdXJjZVRyZWUsIHJvb3QpOwotCi0JfQotCi0KLQkvKioKLQkgKiA8cD4KLQkgKiBBbGwgbWV0aG9kcyBsaXNlZCBpbiB0aGUgInNlZSIgY2xhdXNlcyBhcmUgdGVzdGVkIGJ5IHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIENvbXBvbmVudENvcmUjY3JlYXRlQ29tcG9uZW50KElQcm9qZWN0LCBTdHJpbmcpCi0JICogQHNlZSBJQ29udGFpbmVyI2dldEZvbGRlcihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGgpCi0JICogQHNlZSBJRm9sZGVyI2NyZWF0ZUxpbmsob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoLCBpbnQsCi0JICogICAgICBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKiAKLQkgKi8KLS8qIEJ1ZyAxNjAxMDEJCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZUxpbmsoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChUZXN0V29ya3NwYWNlLmdldFRhcmdldFByb2plY3QoKSwgVGVzdFdvcmtzcGFjZS5XRUJfTU9EVUxFXzJfTkFNRSk7Ci0JCUlWaXJ0dWFsRm9sZGVyIHJvb3RGb2xkZXIgPSBjb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpOwotCQlJVmlydHVhbEZvbGRlciBpbWFnZXMgPSByb290Rm9sZGVyLmdldEZvbGRlcihuZXcgUGF0aCgiL2ltYWdlcyIpKTsgLy8kTk9OLU5MUy0xJAkJCi0JCSgoSVZpcnR1YWxSZXNvdXJjZSlpbWFnZXMpLmNyZWF0ZUxpbmsobmV3IFBhdGgoIi9XZWJNb2R1bGUyL2ltYWdlcyIpLCAwLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCi0JCUlGb2xkZXIgcmVhbEltYWdlcyA9IFRlc3RXb3Jrc3BhY2UuZ2V0VGFyZ2V0UHJvamVjdCgpLmdldEZvbGRlcihuZXcgUGF0aCgiL1dlYk1vZHVsZTIvaW1hZ2VzIikpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlRoZSAvV2ViQ29udGVudDIvaW1hZ2VzIGRpcmVjdG9yeSBtdXN0IGV4aXN0LiIsIHJlYWxJbWFnZXMuZXhpc3RzKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJU3RydWN0dXJlRWRpdCBtb2R1bGVDb3JlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKFRlc3RXb3Jrc3BhY2UuZ2V0VGFyZ2V0UHJvamVjdCgpKTsKLQkJCVdvcmtiZW5jaENvbXBvbmVudCB3YkNvbXBvbmVudCA9IG1vZHVsZUNvcmUuZ2V0Q29tcG9uZW50KCk7Ci0KLQkJCUNvbXBvbmVudFJlc291cmNlW10gY29tcG9uZW50UmVzb3VyY2VzID0gd2JDb21wb25lbnQuZmluZFJlc291cmNlc0J5UnVudGltZVBhdGgobmV3IFBhdGgoIi9pbWFnZXMiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJYXNzZXJ0VHJ1ZSgiVGhlcmUgc2hvdWxkIGJlIGF0IGxlYXN0IG9uZSBtYXBwaW5nIGZvciB2aXJ0dWFsIHBhdGggXCIvaW1hZ2VzXCIuIiwgY29tcG9uZW50UmVzb3VyY2VzLmxlbmd0aCA+IDApOyAvLyROT04tTkxTLTEkCi0KLQkJCVJlc291cmNlVHJlZVJvb3QgcmVzb3VyY2VUcmVlUm9vdCA9IFJlc291cmNlVHJlZVJvb3QuZ2V0U291cmNlUmVzb3VyY2VUcmVlUm9vdCh3YkNvbXBvbmVudCk7Ci0JCQljb21wb25lbnRSZXNvdXJjZXMgPSByZXNvdXJjZVRyZWVSb290LmZpbmRNb2R1bGVSZXNvdXJjZXMocmVhbEltYWdlcy5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCksIFJlc291cmNlVHJlZU5vZGUuQ1JFQVRFX05PTkUpOwotCi0JCQlhc3NlcnRUcnVlKCJUaGVyZSBzaG91bGQgYmUgZXhhY3RseSBvbmUgQ29tcG9uZW50IHJlc291cmNlIHdpdGggdGhlIHNvdXJjZSBwYXRoIFwiIiArIHJlYWxJbWFnZXMuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpICsgIlwiLiIsIGNvbXBvbmVudFJlc291cmNlcy5sZW5ndGggPT0gMSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCQlhc3NlcnRUcnVlKCJUaGUgcnVudGltZSBwYXRoIHNob3VsZCBtYXRjaCBcIi9pbWFnZXNcIi4iLCBjb21wb25lbnRSZXNvdXJjZXNbMF0uZ2V0UnVudGltZVBhdGgoKS50b1N0cmluZygpLmVxdWFscygiL2ltYWdlcyIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCS8vIG1ha2Ugc3VyZSB0aGF0IG9ubHkgb25lIGNvbXBvbmVudCByZXNvdXJjZSBpcyBjcmVhdGVkCi0KLQkJCWltYWdlcy5jcmVhdGVMaW5rKG5ldyBQYXRoKCIvV2ViTW9kdWxlMi9pbWFnZXMiKSwgMCwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQotCQkJY29tcG9uZW50UmVzb3VyY2VzID0gcmVzb3VyY2VUcmVlUm9vdC5maW5kTW9kdWxlUmVzb3VyY2VzKHJlYWxJbWFnZXMuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLCBSZXNvdXJjZVRyZWVOb2RlLkNSRUFURV9OT05FKTsKLQotCQkJYXNzZXJ0VHJ1ZSgiVGhlcmUgc2hvdWxkIGJlIGV4YWN0bHkgb25lIENvbXBvbmVudCByZXNvdXJjZSB3aXRoIHRoZSBzb3VyY2UgcGF0aCBcIiIgKyByZWFsSW1hZ2VzLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKSArICJcIi4iLCBjb21wb25lbnRSZXNvdXJjZXMubGVuZ3RoID09IDEpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJYXNzZXJ0VHJ1ZSgiVGhlIHJ1bnRpbWUgcGF0aCBzaG91bGQgbWF0Y2ggXCIvaW1hZ2VzXCIuIiwgY29tcG9uZW50UmVzb3VyY2VzWzBdLmdldFJ1bnRpbWVQYXRoKCkudG9TdHJpbmcoKS5lcXVhbHMoIi9pbWFnZXMiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9IGZpbmFsbHkgewotCQkJaWYgKG1vZHVsZUNvcmUgIT0gbnVsbCkKLQkJCQltb2R1bGVDb3JlLmRpc3Bvc2UoKTsKLQkJfQotCi0JfQotKi8KLQkvKioKLQkgKiA8cD4KLQkgKiBBbGwgbWV0aG9kcyBsaXNlZCBpbiB0aGUgInNlZSIgY2xhdXNlcyBhcmUgdGVzdGVkIGJ5IHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIENvbXBvbmVudENvcmUjY3JlYXRlQ29tcG9uZW50KElQcm9qZWN0LCBTdHJpbmcpCi0JICogQHNlZSBJQ29udGFpbmVyI2dldEZvbGRlcihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGgpCi0JICogQHNlZSBJRm9sZGVyI2NyZWF0ZUxpbmsob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoLCBpbnQsCi0JICogICAgICBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlV2ViTW9kdWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vVE9ETyAtIFJlZG8gdGVzdHMKLQotLy8JCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KFRlc3RXb3Jrc3BhY2UuZ2V0VGFyZ2V0UHJvamVjdCgpLCBUZXN0V29ya3NwYWNlLk5FV19XRUJfTU9EVUxFX05BTUUpOwotLy8JCS8vIGlmKCFjb21wb25lbnQuZXhpc3RzKCkpCi0vLwkJY29tcG9uZW50LmNyZWF0ZSgwLCBudWxsKTsKLS8vCQkKLS8vCQlJVmlydHVhbEZvbGRlciByb290Rm9sZGVyID0gY29tcG9uZW50LmdldFJvb3RGb2xkZXIoKTsKLS8vCQlJVmlydHVhbEZvbGRlciByb290ID0gcm9vdEZvbGRlci5nZXRGb2xkZXIobmV3IFBhdGgoIi8iKSk7IC8vJE5PTi1OTFMtMSQKLS8vCQlJUGF0aCByZWFsV2ViQ29udGVudFBhdGggPSBuZXcgUGF0aChUZXN0V29ya3NwYWNlLlBST0pFQ1RfTkFNRSArIElQYXRoLlNFUEFSQVRPUiArICJXZWJDb250ZW50Iik7IC8vJE5PTi1OTFMtMSQKLS8vCQlyb290LmNyZWF0ZUxpbmsocmVhbFdlYkNvbnRlbnRQYXRoLCAwLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotLy8KLS8vCQlJVmlydHVhbEZvbGRlciBtZXRhSW5mRm9sZGVyID0gcm9vdC5nZXRGb2xkZXIoVGVzdFdvcmtzcGFjZS5NRVRBX0lORik7Ci0vLwkJbWV0YUluZkZvbGRlci5jcmVhdGUoSVZpcnR1YWxSZXNvdXJjZS5GT1JDRSwgbnVsbCk7Ci0vLwotLy8JCUlWaXJ0dWFsRm9sZGVyIHdlYkluZkZvbGRlciA9IHJvb3QuZ2V0Rm9sZGVyKFRlc3RXb3Jrc3BhY2UuV0VCX0lORik7Ci0vLwkJd2ViSW5mRm9sZGVyLmNyZWF0ZShJVmlydHVhbFJlc291cmNlLkZPUkNFLCBudWxsKTsKLS8vCi0vLwkJSUZvbGRlciByZWFsV2ViQ29udGVudCA9IFRlc3RXb3Jrc3BhY2UuZ2V0VGFyZ2V0UHJvamVjdCgpLmdldEZvbGRlcihyZWFsV2ViQ29udGVudFBhdGgpOwotLy8JCWFzc2VydFRydWUoIlRoZSAiICsgcmVhbFdlYkNvbnRlbnQgKyAiIGRpcmVjdG9yeSBtdXN0IGV4aXN0LiIsIHJlYWxXZWJDb250ZW50LmV4aXN0cygpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0vLwotLy8JCUlGb2xkZXIgcmVhbE1ldGFJbmZGb2xkZXIgPSByZWFsV2ViQ29udGVudC5nZXRGb2xkZXIoVGVzdFdvcmtzcGFjZS5NRVRBX0lORik7Ci0vLwkJYXNzZXJ0VHJ1ZSgiVGhlICIgKyByZWFsTWV0YUluZkZvbGRlciArICIgZGlyZWN0b3J5IG11c3QgZXhpc3QuIiwgcmVhbE1ldGFJbmZGb2xkZXIuZXhpc3RzKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLS8vCi0vLwkJSUZvbGRlciByZWFsV2ViSW5mRm9sZGVyID0gcmVhbFdlYkNvbnRlbnQuZ2V0Rm9sZGVyKFRlc3RXb3Jrc3BhY2UuV0VCX0lORik7Ci0vLwkJYXNzZXJ0VHJ1ZSgiVGhlICIgKyByZWFsV2ViSW5mRm9sZGVyICsgIiBkaXJlY3RvcnkgbXVzdCBleGlzdC4iLCByZWFsV2ViSW5mRm9sZGVyLmV4aXN0cygpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0vLwotLy8JCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0vLwkJdHJ5IHsKLS8vCQkJbW9kdWxlQ29yZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvclJlYWQoVGVzdFdvcmtzcGFjZS5nZXRUYXJnZXRQcm9qZWN0KCkpOwotLy8JCQlXb3JrYmVuY2hDb21wb25lbnQgd2JDb21wb25lbnQgPSBtb2R1bGVDb3JlLmdldENvbXBvbmVudCgpOwotLy8KLS8vCQkJQ29tcG9uZW50UmVzb3VyY2VbXSBjb21wb25lbnRSZXNvdXJjZXMgPSB3YkNvbXBvbmVudC5maW5kUmVzb3VyY2VzQnlSdW50aW1lUGF0aChuZXcgUGF0aCgiLyIgKyBUZXN0V29ya3NwYWNlLk1FVEFfSU5GKSk7IC8vJE5PTi1OTFMtMSQKLS8vCi0vLwkJCWFzc2VydFRydWUoIlRoZXJlIHNob3VsZCBiZSBhdCBsZWFzdCBvbmUgbWFwcGluZyBmb3IgdmlydHVhbCBwYXRoIFwiLyIgKyBUZXN0V29ya3NwYWNlLk1FVEFfSU5GICsgIlwiLiIsIGNvbXBvbmVudFJlc291cmNlcy5sZW5ndGggPiAwKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0vLwotLy8JCQlSZXNvdXJjZVRyZWVSb290IHJlc291cmNlVHJlZVJvb3QgPSBSZXNvdXJjZVRyZWVSb290LmdldFNvdXJjZVJlc291cmNlVHJlZVJvb3Qod2JDb21wb25lbnQpOwotLy8JCQljb21wb25lbnRSZXNvdXJjZXMgPSByZXNvdXJjZVRyZWVSb290LmZpbmRNb2R1bGVSZXNvdXJjZXMobWV0YUluZkZvbGRlci5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCksIFJlc291cmNlVHJlZU5vZGUuQ1JFQVRFX05PTkUpOwotLy8KLS8vCQkJYXNzZXJ0VHJ1ZSgiVGhlcmUgc2hvdWxkIGJlIGV4YWN0bHkgb25lIENvbXBvbmVudCByZXNvdXJjZSB3aXRoIHRoZSBzb3VyY2UgcGF0aCBcIiIgKyBtZXRhSW5mRm9sZGVyLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKSArICJcIi4iLCBjb21wb25lbnRSZXNvdXJjZXMubGVuZ3RoID09IDEpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLS8vCi0vLwkJCWFzc2VydFRydWUoIlRoZSBydW50aW1lIHBhdGggc2hvdWxkIG1hdGNoIFwiLyIgKyBUZXN0V29ya3NwYWNlLk1FVEFfSU5GICsgIlwiLiIsIGNvbXBvbmVudFJlc291cmNlc1swXS5nZXRSdW50aW1lUGF0aCgpLnRvU3RyaW5nKCkuZXF1YWxzKCIvIiArIFRlc3RXb3Jrc3BhY2UuTUVUQV9JTkYpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLS8vCQkJCi0vLwkJCS8vIHRyeSB0byBmb3JjZSBkdXBsaWNhdGUgbWFwcGluZ3MKLS8vCQkJbWV0YUluZkZvbGRlci5jcmVhdGUoSVZpcnR1YWxSZXNvdXJjZS5GT1JDRSwgbnVsbCk7Ci0vLwkJCXdlYkluZkZvbGRlci5jcmVhdGUoSVZpcnR1YWxSZXNvdXJjZS5GT1JDRSwgbnVsbCk7Ci0vLwkJCQotLy8JCQkvLyBlbnN1cmUgdGhhdCBtdWx0aXBsZSBtYXBwaW5ncyBhcmVuJ3QgYWRkZWQKLS8vCQkJCi0vLwkJCWFzc2VydFRydWUoIlRoZSBtYXBwaW5nIHNob3VsZCBub3QgYmUgZHVwbGljYXRlZC4iLCAhaXNEdXBsaWNhdGVkKHdiQ29tcG9uZW50LCBtZXRhSW5mRm9sZGVyLmdldFJ1bnRpbWVQYXRoKCkpKTsgLy8kTk9OLU5MUy0xJAotLy8JCQlhc3NlcnRUcnVlKCJUaGUgbWFwcGluZyBzaG91bGQgbm90IGJlIGR1cGxpY2F0ZWQuIiwgIWlzRHVwbGljYXRlZCh3YkNvbXBvbmVudCwgd2ViSW5mRm9sZGVyLmdldFJ1bnRpbWVQYXRoKCkpKTsgLy8kTk9OLU5MUy0xJAotLy8JCX0gZmluYWxseSB7Ci0vLwkJCWlmIChtb2R1bGVDb3JlICE9IG51bGwpCi0vLwkJCQltb2R1bGVDb3JlLmRpc3Bvc2UoKTsKLS8vCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNEdXBsaWNhdGVkKFdvcmtiZW5jaENvbXBvbmVudCB3YkNvbXBvbmVudCwgSVBhdGggcnVudGltZVBhdGgpIHsKLQkJCi0JCVVSSSBydW50aW1lVVJJID0gVVJJLmNyZWF0ZVVSSShydW50aW1lUGF0aC50b1N0cmluZygpKTsKLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQlMaXN0IHJlc291cmNlTGlzdCA9IHdiQ29tcG9uZW50LmdldFJlc291cmNlcygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZUxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlDb21wb25lbnRSZXNvdXJjZSByZXNvdXJjZSA9IChDb21wb25lbnRSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQlpZihyZXNvdXJjZS5nZXRSdW50aW1lUGF0aCgpLmVxdWFscyhydW50aW1lVVJJKSkKLQkJCQlpZihmb3VuZCkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJZWxzZQotCQkJCQlmb3VuZCA9IHRydWU7Ci0JCX0JCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdGVzdHMvTW9kdWxlQ29yZU5hdHVyZUFQSVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdGVzdHMvTW9kdWxlQ29yZU5hdHVyZUFQSVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRlNDRkYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3Rlc3RzL01vZHVsZUNvcmVOYXR1cmVBUElUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuY29tcG9uZW50Y29yZS50ZXN0czsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXRvb2xzLmNvbW1vbi50ZXN0LmFwaXRvb2xzLlByb2plY3RVbnppcFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5FTUZXb3JrYmVuY2hDb250ZXh0QmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuTW9kdWxlQ29yZU5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQXJ0aWZhY3RFZGl0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5Db21tb25UZXN0c1BsdWdpbjsKLQotcHVibGljIGNsYXNzIE1vZHVsZUNvcmVOYXR1cmVBUElUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmlsZVNlcCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiZmlsZS5zZXBhcmF0b3IiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX05BTUUgPSAiVGVzdEFydGlmYWN0RWRpdCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX01PRFVMRV9OQU1FID0gIldlYk1vZHVsZTEiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVVJJIG1vZHVsZVVSSSA9IFVSSS5jcmVhdGVVUkkoIm1vZHVsZTovcmVzb3VyY2UvVGVzdEFydGlmYWN0RWRpdC9XZWJNb2R1bGUxIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVF9NT0RFTF9JRCA9ICJqc3Qud2ViIjsKLQlwcml2YXRlIFBhdGggemlwRmlsZVBhdGggPSBuZXcgUGF0aCgiVGVzdERhdGEiICsgZmlsZVNlcCArICJUZXN0QXJ0aWZhY3RFZGl0LnppcCIpOwotCXByaXZhdGUgSVByb2plY3QgcHJvamVjdDsKLQotCi0JLy8gL1RoaXMgc2hvdWxkIGJlIGV4dHJhY3RlZCBvdXQsIGRvbnQgaGF2ZSB0aW1lLCBqdXN0IHRyeWluZyB0byBnZXQgY292ZXJhZ2UKLQkvLyBmb3IgbTQgaW50ZWdyYXRpb24uLi4uCi0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAoIWdldFRhcmdldFByb2plY3QoKS5leGlzdHMoKSkKLQkJCWlmICghY3JlYXRlUHJvamVjdCgpKQotCQkJCWZhaWwoKTsKLQkJcHJvamVjdCA9IGdldFRhcmdldFByb2plY3QoKTsKLQl9Ci0KLQotCXB1YmxpYyBJUHJvamVjdCBnZXRUYXJnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KFBST0pFQ1RfTkFNRSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY3JlYXRlUHJvamVjdCgpIHsKLQkJSVBhdGggbG9jYWxaaXBQYXRoID0gZ2V0TG9jYWxQYXRoKCk7Ci0JCVByb2plY3RVbnppcFV0aWwgdXRpbCA9IG5ldyBQcm9qZWN0VW56aXBVdGlsKGxvY2FsWmlwUGF0aCwgbmV3IFN0cmluZ1tde1BST0pFQ1RfTkFNRX0pOwotCQlyZXR1cm4gdXRpbC5jcmVhdGVQcm9qZWN0cygpOwotCX0KLQotCXByaXZhdGUgSVBhdGggZ2V0TG9jYWxQYXRoKCkgewotCQlVUkwgdXJsID0gQ29tbW9uVGVzdHNQbHVnaW4uaW5zdGFuY2UuZmluZCh6aXBGaWxlUGF0aCk7Ci0JCXRyeSB7Ci0JCQl1cmwgPSBQbGF0Zm9ybS5hc0xvY2FsVVJMKHVybCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBQYXRoKHVybC5nZXRQYXRoKCkpOwotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdENvbmZpZ3VyZSgpIHsKLQkJTW9kdWxlQ29yZU5hdHVyZSBuYXR1cmUgPSBNb2R1bGVDb3JlTmF0dXJlLmdldE1vZHVsZUNvcmVOYXR1cmUocHJvamVjdCk7Ci0JCXRyeSB7Ci0JCQluYXR1cmUuY29uZmlndXJlKCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCWZhaWwoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRNb2R1bGVDb3JlTmF0dXJlKCkgewotCQluZXcgTW9kdWxlQ29yZU5hdHVyZSgpOwotCQlNb2R1bGVDb3JlTmF0dXJlIG5hdHVyZSA9IE1vZHVsZUNvcmVOYXR1cmUuZ2V0TW9kdWxlQ29yZU5hdHVyZShwcm9qZWN0KTsKLQkJYXNzZXJ0Tm90TnVsbChuYXR1cmUpOwotCX0KLQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TW9kdWxlU3RydWN0dXJhbE1vZGVsRm9yUmVhZCgpIHsKLQkJTW9kdWxlQ29yZU5hdHVyZSBuYXR1cmUgPSBNb2R1bGVDb3JlTmF0dXJlLmdldE1vZHVsZUNvcmVOYXR1cmUocHJvamVjdCk7Ci0JCW5hdHVyZS5nZXRNb2R1bGVTdHJ1Y3R1cmFsTW9kZWxGb3JSZWFkKHRoaXMpOwotCQlBcnRpZmFjdEVkaXRNb2RlbCBtb2RlbCA9IG5hdHVyZS5nZXRBcnRpZmFjdEVkaXRNb2RlbEZvclJlYWQobW9kdWxlVVJJLCB0aGlzKTsKLQkJYXNzZXJ0Tm90TnVsbChtb2RlbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE1vZHVsZVN0cnVjdHVyYWxNb2RlbEZvcldyaXRlKCkgewotCQlNb2R1bGVDb3JlTmF0dXJlIG5hdHVyZSA9IE1vZHVsZUNvcmVOYXR1cmUuZ2V0TW9kdWxlQ29yZU5hdHVyZShwcm9qZWN0KTsKLQkJQXJ0aWZhY3RFZGl0TW9kZWwgbW9kZWwgPSBuYXR1cmUuZ2V0QXJ0aWZhY3RFZGl0TW9kZWxGb3JXcml0ZShtb2R1bGVVUkksIHRoaXMpOwotCQlhc3NlcnROb3ROdWxsKG1vZGVsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QXJ0aWZhY3RFZGl0TW9kZWxGb3JSZWFkKCkgewotCQlNb2R1bGVDb3JlTmF0dXJlIG5hdHVyZSA9IE1vZHVsZUNvcmVOYXR1cmUuZ2V0TW9kdWxlQ29yZU5hdHVyZShwcm9qZWN0KTsKLQkJRWRpdE1vZGVsIG1vZGVsID0gbmF0dXJlLmdldEVkaXRNb2RlbEZvclJlYWQoRURJVF9NT0RFTF9JRCwgdGhpcyk7Ci0JCWFzc2VydE5vdE51bGwobW9kZWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBcnRpZmFjdEVkaXRNb2RlbEZvcldyaXRlKCkgewotCQlNb2R1bGVDb3JlTmF0dXJlIG5hdHVyZSA9IE1vZHVsZUNvcmVOYXR1cmUuZ2V0TW9kdWxlQ29yZU5hdHVyZShwcm9qZWN0KTsKLQkJRWRpdE1vZGVsIG1vZGVsID0gbmF0dXJlLmdldEVkaXRNb2RlbEZvcldyaXRlKEVESVRfTU9ERUxfSUQsIHRoaXMpOwotCQlhc3NlcnROb3ROdWxsKG1vZGVsKTsKLQl9Ci0KLQkvKgotCSAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIFN0cmluZyBnZXROYXR1cmVJRCgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEdldE5hdHVyZUlEKCkgewotCQlNb2R1bGVDb3JlTmF0dXJlIG5hdHVyZSA9IE1vZHVsZUNvcmVOYXR1cmUuZ2V0TW9kdWxlQ29yZU5hdHVyZShwcm9qZWN0KTsKLQkJU3RyaW5nIGlkID0gbmF0dXJlLmdldE5hdHVyZUlEKCk7Ci0JCWFzc2VydFRydWUoaWQuZXF1YWxzKElNb2R1bGVDb25zdGFudHMuTU9EVUxFX05BVFVSRV9JRCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcmltYXJ5Q29udHJpYnV0ZVRvQ29udGV4dCgpIHsKLQkJTW9kdWxlQ29yZU5hdHVyZSBuYXR1cmUgPSBNb2R1bGVDb3JlTmF0dXJlLmdldE1vZHVsZUNvcmVOYXR1cmUocHJvamVjdCk7Ci0JCUVNRldvcmtiZW5jaENvbnRleHRCYXNlIGNvbnRleHQgPSBuZXcgRU1GV29ya2JlbmNoQ29udGV4dEJhc2UocHJvamVjdCk7Ci0JCXRyeSB7Ci0JCQluYXR1cmUucHJpbWFyeUNvbnRyaWJ1dGVUb0NvbnRleHQoY29udGV4dCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCk7Ci0JCX0KLQotCX0KLQotCS8qCi0JICogQ2xhc3MgdW5kZXIgdGVzdCBmb3IgUmVzb3VyY2VTZXQgZ2V0UmVzb3VyY2VTZXQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RHZXRSZXNvdXJjZVNldCgpIHsKLQkJTW9kdWxlQ29yZU5hdHVyZSBuYXR1cmUgPSBNb2R1bGVDb3JlTmF0dXJlLmdldE1vZHVsZUNvcmVOYXR1cmUocHJvamVjdCk7Ci0JCVJlc291cmNlU2V0IHNldCA9IG5hdHVyZS5nZXRSZXNvdXJjZVNldCgpOwotCQlhc3NlcnROb3ROdWxsKHNldCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNlY29uZGFyeUNvbnRyaWJ1dGVUb0NvbnRleHQoKSB7Ci0JCU1vZHVsZUNvcmVOYXR1cmUgbmF0dXJlID0gTW9kdWxlQ29yZU5hdHVyZS5nZXRNb2R1bGVDb3JlTmF0dXJlKHByb2plY3QpOwotCQlFTUZXb3JrYmVuY2hDb250ZXh0QmFzZSBjb250ZXh0ID0gbmV3IEVNRldvcmtiZW5jaENvbnRleHRCYXNlKHByb2plY3QpOwotCQl0cnkgewotCQkJbmF0dXJlLnNlY29uZGFyeUNvbnRyaWJ1dGVUb0NvbnRleHQoY29udGV4dCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIFN0cmluZyBnZXRQbHVnaW5JRCgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEdldFBsdWdpbklEKCkgewotCQkvLyBwcm90ZWN0ZWQgY2FudCB0ZXN0IHVubGVzcyBpbiBzYW1lIHBhY2thZ2UuLi4uCi0JCU1vZHVsZUNvcmVOYXR1cmUgbmF0dXJlID0gTW9kdWxlQ29yZU5hdHVyZS5nZXRNb2R1bGVDb3JlTmF0dXJlKHByb2plY3QpOwotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkTW9kdWxlQ29yZU5hdHVyZUlmTmVjZXNzYXJ5KCkgewotCQl0cnkgewotCQkJcHJvamVjdC5nZXREZXNjcmlwdGlvbigpLnNldE5hdHVyZUlkcyhuZXcgU3RyaW5nWzBdKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCU1vZHVsZUNvcmVOYXR1cmUuYWRkTW9kdWxlQ29yZU5hdHVyZUlmTmVjZXNzYXJ5KHByb2plY3QsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQlNb2R1bGVDb3JlTmF0dXJlIG5hdHVyZSA9IE1vZHVsZUNvcmVOYXR1cmUuZ2V0TW9kdWxlQ29yZU5hdHVyZShwcm9qZWN0KTsKLQkJYXNzZXJ0Tm90TnVsbChuYXR1cmUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbigpIHsKLQkJVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbiB1cmlFeCA9ICAgbmV3IFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24obW9kdWxlVVJJKTsKLQkJYXNzZXJ0Tm90TnVsbCh1cmlFeCk7Ci0JfQotCQotCi0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS90ZXN0cy9Nb2R1bGVDb3JlVVJJQ29udmVydGVyVW5pdFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdGVzdHMvTW9kdWxlQ29yZVVSSUNvbnZlcnRlclVuaXRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwODFmYTcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS90ZXN0cy9Nb2R1bGVDb3JlVVJJQ29udmVydGVyVW5pdFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmNvbXBvbmVudGNvcmUudGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLkNvbXBvbmVudENvcmVVUklDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmNvbXBvbmVudGNvcmUudmlydHVhbHBhdGgudGVzdHMuVGVzdFdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLlNpbXBsZVRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIE1vZHVsZUNvcmVVUklDb252ZXJ0ZXJVbml0VGVzdCAgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVGVzdFN1aXRlKE1vZHVsZUNvcmVVUklDb252ZXJ0ZXJVbml0VGVzdC5jbGFzcyk7Ci0JfQotCi0JcHVibGljIE1vZHVsZUNvcmVVUklDb252ZXJ0ZXJVbml0VGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOyAgCi0JCVRlc3RXb3Jrc3BhY2UuaW5pdCgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9ybWFsaXplRERVUkkoKSB0aHJvd3MgRXhjZXB0aW9uIHsgCi0JCQotCQlDb21wb25lbnRDb3JlVVJJQ29udmVydGVyIGNvbnZlcnRlciA9IG5ldyBDb21wb25lbnRDb3JlVVJJQ29udmVydGVyKFRlc3RXb3Jrc3BhY2UuZ2V0VGFyZ2V0UHJvamVjdCgpKTsKLQkJCi0JCVVSSSBpbnB1dFVSSSA9IFVSSS5jcmVhdGVVUkkoIm1vZHVsZTovcmVzb3VyY2UvV2ViTW9kdWxlMS9XZWJNb2R1bGUxL1dFQi1JTkYvd2ViLnhtbCIpOyAvLyROT04tTkxTLTEkCi0JCQotCQlVUkkgcmVzdWx0VVJJID0gY29udmVydGVyLm5vcm1hbGl6ZShpbnB1dFVSSSk7Ci0JCQotCQlVUkkgZXhwZWN0ZWRVUkkgPSBVUkkuY3JlYXRlVVJJKCJwbGF0Zm9ybTovcmVzb3VyY2UvV2ViTW9kdWxlMS9XZWJNb2R1bGUxL1dlYkNvbnRlbnQvV0VCLUlORi93ZWIueG1sIik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gVE9ETwotCQkvL2Fzc2VydEVxdWFscygiVGhlIHJlc3VsdGFudCBVUkkgbXVzdCBtYXRjaCB0aGUgZXhwZWN0ZWQgVVJJIiwgZXhwZWN0ZWRVUkksIHJlc3VsdFVSSSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3Rlc3RzL1N0cnVjdHVyZUVkaXRBUElUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3Rlc3RzL1N0cnVjdHVyZUVkaXRBUElUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyZDRmYWMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS90ZXN0cy9TdHJ1Y3R1cmVFZGl0QVBJVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmNvbXBvbmVudGNvcmUudGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuTW9kdWxlQ29yZU5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50UmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlByb2plY3RDb21wb25lbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmNvbXBvbmVudGNvcmUudmlydHVhbHBhdGgudGVzdHMuVGVzdFdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLlNpbXBsZVRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZUVkaXRBUElUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpbGVTZXAgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImZpbGUuc2VwYXJhdG9yIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9OQU1FID0gIlRlc3RBcnRpZmFjdEVkaXQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9NT0RVTEVfTkFNRSA9ICJXZWJNb2R1bGUxIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFVSSSBtb2R1bGVVUkkgPSBVUkkuY3JlYXRlVVJJKCJtb2R1bGU6L3Jlc291cmNlL1Rlc3RBcnRpZmFjdEVkaXQvV2ViTW9kdWxlMSIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRfTU9ERUxfSUQgPSAianN0LndlYiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVE1PREVMX1NUUkVTUyA9ICJzdHJlc3N0ZXN0IjsKLQlwcml2YXRlIFBhdGggemlwRmlsZVBhdGggPSBuZXcgUGF0aCgiVGVzdERhdGEiICsgZmlsZVNlcCArICJUZXN0QXJ0aWZhY3RFZGl0LnppcCIpOwotCXByaXZhdGUgSVByb2plY3QgcHJvamVjdDsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUZXN0U3VpdGUoU3RydWN0dXJlRWRpdEFQSVRlc3QuY2xhc3MpOwotCX0KLQotCS8vIC9UaGlzIHNob3VsZCBiZSBleHRyYWN0ZWQgb3V0LCBkb250IGhhdmUgdGltZSwganVzdCB0cnlpbmcgdG8gZ2V0IGNvdmVyYWdlCi0JLy8gZm9yIG00IGludGVncmF0aW9uLi4uLgotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFdvcmtzcGFjZS5pbml0KCk7Ci0JCXByb2plY3QgPSBUZXN0V29ya3NwYWNlLmdldFRhcmdldFByb2plY3QoKTsKLQl9Ci0KLQlwdWJsaWMgSVByb2plY3QgZ2V0VGFyZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChQUk9KRUNUX05BTUUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTdHJ1Y3R1cmVFZGl0Rm9yUmVhZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJ1Y3R1cmVFZGl0IG1vZHVsZUNvcmUgPSBudWxsOwotCi0JCXRyeSB7Ci0JCQltb2R1bGVDb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yUmVhZChwcm9qZWN0KTsKLQkJCWFzc2VydE5vdE51bGwobW9kdWxlQ29yZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQltb2R1bGVDb3JlLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTdHJ1Y3R1cmVFZGl0Rm9yV3JpdGUoKSB0aHJvd3MgRXhjZXB0aW9uewotCQlTdHJ1Y3R1cmVFZGl0IG1vZHVsZUNvcmUgPSBudWxsOwotCi0JCXRyeSB7Ci0JCQltb2R1bGVDb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yV3JpdGUocHJvamVjdCk7Ci0JCQlhc3NlcnROb3ROdWxsKG1vZHVsZUNvcmUpOwotCQl9IGZpbmFsbHkgewotCQkJbW9kdWxlQ29yZS5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TW9kdWxlQ29yZU5hdHVyZSgpIHRocm93cyBFeGNlcHRpb257Ci0JCU1vZHVsZUNvcmVOYXR1cmUgbmF0dXJlID0gU3RydWN0dXJlRWRpdC5nZXRNb2R1bGVDb3JlTmF0dXJlKG1vZHVsZVVSSSk7Ci0JCWFzc2VydE5vdE51bGwobmF0dXJlKTsKLQl9Ci0KLQkvKgotCSAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIElQcm9qZWN0IGdldENvbnRhaW5pbmdQcm9qZWN0KFdvcmtiZW5jaENvbXBvbmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29udGFpbmluZ1Byb2plY3RXb3JrYmVuY2hDb21wb25lbnQoKSB7Ci0JCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0KLQkJdHJ5IHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKHByb2plY3QpOwotCQkJYXNzZXJ0Tm90TnVsbChtb2R1bGVDb3JlKTsKLQkJCVdvcmtiZW5jaENvbXBvbmVudCB3YkNvbXBvbmVudCA9IG1vZHVsZUNvcmUuZ2V0Q29tcG9uZW50KCk7Ci0JCQlhc3NlcnROb3ROdWxsKHdiQ29tcG9uZW50KTsKLQkJCUlQcm9qZWN0IGFQcm9qZWN0ID0gU3RydWN0dXJlRWRpdC5nZXRDb250YWluaW5nUHJvamVjdCh3YkNvbXBvbmVudCk7Ci0JCQlhc3NlcnROb3ROdWxsKGFQcm9qZWN0KTsKLQkJfSBmaW5hbGx5IHsKLQkJCW1vZHVsZUNvcmUuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBJUHJvamVjdCBnZXRDb250YWluaW5nUHJvamVjdChVUkkpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEdldENvbnRhaW5pbmdQcm9qZWN0VVJJKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0IGFQcm9qZWN0ID0gU3RydWN0dXJlRWRpdC5nZXRDb250YWluaW5nUHJvamVjdChtb2R1bGVVUkkpOwotCQlhc3NlcnROb3ROdWxsKGFQcm9qZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLS8vCXB1YmxpYyB2b2lkIHRlc3RHZXRFY2xpcHNlUmVzb3VyY2UoKSB7Ci0vLwkJU3RydWN0dXJlRWRpdCBtb2R1bGVDb3JlID0gbnVsbDsKLS8vCi0vLwkJdHJ5IHsKLS8vCQkJbW9kdWxlQ29yZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvclJlYWQocHJvamVjdCk7Ci0vLwkJCVdvcmtiZW5jaENvbXBvbmVudCB3YkNvbXBvbmVudCA9IG1vZHVsZUNvcmUuZmluZENvbXBvbmVudEJ5TmFtZShXRUJfTU9EVUxFX05BTUUpOwotLy8JCQlDb21wb25lbnRSZXNvdXJjZSBjb21wb25lbnRSZXNvdXJjZSA9IHdiQ29tcG9uZW50LmZpbmRSZXNvdXJjZXNCeVJ1bnRpbWVQYXRoKG5ldyBQYXRoKCIvVGVzdEFydGlmYWN0RWRpdC9XZWJNb2R1bGUxIikpWzBdOwotLy8JCQltb2R1bGVDb3JlLmdldEVjbGlwc2VSZXNvdXJjZShjb21wb25lbnRSZXNvdXJjZSk7Ci0vLwkJfSBmaW5hbGx5IHsKLS8vCQkJaWYgKG1vZHVsZUNvcmUgIT0gbnVsbCkgewotLy8JCQkJbW9kdWxlQ29yZS5kaXNwb3NlKCk7Ci0vLwotLy8JCQl9Ci0vLwkJCWFzc2VydE5vdE51bGwobW9kdWxlQ29yZSk7Ci0vLwotLy8JCX0KLS8vCX0KLQotCS8qKgotCSAqIAotCSAqLwotLy8JcHVibGljIHZvaWQgdGVzdEdldE91dHB1dENvbnRhaW5lclJvb3QoKSB7Ci0vLwkJU3RydWN0dXJlRWRpdCBtb2R1bGVDb3JlID0gbnVsbDsKLS8vCQl0cnkgewotLy8JCQltb2R1bGVDb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yUmVhZChwcm9qZWN0KTsKLS8vCQkJV29ya2JlbmNoQ29tcG9uZW50IHdiQ29tcG9uZW50ID0gbW9kdWxlQ29yZS5maW5kQ29tcG9uZW50QnlOYW1lKFdFQl9NT0RVTEVfTkFNRSk7Ci0vLwkJCUNvbXBvbmVudFJlc291cmNlIGNvbXBvbmVudFJlc291cmNlID0gd2JDb21wb25lbnQuZmluZFJlc291cmNlc0J5UnVudGltZVBhdGgobmV3IFBhdGgoIi9UZXN0QXJ0aWZhY3RFZGl0L1dlYk1vZHVsZTEiKSlbMF07Ci0vLwkJCVN0cnVjdHVyZUVkaXQuZ2V0T3V0cHV0Q29udGFpbmVyUm9vdCh3YkNvbXBvbmVudCk7Ci0vLwkJfSBmaW5hbGx5IHsKLS8vCQkJaWYgKG1vZHVsZUNvcmUgIT0gbnVsbCkgewotLy8JCQkJbW9kdWxlQ29yZS5kaXNwb3NlKCk7Ci0vLwotLy8JCQl9Ci0vLwkJCWFzc2VydE5vdE51bGwobW9kdWxlQ29yZSk7Ci0vLwkJfQotLy8JfQotCi0JLyoqCi0JICogCi0JICovCi0vLwlwdWJsaWMgdm9pZCB0ZXN0R2V0T3V0cHV0Q29udGFpbmVyc0ZvclByb2plY3QoKSB7Ci0vLwkJU3RydWN0dXJlRWRpdCBtb2R1bGVDb3JlID0gbnVsbDsKLS8vCQl0cnkgewotLy8JCQltb2R1bGVDb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yUmVhZChwcm9qZWN0KTsKLS8vCQkJV29ya2JlbmNoQ29tcG9uZW50IHdiQ29tcG9uZW50ID0gbW9kdWxlQ29yZS5maW5kQ29tcG9uZW50QnlOYW1lKFdFQl9NT0RVTEVfTkFNRSk7Ci0vLwkJCUNvbXBvbmVudFJlc291cmNlIGNvbXBvbmVudFJlc291cmNlID0gd2JDb21wb25lbnQuZmluZFJlc291cmNlc0J5UnVudGltZVBhdGgobmV3IFBhdGgoIi9UZXN0QXJ0aWZhY3RFZGl0L1dlYk1vZHVsZTEiKSlbMF07Ci0vLwkJCVN0cnVjdHVyZUVkaXQuZ2V0T3V0cHV0Q29udGFpbmVyc0ZvclByb2plY3QocHJvamVjdCk7Ci0vLwkJfSBmaW5hbGx5IHsKLS8vCQkJaWYgKG1vZHVsZUNvcmUgIT0gbnVsbCkgewotLy8JCQkJbW9kdWxlQ29yZS5kaXNwb3NlKCk7Ci0vLwotLy8JCQl9Ci0vLwkJCWFzc2VydE5vdE51bGwobW9kdWxlQ29yZSk7Ci0vLwkJfQotLy8JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEdldERlcGxveWVkTmFtZSgpIHRocm93cyBFeGNlcHRpb257Ci0JCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb2R1bGVDb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yUmVhZChwcm9qZWN0KTsKLQkJCWFzc2VydE5vdE51bGwobW9kdWxlQ29yZSk7Ci0JCQlXb3JrYmVuY2hDb21wb25lbnQgd2JDb21wb25lbnQgPSBtb2R1bGVDb3JlLmdldENvbXBvbmVudCgpOwotCQkJYXNzZXJ0Tm90TnVsbCh3YkNvbXBvbmVudCk7Ci0JCQlTdHJpbmcgZGVwbG95TmFtZSA9IFN0cnVjdHVyZUVkaXQuZ2V0RGVwbG95ZWROYW1lKG1vZHVsZVVSSSk7Ci0JCQlhc3NlcnROb3ROdWxsKGRlcGxveU5hbWUpOwotCQl9IGZpbmFsbHkgewotCQkJbW9kdWxlQ29yZS5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29tcG9uZW50VHlwZSgpIHsKLQkJU3RydWN0dXJlRWRpdCBtb2R1bGVDb3JlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKHByb2plY3QpOwotCQkJYXNzZXJ0Tm90TnVsbChtb2R1bGVDb3JlKTsKLQkJCVdvcmtiZW5jaENvbXBvbmVudCB3YkNvbXBvbmVudCA9IG1vZHVsZUNvcmUuZ2V0Q29tcG9uZW50KCk7Ci0JCQlhc3NlcnROb3ROdWxsKHdiQ29tcG9uZW50KTsKLQkJCUNvbXBvbmVudFR5cGUgdHlwZSA9IFN0cnVjdHVyZUVkaXQuZ2V0Q29tcG9uZW50VHlwZShDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0LHdiQ29tcG9uZW50LmdldE5hbWUoKSkpOwotCQkJYXNzZXJ0Tm90TnVsbCh0eXBlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCW1vZHVsZUNvcmUuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNhdmUoKSB7Ci0KLQkJU3RydWN0dXJlRWRpdCBtb2R1bGVDb3JlID0gbnVsbDsKLQotCQl0cnkgewotCQkJbW9kdWxlQ29yZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvcldyaXRlKHByb2plY3QpOwotCQkJYXNzZXJ0Tm90TnVsbChtb2R1bGVDb3JlKTsKLQkJCW1vZHVsZUNvcmUuc2F2ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCW1vZHVsZUNvcmUuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNhdmVJZk5lY2Vzc2FyeSgpIHsKLQkJU3RydWN0dXJlRWRpdCBtb2R1bGVDb3JlID0gbnVsbDsKLQotCQl0cnkgewotCQkJbW9kdWxlQ29yZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvcldyaXRlKHByb2plY3QpOwotCQkJYXNzZXJ0Tm90TnVsbChtb2R1bGVDb3JlKTsKLQkJCW1vZHVsZUNvcmUuc2F2ZUlmTmVjZXNzYXJ5KG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9IGZpbmFsbHkgewotCQkJbW9kdWxlQ29yZS5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJlcGFyZVByb2plY3RDb21wb25lbnRzSWZOZWNlc3NhcnkoKSB7Ci0JCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0KLQkJdHJ5IHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShwcm9qZWN0KTsKLQkJCWFzc2VydE5vdE51bGwobW9kdWxlQ29yZSk7Ci0JCQltb2R1bGVDb3JlLnByZXBhcmVQcm9qZWN0Q29tcG9uZW50c0lmTmVjZXNzYXJ5KCk7Ci0JCX0gZmluYWxseSB7Ci0JCQltb2R1bGVDb3JlLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb21wb25lbnRNb2RlbFJvb3QoKSB7Ci0JCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0KLQkJdHJ5IHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShwcm9qZWN0KTsKLQkJCWFzc2VydE5vdE51bGwobW9kdWxlQ29yZSk7Ci0JCQlQcm9qZWN0Q29tcG9uZW50cyBwcm9qZWN0Q29tcG9uZW50cyA9IG1vZHVsZUNvcmUuZ2V0Q29tcG9uZW50TW9kZWxSb290KCk7Ci0JCQlhc3NlcnROb3ROdWxsKHByb2plY3RDb21wb25lbnRzKTsKLQkJfSBmaW5hbGx5IHsKLQkJCW1vZHVsZUNvcmUuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFNvdXJjZUNvbnRhaW5lcnMoKSB7Ci0JCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0KLQkJdHJ5IHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShwcm9qZWN0KTsKLQkJCWFzc2VydE5vdE51bGwobW9kdWxlQ29yZSk7Ci0JCQlXb3JrYmVuY2hDb21wb25lbnQgd2JDb21wb25lbnQgPSBtb2R1bGVDb3JlLmdldENvbXBvbmVudCgpOwotCQkJQ29tcG9uZW50UmVzb3VyY2VbXSBjb250YWluZXJzID0gbW9kdWxlQ29yZS5nZXRTb3VyY2VDb250YWluZXJzKHdiQ29tcG9uZW50KTsKLQkJCWFzc2VydE5vdE51bGwoY29udGFpbmVycyk7Ci0KLQkJfSBmaW5hbGx5IHsKLQkJCW1vZHVsZUNvcmUuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFdvcmtiZW5jaE1vZHVsZXMoKSB7Ci0JCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0KLQkJdHJ5IHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShwcm9qZWN0KTsKLQkJCWFzc2VydE5vdE51bGwobW9kdWxlQ29yZSk7Ci0JCQlXb3JrYmVuY2hDb21wb25lbnQgd2JDb21wb25lbnQgPSBtb2R1bGVDb3JlLmdldENvbXBvbmVudCgpOwotCQkJYXNzZXJ0Tm90TnVsbCh3YkNvbXBvbmVudCk7Ci0JCQlXb3JrYmVuY2hDb21wb25lbnRbXSBjb21wb25lbnRzID0gbW9kdWxlQ29yZS5nZXRXb3JrYmVuY2hNb2R1bGVzKCk7Ci0JCQlhc3NlcnROb3ROdWxsKGNvbXBvbmVudHMpOwotCQkJYXNzZXJ0VHJ1ZShjb21wb25lbnRzLmxlbmd0aCA+IDApOwotCQl9IGZpbmFsbHkgewotCQkJbW9kdWxlQ29yZS5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlV29ya2JlbmNoTW9kdWxlKCkgewotCi0JCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0KLQkJdHJ5IHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShwcm9qZWN0KTsKLQkJCWFzc2VydE5vdE51bGwobW9kdWxlQ29yZSk7Ci0JCQlXb3JrYmVuY2hDb21wb25lbnQgd2JDb21wb25lbnQgPSBtb2R1bGVDb3JlLmdldENvbXBvbmVudCgpOwotCQkJYXNzZXJ0Tm90TnVsbCh3YkNvbXBvbmVudCk7Ci0JCQl3YkNvbXBvbmVudCA9IG1vZHVsZUNvcmUuY3JlYXRlV29ya2JlbmNoTW9kdWxlKCJ0ZXN0Iik7Ci0JCQlhc3NlcnROb3ROdWxsKHdiQ29tcG9uZW50KTsKLQkJfSBmaW5hbGx5IHsKLQkJCW1vZHVsZUNvcmUuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlV29ya2JlbmNoTW9kdWxlUmVzb3VyY2UoKSB7Ci0JCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0KLQkJdHJ5IHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShwcm9qZWN0KTsKLQkJCWFzc2VydE5vdE51bGwobW9kdWxlQ29yZSk7Ci0JCQlXb3JrYmVuY2hDb21wb25lbnQgd2JDb21wb25lbnQgPSBtb2R1bGVDb3JlLmdldENvbXBvbmVudCgpOwotCQkJYXNzZXJ0Tm90TnVsbCh3YkNvbXBvbmVudCk7Ci0JCQlDb21wb25lbnRSZXNvdXJjZSByZXNvdXJjZSA9IG1vZHVsZUNvcmUuY3JlYXRlV29ya2JlbmNoTW9kdWxlUmVzb3VyY2UocHJvamVjdC5nZXRGaWxlKCJXZWJNb2R1bGUxL05ld0ZvbGRlciIpKTsKLQkJCWFzc2VydE5vdE51bGwocmVzb3VyY2UpOwotCQl9IGZpbmFsbHkgewotCQkJbW9kdWxlQ29yZS5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlTW9kdWxlVHlwZSgpIHsKLQkJU3RydWN0dXJlRWRpdCBtb2R1bGVDb3JlID0gbnVsbDsKLQotCQl0cnkgewotCQkJbW9kdWxlQ29yZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvcldyaXRlKHByb2plY3QpOwotCQkJYXNzZXJ0Tm90TnVsbChtb2R1bGVDb3JlKTsKLQkJCVdvcmtiZW5jaENvbXBvbmVudCB3YkNvbXBvbmVudCA9IG1vZHVsZUNvcmUuZ2V0Q29tcG9uZW50KCk7Ci0JCQlhc3NlcnROb3ROdWxsKHdiQ29tcG9uZW50KTsKLQkJCUNvbXBvbmVudFR5cGUgdHlwZSA9IG1vZHVsZUNvcmUuY3JlYXRlTW9kdWxlVHlwZShFRElUX01PREVMX0lEKTsKLQkJCWFzc2VydE5vdE51bGwodHlwZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQltb2R1bGVDb3JlLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCi0JLyoKLQkgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBDb21wb25lbnRSZXNvdXJjZVtdIGZpbmRSZXNvdXJjZXNCeVJ1bnRpbWVQYXRoKFVSSSwgVVJJKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RGaW5kUmVzb3VyY2VzQnlSdW50aW1lUGF0aFVSSVVSSSgpIHRocm93cyBFeGNlcHRpb257Ci0JCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb2R1bGVDb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yV3JpdGUocHJvamVjdCk7Ci0JCQlhc3NlcnROb3ROdWxsKG1vZHVsZUNvcmUpOwotCQkJV29ya2JlbmNoQ29tcG9uZW50IHdiQ29tcG9uZW50ID0gbW9kdWxlQ29yZS5nZXRDb21wb25lbnQoKTsKLQkJCWFzc2VydE5vdE51bGwod2JDb21wb25lbnQpOwotCQkJQ29tcG9uZW50UmVzb3VyY2VbXSByZXNvdXJjZXMgPSBtb2R1bGVDb3JlLmZpbmRSZXNvdXJjZXNCeVJ1bnRpbWVQYXRoKG1vZHVsZVVSSSk7Ci0JCQlhc3NlcnROb3ROdWxsKHJlc291cmNlcyk7Ci0JCQlhc3NlcnRUcnVlKHJlc291cmNlcy5sZW5ndGggPiAwKTsKLQkJfSBmaW5hbGx5IHsKLQkJCW1vZHVsZUNvcmUuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBDb21wb25lbnRSZXNvdXJjZVtdIGZpbmRSZXNvdXJjZXNCeVJ1bnRpbWVQYXRoKFVSSSkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0RmluZFJlc291cmNlc0J5UnVudGltZVBhdGhVUkkoKSB0aHJvd3MgRXhjZXB0aW9uewotCQlTdHJ1Y3R1cmVFZGl0IG1vZHVsZUNvcmUgPSBudWxsOwotCQl0cnkgewotCQkJbW9kdWxlQ29yZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvcldyaXRlKHByb2plY3QpOwotCQkJYXNzZXJ0Tm90TnVsbChtb2R1bGVDb3JlKTsKLQkJCVdvcmtiZW5jaENvbXBvbmVudCB3YkNvbXBvbmVudCA9IG1vZHVsZUNvcmUuZ2V0Q29tcG9uZW50KCk7Ci0JCQlhc3NlcnROb3ROdWxsKHdiQ29tcG9uZW50KTsKLQkJCUNvbXBvbmVudFJlc291cmNlW10gcmVzb3VyY2VzID0gbW9kdWxlQ29yZS5maW5kUmVzb3VyY2VzQnlSdW50aW1lUGF0aChtb2R1bGVVUkksIG1vZHVsZVVSSSk7Ci0JCQlhc3NlcnROb3ROdWxsKHJlc291cmNlcyk7Ci0JCQlhc3NlcnRUcnVlKHJlc291cmNlcy5sZW5ndGggPiAwKTsKLQkJfSBmaW5hbGx5IHsKLQkJCW1vZHVsZUNvcmUuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbmRSZXNvdXJjZXNCeVNvdXJjZVBhdGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RydWN0dXJlRWRpdCBtb2R1bGVDb3JlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShwcm9qZWN0KTsKLQkJCWFzc2VydE5vdE51bGwobW9kdWxlQ29yZSk7Ci0JCQlDb21wb25lbnRSZXNvdXJjZVtdIHJlc291cmNlcyA9IG1vZHVsZUNvcmUuZmluZFJlc291cmNlc0J5U291cmNlUGF0aChtb2R1bGVVUkkpOwotCQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZXMpOwotCQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZXMubGVuZ3RoID4gMCk7Ci0JCX0gZmluYWxseSB7Ci0JCQltb2R1bGVDb3JlLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaW5kQ29tcG9uZW50QnlOYW1lKCkgewotCQlTdHJ1Y3R1cmVFZGl0IG1vZHVsZUNvcmUgPSBudWxsOwotCQl0cnkgewotCQkJbW9kdWxlQ29yZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvcldyaXRlKHByb2plY3QpOwotCQkJYXNzZXJ0Tm90TnVsbChtb2R1bGVDb3JlKTsKLQkJCVdvcmtiZW5jaENvbXBvbmVudCB3YkNvbXBvbmVudCA9ICBtb2R1bGVDb3JlLmdldENvbXBvbmVudCgpOwotCQkJYXNzZXJ0Tm90TnVsbCh3YkNvbXBvbmVudCk7Ci0JCX0gZmluYWxseSB7Ci0JCQltb2R1bGVDb3JlLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaW5kQ29tcG9uZW50QnlVUkkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RydWN0dXJlRWRpdCBtb2R1bGVDb3JlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShwcm9qZWN0KTsKLQkJCWFzc2VydE5vdE51bGwobW9kdWxlQ29yZSk7Ci0JCQlXb3JrYmVuY2hDb21wb25lbnQgd2JDb21wb25lbnQgPSBtb2R1bGVDb3JlLmZpbmRDb21wb25lbnRCeVVSSShtb2R1bGVVUkkpOwotCQkJYXNzZXJ0Tm90TnVsbCh3YkNvbXBvbmVudCk7Ci0JCX0gZmluYWxseSB7Ci0JCQltb2R1bGVDb3JlLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc0xvY2FsRGVwZW5kZW5jeSgpIHsKLQkJU3RydWN0dXJlRWRpdCBtb2R1bGVDb3JlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKHByb2plY3QpOwotCQkJYXNzZXJ0Tm90TnVsbChtb2R1bGVDb3JlKTsKLQkJCW1vZHVsZUNvcmUuaXNMb2NhbERlcGVuZGVuY3kobnVsbCk7Ci0JCX0gZmluYWxseSB7Ci0JCQltb2R1bGVDb3JlLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRGaXJzdE1vZHVsZSgpIHsKLQkJU3RydWN0dXJlRWRpdCBtb2R1bGVDb3JlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKHByb2plY3QpOwotCQkJYXNzZXJ0Tm90TnVsbChtb2R1bGVDb3JlKTsKLQkJCVdvcmtiZW5jaENvbXBvbmVudCB3YkNvbXBvbmVudCA9ICBtb2R1bGVDb3JlLmdldEZpcnN0TW9kdWxlKCk7Ci0JCQlhc3NlcnROb3ROdWxsKHdiQ29tcG9uZW50KTsKLQkJfSBmaW5hbGx5IHsKLQkJCW1vZHVsZUNvcmUuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZUNvbXBvbmVudFVSSSgpIHsKLQkJU3RydWN0dXJlRWRpdCBtb2R1bGVDb3JlID0gbnVsbDsKLQkJVVJJIHVyaSA9IFN0cnVjdHVyZUVkaXQuY3JlYXRlQ29tcG9uZW50VVJJKHByb2plY3QsICJ0ZXN0Q29tcCIpOwotCQlhc3NlcnROb3ROdWxsKHVyaSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS90ZXN0cy9TdHJ1Y3R1cmVFZGl0U3RyZXNzVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS90ZXN0cy9TdHJ1Y3R1cmVFZGl0U3RyZXNzVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzBhNTQxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdGVzdHMvU3RydWN0dXJlRWRpdFN0cmVzc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5jb21wb25lbnRjb3JlLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudGNvcmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuU3RydWN0dXJlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5jb21wb25lbnRjb3JlLnZpcnR1YWxwYXRoLnRlc3RzLlRlc3RXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5TaW1wbGVUZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVFZGl0U3RyZXNzVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaWxlU2VwID0gU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLnNlcGFyYXRvciIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfTkFNRSA9ICJUZXN0QXJ0aWZhY3RFZGl0IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfTU9EVUxFX05BTUUgPSAiV2ViTW9kdWxlMSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBVUkkgbW9kdWxlVVJJID0gVVJJLmNyZWF0ZVVSSSgibW9kdWxlOi9yZXNvdXJjZS9UZXN0QXJ0aWZhY3RFZGl0L1dlYk1vZHVsZTEiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUX01PREVMX0lEID0gImpzdC53ZWIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRNT0RFTF9TVFJFU1MgPSAic3RyZXNzdGVzdCI7Ci0JcHJpdmF0ZSBQYXRoIHppcEZpbGVQYXRoID0gbmV3IFBhdGgoIlRlc3REYXRhIiArIGZpbGVTZXAgKyAiVGVzdEFydGlmYWN0RWRpdC56aXAiKTsKLQlwcml2YXRlIElQcm9qZWN0IHByb2plY3Q7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVGVzdFN1aXRlKFN0cnVjdHVyZUVkaXRTdHJlc3NUZXN0LmNsYXNzKTsKLQl9Ci0KLQkvLyAvVGhpcyBzaG91bGQgYmUgZXh0cmFjdGVkIG91dCwgZG9udCBoYXZlIHRpbWUsIGp1c3QgdHJ5aW5nIHRvIGdldCBjb3ZlcmFnZQotCS8vIGZvciBtNCBpbnRlZ3JhdGlvbi4uLi4KLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RXb3Jrc3BhY2UuaW5pdCgpOwotCQlwcm9qZWN0ID0gVGVzdFdvcmtzcGFjZS5nZXRUYXJnZXRQcm9qZWN0KCk7Ci0JfQotCi0KLQlwdWJsaWMgSVByb2plY3QgZ2V0VGFyZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChQUk9KRUNUX05BTUUpOwotCX0KLQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0TXVsdGlUaHJlYWRBY2Nlc3MoKSB7Ci0JCQotCQlKb2JbXSB0ZXN0Sm9icyA9IG5ldyBKb2JbNTBdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRlc3RKb2JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlKb2Igam9iID0gbmV3IEpvYigiSm9iICIgKyBpKQotCQkgICAgICB7Ci0JCSAgICAgICAgCi0JCSAgICAgICAgcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJICAgICAgICB7Ci0JCSAgICAgICAgU3RydWN0dXJlRWRpdCBtb2R1bGVDb3JlID0gbnVsbDsKLQkJICAgICAgICAgIHRyeQotCQkgICAgICAgICAgewotCQkgICAgICAgIAltb2R1bGVDb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yV3JpdGUocHJvamVjdCk7Ci0JCSAgICAgICAgCVByb3BlcnR5IHByb3AgPSBDb21wb25lbnRjb3JlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvcGVydHkoKTsKLQkJICAgICAgICAJcHJvcC5zZXROYW1lKCJKb2IgIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLQkJICAgICAgICAJcHJvcC5zZXRWYWx1ZSgiQmxhaCIpOwotCQkgICAgICAgIAlpZiAobW9kdWxlQ29yZSAhPSBudWxsKSB7Ci0JCSAgICAgICAgCQlpZiAobW9kdWxlQ29yZS5nZXRDb21wb25lbnQoKSAhPSBudWxsKSB7Ci0JCSAgICAgICAgCQkJbW9kdWxlQ29yZS5nZXRDb21wb25lbnQoKS5nZXRQcm9wZXJ0aWVzKCkuYWRkKHByb3ApOwotCQkgICAgICAgIAkJCVN5c3RlbS5vdXQucHJpbnRsbihwcm9wLmdldE5hbWUoKSk7Ci0JCSAgICAgICAgCQkJbW9kdWxlQ29yZS5zYXZlSWZOZWNlc3NhcnkobnVsbCk7Ci0JCSAgICAgICAgCQl9Ci0JCSAgICAgICAgCX0KLQkJICAgICAgICAgIH0KLQkJICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLQkJICAgICAgICAgIHsKLQkJICAgICAgICAJICBlLnByaW50U3RhY2tUcmFjZSgpOwotCQkgICAgICAgIAkgIHJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJICAgICAgICAgIH0KLQkJICAgICAgICAgIGZpbmFsbHkgewotCQkgICAgICAgIAkgIGlmIChtb2R1bGVDb3JlICE9IG51bGwpCi0JCSAgICAgICAgCQkgIG1vZHVsZUNvcmUuZGlzcG9zZSgpOwotCQkgICAgICAgICAgfQotCQkgICAgICAgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCSAgICAgICAgfQotCQkgICAgICAgIHB1YmxpYyBib29sZWFuIGJlbG9uZ3NUbyhPYmplY3QgZmFtaWx5KSB7Ci0JCQkJCXJldHVybiBFRElUTU9ERUxfU1RSRVNTLmVxdWFscyhmYW1pbHkpOwotCQkJCX0KLQkJICAgICAgfTsKLQkJCXRlc3RKb2JzW2ldID0gam9iOwkKLQkJCX0KLQkJZm9yIChpbnQgaiA9IDA7IGogPCB0ZXN0Sm9icy5sZW5ndGg7IGorKykgewotCQkJSm9iIGpvYiA9IHRlc3RKb2JzW2pdOwotCQkJam9iLnNjaGVkdWxlKCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCVBsYXRmb3JtLmdldEpvYk1hbmFnZXIoKS5qb2luKEVESVRNT0RFTF9TVFJFU1MsbnVsbCk7Ci0JCX0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJCi0JfQotcHVibGljIHZvaWQgdGVzdE11bHRpVGhyZWFkQ29tcG9uZW50QWNjZXNzKCkgewotCQkKLQkJSm9iW10gdGVzdEpvYnMgPSBuZXcgSm9iWzUwXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0Sm9icy5sZW5ndGg7IGkrKykgewotCQkJSm9iIGpvYiA9IG5ldyBKb2IoIkpvYiAiICsgaSkKLQkJICAgICAgewotCQkgICAgICAgIAotCQkgICAgICAgIHByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCSAgICAgICAgewotCQkgICAgICAgIElWaXJ0dWFsQ29tcG9uZW50IGNvbXAgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KTsKLQkJICAgICAgICBJUGF0aCBhUGF0aCA9IGNvbXAuZ2V0Um9vdEZvbGRlcigpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKTsKLQkJICAgICAgICBhc3NlcnRFcXVhbHMoYVBhdGgsbmV3IFBhdGgoIi9XZWJNb2R1bGUxL1dlYkNvbnRlbnQiKSk7Ci0JCSAgICAgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCSAgICAgICAgfQotCQkgICAgICAgIHB1YmxpYyBib29sZWFuIGJlbG9uZ3NUbyhPYmplY3QgZmFtaWx5KSB7Ci0JCQkJCXJldHVybiBFRElUTU9ERUxfU1RSRVNTLmVxdWFscyhmYW1pbHkpOwotCQkJCX0KLQkJICAgICAgfTsKLQkJCXRlc3RKb2JzW2ldID0gam9iOwkKLQkJCX0KLQkJZm9yIChpbnQgaiA9IDA7IGogPCB0ZXN0Sm9icy5sZW5ndGg7IGorKykgewotCQkJSm9iIGpvYiA9IHRlc3RKb2JzW2pdOwotCQkJam9iLnNjaGVkdWxlKCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCVBsYXRmb3JtLmdldEpvYk1hbmFnZXIoKS5qb2luKEVESVRNT0RFTF9TVFJFU1MsbnVsbCk7Ci0JCX0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS90ZXN0cy9UZXN0V29ya3NwYWNlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3Rlc3RzL1Rlc3RXb3Jrc3BhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y5MzZlOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3Rlc3RzL1Rlc3RXb3Jrc3BhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmNvbXBvbmVudGNvcmUudGVzdHM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ldG9vbHMuY29tbW9uLnRlc3QuYXBpdG9vbHMuUHJvamVjdFVuemlwVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLkNvbW1vblRlc3RzUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgVGVzdFdvcmtzcGFjZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX05BTUUgPSAiV2ViTW9kdWxlMSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfTU9EVUxFXzFfTkFNRSA9ICJXZWJNb2R1bGUxIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9NT0RVTEVfMl9OQU1FID0gIldlYk1vZHVsZTIiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX1dFQl9NT0RVTEVfTkFNRSA9ICJOZXdXZWJNb2R1bGUiOyAvLyROT04tTkxTLTEkCi0JCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBX0lORiA9ICJNRVRBLUlORiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfSU5GID0gIldFQi1JTkYiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgUGF0aCB6aXBGaWxlUGF0aCA9IG5ldyBQYXRoKCJ0ZXN0RGF0YS9UZXN0VmlydHVhbEFQSS56aXAiKTsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElQcm9qZWN0IFRFU1RfUFJPSkVDVCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChUZXN0V29ya3NwYWNlLlBST0pFQ1RfTkFNRSk7Ci0JICAJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBNT0RVTEVfTkFNRVMgPSBuZXcgU3RyaW5nW117V0VCX01PRFVMRV8xX05BTUUsIFdFQl9NT0RVTEVfMl9OQU1FfTsgIAotCQotCQotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgZ2V0VGFyZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChQUk9KRUNUX05BTUUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbml0KCkgewotCQkKLQkJdHJ5IHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBnZXRUYXJnZXRQcm9qZWN0KCk7Ci0JCQlpZiAoIXByb2plY3QuZXhpc3RzKCkpCi0JCQkJY3JlYXRlUHJvamVjdCgpOwotCQkJcHJvamVjdC5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBudWxsKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7IAotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY3JlYXRlUHJvamVjdCgpIHsKLQkJSVBhdGggbG9jYWxaaXBQYXRoID0gZ2V0TG9jYWxQYXRoKCk7Ci0JCVByb2plY3RVbnppcFV0aWwgdXRpbCA9IG5ldyBQcm9qZWN0VW56aXBVdGlsKGxvY2FsWmlwUGF0aCwgbmV3IFN0cmluZ1tde1BST0pFQ1RfTkFNRX0pOwotCQlyZXR1cm4gdXRpbC5jcmVhdGVQcm9qZWN0cygpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIElQYXRoIGdldExvY2FsUGF0aCgpIHsKLQkJVVJMIHVybCA9IENvbW1vblRlc3RzUGx1Z2luLmluc3RhbmNlLmZpbmQoemlwRmlsZVBhdGgpOwotCQl0cnkgewotCQkJdXJsID0gUGxhdGZvcm0uYXNMb2NhbFVSTCh1cmwpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBuZXcgUGF0aCh1cmwuZ2V0UGF0aCgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdmlydHVhbHBhdGgvdGVzdHMvRGVmZWN0VmVyaWZpY2F0aW9uVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdmlydHVhbHBhdGgvdGVzdHMvRGVmZWN0VmVyaWZpY2F0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM3YjNlYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3ZpcnR1YWxwYXRoL3Rlc3RzL0RlZmVjdFZlcmlmaWNhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5jb21wb25lbnRjb3JlLnZpcnR1YWxwYXRoLnRlc3RzOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuQ29tbW9uVGVzdHNQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBEZWZlY3RWZXJpZmljYXRpb25UZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQkKLQotCXByaXZhdGUgc3RhdGljIFBhdGggemlwRmlsZVBhdGggPSBuZXcgUGF0aCgidGVzdERhdGEvRGVmZWN0VmVyaWZpY2F0aW9uVGVzdHMuemlwIik7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotLy8JCUlQYXRoIGxvY2FsWmlwUGF0aCA9IGdldExvY2FsUGF0aCgpOwotLy8JCVByb2plY3RVbnppcFV0aWwgdXRpbCA9IG5ldyBQcm9qZWN0VW56aXBVdGlsKGxvY2FsWmlwUGF0aCwgbmV3IFN0cmluZ1tdeyJEZWZlY3RWZXJpZmljYXRpb25Qcm9qZWN0In0pOwotLy8JCXV0aWwuY3JlYXRlUHJvamVjdHMoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdDk2ODYyKCkgeyAKLQkJCi0JCUlQYXRoIGZpbGVQYXRoID0gbmV3IFBhdGgoIi9XRUItSU5GL3dlYi54bWwiKTsKLQkJSVBhdGggZm9sZGVyUGF0aCA9IG5ldyBQYXRoKCIvV0VCLUlORiIpOwotCQkKLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoZ2V0UHJvamVjdCgpLCAiRGVmZWN0VmVyaWZpY2F0aW9uUHJvamVjdCIpOwotCQkKLQkJSVZpcnR1YWxGb2xkZXIgcm9vdEZvbGRlciA9IGNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCk7Ci0JCUlWaXJ0dWFsUmVzb3VyY2UgZmlsZVJlc291cmNlID0gcm9vdEZvbGRlci5maW5kTWVtYmVyKGZpbGVQYXRoKTsJCQotCQlhc3NlcnRFcXVhbHMoIlRoZSByZXR1cm5lZCB0eXBlIHNob3VsZCBiZSBhIGZpbGUuIiwgSVZpcnR1YWxSZXNvdXJjZS5GSUxFLCBmaWxlUmVzb3VyY2UuZ2V0VHlwZSgpKTsKLQotCQlJVmlydHVhbFJlc291cmNlIGZvbGRlclJlc291cmNlID0gcm9vdEZvbGRlci5maW5kTWVtYmVyKGZvbGRlclBhdGgpOwkJCi0JCWFzc2VydEVxdWFscygiVGhlIHJldHVybmVkIHR5cGUgc2hvdWxkIGJlIGEgZm9sZGVyLiIsIElWaXJ0dWFsUmVzb3VyY2UuRk9MREVSLCBmb2xkZXJSZXNvdXJjZS5nZXRUeXBlKCkpOwotCi0JfQotCi0JcHJpdmF0ZSBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KCJEZWZlY3RWZXJpZmljYXRpb25Qcm9qZWN0Iik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0JCi0KLQlwcml2YXRlIHN0YXRpYyBJUGF0aCBnZXRMb2NhbFBhdGgoKSB7Ci0JCVVSTCB1cmwgPSBDb21tb25UZXN0c1BsdWdpbi5pbnN0YW5jZS5maW5kKHppcEZpbGVQYXRoKTsKLQkJdHJ5IHsKLQkJCXVybCA9IFBsYXRmb3JtLmFzTG9jYWxVUkwodXJsKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gbmV3IFBhdGgodXJsLmdldFBhdGgoKSk7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdmlydHVhbHBhdGgvdGVzdHMvSVZpcnR1YWxDb21wb25lbnRBUElUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3ZpcnR1YWxwYXRoL3Rlc3RzL0lWaXJ0dWFsQ29tcG9uZW50QVBJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTY5ODQyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdmlydHVhbHBhdGgvdGVzdHMvSVZpcnR1YWxDb21wb25lbnRBUElUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuY29tcG9uZW50Y29yZS52aXJ0dWFscGF0aC50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5SZWZlcmVuY2VkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuTW9kdWxlVVJJVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVzb3VyY2U7Ci0KLXB1YmxpYyBjbGFzcyBJVmlydHVhbENvbXBvbmVudEFQSVRlc3QgZXh0ZW5kcyBJVmlydHVhbENvbnRhaW5lckFQSVRlc3QgewotCi0JcHJpdmF0ZSBJVmlydHVhbENvbXBvbmVudCB2aXJ0dWFsQ29tcG9uZW50OwotCXByaXZhdGUgV29ya2JlbmNoQ29tcG9uZW50IHdvcmtiZW5jaENvbXBvbmVudDsKLQlwcml2YXRlIFN0cnVjdHVyZUVkaXQgc3RydWN0dXJlRWRpdDsKLQkKLQlwdWJsaWMgSVZpcnR1YWxDb21wb25lbnRBUElUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOyAKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBUZXN0U3VpdGUgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgSVZpcnR1YWxDb21wb25lbnRBUElUZXN0KCJ0ZXN0R2V0UmVmZXJlbmNlcyIpKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBkb1NldHVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IAotCQl2aXJ0dWFsQ29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoVGVzdFdvcmtzcGFjZS5URVNUX1BST0pFQ1QsIFRlc3RXb3Jrc3BhY2UuV0VCX01PRFVMRV8xX05BTUUpOwotCQlzdHJ1Y3R1cmVFZGl0ID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yUmVhZChUZXN0V29ya3NwYWNlLlRFU1RfUFJPSkVDVCk7Ci0JCXdvcmtiZW5jaENvbXBvbmVudCA9IHN0cnVjdHVyZUVkaXQuZ2V0Q29tcG9uZW50KCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IAotCQlzdXBlci50ZWFyRG93bigpOwotCQlpZihzdHJ1Y3R1cmVFZGl0ICE9IG51bGwpCi0JCQlzdHJ1Y3R1cmVFZGl0LmRpc3Bvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHsKLQkJCi0JCVN0cmluZyBuYW1lID0gdmlydHVhbENvbXBvbmVudC5nZXROYW1lKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE1ldGFQcm9wZXJ0aWVzKCkgewotCQlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSB2aXJ0dWFsQ29tcG9uZW50LmdldE1ldGFQcm9wZXJ0aWVzKCkgOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRNZXRhUmVzb3VyY2VzKCkgewotCQlJUGF0aFtdIG1ldGFyZXNvdXJjZXMgPSB2aXJ0dWFsQ29tcG9uZW50LmdldE1ldGFSZXNvdXJjZXMoKSA7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TWV0YVJlc291cmNlcygpIHsKLQkJCi0JCUlQYXRoW10gbWV0YXJlc291cmNlcyA9IG5ldyBJUGF0aFsxXTsKLQkJbWV0YXJlc291cmNlc1swXSA9IG5ldyBQYXRoKCIvdGVzdCIpOwotCQl2aXJ0dWFsQ29tcG9uZW50LnNldE1ldGFSZXNvdXJjZXMobWV0YXJlc291cmNlcykgOwotCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRSZXNvdXJjZXMoKSB7Ci0JCVN0cmluZyByZXNvdXJjZSA9ICIvdGVzdCI7Ci0JCUlWaXJ0dWFsRm9sZGVyIHJvb3RGb2xkZXIgPSB2aXJ0dWFsQ29tcG9uZW50LmdldFJvb3RGb2xkZXIoKTsKLQkJSVZpcnR1YWxSZXNvdXJjZVtdIHZpcnR1YWxSZXNvdXJjZSA9IHJvb3RGb2xkZXIuZ2V0UmVzb3VyY2VzKHJlc291cmNlKSA7Ci0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFJlZmVyZW5jZXMoKSB7Ci0JCUlWaXJ0dWFsUmVmZXJlbmNlW10gcmVmZXJlbmNlcyA9IHZpcnR1YWxDb21wb25lbnQuZ2V0UmVmZXJlbmNlcygpOwotCQkKLQkJZm9yKGludCBpPTA7IGk8cmVmZXJlbmNlcy5sZW5ndGg7aSsrKQotCQkJYXNzZXJ0UmVmZXJlbmNlKHJlZmVyZW5jZXNbaV0pOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYXNzZXJ0UmVmZXJlbmNlKElWaXJ0dWFsUmVmZXJlbmNlIHJlZmVyZW5jZSkgeyAKLQkJTGlzdCByZWZlcmVuY2VkQ29tcG9uZW50cyA9IHdvcmtiZW5jaENvbXBvbmVudC5nZXRSZWZlcmVuY2VkQ29tcG9uZW50cygpOwotCQlSZWZlcmVuY2VkQ29tcG9uZW50IHJlZmVyZW5jZWRDb21wb25lbnQgPSBudWxsOwotCQlTdHJpbmcgY29tcG9uZW50TmFtZSA9IG51bGw7Ci0JCWZvcihpbnQgaT0wOyBpPHJlZmVyZW5jZWRDb21wb25lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQlyZWZlcmVuY2VkQ29tcG9uZW50ID0gKFJlZmVyZW5jZWRDb21wb25lbnQpIHJlZmVyZW5jZWRDb21wb25lbnRzLmdldChpKTsKLQkJCXRyeSB7Ci0JCQkJY29tcG9uZW50TmFtZSA9IE1vZHVsZVVSSVV0aWwuZ2V0RGVwbG95ZWROYW1lKHJlZmVyZW5jZWRDb21wb25lbnQuZ2V0SGFuZGxlKCkpOwotCQkJfSBjYXRjaCAoVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbiBlKSB7ICAKLQkJCX0KLQkJCWlmKGNvbXBvbmVudE5hbWUgIT0gbnVsbCAmJiBjb21wb25lbnROYW1lLmVxdWFscyhyZWZlcmVuY2UuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpLmdldE5hbWUoKSkpIHsJCQkJCQotCQkJCWFzc2VydEVxdWFscygiVGhlIHJ1bnRpbWUgcGF0aHMgbXVzdCBtYXRjaC4iLCByZWZlcmVuY2VkQ29tcG9uZW50LmdldFJ1bnRpbWVQYXRoKCksIHJlZmVyZW5jZS5nZXRSdW50aW1lUGF0aCgpKTsKLQkJCQlhc3NlcnRFcXVhbHMoIlRoZSB3b3JrYmVuY2ggY29tcG9uZW50IHNob3VsZCBtYXRjaCB0aGUgZW5jbG9zaW5nIGNvbXBvbmVudC4iLCB2aXJ0dWFsQ29tcG9uZW50LCByZWZlcmVuY2UuZ2V0RW5jbG9zaW5nQ29tcG9uZW50KCkpOwotCQkJCWFzc2VydEVxdWFscygiVGhlIGRlcGVuZGVuY3lUeXBlcyBzaG91bGQgbWF0Y2guIiwgcmVmZXJlbmNlZENvbXBvbmVudC5nZXREZXBlbmRlbmN5VHlwZSgpLmdldFZhbHVlKCksIHJlZmVyZW5jZS5nZXREZXBlbmRlbmN5VHlwZSgpKTsKLQkJCQlVUkkgYWN0dWFsSGFuZGxlID0gTW9kdWxlVVJJVXRpbC5mdWxseVF1YWxpZnlVUkkocmVmZXJlbmNlLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKS5nZXRQcm9qZWN0KCkpOwotCQkJCWFzc2VydEVxdWFscygiVGhlIGhhbmRsZXMgc2hvdWxkIG1hdGNoLiIsIHJlZmVyZW5jZWRDb21wb25lbnQuZ2V0SGFuZGxlKCksIGFjdHVhbEhhbmRsZSk7IAotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlmYWlsKCJBIG1hdGNoaW5nIHJlZmVyZW5jZSB3YXMgbm90IGZvdW5kIGZvciAiK3JlZmVyZW5jZS5nZXRSdW50aW1lUGF0aCgpKTsgCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFJlZmVyZW5jZXMoKSB7Ci0JCQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS92aXJ0dWFscGF0aC90ZXN0cy9JVmlydHVhbENvbnRhaW5lckFQSVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdmlydHVhbHBhdGgvdGVzdHMvSVZpcnR1YWxDb250YWluZXJBUElUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1YzI5NDYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS92aXJ0dWFscGF0aC90ZXN0cy9JVmlydHVhbENvbnRhaW5lckFQSVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5jb21wb25lbnRjb3JlLnZpcnR1YWxwYXRoLnRlc3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZXNvdXJjZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIElWaXJ0dWFsQ29udGFpbmVyQVBJVGVzdCBleHRlbmRzIElWaXJ0dWFsUmVzb3VyY2VBUElUZXN0IHsJCi0KLQlwcm90ZWN0ZWQgSVZpcnR1YWxDb250YWluZXIgdGFyZ2V0VmlydHVhbENvbnRhaW5lcjsKLQlwcm90ZWN0ZWQgSUNvbnRhaW5lciB0YXJnZXRQbGF0Zm9ybUNvbnRhaW5lcjsKLQlwcm90ZWN0ZWQgSVBhdGggZXhwZWN0ZWRQbGF0Zm9ybUNvbnRhaW5lclBhdGg7Ci0JCi0JLyoKLQkgKiAgVGhlIGZvbGxvd2luZyBmaWVsZHMgYXNzdW1lIGEgbWluaW11bSBzdHJ1Y3R1cmUgb2Y6Ci0JICogIAotCSAqICAgLwkJCQkJCVtSb290XQotCSAqICAgCS9qc3BzCQkJCVtGb2xkZXJdCi0JICogICAJCS9UZXN0SnNwMy5qc3AJW0ZpbGVdCi0JICogICAJL1dFQi1JTkYJCQlbRm9sZGVyXQotCSAqICAgCQkvbGliCQkJW0ZvbGRlcl0KLQkgKiAgIC9UZXN0RmlsZTEudHh0CQkJW0ZpbGVdCi0JICogCi0JICovCi0JCi0JCi0JcHJvdGVjdGVkIElQYXRoIGV4cGVjdGVkRmlsZVNpbmdsZURlcHRoUGF0aCA9IG5ldyBQYXRoKCIvanNwcy9UZXN0SnNwMy5qc3AiKTsKLQlwcm90ZWN0ZWQgSVBhdGggZXhwZWN0ZWRGb2xkZXJTaW5nbGVEZXB0aFBhdGggPSBuZXcgUGF0aCgiV0VCLUlORi9saWIiKTsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGV4cGVjdGVkRm9sZGVyTmFtZSA9ICJqc3BzIjsKLQlwcm90ZWN0ZWQgSVBhdGggZXhwZWN0ZWRGb2xkZXJaZXJvdGhEZXB0aFBhdGggPSBuZXcgUGF0aChleHBlY3RlZEZvbGRlck5hbWUpOwotCQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGV4cGVjdGVkRmlsZU5hbWUgPSAiVGVzdEZpbGUxLnR4dCI7Ci0JcHJvdGVjdGVkIElQYXRoIGV4cGVjdGVkRmlsZVplcm90aERlcHRoUGF0aCA9IG5ldyBQYXRoKGV4cGVjdGVkRmlsZU5hbWUpOwotCQotCXB1YmxpYyBJVmlydHVhbENvbnRhaW5lckFQSVRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQkKLQkKLQotCXByb3RlY3RlZCB2b2lkIGFzc2VydFJlcXVpcmVtZW50cygpIHsKLQkJc3VwZXIuYXNzZXJ0UmVxdWlyZW1lbnRzKCk7Ci0vLwkJYXNzZXJ0Tm90TnVsbCgiVGhlIHRhcmdldCB2aXJ0dWFsIGNvbnRhaW5lciBtdXN0IGJlIHNwZWNpZmllZC4iLCB0YXJnZXRWaXJ0dWFsQ29udGFpbmVyKTsKLS8vCQlhc3NlcnROb3ROdWxsKCJUaGUgdGFyZ2V0IHBsYXRmb3JtIGNvbnRhaW5lciBtdXN0IGJlIHNwZWNpZmllZC4iLCB0YXJnZXRQbGF0Zm9ybUNvbnRhaW5lcik7Ci0vLwkJYXNzZXJ0Tm90TnVsbCgiVGhlIGV4cGVjdGVkIHBsYXRmb3JtIGNvbnRhaW5lciBwYXRoIG11c3QgYmUgc3BlY2lmaWVkLiIsIGV4cGVjdGVkUGxhdGZvcm1Db250YWluZXJQYXRoKTsKLQl9Ci0JCi0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RmlsZVN0cmluZygpIHsKLQkJSVZpcnR1YWxGaWxlIHRlc3RGaWxlMXR4dCA9IHRhcmdldFZpcnR1YWxDb250YWluZXIuZ2V0RmlsZShleHBlY3RlZEZpbGVOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIlRoZSB0ZXN0IGZpbGUgcHJvamVjdCByZWxhdGl2ZSBwYXRoIG11c3QgbWF0Y2guIiwgZXhwZWN0ZWRQbGF0Zm9ybUNvbnRhaW5lclBhdGguYXBwZW5kKGV4cGVjdGVkRmlsZU5hbWUpLCB0ZXN0RmlsZTF0eHQuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RmlsZVBhdGgoKSB7Ci0JCUlWaXJ0dWFsRmlsZSB0ZXN0M2pzcCA9IHRhcmdldFZpcnR1YWxDb250YWluZXIuZ2V0RmlsZShleHBlY3RlZEZpbGVTaW5nbGVEZXB0aFBhdGgpOwkJCi0JCUlQYXRoIGV4cGVjdGVkUGF0aCA9IGV4cGVjdGVkUGxhdGZvcm1Db250YWluZXJQYXRoLmFwcGVuZChleHBlY3RlZEZpbGVTaW5nbGVEZXB0aFBhdGgpOwotCQlhc3NlcnRFcXVhbHMoIlRoZSB0ZXN0IGZpbGUgcHJvamVjdCByZWxhdGl2ZSBwYXRoIG11c3QgbWF0Y2guIiwgZXhwZWN0ZWRQYXRoLCB0ZXN0M2pzcC5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkpOyAvLyROT04tTkxTLTEkCi0JfSAKLQkgCi0JLyoKLQkgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBJVmlydHVhbEZvbGRlciBnZXRGb2xkZXIoU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RHZXRGb2xkZXJTdHJpbmcoKSB7Ci0JCUlWaXJ0dWFsRm9sZGVyIGpzcHNGb2xkZXIgPSB0YXJnZXRWaXJ0dWFsQ29udGFpbmVyLmdldEZvbGRlcihleHBlY3RlZEZvbGRlck5hbWUpOwotCQlhc3NlcnROb3ROdWxsKCJUaGUgZm9sZGVyIHNob3VsZCBub3QgYmUgbnVsbC4iLCBqc3BzRm9sZGVyKTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgbmFtZSBvZiB0aGUgZm9sZGVyIHJldHVybmVkIHNob3VsZWQgbWF0Y2ggdGhlIGV4cGVjdGVkIGZvbGRlci4iLCBleHBlY3RlZEZvbGRlck5hbWUsIGpzcHNGb2xkZXIuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKgotCSAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIElWaXJ0dWFsRm9sZGVyIGdldEZvbGRlcihJUGF0aCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Rm9sZGVySVBhdGgoKSB7IAotCQlJVmlydHVhbEZvbGRlciB0ZXN0R2V0Rm9sZGVyID0gdGFyZ2V0VmlydHVhbENvbnRhaW5lci5nZXRGb2xkZXIoZXhwZWN0ZWRGb2xkZXJaZXJvdGhEZXB0aFBhdGgpOwotCQlhc3NlcnROb3ROdWxsKCJUaGUgZm9sZGVyIHNob3VsZCBub3QgYmUgbnVsbC4iLCB0ZXN0R2V0Rm9sZGVyKTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgbmFtZSBvZiB0aGUgZm9sZGVyIHJldHVybmVkIHNob3VsZWQgbWF0Y2ggdGhlIGV4cGVjdGVkIGZvbGRlci4iLCBleHBlY3RlZEZvbGRlclplcm90aERlcHRoUGF0aCwgdGVzdEdldEZvbGRlci5nZXRSdW50aW1lUGF0aCgpKTsJCQotCX0KLSAKLQkvKgotCSAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIGJvb2xlYW4gZXhpc3RzKElQYXRoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RFeGlzdHNJUGF0aCgpIHsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIGV4cGVjdGVkIGZpbGUgcGF0aCBzaG91bGQgYmUgZm91bmQgdG8gZXhpc3QuIiwgdGFyZ2V0VmlydHVhbENvbnRhaW5lci5leGlzdHMoZXhwZWN0ZWRGaWxlU2luZ2xlRGVwdGhQYXRoKSk7CQkKLQl9Ci0KLQkvKgotCSAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIElWaXJ0dWFsUmVzb3VyY2UgZmluZE1lbWJlcihTdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEZpbmRNZW1iZXJTdHJpbmcoKSB7Ci0JCUlWaXJ0dWFsUmVzb3VyY2UgZm91bmRSZXNvdXJjZSA9IHRhcmdldFZpcnR1YWxDb250YWluZXIuZmluZE1lbWJlcihleHBlY3RlZEZvbGRlck5hbWUpOwotCQlhc3NlcnRFcXVhbHMoIlRoZSB0eXBlIGZvdW5kIGZvciB0aGUgZXhwZWN0ZWQgZm9sZGVyIG5hbWUgc2hvdWxkIGJlIElWaXJ0dWFsUmVzb3VyY2UuRk9MREVSLiIsIElWaXJ0dWFsUmVzb3VyY2UuRk9MREVSLCBmb3VuZFJlc291cmNlLmdldFR5cGUoKSk7Ci0JCUlWaXJ0dWFsRm9sZGVyIGZvdW5kRm9sZGVyID0gKElWaXJ0dWFsRm9sZGVyKSBmb3VuZFJlc291cmNlOwotCQlhc3NlcnRFcXVhbHMoIlRoZSBuYW1lIHNob3VsZCBiZSBjb3JyZWN0LiIsIGV4cGVjdGVkRm9sZGVyTmFtZSwgZm91bmRSZXNvdXJjZS5nZXROYW1lKCkpOwotCQkKLQotCQlmb3VuZFJlc291cmNlID0gdGFyZ2V0VmlydHVhbENvbnRhaW5lci5maW5kTWVtYmVyKGV4cGVjdGVkRmlsZU5hbWUpOwotCQlhc3NlcnRFcXVhbHMoIlRoZSB0eXBlIGZvdW5kIGZvciB0aGUgZXhwZWN0ZWQgZm9sZGVyIG5hbWUgc2hvdWxkIGJlIElWaXJ0dWFsUmVzb3VyY2UuRklMRS4iLCBJVmlydHVhbFJlc291cmNlLkZJTEUsIGZvdW5kUmVzb3VyY2UuZ2V0VHlwZSgpKTsKLQkJSVZpcnR1YWxGaWxlIGZvdW5kRmlsZSA9IChJVmlydHVhbEZpbGUpIGZvdW5kUmVzb3VyY2U7Ci0JCWFzc2VydEVxdWFscygiVGhlIG5hbWUgc2hvdWxkIGJlIGNvcnJlY3QuIiwgZXhwZWN0ZWRGaWxlTmFtZSwgZm91bmRSZXNvdXJjZS5nZXROYW1lKCkpOwotCX0KLQotCS8qCi0JICogQ2xhc3MgdW5kZXIgdGVzdCBmb3IgSVZpcnR1YWxSZXNvdXJjZSBmaW5kTWVtYmVyKFN0cmluZywgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RGaW5kTWVtYmVyU3RyaW5naW50KCkgewotCi0JCUlWaXJ0dWFsUmVzb3VyY2UgZm91bmRSZXNvdXJjZSA9IHRhcmdldFZpcnR1YWxDb250YWluZXIuZmluZE1lbWJlcihleHBlY3RlZEZvbGRlck5hbWUsIElWaXJ0dWFsUmVzb3VyY2UuTk9ORSk7Ci0JCWFzc2VydEVxdWFscygiVGhlIHR5cGUgZm91bmQgZm9yIHRoZSBleHBlY3RlZCBmb2xkZXIgbmFtZSBzaG91bGQgYmUgSVZpcnR1YWxSZXNvdXJjZS5GT0xERVIuIiwgSVZpcnR1YWxSZXNvdXJjZS5GT0xERVIsIGZvdW5kUmVzb3VyY2UuZ2V0VHlwZSgpKTsKLQkJSVZpcnR1YWxGb2xkZXIgZm91bmRGb2xkZXIgPSAoSVZpcnR1YWxGb2xkZXIpIGZvdW5kUmVzb3VyY2U7Ci0JCWFzc2VydEVxdWFscygiVGhlIG5hbWUgc2hvdWxkIGJlIGNvcnJlY3QuIiwgZXhwZWN0ZWRGb2xkZXJOYW1lLCBmb3VuZFJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQotCi0JCWZvdW5kUmVzb3VyY2UgPSB0YXJnZXRWaXJ0dWFsQ29udGFpbmVyLmZpbmRNZW1iZXIoZXhwZWN0ZWRGb2xkZXJOYW1lLCBJVmlydHVhbFJlc291cmNlLk5PTkUpOwotCQlhc3NlcnRFcXVhbHMoIlRoZSB0eXBlIGZvdW5kIGZvciB0aGUgZXhwZWN0ZWQgZm9sZGVyIG5hbWUgc2hvdWxkIGJlIElWaXJ0dWFsUmVzb3VyY2UuRklMRS4iLCBJVmlydHVhbFJlc291cmNlLkZJTEUsIGZvdW5kUmVzb3VyY2UuZ2V0VHlwZSgpKTsKLQkJSVZpcnR1YWxGaWxlIGZvdW5kRmlsZSA9IChJVmlydHVhbEZpbGUpIGZvdW5kUmVzb3VyY2U7Ci0JCWFzc2VydEVxdWFscygiVGhlIG5hbWUgc2hvdWxkIGJlIGNvcnJlY3QuIiwgZXhwZWN0ZWRGaWxlTmFtZSwgZm91bmRSZXNvdXJjZS5nZXROYW1lKCkpOyAKLQl9Ci0KLQkvKgotCSAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIElWaXJ0dWFsUmVzb3VyY2UgZmluZE1lbWJlcihJUGF0aCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0RmluZE1lbWJlcklQYXRoKCkgewotCi0JCUlWaXJ0dWFsUmVzb3VyY2UgZm91bmRSZXNvdXJjZSA9IHRhcmdldFZpcnR1YWxDb250YWluZXIuZmluZE1lbWJlcihleHBlY3RlZEZvbGRlclNpbmdsZURlcHRoUGF0aCk7Ci0JCWFzc2VydEVxdWFscygiVGhlIHR5cGUgZm91bmQgZm9yIHRoZSBleHBlY3RlZCBmb2xkZXIgbmFtZSBzaG91bGQgYmUgSVZpcnR1YWxSZXNvdXJjZS5GT0xERVIuIiwgSVZpcnR1YWxSZXNvdXJjZS5GT0xERVIsIGZvdW5kUmVzb3VyY2UuZ2V0VHlwZSgpKTsKLQkJSVZpcnR1YWxGb2xkZXIgZm91bmRGb2xkZXIgPSAoSVZpcnR1YWxGb2xkZXIpIGZvdW5kUmVzb3VyY2U7Ci0JCWFzc2VydEVxdWFscygiVGhlIG5hbWUgc2hvdWxkIGJlIGNvcnJlY3QuIiwgZXhwZWN0ZWRGb2xkZXJTaW5nbGVEZXB0aFBhdGgubGFzdFNlZ21lbnQoKSwgZm91bmRSZXNvdXJjZS5nZXROYW1lKCkpOwotCQkKLQotCQlmb3VuZFJlc291cmNlID0gdGFyZ2V0VmlydHVhbENvbnRhaW5lci5maW5kTWVtYmVyKGV4cGVjdGVkRmlsZVNpbmdsZURlcHRoUGF0aCk7Ci0JCWFzc2VydEVxdWFscygiVGhlIHR5cGUgZm91bmQgZm9yIHRoZSBleHBlY3RlZCBmb2xkZXIgbmFtZSBzaG91bGQgYmUgSVZpcnR1YWxSZXNvdXJjZS5GSUxFLiIsIElWaXJ0dWFsUmVzb3VyY2UuRklMRSwgZm91bmRSZXNvdXJjZS5nZXRUeXBlKCkpOwotCQlJVmlydHVhbEZpbGUgZm91bmRGaWxlID0gKElWaXJ0dWFsRmlsZSkgZm91bmRSZXNvdXJjZTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgbmFtZSBzaG91bGQgYmUgY29ycmVjdC4iLCBleHBlY3RlZEZpbGVTaW5nbGVEZXB0aFBhdGgubGFzdFNlZ21lbnQoKSwgZm91bmRSZXNvdXJjZS5nZXROYW1lKCkpOwotCX0KLQotCS8qCi0JICogQ2xhc3MgdW5kZXIgdGVzdCBmb3IgSVZpcnR1YWxSZXNvdXJjZSBmaW5kTWVtYmVyKElQYXRoLCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEZpbmRNZW1iZXJJUGF0aGludCgpIHsKLQkJSVZpcnR1YWxSZXNvdXJjZSBmb3VuZFJlc291cmNlID0gdGFyZ2V0VmlydHVhbENvbnRhaW5lci5maW5kTWVtYmVyKGV4cGVjdGVkRm9sZGVyU2luZ2xlRGVwdGhQYXRoLCBJVmlydHVhbFJlc291cmNlLk5PTkUpOwotCQlhc3NlcnRFcXVhbHMoIlRoZSB0eXBlIGZvdW5kIGZvciB0aGUgZXhwZWN0ZWQgZm9sZGVyIG5hbWUgc2hvdWxkIGJlIElWaXJ0dWFsUmVzb3VyY2UuRk9MREVSLiIsIElWaXJ0dWFsUmVzb3VyY2UuRk9MREVSLCBmb3VuZFJlc291cmNlLmdldFR5cGUoKSk7Ci0JCUlWaXJ0dWFsRm9sZGVyIGZvdW5kRm9sZGVyID0gKElWaXJ0dWFsRm9sZGVyKSBmb3VuZFJlc291cmNlOwotCQlhc3NlcnRFcXVhbHMoIlRoZSBuYW1lIHNob3VsZCBiZSBjb3JyZWN0LiIsIGV4cGVjdGVkRm9sZGVyU2luZ2xlRGVwdGhQYXRoLmxhc3RTZWdtZW50KCksIGZvdW5kUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCi0KLQkJZm91bmRSZXNvdXJjZSA9IHRhcmdldFZpcnR1YWxDb250YWluZXIuZmluZE1lbWJlcihleHBlY3RlZEZpbGVTaW5nbGVEZXB0aFBhdGgsIElWaXJ0dWFsUmVzb3VyY2UuTk9ORSk7Ci0JCWFzc2VydEVxdWFscygiVGhlIHR5cGUgZm91bmQgZm9yIHRoZSBleHBlY3RlZCBmb2xkZXIgbmFtZSBzaG91bGQgYmUgSVZpcnR1YWxSZXNvdXJjZS5GSUxFLiIsIElWaXJ0dWFsUmVzb3VyY2UuRklMRSwgZm91bmRSZXNvdXJjZS5nZXRUeXBlKCkpOwotCQlJVmlydHVhbEZpbGUgZm91bmRGaWxlID0gKElWaXJ0dWFsRmlsZSkgZm91bmRSZXNvdXJjZTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgbmFtZSBzaG91bGQgYmUgY29ycmVjdC4iLCBleHBlY3RlZEZpbGVTaW5nbGVEZXB0aFBhdGgubGFzdFNlZ21lbnQoKSwgZm91bmRSZXNvdXJjZS5nZXROYW1lKCkpOwotCX0KLSAKLQotCS8qCi0JICogQ2xhc3MgdW5kZXIgdGVzdCBmb3IgSVZpcnR1YWxSZXNvdXJjZVtdIG1lbWJlcnMoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RNZW1iZXJzKCkgewotCX0KLQotCS8qCi0JICogQ2xhc3MgdW5kZXIgdGVzdCBmb3IgSVZpcnR1YWxSZXNvdXJjZVtdIG1lbWJlcnMoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RNZW1iZXJzaW50KCkgewotCX0KLSAKLQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGUoKSB7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3ZpcnR1YWxwYXRoL3Rlc3RzL0lWaXJ0dWFsRmlsZUFQSVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdmlydHVhbHBhdGgvdGVzdHMvSVZpcnR1YWxGaWxlQVBJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjM0NTI3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdmlydHVhbHBhdGgvdGVzdHMvSVZpcnR1YWxGaWxlQVBJVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuY29tcG9uZW50Y29yZS52aXJ0dWFscGF0aC50ZXN0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRmlsZTsKLQotcHVibGljIGNsYXNzIElWaXJ0dWFsRmlsZUFQSVRlc3QgZXh0ZW5kcyBJVmlydHVhbFJlc291cmNlQVBJVGVzdCB7Ci0JCi0JcHVibGljIElWaXJ0dWFsRmlsZUFQSVRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGRvU2V0dXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgCi0JCQotCQkKLQl9Ci0KLQkvKgotCSAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIHZvaWQgVmlydHVhbEZpbGUoSVByb2plY3QsIFN0cmluZywgSVBhdGgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxGaWxlSVByb2plY3RTdHJpbmdJUGF0aCgpIHsKLQkJCi0JfQotIAotCi0JcHVibGljIHZvaWQgdGVzdEdldFVuZGVybHlpbmdGaWxlKCkgeyAKLQotCQlJRmlsZSBwbGF0Zm9ybUZpbGVUb0NyZWF0ZSA9ICgoSVZpcnR1YWxGaWxlKXRhcmdldFZpcnR1YWxSZXNvdXJjZVRvQ3JlYXRlKS5nZXRVbmRlcmx5aW5nRmlsZSgpOyAKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHVuZGVyeWxpbmcgcmVzb3VyY2Ugc2hvdWxkIG5vdCBleGlzdC4iLCAhcGxhdGZvcm1GaWxlVG9DcmVhdGUuZXhpc3RzKCkgKTsgIAotCi0JCUlGaWxlIGV4aXN0aW5nUGxhdGZvcm1GaWxlID0gKChJVmlydHVhbEZpbGUpdGFyZ2V0RXhpc3RpbmdWaXJ0dWFsUmVzb3VyY2UpLmdldFVuZGVybHlpbmdGaWxlKCk7IAotCQlhc3NlcnRUcnVlKCJUaGUgdW5kZXJ5bGluZyByZXNvdXJjZSBzaG91bGQgbm90IGV4aXN0LiIsICFleGlzdGluZ1BsYXRmb3JtRmlsZS5leGlzdHMoKSApOwotCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFVuZGVybHlpbmdGaWxlcygpIHsgIAotCQkKLQkJSVJlc291cmNlW10gcGxhdGZvcm1GaWxlVG9DcmVhdGUgPSAoKElWaXJ0dWFsRmlsZSl0YXJnZXRWaXJ0dWFsUmVzb3VyY2VUb0NyZWF0ZSkuZ2V0VW5kZXJseWluZ0ZpbGVzKCk7Ci0JCWFzc2VydEVxdWFscygiVGhlcmUgc2hvdWxkIG9ubHkgYmUgb25lIHJlc291cmNlIGluIHRoZSByZXN1bHQgYXJyYXkuIiwgMSwgcGxhdGZvcm1GaWxlVG9DcmVhdGUubGVuZ3RoKTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgdHlwZSBvZiB0aGUgdW5kZXJseWluZyByZXNvdXJjZSBzaG91bGQgbWF0Y2ggSVJlc291cmNlLkZJTEUuIiwgSVJlc291cmNlLkZJTEUsIHBsYXRmb3JtRmlsZVRvQ3JlYXRlWzBdLmdldFR5cGUoKSk7Ci0JCWFzc2VydFRydWUoIlRoZSB1bmRlcnlsaW5nIHJlc291cmNlIHNob3VsZCBub3QgZXhpc3QuIiwgIXBsYXRmb3JtRmlsZVRvQ3JlYXRlWzBdLmV4aXN0cygpICk7IAotCi0KLQkJSVJlc291cmNlW10gZXhpc3RpbmdQbGF0Zm9ybUZpbGUgPSAoKElWaXJ0dWFsRmlsZSl0YXJnZXRFeGlzdGluZ1ZpcnR1YWxSZXNvdXJjZSkuZ2V0VW5kZXJseWluZ0ZpbGVzKCk7Ci0JCWFzc2VydEVxdWFscygiVGhlcmUgc2hvdWxkIG9ubHkgYmUgb25lIHJlc291cmNlIGluIHRoZSByZXN1bHQgYXJyYXkuIiwgMSwgZXhpc3RpbmdQbGF0Zm9ybUZpbGUubGVuZ3RoKTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgdHlwZSBvZiB0aGUgdW5kZXJseWluZyByZXNvdXJjZSBzaG91bGQgbWF0Y2ggSVJlc291cmNlLkZJTEUuIiwgSVJlc291cmNlLkZJTEUsIGV4aXN0aW5nUGxhdGZvcm1GaWxlWzBdLmdldFR5cGUoKSk7Ci0JCWFzc2VydFRydWUoIlRoZSB1bmRlcnlsaW5nIHJlc291cmNlIHNob3VsZCBub3QgZXhpc3QuIiwgIWV4aXN0aW5nUGxhdGZvcm1GaWxlWzBdLmV4aXN0cygpICk7ICAKLQotCQlJRmlsZSBtdWx0aVBsYXRmb3JtRmlsZSA9ICgoSVZpcnR1YWxGaWxlKXRhcmdldE11bHRpVmlydHVhbFJlc291cmNlKS5nZXRVbmRlcmx5aW5nRmlsZSgpOyAKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHVuZGVyeWxpbmcgcmVzb3VyY2Ugc2hvdWxkIG5vdCBleGlzdC4iLCAhbXVsdGlQbGF0Zm9ybUZpbGUuZXhpc3RzKCkgKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdmlydHVhbHBhdGgvdGVzdHMvSVZpcnR1YWxGb2xkZXJBUElUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3ZpcnR1YWxwYXRoL3Rlc3RzL0lWaXJ0dWFsRm9sZGVyQVBJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGZhYjcyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdmlydHVhbHBhdGgvdGVzdHMvSVZpcnR1YWxGb2xkZXJBUElUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5jb21wb25lbnRjb3JlLnZpcnR1YWxwYXRoLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZXNvdXJjZTsKLQotcHVibGljIGNsYXNzIElWaXJ0dWFsRm9sZGVyQVBJVGVzdCBleHRlbmRzIElWaXJ0dWFsQ29udGFpbmVyQVBJVGVzdCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0ZPTERFUl9OQU1FID0gIldFQi1JTkYiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJUGF0aCBXRUJDT05URU5UX0ZPTERFUl9SRUFMX1BBVEggPSBuZXcgUGF0aCgiL1dlYk1vZHVsZTEvV2ViQ29udGVudC8iKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVBhdGggV0VCSU5GX0ZPTERFUl9SRUFMX1BBVEggPSBXRUJDT05URU5UX0ZPTERFUl9SRUFMX1BBVEguYXBwZW5kKFRFU1RfRk9MREVSX05BTUUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElQYXRoIFdFQklORl9GT0xERVJfUlVOVElNRV9QQVRIID0gbmV3IFBhdGgoIi8iK1RFU1RfRk9MREVSX05BTUUpOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJUGF0aCBURVNUREFUQV9GT0xERVJfUkVBTF9QQVRIID0gbmV3IFBhdGgoIldlYk1vZHVsZTEvdGVzdGRhdGEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJUGF0aCBURVNUREFUQV9GT0xERVJfUlVOVElNRV9QQVRIID0gbmV3IFBhdGgoIi8iKTsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElQYXRoIERFTEVURU1FX1BBVEggPSBuZXcgUGF0aCgiL2RlbGV0ZW1lIik7IC8vJE5PTi1OTFMtMSQgCi0KLQlwdWJsaWMgSVZpcnR1YWxGb2xkZXJBUElUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0gCi0KLQlwcm90ZWN0ZWQgdm9pZCBkb1NldHVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IAotCQkKLQkJZXhwZWN0ZWRQbGF0Zm9ybUNvbnRhaW5lclBhdGggPSBURVNUREFUQV9GT0xERVJfUkVBTF9QQVRIOwotCQkKLQkJZXhwZWN0ZWRSdW50aW1lUGF0aCA9IFdFQklORl9GT0xERVJfUlVOVElNRV9QQVRIOwotCQlleHBlY3RlZE5hbWUgPSBURVNUX0ZPTERFUl9OQU1FOwotCQlleHBlY3RlZFByb2plY3QgPSBUZXN0V29ya3NwYWNlLlRFU1RfUFJPSkVDVDsKLQkJCi0JCXRhcmdldEV4aXN0aW5nUGxhdGZvcm1SZXNvdXJjZSA9IFRlc3RXb3Jrc3BhY2UuVEVTVF9QUk9KRUNULmdldEZvbGRlcihXRUJJTkZfRk9MREVSX1JFQUxfUEFUSCk7Ci0JCQotCQkvL3ZpcnR1YWxQYXJlbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChUZXN0V29ya3NwYWNlLlRFU1RfUFJPSkVDVCwgVGVzdFdvcmtzcGFjZS5XRUJfTU9EVUxFXzFfTkFNRSk7Ci0JCQotCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChUZXN0V29ya3NwYWNlLlRFU1RfUFJPSkVDVCk7Ci0JCUlWaXJ0dWFsRm9sZGVyIHJvb3RGb2xkZXIgPSBjb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpOwotCQl2aXJ0dWFsUGFyZW50ID0gcm9vdEZvbGRlcjsKLQkJCi0JCXRhcmdldEV4aXN0aW5nVmlydHVhbFJlc291cmNlID0gdmlydHVhbFBhcmVudC5nZXRGb2xkZXIoV0VCSU5GX0ZPTERFUl9SVU5USU1FX1BBVEgpOyAJCQotCi0JCXRhcmdldFZpcnR1YWxDb250YWluZXIgPSB2aXJ0dWFsUGFyZW50LmdldEZvbGRlcihURVNUREFUQV9GT0xERVJfUlVOVElNRV9QQVRIKTsgCi0JCXRhcmdldFBsYXRmb3JtQ29udGFpbmVyID0gVGVzdFdvcmtzcGFjZS5URVNUX1BST0pFQ1QuZ2V0Rm9sZGVyKFRFU1REQVRBX0ZPTERFUl9SRUFMX1BBVEgpOwotCQkKLQkJdGFyZ2V0VmlydHVhbFJlc291cmNlVG9EZWxldGUgPSB2aXJ0dWFsUGFyZW50LmdldEZvbGRlcihERUxFVEVNRV9QQVRIKTsKLQkJdGFyZ2V0VmlydHVhbFJlc291cmNlVG9EZWxldGUuY3JlYXRlKElWaXJ0dWFsUmVzb3VyY2UuRk9SQ0UsIG51bGwpOwotCQkKLQkJdGFyZ2V0UGxhdGZvcm1SZXNvdXJjZVRvRGVsZXRlID0gZXhwZWN0ZWRQcm9qZWN0LmdldEZvbGRlcih0YXJnZXRWaXJ0dWFsUmVzb3VyY2VUb0RlbGV0ZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkpOwkJCQotCQkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVhckRvd24oKTsKLQkJCi0JCWlmKHRhcmdldFBsYXRmb3JtUmVzb3VyY2VUb0RlbGV0ZS5leGlzdHMoKSkKLQkJCXRhcmdldFBsYXRmb3JtUmVzb3VyY2VUb0RlbGV0ZS5kZWxldGUoSVZpcnR1YWxSZXNvdXJjZS5GT1JDRSwgbnVsbCk7IAotCX0gIAotCQotCi0JcHVibGljIHZvaWQgdGVzdEdldFVuZGVybHlpbmdGb2xkZXIoKSB7IAotCQlJQ29udGFpbmVyIHVuZGVybHlpbmdSZXNvdXJjZSAgPSAoKElWaXJ0dWFsRm9sZGVyKXRhcmdldEV4aXN0aW5nVmlydHVhbFJlc291cmNlKS5nZXRVbmRlcmx5aW5nRm9sZGVyKCk7CQkKLQkJSUNvbnRhaW5lciBleHBlY3RlZFBsYXRmb3JtUmVzb3VyY2UgPSBUZXN0V29ya3NwYWNlLlRFU1RfUFJPSkVDVC5nZXRGb2xkZXIoV0VCSU5GX0ZPTERFUl9SVU5USU1FX1BBVEgpOwkJCi0JCWFzc2VydEVxdWFscygiVGhlIHVuZGVybHlpbmcgcmVzb3VyY2Ugc2hvdWxkIGJlICIgK2V4cGVjdGVkUGxhdGZvcm1SZXNvdXJjZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCksIGV4cGVjdGVkUGxhdGZvcm1SZXNvdXJjZSwgdW5kZXJseWluZ1Jlc291cmNlKTsgLy8kTk9OLU5MUy0xJAkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VW5kZXJseWluZ0ZvbGRlcnMoKSB7IAotCi0JCUlDb250YWluZXJbXSB1bmRlcmx5aW5nUmVzb3VyY2VzICA9ICgoSVZpcnR1YWxGb2xkZXIpdGFyZ2V0VmlydHVhbENvbnRhaW5lcikuZ2V0VW5kZXJseWluZ0ZvbGRlcnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGVyZSBzaG91bGQgYmUgdHdvIGZvbGRlcnMgbWFwcGVkIHRvIHJvb3QiLCAyLCB1bmRlcmx5aW5nUmVzb3VyY2VzLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCVNldCB1bmRlcmx5aW5nUmVzb3VyY2VzU2V0ID0gbmV3IEhhc2hTZXQoQXJyYXlzLmFzTGlzdCh1bmRlcmx5aW5nUmVzb3VyY2VzKSk7Ci0JCVNldCBleHBlY3RlZFVuZGVybHlpbmdSZXNvdXJjZXNTZXQgPSBuZXcgSGFzaFNldCgpOwotCQlleHBlY3RlZFVuZGVybHlpbmdSZXNvdXJjZXNTZXQuYWRkKFRlc3RXb3Jrc3BhY2UuVEVTVF9QUk9KRUNULmdldEZvbGRlcihURVNUREFUQV9GT0xERVJfUkVBTF9QQVRIKSk7Ci0JCWV4cGVjdGVkVW5kZXJseWluZ1Jlc291cmNlc1NldC5hZGQoVGVzdFdvcmtzcGFjZS5URVNUX1BST0pFQ1QuZ2V0Rm9sZGVyKFdFQkNPTlRFTlRfRk9MREVSX1JFQUxfUEFUSCkpOwotCQlhc3NlcnRFcXVhbHMoIkV4cGVjdGluZyB0d28gZm9sZGVycyBtYXBwZWQgdG8gcm9vdC4iICtleHBlY3RlZFVuZGVybHlpbmdSZXNvdXJjZXNTZXQsIHVuZGVybHlpbmdSZXNvdXJjZXNTZXQpOyAvLyROT04tTkxTLTEkCQotCi0JfQotCSAKLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS92aXJ0dWFscGF0aC90ZXN0cy9JVmlydHVhbFJlZmVyZW5jZUFQSVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdmlydHVhbHBhdGgvdGVzdHMvSVZpcnR1YWxSZWZlcmVuY2VBUElUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjOTE1ZGQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS92aXJ0dWFscGF0aC90ZXN0cy9JVmlydHVhbFJlZmVyZW5jZUFQSVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmNvbXBvbmVudGNvcmUudmlydHVhbHBhdGgudGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlcy5WaXJ0dWFsUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKLQotcHVibGljIGNsYXNzIElWaXJ0dWFsUmVmZXJlbmNlQVBJVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlKCkgewotCQlJVmlydHVhbFJlZmVyZW5jZSByZWZlcmVuY2UgPSBuZXcgVmlydHVhbFJlZmVyZW5jZSgpOwotCQlyZWZlcmVuY2UuY3JlYXRlKDAsbnVsbCk7Ci0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRSdW50aW1lUGF0aCgpIHsKLQkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmZXJlbmNlID0gbmV3IFZpcnR1YWxSZWZlcmVuY2UoKTsKLQkJcmVmZXJlbmNlLnNldFJ1bnRpbWVQYXRoKG5ldyBQYXRoKCIvIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRSdW50aW1lUGF0aCgpIHsKLQkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmZXJlbmNlID0gbmV3IFZpcnR1YWxSZWZlcmVuY2UoKTsKLQkJSVBhdGggcGF0aCA9IHJlZmVyZW5jZS5nZXRSdW50aW1lUGF0aCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXREZXBlbmRlbmN5VHlwZSgpIHsKLQkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmZXJlbmNlID0gbmV3IFZpcnR1YWxSZWZlcmVuY2UoKTsKLQkJaW50IGRlcGVuZGVuY3lUeXBlID0gMDsKLQkJcmVmZXJlbmNlLnNldERlcGVuZGVuY3lUeXBlKGRlcGVuZGVuY3lUeXBlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVwZW5kZW5jeVR5cGUoKSB7Ci0JCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZmVyZW5jZSA9IG5ldyBWaXJ0dWFsUmVmZXJlbmNlKCk7Ci0JCWludCBkZXBlbmRlbmN5VHlwZSA9IDA7Ci0JCWRlcGVuZGVuY3lUeXBlID0gcmVmZXJlbmNlLmdldERlcGVuZGVuY3lUeXBlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV4aXN0cygpIHsKLQkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmZXJlbmNlID0gbmV3IFZpcnR1YWxSZWZlcmVuY2UoKTsKLQkJYm9vbGVhbiBleGlzdHMgPSByZWZlcmVuY2UuZXhpc3RzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEVuY2xvc2luZ0NvbXBvbmVudCgpIHsKLQkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmZXJlbmNlID0gbmV3IFZpcnR1YWxSZWZlcmVuY2UoKTsKLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gcmVmZXJlbmNlLmdldEVuY2xvc2luZ0NvbXBvbmVudCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkgewotCQlJVmlydHVhbFJlZmVyZW5jZSByZWZlcmVuY2UgPSBuZXcgVmlydHVhbFJlZmVyZW5jZSgpOwotCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSByZWZlcmVuY2UuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwotCi0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3ZpcnR1YWxwYXRoL3Rlc3RzL0lWaXJ0dWFsUmVzb3VyY2VBUElUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3ZpcnR1YWxwYXRoL3Rlc3RzL0lWaXJ0dWFsUmVzb3VyY2VBUElUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyZmFjNjAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS92aXJ0dWFscGF0aC90ZXN0cy9JVmlydHVhbFJlc291cmNlQVBJVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmNvbXBvbmVudGNvcmUudmlydHVhbHBhdGgudGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuUmVzb3VyY2VUcmVlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5SZXNvdXJjZVRyZWVSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZXNvdXJjZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIElWaXJ0dWFsUmVzb3VyY2VBUElUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCQotCXByb3RlY3RlZCBJVmlydHVhbENvbnRhaW5lciB2aXJ0dWFsUGFyZW50OwkKLQlwcm90ZWN0ZWQgSVZpcnR1YWxSZXNvdXJjZSB0YXJnZXRFeGlzdGluZ1ZpcnR1YWxSZXNvdXJjZTsKLQlwcm90ZWN0ZWQgSVJlc291cmNlIHRhcmdldEV4aXN0aW5nUGxhdGZvcm1SZXNvdXJjZTsKLQkgIAotCXByb3RlY3RlZCBJVmlydHVhbEZvbGRlciB0YXJnZXRWaXJ0dWFsUmVzb3VyY2VUb0RlbGV0ZTsKLQlwcm90ZWN0ZWQgSVJlc291cmNlIHRhcmdldFBsYXRmb3JtUmVzb3VyY2VUb0RlbGV0ZTsJIAotCQkKLQlwcm90ZWN0ZWQgSVZpcnR1YWxSZXNvdXJjZSB0YXJnZXRWaXJ0dWFsUmVzb3VyY2VUb0NyZWF0ZSA9IG51bGw7Ci0JcHJvdGVjdGVkIElWaXJ0dWFsUmVzb3VyY2UgdGFyZ2V0TXVsdGlWaXJ0dWFsUmVzb3VyY2UgPSBudWxsOyAKLQkKLQlwcm90ZWN0ZWQgSVByb2plY3QgZXhwZWN0ZWRQcm9qZWN0OwkKLQlwcm90ZWN0ZWQgSVBhdGggZXhwZWN0ZWRSdW50aW1lUGF0aDsKLQlwcm90ZWN0ZWQgU3RyaW5nIGV4cGVjdGVkTmFtZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX05BTUUgPSBudWxsOwotCi0JcHVibGljIElWaXJ0dWFsUmVzb3VyY2VBUElUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0gIAotCQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQotCQlUZXN0V29ya3NwYWNlLmluaXQoKTsKLQkJZG9TZXR1cCgpOwotCQlhc3NlcnRSZXF1aXJlbWVudHMoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYXNzZXJ0UmVxdWlyZW1lbnRzKCkgeyAKLQkJCi0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZG9TZXR1cCgpIHRocm93cyBFeGNlcHRpb24gOwotCi0JLy9UT0RPOiBUaGlzIHRlc3QgZmFpbHMgaW50ZXJtaXR0ZW50bHkgKEJ1ZyAxNzUyODYpLAotCS8vd2FpdGluZyBmb3IgYnVnIDIwODA5MyB0byBiZSByZXNvbHZlZCBiZWZvcmUgaW52ZXN0aWdhdGluZyBmdXJ0aGVyCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZUxpbmtJUGF0aGludElQcm9ncmVzc01vbml0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoVGVzdFdvcmtzcGFjZS5nZXRUYXJnZXRQcm9qZWN0KCksIFRlc3RXb3Jrc3BhY2UuV0VCX01PRFVMRV8yX05BTUUpOwotCQlJVmlydHVhbEZvbGRlciByb290Rm9sZGVyID0gY29tcG9uZW50LmdldFJvb3RGb2xkZXIoKTsKLQkJCi0JCUlWaXJ0dWFsRm9sZGVyIGltYWdlcyA9IHJvb3RGb2xkZXIuZ2V0Rm9sZGVyKG5ldyBQYXRoKCIvaW1hZ2VzIikpOyAvLyROT04tTkxTLTEkCQkKLQkJaW1hZ2VzLmNyZWF0ZUxpbmsobmV3IFBhdGgoIi9XZWJNb2R1bGUyL2ltYWdlcyIpLCAwLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCi0JCUlGb2xkZXIgcmVhbEltYWdlcyA9IFRlc3RXb3Jrc3BhY2UuZ2V0VGFyZ2V0UHJvamVjdCgpLmdldEZvbGRlcihuZXcgUGF0aCgiL1dlYk1vZHVsZTIvaW1hZ2VzIikpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlRoZSAvV2ViQ29udGVudDIvaW1hZ2VzIGRpcmVjdG9yeSBtdXN0IGV4aXN0LiIsIHJlYWxJbWFnZXMuZXhpc3RzKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJU3RydWN0dXJlRWRpdCBtb2R1bGVDb3JlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKFRlc3RXb3Jrc3BhY2UuZ2V0VGFyZ2V0UHJvamVjdCgpKTsKLQkJCVdvcmtiZW5jaENvbXBvbmVudCB3YkNvbXBvbmVudCA9IG1vZHVsZUNvcmUuZ2V0Q29tcG9uZW50KCk7Ci0KLQkJCUNvbXBvbmVudFJlc291cmNlW10gY29tcG9uZW50UmVzb3VyY2VzID0gd2JDb21wb25lbnQuZmluZFJlc291cmNlc0J5UnVudGltZVBhdGgobmV3IFBhdGgoIi9pbWFnZXMiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJYXNzZXJ0VHJ1ZSgiVGhlcmUgc2hvdWxkIGJlIGF0IGxlYXN0IG9uZSBtYXBwaW5nIGZvciB2aXJ0dWFsIHBhdGggXCIvaW1hZ2VzXCIuIiwgY29tcG9uZW50UmVzb3VyY2VzLmxlbmd0aCA+IDApOyAvLyROT04tTkxTLTEkCi0KLQkJCVJlc291cmNlVHJlZVJvb3QgcmVzb3VyY2VUcmVlUm9vdCA9IFJlc291cmNlVHJlZVJvb3QuZ2V0U291cmNlUmVzb3VyY2VUcmVlUm9vdCh3YkNvbXBvbmVudCk7Ci0JCQljb21wb25lbnRSZXNvdXJjZXMgPSByZXNvdXJjZVRyZWVSb290LmZpbmRNb2R1bGVSZXNvdXJjZXMocmVhbEltYWdlcy5nZXRGdWxsUGF0aCgpLCBSZXNvdXJjZVRyZWVOb2RlLkNSRUFURV9OT05FKTsKLQotCQkJYXNzZXJ0VHJ1ZSgiVGhlcmUgc2hvdWxkIGJlIGV4YWN0bHkgb25lIENvbXBvbmVudCByZXNvdXJjZSB3aXRoIHRoZSBzb3VyY2UgcGF0aCBcIiIgKyByZWFsSW1hZ2VzLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKSArICJcIi4iLCBjb21wb25lbnRSZXNvdXJjZXMubGVuZ3RoID09IDEpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJYXNzZXJ0VHJ1ZSgiVGhlIHJ1bnRpbWUgcGF0aCBzaG91bGQgbWF0Y2ggXCIvaW1hZ2VzXCIuIiwgY29tcG9uZW50UmVzb3VyY2VzWzBdLmdldFJ1bnRpbWVQYXRoKCkudG9TdHJpbmcoKS5lcXVhbHMoIi9pbWFnZXMiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCQkvLyBtYWtlIHN1cmUgdGhhdCBvbmx5IG9uZSBjb21wb25lbnQgcmVzb3VyY2UgaXMgY3JlYXRlZAotCi0JCQlpbWFnZXMuY3JlYXRlTGluayhuZXcgUGF0aCgiL1dlYk1vZHVsZTIvaW1hZ2VzIiksIDAsIG51bGwpOyAvLyROT04tTkxTLTEkCi0KLQkJCWNvbXBvbmVudFJlc291cmNlcyA9IHJlc291cmNlVHJlZVJvb3QuZmluZE1vZHVsZVJlc291cmNlcyhyZWFsSW1hZ2VzLmdldEZ1bGxQYXRoKCksIFJlc291cmNlVHJlZU5vZGUuQ1JFQVRFX05PTkUpOwotCi0JCQlhc3NlcnRUcnVlKCJUaGVyZSBzaG91bGQgYmUgZXhhY3RseSBvbmUgQ29tcG9uZW50IHJlc291cmNlIHdpdGggdGhlIHNvdXJjZSBwYXRoIFwiIiArIHJlYWxJbWFnZXMuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpICsgIlwiLiIsIGNvbXBvbmVudFJlc291cmNlcy5sZW5ndGggPT0gMSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCQlhc3NlcnRUcnVlKCJUaGUgcnVudGltZSBwYXRoIHNob3VsZCBtYXRjaCBcIi9pbWFnZXNcIi4iLCBjb21wb25lbnRSZXNvdXJjZXNbMF0uZ2V0UnVudGltZVBhdGgoKS50b1N0cmluZygpLmVxdWFscygiL2ltYWdlcyIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0gZmluYWxseSB7Ci0JCQlpZiAobW9kdWxlQ29yZSAhPSBudWxsKQotCQkJCW1vZHVsZUNvcmUuZGlzcG9zZSgpOwotCQl9Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RXhpc3RzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRGaWxlRXh0ZW5zaW9uKCkgewotCQlhc3NlcnRUcnVlKCJUaGUgZXhpc3RpbmcgdmlydHVhbCByZXNvdXJjZSBzaG91bGQgaGF2ZSBubyBmaWxlIGV4dGVuc2lvbi4iLCB0YXJnZXRFeGlzdGluZ1ZpcnR1YWxSZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCkgPT0gbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0V29ya3NwYWNlUmVsYXRpdmVQYXRoKCkgewotCQlJUGF0aCByZWFsUGF0aCA9IHRhcmdldEV4aXN0aW5nUGxhdGZvcm1SZXNvdXJjZS5nZXRGdWxsUGF0aCgpOwotCQlJUGF0aCB2aXJ0dWFsUGF0aCA9IHRhcmdldEV4aXN0aW5nVmlydHVhbFJlc291cmNlLmdldFdvcmtzcGFjZVJlbGF0aXZlUGF0aCgpOwotCQlhc3NlcnRFcXVhbHMoIlRoZSB3b3Jrc3BhY2UgcmVsYXRpdmUgcGF0aCBvZiB0aGUgdmlydHVhbCByZXNvdXJjZSBtdXN0IG1hdGNoIHRoZSByZWFsIHJlc291cmNlIiwgcmVhbFBhdGgsIHZpcnR1YWxQYXRoKTsgLy8kTk9OLU5MUy0xJAotCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFByb2plY3RSZWxhdGl2ZVBhdGgoKSB7Ci0JCUlQYXRoIHJlYWxQYXRoID0gdGFyZ2V0RXhpc3RpbmdQbGF0Zm9ybVJlc291cmNlLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKTsKLQkJSVBhdGggdmlydHVhbFBhdGggPSB0YXJnZXRFeGlzdGluZ1ZpcnR1YWxSZXNvdXJjZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCk7Ci0JCWFzc2VydEVxdWFscygiVGhlIHByb2plY3QgcmVsYXRpdmUgcGF0aCBvZiB0aGUgdmlydHVhbCByZXNvdXJjZSBtdXN0IG1hdGNoIHRoZSByZWFsIHJlc291cmNlIiwgcmVhbFBhdGgsIHZpcnR1YWxQYXRoKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRSdW50aW1lUGF0aCgpIHsgCi0JCUlQYXRoIHZpcnR1YWxQYXRoID0gdGFyZ2V0RXhpc3RpbmdWaXJ0dWFsUmVzb3VyY2UuZ2V0UnVudGltZVBhdGgoKTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgcnVudGltZSBwYXRoIG9mIHRoZSB2aXJ0dWFsIHJlc291cmNlIG11c3QgbWF0Y2ggdGhlIHJlYWwgcmVzb3VyY2UiLCBleHBlY3RlZFJ1bnRpbWVQYXRoLCB2aXJ0dWFsUGF0aCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgbmFtZSBvZiB0aGUgdmlydHVhbCByZXNvdXJjZSBtdXN0IG1hdGNoIHRoZSBleHBlY3RlZCBuYW1lLiIsIGV4cGVjdGVkTmFtZSwgdGFyZ2V0RXhpc3RpbmdWaXJ0dWFsUmVzb3VyY2UuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRQYXJlbnQoKSB7Ci0JCWFzc2VydEVxdWFscygiVGhlIHBhcmVudCBvZiB0aGUgdmlydHVhbCByZXNvdXJjZSBtdXN0IG1hdGNoIHRoZSBjb21wb25lbnQuIiwgdmlydHVhbFBhcmVudCwgdGFyZ2V0RXhpc3RpbmdWaXJ0dWFsUmVzb3VyY2UuZ2V0UGFyZW50KCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFByb2plY3QoKSB7Ci0JCWFzc2VydEVxdWFscygiVGhlIHByb2plY3Qgb2YgdGhlIHZpcnR1YWwgcmVzb3VyY2UgbXVzdCBtYXRjaCB0aGUgdGVzdCBwcm9qZWN0LiIsIGV4cGVjdGVkUHJvamVjdCwgdGFyZ2V0RXhpc3RpbmdWaXJ0dWFsUmVzb3VyY2UuZ2V0UHJvamVjdCgpKTsgLy8kTk9OLU5MUy0xJAotCX0gIAotCi0JcHVibGljIHZvaWQgdGVzdEdldFR5cGUoKSB7Ci0JCWFzc2VydEVxdWFscygiVGhlIHR5cGUgb2YgdGhlIHZpcnR1YWwgcmVzb3VyY2UgbXVzdCBtYXRjaCB0aGUgdGVzdCBwcm9qZWN0LiIsIElSZXNvdXJjZS5GT0xERVIsIHRhcmdldEV4aXN0aW5nVmlydHVhbFJlc291cmNlLmdldFR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldENvbXBvbmVudCgpIHsgCi0JCWFzc2VydEVxdWFscygiVGhlIGNvbXBvbmVudCBuYW1lIG9mIHRoZSB2aXJ0dWFsIHJlc291cmNlIG11c3QgbWF0Y2ggdGhlIHRlc3QgcHJvamVjdC4iLCBUZXN0V29ya3NwYWNlLldFQl9NT0RVTEVfMV9OQU1FLCB0YXJnZXRFeGlzdGluZ1ZpcnR1YWxSZXNvdXJjZS5nZXRDb21wb25lbnQoKS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzQWNjZXNzaWJsZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgcGxhdGZvcm0gcmVzb3VyY2Ugc2hvdWxkIGJlIGFjY2Vzc2libGUgb25seSBpZiB0aGUgdmlydHVhbCByZXNvdXJjZSBpcyBhY2Nlc3NpYmxlLiIsIHRhcmdldEV4aXN0aW5nUGxhdGZvcm1SZXNvdXJjZS5pc0FjY2Vzc2libGUoKSwgdGFyZ2V0RXhpc3RpbmdQbGF0Zm9ybVJlc291cmNlLmlzQWNjZXNzaWJsZSgpKTsgLy8kTk9OLU5MUy0xJAotCX0gCi0KLQkvKgotCSAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIHZvaWQgZGVsZXRlKGludCwgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0RGVsZXRlaW50SVByb2dyZXNzTW9uaXRvcigpIHRocm93cyBFeGNlcHRpb24gewotCQl0YXJnZXRWaXJ0dWFsUmVzb3VyY2VUb0RlbGV0ZS5kZWxldGUoMCwgbnVsbCk7Ci0JCQotCQlhc3NlcnRUcnVlKCJUaGUgcmVhbCBmb2xkZXIgc2hvdWxkIGJlIGRlbGV0ZWQgd2hlbiBJVmlydHVhbFJlc291cmNlLkRFTEVURV9NRVRBTU9ERUxfT05MWSBpcyBOT1Qgc3VwcGxpZWQuIiwgIXRhcmdldFBsYXRmb3JtUmVzb3VyY2VUb0RlbGV0ZS5leGlzdHMoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkKLQkJSVZpcnR1YWxSZXNvdXJjZVtdIG1lbWJlcnMgPSB2aXJ0dWFsUGFyZW50Lm1lbWJlcnMoKTsKLQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVycy5sZW5ndGg7IGkrKykgewotCQkJaWYobWVtYmVyc1tpXS5nZXRSdW50aW1lUGF0aCgpLmVxdWFscyh0YXJnZXRWaXJ0dWFsUmVzb3VyY2VUb0RlbGV0ZS5nZXRSdW50aW1lUGF0aCgpKSkgewotCQkJCWZhaWwoIkZvdW5kIGRlbGV0ZWQgZm9sZGVyIGluIG1lbWJlcnMoKSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0JCQotCX0KLQkKLQkvKgotCSAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIHZvaWQgZGVsZXRlKGludCwgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0RGVsZXRlaW50SVByb2dyZXNzTW9uaXRvcjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGFyZ2V0VmlydHVhbFJlc291cmNlVG9EZWxldGUuZGVsZXRlKElWaXJ0dWFsUmVzb3VyY2UuSUdOT1JFX1VOREVSTFlJTkdfUkVTT1VSQ0UsIG51bGwpOwotCQkKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHJlYWwgcmVzb3VyY2Ugc2hvdWxkIG5vdCBiZSBkZWxldGVkIHdoZW4gSVZpcnR1YWxSZXNvdXJjZS5JR05PUkVfVU5ERVJMWUlOR19SRVNPVVJDRSBpcyBzdXBwbGllZC4iLCB0YXJnZXRQbGF0Zm9ybVJlc291cmNlVG9EZWxldGUuZXhpc3RzKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCi0JCS8vIG9ubHkgaGFuZGxlcyBleHBsaWNpdCBtYXBwaW5ncwotCQlTdHJ1Y3R1cmVFZGl0IG1vZHVsZUNvcmUgPSBudWxsOwotCQl0cnkgeyAKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShleHBlY3RlZFByb2plY3QpOwotCQkJV29ya2JlbmNoQ29tcG9uZW50IHdiQ29tcG9uZW50ID0gbW9kdWxlQ29yZS5nZXRDb21wb25lbnQoKTsKLQkJCUNvbXBvbmVudFJlc291cmNlW10gcmVzb3VyY2VzID0gd2JDb21wb25lbnQuZmluZFJlc291cmNlc0J5UnVudGltZVBhdGgodGFyZ2V0VmlydHVhbFJlc291cmNlVG9EZWxldGUuZ2V0UnVudGltZVBhdGgoKSk7Ci0JCQlhc3NlcnRUcnVlKCJUaGVyZSBzaG91bGQgYmUgbm8gbWF0Y2hpbmcgcmVzb3VyY2VzIGZvdW5kIGluIHRoZSBtb2RlbC4iLCByZXNvdXJjZXMubGVuZ3RoID09IDApOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChtb2R1bGVDb3JlICE9IG51bGwpIHsKLQkJCQltb2R1bGVDb3JlLnNhdmVJZk5lY2Vzc2FyeShudWxsKTsKLQkJCQltb2R1bGVDb3JlLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKgotCSAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIHZvaWQgZGVsZXRlKGJvb2xlYW4sIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdERlbGV0ZWludElQcm9ncmVzc01vbml0b3IzKCkgIHRocm93cyBFeGNlcHRpb24gIHsKLQkJdGFyZ2V0VmlydHVhbFJlc291cmNlVG9EZWxldGUuZGVsZXRlKElWaXJ0dWFsUmVzb3VyY2UuRk9SQ0UsIG51bGwpOwotCQkKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHJlYWwgcmVzb3VyY2Ugc2hvdWxkIGJlIGRlbGV0ZWQgd2hlbiBJVmlydHVhbFJlc291cmNlLklHTk9SRV9VTkRFUkxZSU5HX1JFU09VUkNFIGlzIE5PVCBzdXBwbGllZC4iLCAhdGFyZ2V0UGxhdGZvcm1SZXNvdXJjZVRvRGVsZXRlLmV4aXN0cygpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQotCQlJVmlydHVhbFJlc291cmNlW10gbWVtYmVycyA9IHZpcnR1YWxQYXJlbnQubWVtYmVycygpOwotCQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZW1iZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZihtZW1iZXJzW2ldLmdldFJ1bnRpbWVQYXRoKCkuZXF1YWxzKHRhcmdldFZpcnR1YWxSZXNvdXJjZVRvRGVsZXRlLmdldFJ1bnRpbWVQYXRoKCkpKSB7Ci0JCQkJZmFpbCgiRm91bmQgZGVsZXRlZCBmb2xkZXIgaW4gbWVtYmVycygpIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQkKLQl9CQotCSAKLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRVbmRlcmx5aW5nUmVzb3VyY2UoKSB7Ci0JCUlSZXNvdXJjZSBwbGF0Zm9ybVJlc291cmNlVG9DcmVhdGUgPSB0YXJnZXRWaXJ0dWFsUmVzb3VyY2VUb0NyZWF0ZS5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKTsKLQkJaW50IGV4cGVjdGVkVHlwZSA9IGRldGVybWluZUV4cGVjdGVkVHlwZSh0YXJnZXRWaXJ0dWFsUmVzb3VyY2VUb0NyZWF0ZSk7Ci0JCWFzc2VydEVxdWFscygiVGhlIHR5cGUgb2YgdGhlIHVuZGVybHlpbmcgcmVzb3VyY2Ugc2hvdWxkIG1hdGNoIHRoZSBleHBlY3RlZCB0eXBlLiIsIGV4cGVjdGVkVHlwZSwgcGxhdGZvcm1SZXNvdXJjZVRvQ3JlYXRlLmdldFR5cGUoKSk7Ci0JCWFzc2VydFRydWUoIlRoZSB1bmRlcnlsaW5nIHJlc291cmNlIHNob3VsZCBub3QgZXhpc3QuIiwgIXBsYXRmb3JtUmVzb3VyY2VUb0NyZWF0ZS5leGlzdHMoKSApOyAgCi0JCQotCQlleHBlY3RlZFR5cGUgPSBkZXRlcm1pbmVFeHBlY3RlZFR5cGUodGFyZ2V0RXhpc3RpbmdWaXJ0dWFsUmVzb3VyY2UpOwotCQlJUmVzb3VyY2UgZXhpdGluZ1BsYXRmb3JtUmVzb3VyY2UgPSB0YXJnZXRFeGlzdGluZ1ZpcnR1YWxSZXNvdXJjZS5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgdHlwZSBvZiB0aGUgdW5kZXJseWluZyByZXNvdXJjZSBzaG91bGQgbWF0Y2ggdGhlIGV4cGVjdGVkIHR5cGUuIiwgZXhwZWN0ZWRUeXBlLCBleGl0aW5nUGxhdGZvcm1SZXNvdXJjZS5nZXRUeXBlKCkpOwotCQlhc3NlcnRUcnVlKCJUaGUgdW5kZXJ5bGluZyByZXNvdXJjZSBzaG91bGQgZXhpc3QuIiwgZXhpdGluZ1BsYXRmb3JtUmVzb3VyY2UuZXhpc3RzKCkgKTsKLQkJCi0JCQotCQlleHBlY3RlZFR5cGUgPSBkZXRlcm1pbmVFeHBlY3RlZFR5cGUodGFyZ2V0TXVsdGlWaXJ0dWFsUmVzb3VyY2UpOwotCQlJUmVzb3VyY2UgbXVsdGlQbGF0Zm9ybVJlc291cmNlID0gdGFyZ2V0TXVsdGlWaXJ0dWFsUmVzb3VyY2UuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCk7Ci0JCWFzc2VydEVxdWFscygiVGhlIHR5cGUgb2YgdGhlIHVuZGVybHlpbmcgcmVzb3VyY2Ugc2hvdWxkIG1hdGNoIHRoZSBleHBlY3RlZCB0eXBlLiIsIGV4cGVjdGVkVHlwZSwgbXVsdGlQbGF0Zm9ybVJlc291cmNlLmdldFR5cGUoKSk7Ci0JCWFzc2VydFRydWUoIlRoZSB1bmRlcnlsaW5nIHJlc291cmNlIHNob3VsZCBleGlzdC4iLCBtdWx0aVBsYXRmb3JtUmVzb3VyY2UuZXhpc3RzKCkgKTsgCi0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRVbmRlcmx5aW5nUmVzb3VyY2VzKCkgeyAKLQotCQlpbnQgZXhwZWN0ZWRUeXBlID0gZGV0ZXJtaW5lRXhwZWN0ZWRUeXBlKHRhcmdldFZpcnR1YWxSZXNvdXJjZVRvQ3JlYXRlKTsKLQkJSVJlc291cmNlW10gcGxhdGZvcm1SZXNvdXJjZXNUb0NyZWF0ZSA9IHRhcmdldFZpcnR1YWxSZXNvdXJjZVRvQ3JlYXRlLmdldFVuZGVybHlpbmdSZXNvdXJjZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGVyZSBzaG91bGQgb25seSBiZSBvbmUgcmVzb3VyY2UgaW4gdGhlIHJlc3VsdCBhcnJheS4iLCAxLCBwbGF0Zm9ybVJlc291cmNlc1RvQ3JlYXRlLmxlbmd0aCk7Ci0JCWFzc2VydEVxdWFscygiVGhlIHR5cGUgb2YgdGhlIHVuZGVybHlpbmcgcmVzb3VyY2Ugc2hvdWxkIG1hdGNoIHRoZSBleHBlY3RlZCB0eXBlLiIsIGV4cGVjdGVkVHlwZSwgcGxhdGZvcm1SZXNvdXJjZXNUb0NyZWF0ZVswXS5nZXRUeXBlKCkpOwotCQlhc3NlcnRUcnVlKCJUaGUgdW5kZXJ5bGluZyByZXNvdXJjZSBzaG91bGQgbm90IGV4aXN0LiIsICFwbGF0Zm9ybVJlc291cmNlc1RvQ3JlYXRlWzBdLmV4aXN0cygpICk7IAotCi0JCWV4cGVjdGVkVHlwZSA9IGRldGVybWluZUV4cGVjdGVkVHlwZSh0YXJnZXRFeGlzdGluZ1ZpcnR1YWxSZXNvdXJjZSk7Ci0JCUlSZXNvdXJjZVtdIGV4aXN0aW5nUGxhdGZvcm1SZXNvdXJjZSA9IHRhcmdldEV4aXN0aW5nVmlydHVhbFJlc291cmNlLmdldFVuZGVybHlpbmdSZXNvdXJjZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGVyZSBzaG91bGQgb25seSBiZSBvbmUgcmVzb3VyY2UgaW4gdGhlIHJlc3VsdCBhcnJheS4iLCAxLCBleGlzdGluZ1BsYXRmb3JtUmVzb3VyY2UubGVuZ3RoKTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgdHlwZSBvZiB0aGUgdW5kZXJseWluZyByZXNvdXJjZSBzaG91bGQgbWF0Y2ggdGhlIGV4cGVjdGVkIHR5cGUuIiwgZXhwZWN0ZWRUeXBlLCBleGlzdGluZ1BsYXRmb3JtUmVzb3VyY2VbMF0uZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHVuZGVyeWxpbmcgcmVzb3VyY2Ugc2hvdWxkIG5vdCBleGlzdC4iLCBleGlzdGluZ1BsYXRmb3JtUmVzb3VyY2VbMF0uZXhpc3RzKCkgKTsgIAotCi0JCQotCQlleHBlY3RlZFR5cGUgPSBkZXRlcm1pbmVFeHBlY3RlZFR5cGUodGFyZ2V0TXVsdGlWaXJ0dWFsUmVzb3VyY2UpOwotCQlJUmVzb3VyY2VbXSBtdWx0aVBsYXRmb3JtUmVzb3VyY2VzID0gdGFyZ2V0TXVsdGlWaXJ0dWFsUmVzb3VyY2UuZ2V0VW5kZXJseWluZ1Jlc291cmNlcygpOwotCQlhc3NlcnRFcXVhbHMoIlRoZSB0eXBlIG9mIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlIHNob3VsZCBtYXRjaCB0aGUgZXhwZWN0ZWQgdHlwZS4iLCBleHBlY3RlZFR5cGUsIG11bHRpUGxhdGZvcm1SZXNvdXJjZXNbMF0uZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHVuZGVyeWxpbmcgcmVzb3VyY2Ugc2hvdWxkIG5vdCBleGlzdC4iLCBtdWx0aVBsYXRmb3JtUmVzb3VyY2VzWzBdLmV4aXN0cygpICk7IAotCX0KLQotCXByaXZhdGUgaW50IGRldGVybWluZUV4cGVjdGVkVHlwZShJVmlydHVhbFJlc291cmNlIGFWaXJ0dWFsUmVzb3VyY2UpIHsgCi0JCXN3aXRjaCh0YXJnZXRWaXJ0dWFsUmVzb3VyY2VUb0NyZWF0ZS5nZXRUeXBlKCkpIHsKLQkJCWNhc2UgSVZpcnR1YWxSZXNvdXJjZS5GSUxFOgotCQkJCXJldHVybiBJUmVzb3VyY2UuRklMRTsgCi0JCQljYXNlIElWaXJ0dWFsUmVzb3VyY2UuRk9MREVSOgotCQkJY2FzZSBJVmlydHVhbFJlc291cmNlLkNPTVBPTkVOVDoKLQkJCQlyZXR1cm4gSVJlc291cmNlLkZPTERFUjsgCi0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3ZpcnR1YWxwYXRoL3Rlc3RzL1N0cnVjdHVyZUVkaXRUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3ZpcnR1YWxwYXRoL3Rlc3RzL1N0cnVjdHVyZUVkaXRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNjRmMjguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS92aXJ0dWFscGF0aC90ZXN0cy9TdHJ1Y3R1cmVFZGl0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuY29tcG9uZW50Y29yZS52aXJ0dWFscGF0aC50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLlVucmVzb2x2ZWFibGVVUklFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlRWRpdFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIElSZXNvdXJjZSBhUmVzb3VyY2U7Ci0KLQlwdWJsaWMgU3RydWN0dXJlRWRpdFRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCVRlc3RXb3Jrc3BhY2UuaW5pdCgpOwotCQlhUmVzb3VyY2U9IFRlc3RXb3Jrc3BhY2UuVEVTVF9QUk9KRUNULmdldEZpbGUobmV3IFBhdGgoIldlYk1vZHVsZTEvdGVzdGRhdGEvVGVzdEZpbGUxLnR4dCIpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEZpbmRCeVNvdXJjZVBhdGgoKSB7IAotCQlJUHJvamVjdCBwcm9qID0gYVJlc291cmNlLmdldFByb2plY3QoKTsKLQkJU3RydWN0dXJlRWRpdCBzZSA9IG51bGw7Ci0JCUxpc3QgZm91bmRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRyeSB7Ci0JCQlzZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvclJlYWQocHJvaik7Ci0JCQlDb21wb25lbnRSZXNvdXJjZVtdIHJlc291cmNlcyA9IHNlLmZpbmRSZXNvdXJjZXNCeVNvdXJjZVBhdGgoYVJlc291cmNlLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoIlRoZXJlIHNob3VsZCBiZSBvbmUgcmVzb3VyY2UgZm91bmQuIiwgMSwgcmVzb3VyY2VzLmxlbmd0aCk7Ci0KLQkJCXJlc291cmNlcyA9IHNlLmZpbmRSZXNvdXJjZXNCeVNvdXJjZVBhdGgoYVJlc291cmNlLmdldEZ1bGxQYXRoKCkpOwotCQkJYXNzZXJ0RXF1YWxzKCJUaGVyZSBzaG91bGQgYmUgb25lIHJlc291cmNlIGZvdW5kLiIsIDEsIHJlc291cmNlcy5sZW5ndGgpOwotCQl9Ci0JCWNhdGNoIChVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJIGZpbmFsbHkgewotCQkJc2UuZGlzcG9zZSgpOwkKLQkJfSAKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdmlydHVhbHBhdGgvdGVzdHMvVGVzdFdvcmtzcGFjZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS92aXJ0dWFscGF0aC90ZXN0cy9UZXN0V29ya3NwYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0MmU1NDIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS92aXJ0dWFscGF0aC90ZXN0cy9UZXN0V29ya3NwYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5jb21wb25lbnRjb3JlLnZpcnR1YWxwYXRoLnRlc3RzOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ldG9vbHMuY29tbW9uLnRlc3QuYXBpdG9vbHMuUHJvamVjdFVuemlwVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLkNvbW1vblRlc3RzUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgVGVzdFdvcmtzcGFjZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX05BTUUgPSAiV2ViTW9kdWxlMSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfTU9EVUxFXzFfTkFNRSA9ICJXZWJNb2R1bGUxIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9NT0RVTEVfMl9OQU1FID0gIldlYk1vZHVsZTIiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX1dFQl9NT0RVTEVfTkFNRSA9ICJUZXN0VmlydHVhbEFQSSI7IC8vJE5PTi1OTFMtMSQKLQkKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFfSU5GID0gIk1FVEEtSU5GIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9JTkYgPSAiV0VCLUlORiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBQYXRoIHppcEZpbGVQYXRoID0gbmV3IFBhdGgoInRlc3REYXRhL1Rlc3RWaXJ0dWFsQVBJLnppcCIpOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVByb2plY3QgVEVTVF9QUk9KRUNUID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KFRlc3RXb3Jrc3BhY2UuUFJPSkVDVF9OQU1FKTsKLQkgIAkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIE1PRFVMRV9OQU1FUyA9IG5ldyBTdHJpbmdbXXsiV2ViTW9kdWxlMSIsICJXZWJNb2R1bGUyIn07ICAKLQkKLQkKLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0IGdldFRhcmdldFByb2plY3QoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoUFJPSkVDVF9OQU1FKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdCgpIHsKLQkJCi0JCXRyeSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0VGFyZ2V0UHJvamVjdCgpOwotCQkJaWYgKHByb2plY3QuZXhpc3RzKCkpCi0JCQkJcHJvamVjdC5kZWxldGUodHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0JCQljcmVhdGVQcm9qZWN0KCk7IAotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsgCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjcmVhdGVQcm9qZWN0KCkgewotCQlJUGF0aCBsb2NhbFppcFBhdGggPSBnZXRMb2NhbFBhdGgoKTsKLQkJUHJvamVjdFVuemlwVXRpbCB1dGlsID0gbmV3IFByb2plY3RVbnppcFV0aWwobG9jYWxaaXBQYXRoLCBuZXcgU3RyaW5nW117UFJPSkVDVF9OQU1FfSk7Ci0JCXJldHVybiB1dGlsLmNyZWF0ZVByb2plY3RzKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSVBhdGggZ2V0TG9jYWxQYXRoKCkgewotCQlVUkwgdXJsID0gQ29tbW9uVGVzdHNQbHVnaW4uaW5zdGFuY2UuZmluZCh6aXBGaWxlUGF0aCk7Ci0JCXRyeSB7Ci0JCQl1cmwgPSBQbGF0Zm9ybS5hc0xvY2FsVVJMKHVybCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBQYXRoKHVybC5nZXRQYXRoKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL0EuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9BLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhMjAxOTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlcjsKLQotcHVibGljIGNsYXNzIEEgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQID0gIkEuUCI7Ci0KLQlwdWJsaWMgU2V0IGdldFByb3BlcnR5TmFtZXMoKSB7Ci0JCVNldCBwcm9wZXJ0eU5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChQKTsKLQkJcmV0dXJuIHByb3BlcnR5TmFtZXM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJRCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL0IuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9CLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1YTVmOTkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL0IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlcjsKLQotcHVibGljIGNsYXNzIEIgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQID0gIkIuUCI7Ci0KLQlwdWJsaWMgU2V0IGdldFByb3BlcnR5TmFtZXMoKSB7Ci0JCVNldCBwcm9wZXJ0eU5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChQKTsKLQkJcmV0dXJuIHByb3BlcnR5TmFtZXM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJRCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL0MuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9DLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMzA4NTcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL0MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlcjsKLQotcHVibGljIGNsYXNzIEMgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQID0gIkMuUCI7Ci0KLQlwdWJsaWMgU2V0IGdldFByb3BlcnR5TmFtZXMoKSB7Ci0JCVNldCBwcm9wZXJ0eU5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChQKTsKLQkJcmV0dXJuIHByb3BlcnR5TmFtZXM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJRCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL0RhdGFNb2RlbEFQSVRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvRGF0YU1vZGVsQVBJVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM1YjdjYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvRGF0YU1vZGVsQVBJVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuZXh0ZW5kZWQuRXh0ZW5kZWRPcGVyYXRpb25UZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLlNpbXBsZVRlc3RTdWl0ZTsKLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICovCi1wdWJsaWMgY2xhc3MgRGF0YU1vZGVsQVBJVGVzdHMgZXh0ZW5kcyBUZXN0U3VpdGUgewotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IERhdGFNb2RlbEFQSVRlc3RzKCk7Ci0JfQotCi0JcHVibGljIERhdGFNb2RlbEFQSVRlc3RzKCkgewotCQlzdXBlcigpOwotCQlhZGRUZXN0KG5ldyBTaW1wbGVUZXN0U3VpdGUoRXZlbnRUZXN0LmNsYXNzKSk7Ci0JCWFkZFRlc3QobmV3IFNpbXBsZVRlc3RTdWl0ZShOZXN0aW5nVGVzdC5jbGFzcykpOwotCQlhZGRUZXN0KG5ldyBTaW1wbGVUZXN0U3VpdGUoTmVzdGVkTGlzdGVuaW5nVGVzdC5jbGFzcykpOwotCQlhZGRUZXN0KG5ldyBTaW1wbGVUZXN0U3VpdGUoU2ltcGxlRGF0YU1vZGVsVGVzdC5jbGFzcykpOwotCQlhZGRUZXN0KG5ldyBTaW1wbGVUZXN0U3VpdGUoRGF0YU1vZGVsRmFjdG9yeVRlc3QuY2xhc3MpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgU2ltcGxlVGVzdFN1aXRlKERhdGFNb2RlbEVuYWJsZW1lbnRUZXN0LmNsYXNzKSk7Ci0JCWFkZFRlc3QobmV3IFNpbXBsZVRlc3RTdWl0ZShUZXN0QWJzdHJhY3RETVByb3ZpZGVyLmNsYXNzKSk7Ci0JCWFkZFRlc3QobmV3IFNpbXBsZVRlc3RTdWl0ZShWYWxpZGF0aW9uVGVzdC5jbGFzcykpOwotCQlhZGRUZXN0KG5ldyBTaW1wbGVUZXN0U3VpdGUoRXh0ZW5kZWRPcGVyYXRpb25UZXN0cy5jbGFzcykpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9EYXRhTW9kZWxFbmFibGVtZW50VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL0RhdGFNb2RlbEVuYWJsZW1lbnRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2Nzc3Y2QuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL0RhdGFNb2RlbEVuYWJsZW1lbnRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuRGF0YU1vZGVsRW5hYmxlbWVudEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBEYXRhTW9kZWxFbmFibGVtZW50VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyB2b2lkIHRlc3RWYWxpZEV4dGVuc2lvbklEQW5kUHJvdmlkZXJUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0IHByb2ogPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoInRlbXAiKTsKLQkJaWYgKHByb2ogPT0gbnVsbCkgewotCQkJcHJvai5jcmVhdGUobnVsbCk7Ci0JCX0KLQkJSURhdGFNb2RlbCBkYXRhTW9kZWwgPSBEYXRhTW9kZWxFbmFibGVtZW50RmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwoInRlc3RQcm92aWRlckJhc2UiLCBwcm9qKTsKLQkJYXNzZXJ0VHJ1ZShkYXRhTW9kZWwuaXNQcm9wZXJ0eShJVGVzdERhdGFNb2RlbC5GT08pKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsaWRFeHRlbnNpb25JREltcGxlbWVudG9yRm9yUHJvdmlkZXJUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJSVByb2plY3QgcHJvaiA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdCgidGVtcCIpOwotCQlpZiAocHJvaiA9PSBudWxsKSB7Ci0JCQlwcm9qLmNyZWF0ZShudWxsKTsKLQkJfQotCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IERhdGFNb2RlbEVuYWJsZW1lbnRGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbCgidGVzdFByb3ZpZGVyQm9ndXMiLCBwcm9qKTsKLQkJYXNzZXJ0VHJ1ZShkYXRhTW9kZWwgPT0gbnVsbCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvRGF0YU1vZGVsRmFjdG9yeVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9EYXRhTW9kZWxGYWN0b3J5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTgwZjAwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9EYXRhTW9kZWxGYWN0b3J5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgRGF0YU1vZGVsRmFjdG9yeVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RCb2d1c0V4dGVuc2lvbigpIHsKLQkJRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IG51bGw7Ci0JCUlEYXRhTW9kZWwgZGF0YU1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWRhdGFNb2RlbCAgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbCgiYm9ndXMiKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWV4Y2VwdGlvbiA9IGU7Ci0JCX0KLQkJYXNzZXJ0TnVsbChkYXRhTW9kZWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkRXh0ZW5zaW9uSUQoKSB7Ci0JCUV4Y2VwdGlvbiBleGNlcHRpb24gPSBudWxsOwotCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlkYXRhTW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbCgiYmFkSUQiKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWV4Y2VwdGlvbiA9IGU7Ci0JCX0KLQkJYXNzZXJ0TnVsbChkYXRhTW9kZWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkRXh0ZW5zaW9uQ2xhc3MoKSB7Ci0JCUV4Y2VwdGlvbiBleGNlcHRpb24gPSBudWxsOwotCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkgZGF0YU1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwoT2JqZWN0LmNsYXNzKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWV4Y2VwdGlvbiA9IGU7Ci0JCX0KLQkJYXNzZXJ0TnVsbChkYXRhTW9kZWwpOwotCX0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRFeHRlbnNpb25JREFuZFByb3ZpZGVyVHlwZSgpIHsKLSAgICAgICAgU3RyaW5nW10gZGVzY3MgPSBEYXRhTW9kZWxGYWN0b3J5LmdldERhdGFNb2RlbFByb3ZpZGVySURzRm9yS2luZCgidGVzdFByb3ZpZGVyQmFzZSIpOwotICAgICAgICBJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKGRlc2NzWzBdKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShkYXRhTW9kZWwuaXNQcm9wZXJ0eShJVGVzdERhdGFNb2RlbC5GT08pKTsKLSAgICB9Ci0gICAgCi0JcHVibGljIHZvaWQgdGVzdFZhbGlkRXh0ZW5zaW9uSUQoKSB7Ci0JCUlEYXRhTW9kZWwgZGF0YU1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwoIm9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuSVRlc3REYXRhTW9kZWwiKTsKLQkJYXNzZXJ0VHJ1ZShkYXRhTW9kZWwuaXNQcm9wZXJ0eShJVGVzdERhdGFNb2RlbC5GT08pKTsKLQl9Ci0gICAgCi0JcHVibGljIHZvaWQgdGVzdFZhbGlkRXh0ZW5zaW9uQ2xhc3MoKSB7Ci0JCUlEYXRhTW9kZWwgZGF0YU1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwoSVRlc3REYXRhTW9kZWwuY2xhc3MpOwotCQlhc3NlcnRUcnVlKGRhdGFNb2RlbC5pc1Byb3BlcnR5KElUZXN0RGF0YU1vZGVsLkZPTykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWxpZEV4dGVuc2lvbkluc3RhbmNlKCkgewotCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBUZXN0RGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCWFzc2VydFRydWUoZGF0YU1vZGVsLmlzUHJvcGVydHkoSVRlc3REYXRhTW9kZWwuRk9PKSk7Ci0JfQotCi0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL0V2ZW50VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL0V2ZW50VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTgzODcxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9FdmVudFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgRXZlbnRUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIHZvaWQgdGVzdEV2ZW50Q3JlYXRpb24oKSB7Ci0JCUlEYXRhTW9kZWwgZG0gPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgQSgpKTsKLQkJZG0uc2V0UHJvcGVydHkoQS5QLCAiYWFhIik7Ci0JCURhdGFNb2RlbEV2ZW50IGV2ZW50ID0gbmV3IERhdGFNb2RlbEV2ZW50KGRtLCBBLlAsIERhdGFNb2RlbEV2ZW50LlZBTFVFX0NIRyk7Ci0JCWFzc2VydEVxdWFscyhkbSwgZXZlbnQuZ2V0RGF0YU1vZGVsKCkpOwotCQlhc3NlcnRFcXVhbHMoQS5QLCBldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWFhIiwgZXZlbnQuZ2V0UHJvcGVydHkoKSk7Ci0JCWFzc2VydEVxdWFscyhEYXRhTW9kZWxFdmVudC5WQUxVRV9DSEcsIGV2ZW50LmdldEZsYWcoKSk7Ci0JCWRtLnNldFByb3BlcnR5KEEuUCwgImJiYiIpOwotCQlhc3NlcnRFcXVhbHMoImJiYiIsIGV2ZW50LmdldFByb3BlcnR5KCkpOwotCQlldmVudCA9IG5ldyBEYXRhTW9kZWxFdmVudChkbSwgQS5QLCBEYXRhTW9kZWxFdmVudC5FTkFCTEVfQ0hHKTsKLQkJYXNzZXJ0RXF1YWxzKERhdGFNb2RlbEV2ZW50LkVOQUJMRV9DSEcsIGV2ZW50LmdldEZsYWcoKSk7Ci0JCWFzc2VydEVxdWFscyhkbS5pc1Byb3BlcnR5RW5hYmxlZChBLlApLCBldmVudC5pc1Byb3BlcnR5RW5hYmxlZCgpKTsKLQkJZXZlbnQgPSBuZXcgRGF0YU1vZGVsRXZlbnQoZG0sIEEuUCwgRGF0YU1vZGVsRXZlbnQuVkFMSURfVkFMVUVTX0NIRyk7Ci0JCWFzc2VydEVxdWFscyhEYXRhTW9kZWxFdmVudC5WQUxJRF9WQUxVRVNfQ0hHLCBldmVudC5nZXRGbGFnKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvSGVsbG9PcGVyYXRpb25FeHRlbnNpb24uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9IZWxsb09wZXJhdGlvbkV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2Q5ODdhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9IZWxsb09wZXJhdGlvbkV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgSGVsbG9PcGVyYXRpb25FeHRlbnNpb24gZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiB7Ci0KLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBleGVjdXRlIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIE9LX1NUQVRVUzsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyByZWRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiByZWRvIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIE9LX1NUQVRVUzsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiB1bmRvIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIE9LX1NUQVRVUzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9IZWxsb1Bvc3RPcGVyYXRpb25FeHRlbnNpb24uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9IZWxsb1Bvc3RPcGVyYXRpb25FeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYzNDkwOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvSGVsbG9Qb3N0T3BlcmF0aW9uRXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0czsKLQotcHVibGljIGNsYXNzIEhlbGxvUG9zdE9wZXJhdGlvbkV4dGVuc2lvbiBleHRlbmRzIEhlbGxvT3BlcmF0aW9uRXh0ZW5zaW9uIHsKLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL0hlbGxvUHJlT3BlcmF0aW9uRXh0ZW5zaW9uLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvSGVsbG9QcmVPcGVyYXRpb25FeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNmM2M4NC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvSGVsbG9QcmVPcGVyYXRpb25FeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzOwotCi1wdWJsaWMgY2xhc3MgSGVsbG9QcmVPcGVyYXRpb25FeHRlbnNpb24gZXh0ZW5kcyBIZWxsb09wZXJhdGlvbkV4dGVuc2lvbiB7Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9JVGVzdERhdGFNb2RlbC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL0lUZXN0RGF0YU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ODBmMmQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL0lUZXN0RGF0YU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0czsKLQotcHVibGljIGludGVyZmFjZSBJVGVzdERhdGFNb2RlbCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT08gPSAiSVRlc3REYXRhTW9kZWwuRk9PIjsKLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL05lc3RlZExpc3RlbmluZ1Rlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9OZXN0ZWRMaXN0ZW5pbmdUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyMTc0ZTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL05lc3RlZExpc3RlbmluZ1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgTmVzdGVkTGlzdGVuaW5nVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0ZW5lcnMxKCkgewotCQlUZXN0TGlzdGVuZXIgYUwgPSBuZXcgVGVzdExpc3RlbmVyKCk7Ci0JCVRlc3RMaXN0ZW5lciBiTCA9IG5ldyBUZXN0TGlzdGVuZXIoKTsKLQkJVGVzdExpc3RlbmVyIGNMID0gbmV3IFRlc3RMaXN0ZW5lcigpOwotCi0JCUlEYXRhTW9kZWwgYSA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBBKCkpOwotCQlJRGF0YU1vZGVsIGIgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgQigpKTsKLQkJSURhdGFNb2RlbCBjID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEMoKSk7Ci0JCWEuYWRkTGlzdGVuZXIoYUwpOwotCQliLmFkZExpc3RlbmVyKGJMKTsKLQkJYy5hZGRMaXN0ZW5lcihjTCk7Ci0KLQkJLy8gY3lsaWNhbAotCQlhLmFkZE5lc3RlZE1vZGVsKCJiIiwgYik7Ci0JCWIuYWRkTmVzdGVkTW9kZWwoImMiLCBjKTsKLQkJYy5hZGROZXN0ZWRNb2RlbCgiYSIsIGEpOwotCQlhTC5jbGVhckV2ZW50cygpOwotCQliTC5jbGVhckV2ZW50cygpOwotCQljTC5jbGVhckV2ZW50cygpOwotCQlhLnNldFByb3BlcnR5KEEuUCwgImEiKTsKLQkJYi5zZXRQcm9wZXJ0eShCLlAsICJiIik7Ci0JCWMuc2V0UHJvcGVydHkoQy5QLCAiYyIpOwotCQlMaXN0IGFFdmVudHMgPSBhTC5nZXRFdmVudHMoKTsKLQkJTGlzdCBiRXZlbnRzID0gYkwuZ2V0RXZlbnRzKCk7Ci0JCUxpc3QgY0V2ZW50cyA9IGNMLmdldEV2ZW50cygpOwotCQlhc3NlcnRFcXVhbHMoMywgYUV2ZW50cy5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYkV2ZW50cy5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgY0V2ZW50cy5zaXplKCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotCQkJRGF0YU1vZGVsRXZlbnQgYUV2ZW50ID0gKERhdGFNb2RlbEV2ZW50KSBhRXZlbnRzLmdldChpKTsKLQkJCURhdGFNb2RlbEV2ZW50IGJFdmVudCA9IChEYXRhTW9kZWxFdmVudCkgYkV2ZW50cy5nZXQoaSk7Ci0JCQlEYXRhTW9kZWxFdmVudCBjRXZlbnQgPSAoRGF0YU1vZGVsRXZlbnQpIGNFdmVudHMuZ2V0KGkpOwotCi0JCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IGFFdmVudC5nZXREYXRhTW9kZWwoKTsKLQkJCWFzc2VydEVxdWFscyhiRXZlbnQuZ2V0RGF0YU1vZGVsKCksIGRhdGFNb2RlbCk7Ci0JCQlhc3NlcnRFcXVhbHMoY0V2ZW50LmdldERhdGFNb2RlbCgpLCBkYXRhTW9kZWwpOwotCi0JCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gYUV2ZW50LmdldFByb3BlcnR5TmFtZSgpOwotCQkJYXNzZXJ0RXF1YWxzKGJFdmVudC5nZXRQcm9wZXJ0eU5hbWUoKSwgcHJvcGVydHlOYW1lKTsKLQkJCWFzc2VydEVxdWFscyhjRXZlbnQuZ2V0UHJvcGVydHlOYW1lKCksIHByb3BlcnR5TmFtZSk7Ci0KLQkJCWludCBmbGFnID0gYUV2ZW50LmdldEZsYWcoKTsKLQkJCWFzc2VydEVxdWFscyhiRXZlbnQuZ2V0RmxhZygpLCBmbGFnKTsKLQkJCWFzc2VydEVxdWFscyhjRXZlbnQuZ2V0RmxhZygpLCBmbGFnKTsKLQotCQkJT2JqZWN0IHByb3BlcnR5ID0gYUV2ZW50LmdldFByb3BlcnR5KCk7Ci0JCQlhc3NlcnRFcXVhbHMoYkV2ZW50LmdldFByb3BlcnR5KCksIHByb3BlcnR5KTsKLQkJCWFzc2VydEVxdWFscyhjRXZlbnQuZ2V0UHJvcGVydHkoKSwgcHJvcGVydHkpOwotCQkJc3dpdGNoIChpKSB7Ci0JCQkJY2FzZSAwIDoKLQkJCQkJYXNzZXJ0RXF1YWxzKGEsIGRhdGFNb2RlbCk7Ci0JCQkJCWFzc2VydEVxdWFscyhmbGFnLCBEYXRhTW9kZWxFdmVudC5WQUxVRV9DSEcpOwotCQkJCQlhc3NlcnRFcXVhbHMocHJvcGVydHlOYW1lLCBBLlApOwotCQkJCQlhc3NlcnRFcXVhbHMocHJvcGVydHksICJhIik7Ci0JCQkJCWFzc2VydFRydWUoZGF0YU1vZGVsLmlzUHJvcGVydHlTZXQocHJvcGVydHlOYW1lKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMSA6Ci0JCQkJCWFzc2VydEVxdWFscyhiLCBkYXRhTW9kZWwpOwotCQkJCQlhc3NlcnRFcXVhbHMoZmxhZywgRGF0YU1vZGVsRXZlbnQuVkFMVUVfQ0hHKTsKLQkJCQkJYXNzZXJ0RXF1YWxzKHByb3BlcnR5TmFtZSwgQi5QKTsKLQkJCQkJYXNzZXJ0RXF1YWxzKHByb3BlcnR5LCAiYiIpOwotCQkJCQlhc3NlcnRUcnVlKGRhdGFNb2RlbC5pc1Byb3BlcnR5U2V0KHByb3BlcnR5TmFtZSkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDIgOgotCQkJCQlhc3NlcnRFcXVhbHMoYywgZGF0YU1vZGVsKTsKLQkJCQkJYXNzZXJ0RXF1YWxzKGZsYWcsIERhdGFNb2RlbEV2ZW50LlZBTFVFX0NIRyk7Ci0JCQkJCWFzc2VydEVxdWFscyhwcm9wZXJ0eU5hbWUsIEMuUCk7Ci0JCQkJCWFzc2VydEVxdWFscyhwcm9wZXJ0eSwgImMiKTsKLQkJCQkJYXNzZXJ0VHJ1ZShkYXRhTW9kZWwuaXNQcm9wZXJ0eVNldChwcm9wZXJ0eU5hbWUpKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlhTC5jbGVhckV2ZW50cygpOwotCQliTC5jbGVhckV2ZW50cygpOwotCQljTC5jbGVhckV2ZW50cygpOwotCQlhLnNldFByb3BlcnR5KEEuUCwgbnVsbCk7Ci0JCWIuc2V0UHJvcGVydHkoQi5QLCBudWxsKTsKLQkJYy5zZXRQcm9wZXJ0eShDLlAsIG51bGwpOwotCQlhRXZlbnRzID0gYUwuZ2V0RXZlbnRzKCk7Ci0JCWJFdmVudHMgPSBiTC5nZXRFdmVudHMoKTsKLQkJY0V2ZW50cyA9IGNMLmdldEV2ZW50cygpOwotCQlhc3NlcnRFcXVhbHMoMywgYUV2ZW50cy5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYkV2ZW50cy5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgY0V2ZW50cy5zaXplKCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotCQkJRGF0YU1vZGVsRXZlbnQgYUV2ZW50ID0gKERhdGFNb2RlbEV2ZW50KSBhRXZlbnRzLmdldChpKTsKLQkJCURhdGFNb2RlbEV2ZW50IGJFdmVudCA9IChEYXRhTW9kZWxFdmVudCkgYkV2ZW50cy5nZXQoaSk7Ci0JCQlEYXRhTW9kZWxFdmVudCBjRXZlbnQgPSAoRGF0YU1vZGVsRXZlbnQpIGNFdmVudHMuZ2V0KGkpOwotCi0JCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IGFFdmVudC5nZXREYXRhTW9kZWwoKTsKLQkJCWFzc2VydEVxdWFscyhiRXZlbnQuZ2V0RGF0YU1vZGVsKCksIGRhdGFNb2RlbCk7Ci0JCQlhc3NlcnRFcXVhbHMoY0V2ZW50LmdldERhdGFNb2RlbCgpLCBkYXRhTW9kZWwpOwotCi0JCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gYUV2ZW50LmdldFByb3BlcnR5TmFtZSgpOwotCQkJYXNzZXJ0RXF1YWxzKGJFdmVudC5nZXRQcm9wZXJ0eU5hbWUoKSwgcHJvcGVydHlOYW1lKTsKLQkJCWFzc2VydEVxdWFscyhjRXZlbnQuZ2V0UHJvcGVydHlOYW1lKCksIHByb3BlcnR5TmFtZSk7Ci0KLQkJCWludCBmbGFnID0gYUV2ZW50LmdldEZsYWcoKTsKLQkJCWFzc2VydEVxdWFscyhiRXZlbnQuZ2V0RmxhZygpLCBmbGFnKTsKLQkJCWFzc2VydEVxdWFscyhjRXZlbnQuZ2V0RmxhZygpLCBmbGFnKTsKLQotCQkJT2JqZWN0IHByb3BlcnR5ID0gYUV2ZW50LmdldFByb3BlcnR5KCk7Ci0JCQlhc3NlcnRFcXVhbHMoYkV2ZW50LmdldFByb3BlcnR5KCksIHByb3BlcnR5KTsKLQkJCWFzc2VydEVxdWFscyhjRXZlbnQuZ2V0UHJvcGVydHkoKSwgcHJvcGVydHkpOwotCQkJc3dpdGNoIChpKSB7Ci0JCQkJY2FzZSAwIDoKLQkJCQkJYXNzZXJ0RXF1YWxzKGEsIGRhdGFNb2RlbCk7Ci0JCQkJCWFzc2VydEVxdWFscyhmbGFnLCBEYXRhTW9kZWxFdmVudC5WQUxVRV9DSEcpOwotCQkJCQlhc3NlcnRFcXVhbHMocHJvcGVydHlOYW1lLCBBLlApOwotCQkJCQlhc3NlcnRUcnVlKCFkYXRhTW9kZWwuaXNQcm9wZXJ0eVNldChwcm9wZXJ0eU5hbWUpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAxIDoKLQkJCQkJYXNzZXJ0RXF1YWxzKGIsIGRhdGFNb2RlbCk7Ci0JCQkJCWFzc2VydEVxdWFscyhmbGFnLCBEYXRhTW9kZWxFdmVudC5WQUxVRV9DSEcpOwotCQkJCQlhc3NlcnRFcXVhbHMocHJvcGVydHlOYW1lLCBCLlApOwotCQkJCQlhc3NlcnRUcnVlKCFkYXRhTW9kZWwuaXNQcm9wZXJ0eVNldChwcm9wZXJ0eU5hbWUpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyIDoKLQkJCQkJYXNzZXJ0RXF1YWxzKGMsIGRhdGFNb2RlbCk7Ci0JCQkJCWFzc2VydEVxdWFscyhmbGFnLCBEYXRhTW9kZWxFdmVudC5WQUxVRV9DSEcpOwotCQkJCQlhc3NlcnRFcXVhbHMocHJvcGVydHlOYW1lLCBDLlApOwotCQkJCQlhc3NlcnRUcnVlKCFkYXRhTW9kZWwuaXNQcm9wZXJ0eVNldChwcm9wZXJ0eU5hbWUpKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvTmVzdGluZ1Rlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9OZXN0aW5nVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTk4OWM1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9OZXN0aW5nVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLldUUFJlc291cmNlSGFuZGxlcjsKLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICovCi1wdWJsaWMgY2xhc3MgTmVzdGluZ1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIElEYXRhTW9kZWwgYTsKLQlwcml2YXRlIElEYXRhTW9kZWwgYjsKLQlwcml2YXRlIElEYXRhTW9kZWwgYzsKLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCWEgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgQSgpKTsKLQkJYiA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBCKCkpOwotCQljID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKG51bGwgIT0gYSkgewotCQkJYS5kaXNwb3NlKCk7Ci0JCQlhID0gbnVsbDsKLQkJfQotCQlpZiAobnVsbCAhPSBiKSB7Ci0JCQliLmRpc3Bvc2UoKTsKLQkJCWIgPSBudWxsOwotCQl9Ci0KLQkJaWYgKG51bGwgIT0gYykgewotCQkJYy5kaXNwb3NlKCk7Ci0JCQljID0gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkTmVzdGVkTW9kZWwoKSB7Ci0JCVN0cmluZyBORVNURURfTU9ERUxfTk9UX0xPQ0FURUQgPSBXVFBSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCIyMSIpOyAvLyROT04tTkxTLTEkCi0JCUV4Y2VwdGlvbiBleCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlhLmdldE5lc3RlZE1vZGVsKCJmb28iKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlleCA9IGU7Ci0JCX0KLQkJQXNzZXJ0LmFzc2VydE5vdE51bGwoZXgpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShleC5nZXRNZXNzYWdlKCkuc3RhcnRzV2l0aChORVNURURfTU9ERUxfTk9UX0xPQ0FURUQpKTsKLQkJZXggPSBudWxsOwotCQl0cnkgewotCQkJYS5nZXROZXN0ZWRNb2RlbChudWxsKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlleCA9IGU7Ci0JCX0KLQkJQXNzZXJ0LmFzc2VydE5vdE51bGwoZXgpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShleC5nZXRNZXNzYWdlKCkuc3RhcnRzV2l0aChORVNURURfTU9ERUxfTk9UX0xPQ0FURUQpKTsKLQotCQlhLmFkZE5lc3RlZE1vZGVsKCJiIiwgYik7Ci0JCWV4ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWEuZ2V0TmVzdGVkTW9kZWwobnVsbCk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJZXggPSBlOwotCQl9Ci0JCUFzc2VydC5hc3NlcnROb3ROdWxsKGV4KTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoZXguZ2V0TWVzc2FnZSgpLnN0YXJ0c1dpdGgoTkVTVEVEX01PREVMX05PVF9MT0NBVEVEKSk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNOZXN0ZWRNb2RlbCgpIHsKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGEuaXNOZXN0ZWRNb2RlbCgiIikpOwotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoYS5pc05lc3RlZE1vZGVsKG51bGwpKTsKLQkJYS5hZGROZXN0ZWRNb2RlbCgiYiIsIGIpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShhLmlzTmVzdGVkTW9kZWwoImIiKSk7Ci0JCUFzc2VydC5hc3NlcnRGYWxzZShhLmlzTmVzdGVkTW9kZWwoImMiKSk7Ci0JCWEuYWRkTmVzdGVkTW9kZWwoImMiLCBjKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYS5pc05lc3RlZE1vZGVsKCJjIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVOb25FeGlzdGVudE1vZGVscygpIHsKLQkJQXNzZXJ0LmFzc2VydE51bGwoYS5yZW1vdmVOZXN0ZWRNb2RlbCgiYSIpKTsKLQkJQXNzZXJ0LmFzc2VydE51bGwoYS5yZW1vdmVOZXN0ZWRNb2RlbChudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE5lc3RlZEFuZEdldE5lc3RpbmcoKSB7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoMCwgYS5nZXROZXN0ZWRNb2RlbHMoKS5zaXplKCkpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIGIuZ2V0TmVzdGluZ01vZGVscygpLnNpemUoKSk7Ci0KLQkJQXNzZXJ0LmFzc2VydFRydWUoYS5hZGROZXN0ZWRNb2RlbCgiYiIsIGIpKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygxLCBhLmdldE5lc3RlZE1vZGVscygpLnNpemUoKSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGEuZ2V0TmVzdGVkTW9kZWxzKCkuY29udGFpbnMoYikpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKGIsIGEuZ2V0TmVzdGVkTW9kZWwoImIiKSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoMSwgYi5nZXROZXN0aW5nTW9kZWxzKCkuc2l6ZSgpKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYi5nZXROZXN0aW5nTW9kZWxzKCkuY29udGFpbnMoYSkpOwotCi0JCUFzc2VydC5hc3NlcnRUcnVlKGEuYWRkTmVzdGVkTW9kZWwoImMiLCBjKSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoMiwgYS5nZXROZXN0ZWRNb2RlbHMoKS5zaXplKCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShhLmdldE5lc3RlZE1vZGVscygpLmNvbnRhaW5zKGMpKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscyhjLCBhLmdldE5lc3RlZE1vZGVsKCJjIikpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIGMuZ2V0TmVzdGluZ01vZGVscygpLnNpemUoKSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGMuZ2V0TmVzdGluZ01vZGVscygpLmNvbnRhaW5zKGEpKTsKLQotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShiLmFkZE5lc3RlZE1vZGVsKCJjIiwgYykpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIGIuZ2V0TmVzdGVkTW9kZWxzKCkuc2l6ZSgpKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYi5nZXROZXN0ZWRNb2RlbHMoKS5jb250YWlucyhjKSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoMiwgYy5nZXROZXN0aW5nTW9kZWxzKCkuc2l6ZSgpKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYy5nZXROZXN0aW5nTW9kZWxzKCkuY29udGFpbnMoYikpOwotCi0JCUFzc2VydC5hc3NlcnRFcXVhbHMoYiwgYS5yZW1vdmVOZXN0ZWRNb2RlbCgiYiIpKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygxLCBhLmdldE5lc3RlZE1vZGVscygpLnNpemUoKSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoMCwgYi5nZXROZXN0aW5nTW9kZWxzKCkuc2l6ZSgpKTsKLQotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKGMsIGEucmVtb3ZlTmVzdGVkTW9kZWwoImMiKSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoMCwgYS5nZXROZXN0ZWRNb2RlbHMoKS5zaXplKCkpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIGMuZ2V0TmVzdGluZ01vZGVscygpLnNpemUoKSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGMuZ2V0TmVzdGluZ01vZGVscygpLmNvbnRhaW5zKGIpKTsKLQotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKGMsIGIucmVtb3ZlTmVzdGVkTW9kZWwoImMiKSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoMCwgYi5nZXROZXN0ZWRNb2RlbHMoKS5zaXplKCkpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIGMuZ2V0TmVzdGluZ01vZGVscygpLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNlbGZOZXN0KCkgewotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoYS5hZGROZXN0ZWRNb2RlbCgiYSIsIGEpKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygwLCBhLmdldE5lc3RlZE1vZGVscygpLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdER1cGxpY2F0ZU5lc3QoKSB7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGEuYWRkTmVzdGVkTW9kZWwoImIxIiwgYikpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKGIsIGEuZ2V0TmVzdGVkTW9kZWwoImIxIikpOwotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoYS5hZGROZXN0ZWRNb2RlbCgiYjIiLCBiKSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoYiwgYS5nZXROZXN0ZWRNb2RlbCgiYjEiKSk7Ci0JCUFzc2VydC5hc3NlcnRGYWxzZShhLmlzTmVzdGVkTW9kZWwoImIyIikpOwotCX0KLQotCi0JLyoqCi0JICogPGNvZGU+Ci0JICogMSAgICAyICAgMyAgICA0ICAgICA1ICAgIDYKLQkgKiBBICB8IEEgfCBBICB8IEEgICB8IEEgIHwgQQotCSAqICBCIHwgICB8ICBCIHwgIEIgIHwgIEIgfCAgQgotCSAqICAgICAgICAgICAgICAgICBDIHwgICAgfCAgIEMKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdElzUHJvcGVydHlTaW1wbGVOZXN0aW5nMCgpIHsKLQkJYS5hZGROZXN0ZWRNb2RlbCgiYiIsIGIpOyAvLyAxCi0JCUFzc2VydC5hc3NlcnRGYWxzZShhLmlzQmFzZVByb3BlcnR5KEIuUCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShhLmlzUHJvcGVydHkoQi5QKSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGEuaXNOZXN0ZWRQcm9wZXJ0eShCLlApKTsKLQotCQlhLnJlbW92ZU5lc3RlZE1vZGVsKCJiIik7IC8vIDIKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGEuaXNCYXNlUHJvcGVydHkoQi5QKSk7Ci0JCUFzc2VydC5hc3NlcnRGYWxzZShhLmlzUHJvcGVydHkoQi5QKSk7Ci0JCUFzc2VydC5hc3NlcnRGYWxzZShhLmlzTmVzdGVkUHJvcGVydHkoQi5QKSk7Ci0KLQkJYS5hZGROZXN0ZWRNb2RlbCgiYiIsIGIpOyAvLyAzCi0JCUFzc2VydC5hc3NlcnRGYWxzZShhLmlzQmFzZVByb3BlcnR5KEIuUCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShhLmlzUHJvcGVydHkoQi5QKSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGEuaXNOZXN0ZWRQcm9wZXJ0eShCLlApKTsKLQotCQliLmFkZE5lc3RlZE1vZGVsKCJjIiwgYyk7IC8vIDQKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGEuaXNCYXNlUHJvcGVydHkoQy5QKSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGEuaXNQcm9wZXJ0eShDLlApKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYS5pc05lc3RlZFByb3BlcnR5KEMuUCkpOwotCi0JCWIucmVtb3ZlTmVzdGVkTW9kZWwoImMiKTsgLy8gNQotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoYS5pc0Jhc2VQcm9wZXJ0eShDLlApKTsKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGEuaXNQcm9wZXJ0eShDLlApKTsKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGEuaXNOZXN0ZWRQcm9wZXJ0eShDLlApKTsKLQotCQliLmFkZE5lc3RlZE1vZGVsKCJjIiwgYyk7IC8vIDYKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGEuaXNCYXNlUHJvcGVydHkoQy5QKSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGEuaXNQcm9wZXJ0eShDLlApKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYS5pc05lc3RlZFByb3BlcnR5KEMuUCkpOwotCX0KLQotCS8qKgotCSAqIDxjb2RlPgotCSAqIDEgICAgMiAgICAgMyAgICA0Ci0JICogQSAgfCBBICAgfCBBICB8IEEKLQkgKiAgQiB8ICBCICB8ICBCIHwKLQkgKiAgICAgICAgQyB8ICAgIHwKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdElzUHJvcGVydHlTaW1wbGVOZXN0aW5nMSgpIHsKLQkJYS5hZGROZXN0ZWRNb2RlbCgiYiIsIGIpOyAvLyAxCi0JCUFzc2VydC5hc3NlcnRGYWxzZShhLmlzQmFzZVByb3BlcnR5KEIuUCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShhLmlzUHJvcGVydHkoQi5QKSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGEuaXNOZXN0ZWRQcm9wZXJ0eShCLlApKTsKLQkJLy8gY2hlY2sgYSdzIG5lc3RlZAotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShiID09IGEuZ2V0TmVzdGVkTW9kZWwoImIiKSk7Ci0JCUNvbGxlY3Rpb24gbmVzdGVkTW9kZWxOYW1lcyA9IGEuZ2V0TmVzdGVkTW9kZWxOYW1lcygpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIG5lc3RlZE1vZGVsTmFtZXMuc2l6ZSgpKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUobmVzdGVkTW9kZWxOYW1lcy5jb250YWlucygiYiIpKTsKLQkJQ29sbGVjdGlvbiBiYXNlUHJvcGVydGllcyA9IGEuZ2V0QmFzZVByb3BlcnRpZXMoKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygzLCBiYXNlUHJvcGVydGllcy5zaXplKCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShiYXNlUHJvcGVydGllcy5jb250YWlucyhBLlApKTsKLQkJQ29sbGVjdGlvbiBuZXN0ZWRQcm9wZXJ0aWVzID0gYS5nZXROZXN0ZWRQcm9wZXJ0aWVzKCk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoMywgbmVzdGVkUHJvcGVydGllcy5zaXplKCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShuZXN0ZWRQcm9wZXJ0aWVzLmNvbnRhaW5zKEIuUCkpOwotCQlDb2xsZWN0aW9uIGFsbFByb3BlcnRpZXMgPSBhLmdldEFsbFByb3BlcnRpZXMoKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscyg0LCBhbGxQcm9wZXJ0aWVzLnNpemUoKSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGFsbFByb3BlcnRpZXMuY29udGFpbnMoQS5QKSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGFsbFByb3BlcnRpZXMuY29udGFpbnMoQi5QKSk7Ci0KLQotCQliLmFkZE5lc3RlZE1vZGVsKCJjIiwgYyk7IC8vIDIKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGEuaXNCYXNlUHJvcGVydHkoQy5QKSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGEuaXNQcm9wZXJ0eShDLlApKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYS5pc05lc3RlZFByb3BlcnR5KEMuUCkpOwotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoYi5pc0Jhc2VQcm9wZXJ0eShDLlApKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYi5pc1Byb3BlcnR5KEMuUCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShiLmlzTmVzdGVkUHJvcGVydHkoQy5QKSk7Ci0JCS8vIGNoZWNrIGEncyBuZXN0ZWQKLQkJQXNzZXJ0LmFzc2VydFRydWUoYiA9PSBhLmdldE5lc3RlZE1vZGVsKCJiIikpOwotCQluZXN0ZWRNb2RlbE5hbWVzID0gYS5nZXROZXN0ZWRNb2RlbE5hbWVzKCk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoMSwgbmVzdGVkTW9kZWxOYW1lcy5zaXplKCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShuZXN0ZWRNb2RlbE5hbWVzLmNvbnRhaW5zKCJiIikpOwotCQliYXNlUHJvcGVydGllcyA9IGEuZ2V0QmFzZVByb3BlcnRpZXMoKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygzLCBiYXNlUHJvcGVydGllcy5zaXplKCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShiYXNlUHJvcGVydGllcy5jb250YWlucyhBLlApKTsKLQkJbmVzdGVkUHJvcGVydGllcyA9IGEuZ2V0TmVzdGVkUHJvcGVydGllcygpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKDQsIG5lc3RlZFByb3BlcnRpZXMuc2l6ZSgpKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUobmVzdGVkUHJvcGVydGllcy5jb250YWlucyhCLlApKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUobmVzdGVkUHJvcGVydGllcy5jb250YWlucyhDLlApKTsKLQkJYWxsUHJvcGVydGllcyA9IGEuZ2V0QWxsUHJvcGVydGllcygpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKDUsIGFsbFByb3BlcnRpZXMuc2l6ZSgpKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYWxsUHJvcGVydGllcy5jb250YWlucyhBLlApKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYWxsUHJvcGVydGllcy5jb250YWlucyhCLlApKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYWxsUHJvcGVydGllcy5jb250YWlucyhDLlApKTsKLQkJLy8gY2hlY2sgYidzIG5lc3RlZAotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShjID09IGIuZ2V0TmVzdGVkTW9kZWwoImMiKSk7Ci0JCW5lc3RlZE1vZGVsTmFtZXMgPSBiLmdldE5lc3RlZE1vZGVsTmFtZXMoKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygxLCBuZXN0ZWRNb2RlbE5hbWVzLnNpemUoKSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKG5lc3RlZE1vZGVsTmFtZXMuY29udGFpbnMoImMiKSk7Ci0JCWJhc2VQcm9wZXJ0aWVzID0gYi5nZXRCYXNlUHJvcGVydGllcygpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKDMsIGJhc2VQcm9wZXJ0aWVzLnNpemUoKSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGJhc2VQcm9wZXJ0aWVzLmNvbnRhaW5zKEIuUCkpOwotCQluZXN0ZWRQcm9wZXJ0aWVzID0gYi5nZXROZXN0ZWRQcm9wZXJ0aWVzKCk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoMywgbmVzdGVkUHJvcGVydGllcy5zaXplKCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShuZXN0ZWRQcm9wZXJ0aWVzLmNvbnRhaW5zKEMuUCkpOwotCQlhbGxQcm9wZXJ0aWVzID0gYi5nZXRBbGxQcm9wZXJ0aWVzKCk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoNCwgYWxsUHJvcGVydGllcy5zaXplKCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShhbGxQcm9wZXJ0aWVzLmNvbnRhaW5zKEIuUCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShhbGxQcm9wZXJ0aWVzLmNvbnRhaW5zKEMuUCkpOwotCi0JCWIucmVtb3ZlTmVzdGVkTW9kZWwoImMiKTsgLy8gMwotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoYS5pc0Jhc2VQcm9wZXJ0eShDLlApKTsKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGEuaXNQcm9wZXJ0eShDLlApKTsKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGEuaXNOZXN0ZWRQcm9wZXJ0eShDLlApKTsKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGIuaXNCYXNlUHJvcGVydHkoQy5QKSk7Ci0JCUFzc2VydC5hc3NlcnRGYWxzZShiLmlzUHJvcGVydHkoQy5QKSk7Ci0JCUFzc2VydC5hc3NlcnRGYWxzZShiLmlzTmVzdGVkUHJvcGVydHkoQy5QKSk7Ci0JCS8vIGNoZWNrIGEncyBuZXN0ZWQKLQkJQXNzZXJ0LmFzc2VydFRydWUoYiA9PSBhLmdldE5lc3RlZE1vZGVsKCJiIikpOwotCQluZXN0ZWRNb2RlbE5hbWVzID0gYS5nZXROZXN0ZWRNb2RlbE5hbWVzKCk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoMSwgbmVzdGVkTW9kZWxOYW1lcy5zaXplKCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShuZXN0ZWRNb2RlbE5hbWVzLmNvbnRhaW5zKCJiIikpOwotCQliYXNlUHJvcGVydGllcyA9IGEuZ2V0QmFzZVByb3BlcnRpZXMoKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygzLCBiYXNlUHJvcGVydGllcy5zaXplKCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShiYXNlUHJvcGVydGllcy5jb250YWlucyhBLlApKTsKLQkJbmVzdGVkUHJvcGVydGllcyA9IGEuZ2V0TmVzdGVkUHJvcGVydGllcygpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKDMsIG5lc3RlZFByb3BlcnRpZXMuc2l6ZSgpKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUobmVzdGVkUHJvcGVydGllcy5jb250YWlucyhCLlApKTsKLQkJYWxsUHJvcGVydGllcyA9IGEuZ2V0QWxsUHJvcGVydGllcygpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKDQsIGFsbFByb3BlcnRpZXMuc2l6ZSgpKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYWxsUHJvcGVydGllcy5jb250YWlucyhBLlApKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYWxsUHJvcGVydGllcy5jb250YWlucyhCLlApKTsKLQkJLy8gY2hlY2sgYidzIG5lc3RlZAotCQluZXN0ZWRNb2RlbE5hbWVzID0gYi5nZXROZXN0ZWRNb2RlbE5hbWVzKCk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbmVzdGVkTW9kZWxOYW1lcy5zaXplKCkpOwotCQliYXNlUHJvcGVydGllcyA9IGIuZ2V0QmFzZVByb3BlcnRpZXMoKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygzLCBiYXNlUHJvcGVydGllcy5zaXplKCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShiYXNlUHJvcGVydGllcy5jb250YWlucyhCLlApKTsKLQkJbmVzdGVkUHJvcGVydGllcyA9IGIuZ2V0TmVzdGVkUHJvcGVydGllcygpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG5lc3RlZFByb3BlcnRpZXMuc2l6ZSgpKTsKLQkJYWxsUHJvcGVydGllcyA9IGIuZ2V0QWxsUHJvcGVydGllcygpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKDMsIGFsbFByb3BlcnRpZXMuc2l6ZSgpKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYWxsUHJvcGVydGllcy5jb250YWlucyhCLlApKTsKLQotCQlhLnJlbW92ZU5lc3RlZE1vZGVsKCJiIik7IC8vIDQKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGEuaXNCYXNlUHJvcGVydHkoQi5QKSk7Ci0JCUFzc2VydC5hc3NlcnRGYWxzZShhLmlzUHJvcGVydHkoQi5QKSk7Ci0JCUFzc2VydC5hc3NlcnRGYWxzZShhLmlzTmVzdGVkUHJvcGVydHkoQi5QKSk7Ci0JCS8vIGNoZWNrIGEncyBuZXN0ZWQKLQkJbmVzdGVkTW9kZWxOYW1lcyA9IGEuZ2V0TmVzdGVkTW9kZWxOYW1lcygpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG5lc3RlZE1vZGVsTmFtZXMuc2l6ZSgpKTsKLQkJYmFzZVByb3BlcnRpZXMgPSBhLmdldEJhc2VQcm9wZXJ0aWVzKCk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoMywgYmFzZVByb3BlcnRpZXMuc2l6ZSgpKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYmFzZVByb3BlcnRpZXMuY29udGFpbnMoQS5QKSk7Ci0JCW5lc3RlZFByb3BlcnRpZXMgPSBhLmdldE5lc3RlZFByb3BlcnRpZXMoKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygyLCBuZXN0ZWRQcm9wZXJ0aWVzLnNpemUoKSk7Ci0JCWFsbFByb3BlcnRpZXMgPSBhLmdldEFsbFByb3BlcnRpZXMoKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygzLCBhbGxQcm9wZXJ0aWVzLnNpemUoKSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGFsbFByb3BlcnRpZXMuY29udGFpbnMoQS5QKSk7Ci0JfQotCi0JLyoqCi0JICogPGNvZGU+Ci0JICogMSAgICAyICAgICAzICAgIDQgCi0JICogQSAgfCBBICAgfCBBICB8IEEKLQkgKiAgICB8ICBCICB8ICAgIHwgCi0JICogQiAgfCAgIEMgfCBCICB8IEIKLQkgKiAgQyB8ICAgICB8ICBDIHwgCi0JICogICAgICAgICAgfCAgICB8IEMKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdElzUHJvcGVydHlTaW1wbGVOZXN0aW5nMigpIHsKLQkJYi5hZGROZXN0ZWRNb2RlbCgiYyIsIGMpOyAvLyAxCi0JCUFzc2VydC5hc3NlcnRUcnVlKGIuaXNQcm9wZXJ0eShDLlApKTsKLQotCQlhLmFkZE5lc3RlZE1vZGVsKCJiIiwgYik7IC8vIDIKLQkJQXNzZXJ0LmFzc2VydFRydWUoYS5pc1Byb3BlcnR5KEIuUCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShhLmlzUHJvcGVydHkoQy5QKSk7Ci0KLQkJYS5yZW1vdmVOZXN0ZWRNb2RlbCgiYiIpOyAvLyAzCi0JCUFzc2VydC5hc3NlcnRGYWxzZShhLmlzUHJvcGVydHkoQi5QKSk7Ci0JCUFzc2VydC5hc3NlcnRGYWxzZShhLmlzUHJvcGVydHkoQy5QKSk7Ci0KLQkJYi5yZW1vdmVOZXN0ZWRNb2RlbCgiYyIpOyAvLyA0Ci0JCUFzc2VydC5hc3NlcnRGYWxzZShiLmlzUHJvcGVydHkoQy5QKSk7Ci0JfQotCi0JLyoqCi0JICogPGNvZGU+Ci0JICogMSAgICAyICAgICAzICAgICAgNCAgICAgNQotCSAqIEEgIHwgQSAgIHwgQSAgICB8IEEgICB8IEEKLQkgKiAgQiB8ICBCICB8ICBCICAgfCAgQiAgfCAgQgotCSAqICAgICAgICBDIHwgICBDICB8ICAgQyB8Ci0JICogICAgICAgICAgfCAgIEMyIHwKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdElzUHJvcGVydHlDb21wbGV4TmVzdGluZzEoKSB7Ci0JCWEuYWRkTmVzdGVkTW9kZWwoImIiLCBiKTsgLy8gMQotCQliLmFkZE5lc3RlZE1vZGVsKCJjIiwgYyk7IC8vIDIKLQkJQXNzZXJ0LmFzc2VydFRydWUoYS5pc1Byb3BlcnR5KEMuUCkpOwotCQlJRGF0YU1vZGVsIGMyID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEMoKSk7Ci0JCWIuYWRkTmVzdGVkTW9kZWwoImMyIiwgYzIpOyAvLyAzCi0JCWIucmVtb3ZlTmVzdGVkTW9kZWwoImMyIik7IC8vIDQKLQkJQXNzZXJ0LmFzc2VydFRydWUoYi5pc1Byb3BlcnR5KEMuUCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShhLmlzUHJvcGVydHkoQy5QKSk7Ci0JCWIucmVtb3ZlTmVzdGVkTW9kZWwoImMiKTsgLy8gNQotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoYi5pc1Byb3BlcnR5KEMuUCkpOwotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoYS5pc1Byb3BlcnR5KEMuUCkpOwotCX0KLQotCS8qKgotCSAqIDxjb2RlPgotCSAqIDEgICAgMiAgICAgMyAgICAgNCAgICAgNSAgICAgIDYgICAgICA3Ci0JICogQSAgfCBBICAgfCBBICAgfCBBICAgfCBBICAgIHwgQSAgICB8IEEKLQkgKiAgQiB8ICBCICB8ICBCICB8ICBCICB8ICBCICAgfCAgQiAgIHwgIEIKLQkgKiAgICAgICAgQyB8ICAgQyB8ICAgQyB8ICAgQyAgfCAgIEMyIHwKLQkgKiAgICAgICAgICAgICBDMiB8ICAgICAgICAgQzIgfAotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0SXNQcm9wZXJ0eUNvbXBsZXhOZXN0aW5nMigpIHsKLQkJYS5hZGROZXN0ZWRNb2RlbCgiYiIsIGIpOyAvLyAxCi0JCWIuYWRkTmVzdGVkTW9kZWwoImMiLCBjKTsgLy8gMgotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShhLmlzUHJvcGVydHkoQy5QKSk7Ci0JCUlEYXRhTW9kZWwgYzIgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgQygpKTsKLQkJYS5hZGROZXN0ZWRNb2RlbCgiYzIiLCBjMik7IC8vIDMKLQkJYS5yZW1vdmVOZXN0ZWRNb2RlbCgiYzIiKTsgLy8gNAotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShhLmlzUHJvcGVydHkoQy5QKSk7Ci0JCWIuYWRkTmVzdGVkTW9kZWwoImMyIiwgYzIpOyAvLyA1Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGEuaXNQcm9wZXJ0eShDLlApKTsKLQkJYi5yZW1vdmVOZXN0ZWRNb2RlbCgiYyIpOyAvLyA2Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGEuaXNQcm9wZXJ0eShDLlApKTsKLQkJYi5yZW1vdmVOZXN0ZWRNb2RlbCgiYzIiKTsgLy8gNwotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoYS5pc1Byb3BlcnR5KEMuUCkpOwotCX0KLQotCS8qKgotCSAqIDxjb2RlPgotCSAqIDEgICAgIDIgICAgICAgICAgICAgMyAgICAgIDQgICAgICAgICAgICAgNSAgICAgNgotCSAqIEEgICB8IEEgICAgICAgICAgIHwgQiAgICB8IEEgICAgICAgICAgfCAgQyAgIHwgQQotCSAqICBCICB8ICBCICAgICAgICAgIHwgIEMgICB8ICBCICAgICAgICAgfCAgIEEgIHwgQgotCSAqICAgQyB8ICAgQyAgICAgICAgIHwgICBBICB8ICAgQyAgICAgICAgfCAgICBCIHwgQwotCSAqICAgICAgICAgIEEgKGxvb3ApIHwgICAgICB8ICAgIEEobG9vcCkKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdElzUHJvcGVydHlDb21wbGV4TmVzdGluZzMoKSB7Ci0JCWEuYWRkTmVzdGVkTW9kZWwoImIiLCBiKTsKLQkJYi5hZGROZXN0ZWRNb2RlbCgiYyIsIGMpOyAvLyAxCi0JCUFzc2VydC5hc3NlcnRUcnVlKGEuaXNQcm9wZXJ0eShCLlApKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYS5pc1Byb3BlcnR5KEMuUCkpOwotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoYi5pc1Byb3BlcnR5KEEuUCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShiLmlzUHJvcGVydHkoQy5QKSk7Ci0JCUFzc2VydC5hc3NlcnRGYWxzZShjLmlzUHJvcGVydHkoQS5QKSk7Ci0JCUFzc2VydC5hc3NlcnRGYWxzZShjLmlzUHJvcGVydHkoQi5QKSk7Ci0JCUFzc2VydC5hc3NlcnRGYWxzZShhLmlzUHJvcGVydHkoImZvbyIpKTsKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGIuaXNQcm9wZXJ0eSgiZm9vIikpOwotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoYy5pc1Byb3BlcnR5KCJmb28iKSk7Ci0JCWMuYWRkTmVzdGVkTW9kZWwoImEiLCBhKTsgLy8gMgotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShhLmlzUHJvcGVydHkoQi5QKSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGEuaXNQcm9wZXJ0eShDLlApKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYi5pc1Byb3BlcnR5KEEuUCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShiLmlzUHJvcGVydHkoQy5QKSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGMuaXNQcm9wZXJ0eShBLlApKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYy5pc1Byb3BlcnR5KEIuUCkpOwotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoYS5pc1Byb3BlcnR5KCJmb28iKSk7Ci0JCUFzc2VydC5hc3NlcnRGYWxzZShiLmlzUHJvcGVydHkoImZvbyIpKTsKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGMuaXNQcm9wZXJ0eSgiZm9vIikpOwotCQlhLnJlbW92ZU5lc3RlZE1vZGVsKCJiIik7IC8vIDMKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGEuaXNQcm9wZXJ0eShCLlApKTsKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGEuaXNQcm9wZXJ0eShDLlApKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYi5pc1Byb3BlcnR5KEEuUCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShiLmlzUHJvcGVydHkoQy5QKSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGMuaXNQcm9wZXJ0eShBLlApKTsKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGMuaXNQcm9wZXJ0eShCLlApKTsKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGEuaXNQcm9wZXJ0eSgiZm9vIikpOwotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoYi5pc1Byb3BlcnR5KCJmb28iKSk7Ci0JCUFzc2VydC5hc3NlcnRGYWxzZShjLmlzUHJvcGVydHkoImZvbyIpKTsKLQkJYS5hZGROZXN0ZWRNb2RlbCgiYiIsIGIpOyAvLyA0Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGEuaXNQcm9wZXJ0eShCLlApKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYS5pc1Byb3BlcnR5KEMuUCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShiLmlzUHJvcGVydHkoQS5QKSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGIuaXNQcm9wZXJ0eShDLlApKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYy5pc1Byb3BlcnR5KEEuUCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShjLmlzUHJvcGVydHkoQi5QKSk7Ci0JCUFzc2VydC5hc3NlcnRGYWxzZShhLmlzUHJvcGVydHkoImZvbyIpKTsKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGIuaXNQcm9wZXJ0eSgiZm9vIikpOwotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoYy5pc1Byb3BlcnR5KCJmb28iKSk7Ci0JCWIucmVtb3ZlTmVzdGVkTW9kZWwoImMiKTsgLy8gNQotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShhLmlzUHJvcGVydHkoQi5QKSk7Ci0JCUFzc2VydC5hc3NlcnRGYWxzZShhLmlzUHJvcGVydHkoQy5QKSk7Ci0JCUFzc2VydC5hc3NlcnRGYWxzZShiLmlzUHJvcGVydHkoQS5QKSk7Ci0JCUFzc2VydC5hc3NlcnRGYWxzZShiLmlzUHJvcGVydHkoQy5QKSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGMuaXNQcm9wZXJ0eShBLlApKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYy5pc1Byb3BlcnR5KEIuUCkpOwotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoYS5pc1Byb3BlcnR5KCJmb28iKSk7Ci0JCUFzc2VydC5hc3NlcnRGYWxzZShiLmlzUHJvcGVydHkoImZvbyIpKTsKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGMuaXNQcm9wZXJ0eSgiZm9vIikpOwotCQljLnJlbW92ZU5lc3RlZE1vZGVsKCJhIik7Ci0JCWEucmVtb3ZlTmVzdGVkTW9kZWwoImIiKTsKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGEuaXNQcm9wZXJ0eShCLlApKTsKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGEuaXNQcm9wZXJ0eShDLlApKTsKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGIuaXNQcm9wZXJ0eShBLlApKTsKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGIuaXNQcm9wZXJ0eShDLlApKTsKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGMuaXNQcm9wZXJ0eShBLlApKTsKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGMuaXNQcm9wZXJ0eShCLlApKTsKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGEuaXNQcm9wZXJ0eSgiZm9vIikpOwotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoYi5pc1Byb3BlcnR5KCJmb28iKSk7Ci0JCUFzc2VydC5hc3NlcnRGYWxzZShjLmlzUHJvcGVydHkoImZvbyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0R2V0UHJvcGVydHkxKCkgewotCQkvLyBjeWxpY2FsCi0JCWEuYWRkTmVzdGVkTW9kZWwoImIiLCBiKTsKLQkJYi5hZGROZXN0ZWRNb2RlbCgiYyIsIGMpOwotCQljLmFkZE5lc3RlZE1vZGVsKCJhIiwgYSk7Ci0KLQkJYS5zZXRQcm9wZXJ0eShBLlAsICJhIik7Ci0JCWEuc2V0UHJvcGVydHkoQi5QLCAiYiIpOwotCQlhLnNldFByb3BlcnR5KEMuUCwgImMiKTsKLQkJYXNzZXJ0RXF1YWxzKCJhIiwgYS5nZXRQcm9wZXJ0eShBLlApKTsKLQkJYXNzZXJ0RXF1YWxzKCJhIiwgYi5nZXRQcm9wZXJ0eShBLlApKTsKLQkJYXNzZXJ0RXF1YWxzKCJhIiwgYy5nZXRQcm9wZXJ0eShBLlApKTsKLQkJYXNzZXJ0RXF1YWxzKCJiIiwgYS5nZXRQcm9wZXJ0eShCLlApKTsKLQkJYXNzZXJ0RXF1YWxzKCJiIiwgYi5nZXRQcm9wZXJ0eShCLlApKTsKLQkJYXNzZXJ0RXF1YWxzKCJiIiwgYy5nZXRQcm9wZXJ0eShCLlApKTsKLQkJYXNzZXJ0RXF1YWxzKCJjIiwgYS5nZXRQcm9wZXJ0eShDLlApKTsKLQkJYXNzZXJ0RXF1YWxzKCJjIiwgYi5nZXRQcm9wZXJ0eShDLlApKTsKLQkJYXNzZXJ0RXF1YWxzKCJjIiwgYy5nZXRQcm9wZXJ0eShDLlApKTsKLQotCQliLnNldFByb3BlcnR5KEEuUCwgImFhIik7Ci0JCWIuc2V0UHJvcGVydHkoQi5QLCAiYmIiKTsKLQkJYi5zZXRQcm9wZXJ0eShDLlAsICJjYyIpOwotCQlhc3NlcnRFcXVhbHMoImFhIiwgYS5nZXRQcm9wZXJ0eShBLlApKTsKLQkJYXNzZXJ0RXF1YWxzKCJhYSIsIGIuZ2V0UHJvcGVydHkoQS5QKSk7Ci0JCWFzc2VydEVxdWFscygiYWEiLCBjLmdldFByb3BlcnR5KEEuUCkpOwotCQlhc3NlcnRFcXVhbHMoImJiIiwgYS5nZXRQcm9wZXJ0eShCLlApKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYiIsIGIuZ2V0UHJvcGVydHkoQi5QKSk7Ci0JCWFzc2VydEVxdWFscygiYmIiLCBjLmdldFByb3BlcnR5KEIuUCkpOwotCQlhc3NlcnRFcXVhbHMoImNjIiwgYS5nZXRQcm9wZXJ0eShDLlApKTsKLQkJYXNzZXJ0RXF1YWxzKCJjYyIsIGIuZ2V0UHJvcGVydHkoQy5QKSk7Ci0JCWFzc2VydEVxdWFscygiY2MiLCBjLmdldFByb3BlcnR5KEMuUCkpOwotCi0JCWMuc2V0UHJvcGVydHkoQS5QLCAiYWFhIik7Ci0JCWMuc2V0UHJvcGVydHkoQi5QLCAiYmJiIik7Ci0JCWMuc2V0UHJvcGVydHkoQy5QLCAiY2NjIik7Ci0JCWFzc2VydEVxdWFscygiYWFhIiwgYS5nZXRQcm9wZXJ0eShBLlApKTsKLQkJYXNzZXJ0RXF1YWxzKCJhYWEiLCBiLmdldFByb3BlcnR5KEEuUCkpOwotCQlhc3NlcnRFcXVhbHMoImFhYSIsIGMuZ2V0UHJvcGVydHkoQS5QKSk7Ci0JCWFzc2VydEVxdWFscygiYmJiIiwgYS5nZXRQcm9wZXJ0eShCLlApKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYmIiLCBiLmdldFByb3BlcnR5KEIuUCkpOwotCQlhc3NlcnRFcXVhbHMoImJiYiIsIGMuZ2V0UHJvcGVydHkoQi5QKSk7Ci0JCWFzc2VydEVxdWFscygiY2NjIiwgYS5nZXRQcm9wZXJ0eShDLlApKTsKLQkJYXNzZXJ0RXF1YWxzKCJjY2MiLCBiLmdldFByb3BlcnR5KEMuUCkpOwotCQlhc3NlcnRFcXVhbHMoImNjYyIsIGMuZ2V0UHJvcGVydHkoQy5QKSk7Ci0JfQotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvU2ltcGxlRGF0YU1vZGVsVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL1NpbXBsZURhdGFNb2RlbFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE4MjA3YS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvU2ltcGxlRGF0YU1vZGVsVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5XVFBSZXNvdXJjZUhhbmRsZXI7Ci0KLQotcHVibGljIGNsYXNzIFNpbXBsZURhdGFNb2RlbFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIGNsYXNzIERNUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyIHsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5UX1BST1AgPSAiSU5UX1BST1AiOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlRfUFJPUDIgPSAiSU5UX1BST1AyIjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5UX1BST1AzID0gIklOVF9QUk9QMyI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOVF9QUk9QNCA9ICJJTlRfUFJPUDQiOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCT09MRUFOX1BST1AgPSAiQk9PTEVBTl9QUk9QIjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQk9PTEVBTl9QUk9QMiA9ICJCT09MRUFOX1BST1AyIjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSSU5HX1BST1AgPSAiU1RSSU5HX1BST1AiOwotCi0JCXB1YmxpYyBTZXQgZ2V0UHJvcGVydHlOYW1lcygpIHsKLQkJCVNldCBwcm9wZXJ0eU5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwotCQkJcHJvcGVydHlOYW1lcy5hZGQoSU5UX1BST1ApOwotCQkJcHJvcGVydHlOYW1lcy5hZGQoSU5UX1BST1AyKTsKLQkJCXByb3BlcnR5TmFtZXMuYWRkKElOVF9QUk9QMyk7Ci0JCQlwcm9wZXJ0eU5hbWVzLmFkZChJTlRfUFJPUDQpOwotCQkJcHJvcGVydHlOYW1lcy5hZGQoQk9PTEVBTl9QUk9QKTsKLQkJCXByb3BlcnR5TmFtZXMuYWRkKEJPT0xFQU5fUFJPUDIpOwotCQkJcHJvcGVydHlOYW1lcy5hZGQoU1RSSU5HX1BST1ApOwotCQkJcmV0dXJuIHByb3BlcnR5TmFtZXM7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhJTlRfUFJPUCkpIHsKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIoMTApOwotCQkJfSBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKElOVF9QUk9QMikpIHsKLQkJCQlyZXR1cm4gZ2V0UHJvcGVydHkoSU5UX1BST1ApOwotCQkJfSBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEJPT0xFQU5fUFJPUCkpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi5UUlVFOwotCQkJfSBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFNUUklOR19QUk9QKSkgewotCQkJCXJldHVybiAiZm9vIiArIGdldFByb3BlcnR5KElOVF9QUk9QKSArIGdldFByb3BlcnR5KEJPT0xFQU5fUFJPUCk7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0RGVmYXVsdFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnR5RW5hYmxlZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhCT09MRUFOX1BST1AyKSkgewotCQkJCXJldHVybiBnZXRCb29sZWFuUHJvcGVydHkoQk9PTEVBTl9QUk9QKTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gcHJvcGVydHlTZXQoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHByb3BlcnR5VmFsdWUpIHsKLQkJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKElOVF9QUk9QKSkgewotCQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKElOVF9QUk9QMiwgSURhdGFNb2RlbC5WQUxVRV9DSEcpOwotCQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKElOVF9QUk9QMiwgSURhdGFNb2RlbC5WQUxJRF9WQUxVRVNfQ0hHKTsKLQkJCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShTVFJJTkdfUFJPUCwgSURhdGFNb2RlbC5ERUZBVUxUX0NIRyk7Ci0JCQl9Ci0JCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhCT09MRUFOX1BST1ApKSB7Ci0JCQkJbW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoQk9PTEVBTl9QUk9QMiwgSURhdGFNb2RlbC5FTkFCTEVfQ0hHKTsKLQkJCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShTVFJJTkdfUFJPUCwgSURhdGFNb2RlbC5ERUZBVUxUX0NIRyk7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXB1YmxpYyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBnZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQkJaWYgKElOVF9QUk9QMi5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJCWludCByYW5nZSA9IGdldEludFByb3BlcnR5KElOVF9QUk9QKTsKLQkJCQlJbnRlZ2VyW10gaW50cyA9IG5ldyBJbnRlZ2VyW3JhbmdlXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGludHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaW50c1tpXSA9IG5ldyBJbnRlZ2VyKGkgKyAxKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvci5jcmVhdGVEZXNjcmlwdG9ycyhpbnRzKTsKLQkJCX0KLQkJCWlmIChJTlRfUFJPUDMuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCQlpbnQgcmFuZ2UgPSAzOwotCQkJCUludGVnZXJbXSBpbnRzID0gbmV3IEludGVnZXJbcmFuZ2VdOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW50cy5sZW5ndGg7IGkrKykgewotCQkJCQlpbnRzW2ldID0gbmV3IEludGVnZXIoaSArIDEpOwotCQkJCX0KLQkJCQlTdHJpbmdbXSBkZXNjcmlwdGlvbnMgPSBuZXcgU3RyaW5nW117Im9uZSIsICJ0d28iLCAidGhyZWUifTsKLQkJCQlyZXR1cm4gRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yLmNyZWF0ZURlc2NyaXB0b3JzKGludHMsIGRlc2NyaXB0aW9ucyk7Ci0JCQl9Ci0JCQlpZiAoSU5UX1BST1A0LmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQkJRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMgPSBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yWzNdOwotCQkJCVN0cmluZ1tdIGRlc2NyaXB0aW9ucyA9IG5ldyBTdHJpbmdbXXsib25lIiwgInR3byIsICJ0aHJlZSJ9OwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJZGVzY3JpcHRvcnNbaV0gPSBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yKG5ldyBJbnRlZ2VyKGkgKyAxKSwgZGVzY3JpcHRpb25zW2ldKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGRlc2NyaXB0b3JzOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIGdldFByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCQlPYmplY3QgcHJvcGVydHkgPSBnZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCQkJaWYgKElOVF9QUk9QMi5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJCXJldHVybiBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yKHByb3BlcnR5KTsKLQkJCX0gZWxzZSBpZiAoSU5UX1BST1AzLmVxdWFscyhwcm9wZXJ0eU5hbWUpIHx8IElOVF9QUk9QNC5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJCVN0cmluZ1tdIGRlc2NyaXB0aW9ucyA9IG5ldyBTdHJpbmdbXXsib25lIiwgInR3byIsICJ0aHJlZSJ9OwotCQkJCWludCB2YWx1ZSA9ICgoSW50ZWdlcikgcHJvcGVydHkpLmludFZhbHVlKCk7Ci0JCQkJcmV0dXJuIG5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IocHJvcGVydHksIGRlc2NyaXB0aW9uc1t2YWx1ZSAtIDFdKTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQotCQlwdWJsaWMgU3RyaW5nIGdldElEKCkgewotCQkJcmV0dXJuIGlkOwotCQl9Ci0KLQkJcHVibGljIExpc3QgZ2V0RXh0ZW5kZWRDb250ZXh0KCkgewotCQkJcmV0dXJuIGV4dGVuZGVkQ29udGV4dDsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0JcHJpdmF0ZSBMaXN0IGV4dGVuZGVkQ29udGV4dDsKLQotCXByaXZhdGUgSURhdGFNb2RlbCBkbTsKLQlwcml2YXRlIFRlc3RMaXN0ZW5lciBkbUw7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlkbSA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBETVByb3ZpZGVyKCkpOwotCQlkbUwgPSBuZXcgVGVzdExpc3RlbmVyKCk7Ci0JCWRtLmFkZExpc3RlbmVyKGRtTCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJhc2ljcygpIHsKLQkJaWQgPSBudWxsOwotCQlhc3NlcnRFcXVhbHMoIiIsIGRtLmdldElEKCkpOwotCQlpZCA9ICJmb28iOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGRtLmdldElEKCkpOwotCQlleHRlbmRlZENvbnRleHQgPSBudWxsOwotCQlhc3NlcnROb3ROdWxsKGRtLmdldEV4dGVuZGVkQ29udGV4dCgpKTsKLQkJZXh0ZW5kZWRDb250ZXh0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlhc3NlcnRUcnVlKGRtLmdldEV4dGVuZGVkQ29udGV4dCgpID09IGV4dGVuZGVkQ29udGV4dCk7Ci0JCWV4dGVuZGVkQ29udGV4dC5hZGQoImZvbyIpOwotCQlhc3NlcnRUcnVlKGRtLmdldEV4dGVuZGVkQ29udGV4dCgpID09IGV4dGVuZGVkQ29udGV4dCk7Ci0JCWFzc2VydE5vdE51bGwoZG0uZ2V0RGVmYXVsdE9wZXJhdGlvbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFByb3BlcnR5KCkgewotCQlTdHJpbmcgUFJPUEVSVFlfTk9UX0xPQ0FURURfID0gV1RQUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiMjAiKTsgLy8kTk9OLU5MUy0xJAotCQlFeGNlcHRpb24gZXggPSBudWxsOwotCQl0cnkgewotCQkJZG0uZ2V0UHJvcGVydHkoImZvbyIpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCWV4ID0gZTsKLQkJfQotCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbChleCk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGV4LmdldE1lc3NhZ2UoKS5zdGFydHNXaXRoKFBST1BFUlRZX05PVF9MT0NBVEVEXykpOwotCQlleCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlkbS5nZXRJbnRQcm9wZXJ0eSgiZm9vIik7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJZXggPSBlOwotCQl9Ci0JCUFzc2VydC5hc3NlcnROb3ROdWxsKGV4KTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoZXguZ2V0TWVzc2FnZSgpLnN0YXJ0c1dpdGgoUFJPUEVSVFlfTk9UX0xPQ0FURURfKSk7Ci0JCWV4ID0gbnVsbDsKLQkJZXggPSBudWxsOwotCQl0cnkgewotCQkJZG0uZ2V0Qm9vbGVhblByb3BlcnR5KCJmb28iKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlleCA9IGU7Ci0JCX0KLQkJQXNzZXJ0LmFzc2VydE5vdE51bGwoZXgpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShleC5nZXRNZXNzYWdlKCkuc3RhcnRzV2l0aChQUk9QRVJUWV9OT1RfTE9DQVRFRF8pKTsKLQkJZXggPSBudWxsOwotCQlleCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlkbS5nZXRTdHJpbmdQcm9wZXJ0eSgiZm9vIik7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJZXggPSBlOwotCQl9Ci0JCUFzc2VydC5hc3NlcnROb3ROdWxsKGV4KTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoZXguZ2V0TWVzc2FnZSgpLnN0YXJ0c1dpdGgoUFJPUEVSVFlfTk9UX0xPQ0FURURfKSk7Ci0JCWV4ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWRtLmdldFN0cmluZ1Byb3BlcnR5KG51bGwpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCWV4ID0gZTsKLQkJfQotCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbChleCk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGV4LmdldE1lc3NhZ2UoKS5zdGFydHNXaXRoKFBST1BFUlRZX05PVF9MT0NBVEVEXykpOwotCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByb3BlcnR5RGVzY3JpcHRvcnMoKSB7Ci0JCURhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gZG0uZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKERNUHJvdmlkZXIuSU5UX1BST1AyKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJaW50IHZhbHVlID0gaSArIDE7Ci0JCQlhc3NlcnRFcXVhbHModmFsdWUsICgoSW50ZWdlcikgZGVzY3JpcHRvcnNbaV0uZ2V0UHJvcGVydHlWYWx1ZSgpKS5pbnRWYWx1ZSgpKTsKLQkJCWFzc2VydEVxdWFscygiIiArIHZhbHVlLCBkZXNjcmlwdG9yc1tpXS5nZXRQcm9wZXJ0eURlc2NyaXB0aW9uKCkpOwotCQl9Ci0JCWRlc2NyaXB0b3JzID0gZG0uZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKERNUHJvdmlkZXIuSU5UX1BST1AzKTsKLQkJU3RyaW5nW10gZGVzY3JpcHRpb25zID0gbmV3IFN0cmluZ1tdeyJvbmUiLCAidHdvIiwgInRocmVlIn07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCWludCB2YWx1ZSA9IGkgKyAxOwotCQkJYXNzZXJ0RXF1YWxzKHZhbHVlLCAoKEludGVnZXIpIGRlc2NyaXB0b3JzW2ldLmdldFByb3BlcnR5VmFsdWUoKSkuaW50VmFsdWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoZGVzY3JpcHRpb25zW2ldLCBkZXNjcmlwdG9yc1tpXS5nZXRQcm9wZXJ0eURlc2NyaXB0aW9uKCkpOwotCQl9Ci0JCWRlc2NyaXB0b3JzID0gZG0uZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKERNUHJvdmlkZXIuSU5UX1BST1A0KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJaW50IHZhbHVlID0gaSArIDE7Ci0JCQlhc3NlcnRFcXVhbHModmFsdWUsICgoSW50ZWdlcikgZGVzY3JpcHRvcnNbaV0uZ2V0UHJvcGVydHlWYWx1ZSgpKS5pbnRWYWx1ZSgpKTsKLQkJCWFzc2VydEVxdWFscyhkZXNjcmlwdGlvbnNbaV0sIGRlc2NyaXB0b3JzW2ldLmdldFByb3BlcnR5RGVzY3JpcHRpb24oKSk7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDE7IGkgPCA0OyBpKyspIHsKLQkJCWRtLnNldEludFByb3BlcnR5KERNUHJvdmlkZXIuSU5UX1BST1AyLCBpKTsKLQkJCURhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZG0uZ2V0UHJvcGVydHlEZXNjcmlwdG9yKERNUHJvdmlkZXIuSU5UX1BST1AyKTsKLQkJCWFzc2VydEVxdWFscyhkZXNjcmlwdG9yLmdldFByb3BlcnR5VmFsdWUoKSwgZG0uZ2V0UHJvcGVydHkoRE1Qcm92aWRlci5JTlRfUFJPUDIpKTsKLQkJCWFzc2VydEVxdWFscygoKEludGVnZXIpIGRlc2NyaXB0b3IuZ2V0UHJvcGVydHlWYWx1ZSgpKS5pbnRWYWx1ZSgpLCBkbS5nZXRJbnRQcm9wZXJ0eShETVByb3ZpZGVyLklOVF9QUk9QMikpOwotCQkJYXNzZXJ0VHJ1ZShkZXNjcmlwdG9yLmdldFByb3BlcnR5RGVzY3JpcHRpb24oKS5lcXVhbHMoSW50ZWdlci50b1N0cmluZyhpKSkpOwotCi0JCQlkbS5zZXRJbnRQcm9wZXJ0eShETVByb3ZpZGVyLklOVF9QUk9QMywgaSk7Ci0JCQlkZXNjcmlwdG9yID0gZG0uZ2V0UHJvcGVydHlEZXNjcmlwdG9yKERNUHJvdmlkZXIuSU5UX1BST1AzKTsKLQkJCWFzc2VydEVxdWFscyhkZXNjcmlwdG9yLmdldFByb3BlcnR5VmFsdWUoKSwgZG0uZ2V0UHJvcGVydHkoRE1Qcm92aWRlci5JTlRfUFJPUDMpKTsKLQkJCWFzc2VydEVxdWFscygoKEludGVnZXIpIGRlc2NyaXB0b3IuZ2V0UHJvcGVydHlWYWx1ZSgpKS5pbnRWYWx1ZSgpLCBkbS5nZXRJbnRQcm9wZXJ0eShETVByb3ZpZGVyLklOVF9QUk9QMykpOwotCQkJYXNzZXJ0VHJ1ZShkZXNjcmlwdG9yLmdldFByb3BlcnR5RGVzY3JpcHRpb24oKS5lcXVhbHMoZGVzY3JpcHRpb25zW2kgLSAxXSkpOwotCi0JCQlkbS5zZXRJbnRQcm9wZXJ0eShETVByb3ZpZGVyLklOVF9QUk9QNCwgaSk7Ci0JCQlkZXNjcmlwdG9yID0gZG0uZ2V0UHJvcGVydHlEZXNjcmlwdG9yKERNUHJvdmlkZXIuSU5UX1BST1A0KTsKLQkJCWFzc2VydEVxdWFscyhkZXNjcmlwdG9yLmdldFByb3BlcnR5VmFsdWUoKSwgZG0uZ2V0UHJvcGVydHkoRE1Qcm92aWRlci5JTlRfUFJPUDQpKTsKLQkJCWFzc2VydEVxdWFscygoKEludGVnZXIpIGRlc2NyaXB0b3IuZ2V0UHJvcGVydHlWYWx1ZSgpKS5pbnRWYWx1ZSgpLCBkbS5nZXRJbnRQcm9wZXJ0eShETVByb3ZpZGVyLklOVF9QUk9QNCkpOwotCQkJYXNzZXJ0VHJ1ZShkZXNjcmlwdG9yLmdldFByb3BlcnR5RGVzY3JpcHRpb24oKS5lcXVhbHMoZGVzY3JpcHRpb25zW2kgLSAxXSkpOwotCQl9Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdHMoKSB7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkbS5nZXRCb29sZWFuUHJvcGVydHkoRE1Qcm92aWRlci5CT09MRUFOX1BST1ApKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsICgoQm9vbGVhbikgZG0uZ2V0UHJvcGVydHkoRE1Qcm92aWRlci5CT09MRUFOX1BST1ApKS5ib29sZWFuVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygxMCwgZG0uZ2V0SW50UHJvcGVydHkoRE1Qcm92aWRlci5JTlRfUFJPUCkpOwotCQlhc3NlcnRFcXVhbHMoMTAsICgoSW50ZWdlcikgZG0uZ2V0UHJvcGVydHkoRE1Qcm92aWRlci5JTlRfUFJPUCkpLmludFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbzEwdHJ1ZSIsIChTdHJpbmcpIGRtLmdldFByb3BlcnR5KERNUHJvdmlkZXIuU1RSSU5HX1BST1ApKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28xMHRydWUiLCBkbS5nZXRTdHJpbmdQcm9wZXJ0eShETVByb3ZpZGVyLlNUUklOR19QUk9QKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByb3BlcnR5Q2hhbmdlZE9uTGlzdGVuZXIoKSB7Ci0JCWRtTC5jbGVhckV2ZW50cygpOwotCQlEYXRhTW9kZWxFdmVudCBldmVudCA9IG5ldyBEYXRhTW9kZWxFdmVudChkbSwgQS5QLCBEYXRhTW9kZWxFdmVudC5WQUxVRV9DSEcpOwotCQlkbUwucHJvcGVydHlDaGFuZ2VkKGV2ZW50KTsKLQkJTGlzdCBldmVudHMgPSBkbUwuZ2V0RXZlbnRzKCk7Ci0JCWFzc2VydEVxdWFscygxLCBldmVudHMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShldmVudHMuY29udGFpbnMoZXZlbnQpKTsKLQotCQlkbUwuY2xlYXJFdmVudHMoKTsKLQkJSURhdGFNb2RlbExpc3RlbmVyIGlkbWwgPSBkbUw7Ci0JCWlkbWwucHJvcGVydHlDaGFuZ2VkKGV2ZW50KTsKLQkJZXZlbnRzID0gZG1MLmdldEV2ZW50cygpOwotCQlhc3NlcnRFcXVhbHMoMSwgZXZlbnRzLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoZXZlbnRzLmNvbnRhaW5zKGV2ZW50KSk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlTGlzdGVuZXIoKSB7Ci0JCWRtTC5jbGVhckV2ZW50cygpOwotCQlkbS5ub3RpZnlQcm9wZXJ0eUNoYW5nZShETVByb3ZpZGVyLklOVF9QUk9QMiwgSURhdGFNb2RlbC5ERUZBVUxUX0NIRyk7Ci0JCUxpc3QgZXZlbnRzID0gZG1MLmdldEV2ZW50cygpOwotCQlhc3NlcnRFcXVhbHMoMSwgZXZlbnRzLnNpemUoKSk7Ci0KLQkJZG1MLmNsZWFyRXZlbnRzKCk7Ci0JCWRtLnJlbW92ZUxpc3RlbmVyKGRtTCk7Ci0JCWRtLm5vdGlmeVByb3BlcnR5Q2hhbmdlKERNUHJvdmlkZXIuSU5UX1BST1AyLCBJRGF0YU1vZGVsLkRFRkFVTFRfQ0hHKTsKLQkJZXZlbnRzID0gZG1MLmdldEV2ZW50cygpOwotCQlhc3NlcnRFcXVhbHMoMCwgZXZlbnRzLnNpemUoKSk7Ci0KLQkJZG1MLmNsZWFyRXZlbnRzKCk7Ci0JCWRtLmFkZExpc3RlbmVyKGRtTCk7Ci0JCWRtLmFkZExpc3RlbmVyKGRtTCk7Ci0JCWRtLmFkZExpc3RlbmVyKGRtTCk7Ci0JCWRtLmFkZExpc3RlbmVyKGRtTCk7Ci0JCWRtLmFkZExpc3RlbmVyKGRtTCk7Ci0JCWRtLm5vdGlmeVByb3BlcnR5Q2hhbmdlKERNUHJvdmlkZXIuSU5UX1BST1AyLCBJRGF0YU1vZGVsLkRFRkFVTFRfQ0hHKTsKLQkJZXZlbnRzID0gZG1MLmdldEV2ZW50cygpOwotCQlhc3NlcnRFcXVhbHMoMSwgZXZlbnRzLnNpemUoKSk7Ci0KLQkJZG1MLmNsZWFyRXZlbnRzKCk7Ci0JCWRtLnJlbW92ZUxpc3RlbmVyKGRtTCk7Ci0JCWRtLm5vdGlmeVByb3BlcnR5Q2hhbmdlKERNUHJvdmlkZXIuSU5UX1BST1AyLCBJRGF0YU1vZGVsLkRFRkFVTFRfQ0hHKTsKLQkJZXZlbnRzID0gZG1MLmdldEV2ZW50cygpOwotCQlhc3NlcnRFcXVhbHMoMCwgZXZlbnRzLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmluZ0V2ZW50cygpIHsKLQkJZG1MLmNsZWFyRXZlbnRzKCk7Ci0JCWRtLm5vdGlmeVByb3BlcnR5Q2hhbmdlKERNUHJvdmlkZXIuSU5UX1BST1AyLCBJRGF0YU1vZGVsLkRFRkFVTFRfQ0hHKTsKLQkJTGlzdCBldmVudHMgPSBkbUwuZ2V0RXZlbnRzKCk7Ci0JCWFzc2VydEVxdWFscygxLCBldmVudHMuc2l6ZSgpKTsKLQkJRGF0YU1vZGVsRXZlbnQgZXZlbnQgPSAoRGF0YU1vZGVsRXZlbnQpIGV2ZW50cy5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscyhETVByb3ZpZGVyLklOVF9QUk9QMiwgZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRGF0YU1vZGVsRXZlbnQuVkFMVUVfQ0hHLCBldmVudC5nZXRGbGFnKCkpOwotCi0JCWRtTC5jbGVhckV2ZW50cygpOwotCQlkbS5ub3RpZnlQcm9wZXJ0eUNoYW5nZShETVByb3ZpZGVyLklOVF9QUk9QMiwgSURhdGFNb2RlbC5WQUxJRF9WQUxVRVNfQ0hHKTsKLQkJZXZlbnRzID0gZG1MLmdldEV2ZW50cygpOwotCQlhc3NlcnRFcXVhbHMoMSwgZXZlbnRzLnNpemUoKSk7Ci0JCWV2ZW50ID0gKERhdGFNb2RlbEV2ZW50KSBldmVudHMuZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMoRE1Qcm92aWRlci5JTlRfUFJPUDIsIGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKERhdGFNb2RlbEV2ZW50LlZBTElEX1ZBTFVFU19DSEcsIGV2ZW50LmdldEZsYWcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpbXBsZVNldEV2ZW50cygpIHsKLQkJZG1MLmNsZWFyRXZlbnRzKCk7Ci0JCWRtLnNldEludFByb3BlcnR5KERNUHJvdmlkZXIuSU5UX1BST1AyLCAxMDApOwotCQlMaXN0IGV2ZW50cyA9IGRtTC5nZXRFdmVudHMoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGV2ZW50cy5zaXplKCkpOwotCQlEYXRhTW9kZWxFdmVudCBldmVudCA9IChEYXRhTW9kZWxFdmVudCkgZXZlbnRzLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKERNUHJvdmlkZXIuSU5UX1BST1AyLCBldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhEYXRhTW9kZWxFdmVudC5WQUxVRV9DSEcsIGV2ZW50LmdldEZsYWcoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIGRtLmdldEludFByb3BlcnR5KERNUHJvdmlkZXIuSU5UX1BST1AyKSk7Ci0KLQkJZG1MLmNsZWFyRXZlbnRzKCk7Ci0JCWRtLnNldEludFByb3BlcnR5KERNUHJvdmlkZXIuSU5UX1BST1AyLCAxMDApOwotCQlldmVudHMgPSBkbUwuZ2V0RXZlbnRzKCk7Ci0JCWFzc2VydEVxdWFscygwLCBldmVudHMuc2l6ZSgpKTsKLQotCQlkbUwuY2xlYXJFdmVudHMoKTsKLQkJZG0uc2V0SW50UHJvcGVydHkoRE1Qcm92aWRlci5JTlRfUFJPUDIsIDEwMSk7Ci0JCWV2ZW50cyA9IGRtTC5nZXRFdmVudHMoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGV2ZW50cy5zaXplKCkpOwotCQlldmVudCA9IChEYXRhTW9kZWxFdmVudCkgZXZlbnRzLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKERNUHJvdmlkZXIuSU5UX1BST1AyLCBldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbXBsZXhFdmVudHMoKSB7Ci0JCWRtTC5jbGVhckV2ZW50cygpOwotCQlkbS5zZXRJbnRQcm9wZXJ0eShETVByb3ZpZGVyLklOVF9QUk9QLCAxMSk7Ci0JCUxpc3QgZXZlbnRzID0gZG1MLmdldEV2ZW50cygpOwotCQlhc3NlcnRFcXVhbHMoNCwgZXZlbnRzLnNpemUoKSk7Ci0KLQkJRGF0YU1vZGVsRXZlbnQgZXZlbnQgPSAoRGF0YU1vZGVsRXZlbnQpIGV2ZW50cy5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscyhETVByb3ZpZGVyLklOVF9QUk9QMiwgZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRGF0YU1vZGVsRXZlbnQuVkFMVUVfQ0hHLCBldmVudC5nZXRGbGFnKCkpOwotCQlhc3NlcnRFcXVhbHMoMTEsICgoSW50ZWdlcikgZG0uZ2V0UHJvcGVydHkoRE1Qcm92aWRlci5JTlRfUFJPUDIpKS5pbnRWYWx1ZSgpKTsKLQotCQlldmVudCA9IChEYXRhTW9kZWxFdmVudCkgZXZlbnRzLmdldCgxKTsKLQkJYXNzZXJ0RXF1YWxzKERNUHJvdmlkZXIuSU5UX1BST1AyLCBldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhEYXRhTW9kZWxFdmVudC5WQUxJRF9WQUxVRVNfQ0hHLCBldmVudC5nZXRGbGFnKCkpOwotCQlEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IGV2ZW50LmdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycygpOwotCQlEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBkZXNjcmlwdG9yczIgPSBkbS5nZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoRE1Qcm92aWRlci5JTlRfUFJPUDIpOwotCQlhc3NlcnRFcXVhbHMoMTEsIGRlc2NyaXB0b3JzLmxlbmd0aCk7Ci0JCWFzc2VydEVxdWFscygxMSwgZGVzY3JpcHRvcnMyLmxlbmd0aCk7Ci0KLQkJZXZlbnQgPSAoRGF0YU1vZGVsRXZlbnQpIGV2ZW50cy5nZXQoMik7Ci0JCWFzc2VydEVxdWFscyhETVByb3ZpZGVyLlNUUklOR19QUk9QLCBldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhEYXRhTW9kZWxFdmVudC5WQUxVRV9DSEcsIGV2ZW50LmdldEZsYWcoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vMTF0cnVlIiwgZXZlbnQuZ2V0UHJvcGVydHkoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vMTF0cnVlIiwgZG0uZ2V0RGVmYXVsdFByb3BlcnR5KERNUHJvdmlkZXIuU1RSSU5HX1BST1ApKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28xMXRydWUiLCBkbS5nZXRQcm9wZXJ0eShETVByb3ZpZGVyLlNUUklOR19QUk9QKSk7Ci0KLQkJZXZlbnQgPSAoRGF0YU1vZGVsRXZlbnQpIGV2ZW50cy5nZXQoMyk7Ci0JCWFzc2VydEVxdWFscyhETVByb3ZpZGVyLklOVF9QUk9QLCBldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhEYXRhTW9kZWxFdmVudC5WQUxVRV9DSEcsIGV2ZW50LmdldEZsYWcoKSk7Ci0JCWFzc2VydEVxdWFscygxMSwgKChJbnRlZ2VyKSBkbS5nZXRQcm9wZXJ0eShETVByb3ZpZGVyLklOVF9QUk9QKSkuaW50VmFsdWUoKSk7Ci0KLQkJZG1MLmNsZWFyRXZlbnRzKCk7Ci0JCWRtLnNldEJvb2xlYW5Qcm9wZXJ0eShETVByb3ZpZGVyLkJPT0xFQU5fUFJPUCwgZmFsc2UpOwotCQlldmVudHMgPSBkbUwuZ2V0RXZlbnRzKCk7Ci0JCWFzc2VydEVxdWFscygzLCBldmVudHMuc2l6ZSgpKTsKLQkJZXZlbnQgPSAoRGF0YU1vZGVsRXZlbnQpIGV2ZW50cy5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscyhETVByb3ZpZGVyLkJPT0xFQU5fUFJPUDIsIGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKERhdGFNb2RlbEV2ZW50LkVOQUJMRV9DSEcsIGV2ZW50LmdldEZsYWcoKSk7Ci0JCWFzc2VydEZhbHNlKGRtLmlzUHJvcGVydHlFbmFibGVkKERNUHJvdmlkZXIuQk9PTEVBTl9QUk9QMikpOwotCQlhc3NlcnRGYWxzZShldmVudC5pc1Byb3BlcnR5RW5hYmxlZCgpKTsKLQotCQlldmVudCA9IChEYXRhTW9kZWxFdmVudCkgZXZlbnRzLmdldCgxKTsKLQkJYXNzZXJ0RXF1YWxzKERNUHJvdmlkZXIuU1RSSU5HX1BST1AsIGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKERhdGFNb2RlbEV2ZW50LlZBTFVFX0NIRywgZXZlbnQuZ2V0RmxhZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28xMWZhbHNlIiwgZXZlbnQuZ2V0UHJvcGVydHkoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vMTFmYWxzZSIsIGRtLmdldERlZmF1bHRQcm9wZXJ0eShETVByb3ZpZGVyLlNUUklOR19QUk9QKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vMTFmYWxzZSIsIGRtLmdldFByb3BlcnR5KERNUHJvdmlkZXIuU1RSSU5HX1BST1ApKTsKLQotCQlldmVudCA9IChEYXRhTW9kZWxFdmVudCkgZXZlbnRzLmdldCgyKTsKLQkJYXNzZXJ0RXF1YWxzKERNUHJvdmlkZXIuQk9PTEVBTl9QUk9QLCBldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhEYXRhTW9kZWxFdmVudC5WQUxVRV9DSEcsIGV2ZW50LmdldEZsYWcoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZG0uZ2V0Qm9vbGVhblByb3BlcnR5KERNUHJvdmlkZXIuQk9PTEVBTl9QUk9QKSk7Ci0KLQkJZG0uc2V0U3RyaW5nUHJvcGVydHkoRE1Qcm92aWRlci5TVFJJTkdfUFJPUCwgImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGRtLmdldFN0cmluZ1Byb3BlcnR5KERNUHJvdmlkZXIuU1RSSU5HX1BST1ApKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28xMWZhbHNlIiwgZG0uZ2V0RGVmYXVsdFByb3BlcnR5KERNUHJvdmlkZXIuU1RSSU5HX1BST1ApKTsKLQkJZG1MLmNsZWFyRXZlbnRzKCk7Ci0JCWRtLnNldEJvb2xlYW5Qcm9wZXJ0eShETVByb3ZpZGVyLkJPT0xFQU5fUFJPUCwgdHJ1ZSk7Ci0JCWV2ZW50cyA9IGRtTC5nZXRFdmVudHMoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGV2ZW50cy5zaXplKCkpOwotCQlldmVudCA9IChEYXRhTW9kZWxFdmVudCkgZXZlbnRzLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKERNUHJvdmlkZXIuQk9PTEVBTl9QUk9QMiwgZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQlldmVudCA9IChEYXRhTW9kZWxFdmVudCkgZXZlbnRzLmdldCgxKTsKLQkJYXNzZXJ0RXF1YWxzKERNUHJvdmlkZXIuQk9PTEVBTl9QUk9QLCBldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBkbS5nZXRTdHJpbmdQcm9wZXJ0eShETVByb3ZpZGVyLlNUUklOR19QUk9QKSk7Ci0JCWRtLnNldFN0cmluZ1Byb3BlcnR5KERNUHJvdmlkZXIuU1RSSU5HX1BST1AsIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoImZvbzExdHJ1ZSIsIGRtLmdldFN0cmluZ1Byb3BlcnR5KERNUHJvdmlkZXIuU1RSSU5HX1BST1ApKTsKLQkJZG1MLmNsZWFyRXZlbnRzKCk7Ci0JCWRtLnNldEJvb2xlYW5Qcm9wZXJ0eShETVByb3ZpZGVyLkJPT0xFQU5fUFJPUCwgZmFsc2UpOwotCQlldmVudHMgPSBkbUwuZ2V0RXZlbnRzKCk7Ci0JCWFzc2VydEVxdWFscygzLCBldmVudHMuc2l6ZSgpKTsKLQkJZXZlbnQgPSAoRGF0YU1vZGVsRXZlbnQpIGV2ZW50cy5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscyhETVByb3ZpZGVyLkJPT0xFQU5fUFJPUDIsIGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKERhdGFNb2RlbEV2ZW50LkVOQUJMRV9DSEcsIGV2ZW50LmdldEZsYWcoKSk7Ci0JCWFzc2VydEZhbHNlKGRtLmlzUHJvcGVydHlFbmFibGVkKERNUHJvdmlkZXIuQk9PTEVBTl9QUk9QMikpOwotCQlhc3NlcnRGYWxzZShldmVudC5pc1Byb3BlcnR5RW5hYmxlZCgpKTsKLQotCQlldmVudCA9IChEYXRhTW9kZWxFdmVudCkgZXZlbnRzLmdldCgxKTsKLQkJYXNzZXJ0RXF1YWxzKERNUHJvdmlkZXIuU1RSSU5HX1BST1AsIGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKERhdGFNb2RlbEV2ZW50LlZBTFVFX0NIRywgZXZlbnQuZ2V0RmxhZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28xMWZhbHNlIiwgZXZlbnQuZ2V0UHJvcGVydHkoKSk7Ci0KLQkJZXZlbnQgPSAoRGF0YU1vZGVsRXZlbnQpIGV2ZW50cy5nZXQoMik7Ci0JCWFzc2VydEVxdWFscyhETVByb3ZpZGVyLkJPT0xFQU5fUFJPUCwgZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRGF0YU1vZGVsRXZlbnQuVkFMVUVfQ0hHLCBldmVudC5nZXRGbGFnKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGRtLmdldEJvb2xlYW5Qcm9wZXJ0eShETVByb3ZpZGVyLkJPT0xFQU5fUFJPUCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL1Rlc3RBYnN0cmFjdERNUHJvdmlkZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9UZXN0QWJzdHJhY3RETVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkYTU0NDAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL1Rlc3RBYnN0cmFjdERNUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcjsKLQotcHVibGljIGNsYXNzIFRlc3RBYnN0cmFjdERNUHJvdmlkZXIgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5URUdFUiA9ICJJTlRFR0VSIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQk9PTEVBTiA9ICJCT09MRUFOIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSSU5HID0gIlNUUklORyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9CSkVDVCA9ICJPQkpFQ1QiOwotCi0JcHJpdmF0ZSBjbGFzcyBETU9wIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gewotCi0JCXB1YmxpYyBETU9wKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBETU9wKElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJCXN1cGVyKG1vZGVsKTsKLQkJfQotCi0JCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgSVN0YXR1cyByZWRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIElTdGF0dXMgdW5kbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldElEKFN0cmluZyBpZCkgewotCQkJc3VwZXIuc2V0SUQoaWQpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRJRCgpIHsKLQkJCXJldHVybiBzdXBlci5nZXRJRCgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0RGF0YU1vZGVsKElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJCXN1cGVyLnNldERhdGFNb2RlbChtb2RlbCk7Ci0JCX0KLQotCQlwdWJsaWMgSURhdGFNb2RlbCBnZXREYXRhTW9kZWwoKSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0RGF0YU1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIERNUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyIHsKLQotCQlwdWJsaWMgU2V0IGdldFByb3BlcnR5TmFtZXMoKXsKLQkJCVNldCBwcm9wZXJ0eU5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwotCQkJcHJvcGVydHlOYW1lcy5hZGQoSU5URUdFUik7Ci0JCQlwcm9wZXJ0eU5hbWVzLmFkZChCT09MRUFOKTsKLQkJCXByb3BlcnR5TmFtZXMuYWRkKFNUUklORyk7Ci0JCQlwcm9wZXJ0eU5hbWVzLmFkZChPQkpFQ1QpOwotCQkJcmV0dXJuIHByb3BlcnR5TmFtZXM7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBpbml0KCkgewotCQkJc3VwZXIuaW5pdCgpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNQcm9wZXJ0eUVuYWJsZWQoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQkJcmV0dXJuIHN1cGVyLmlzUHJvcGVydHlFbmFibGVkKHByb3BlcnR5TmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShTdHJpbmcgbmFtZSkgewotCQkJcmV0dXJuIHN1cGVyLnZhbGlkYXRlKG5hbWUpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gcHJvcGVydHlTZXQoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHByb3BlcnR5VmFsdWUpIHsKLQkJCXJldHVybiBzdXBlci5wcm9wZXJ0eVNldChwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOwotCQl9Ci0KLQkJcHVibGljIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvciBnZXRQcm9wZXJ0eURlc2NyaXB0b3IoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQkJcmV0dXJuIHN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcihwcm9wZXJ0eU5hbWUpOwotCQl9Ci0KLQkJcHVibGljIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltdIGdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKHByb3BlcnR5TmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgTGlzdCBnZXRFeHRlbmRlZENvbnRleHQoKSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0RXh0ZW5kZWRDb250ZXh0KCk7Ci0JCX0KLQotCQlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXREZWZhdWx0T3BlcmF0aW9uKCkgewotCQkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHRPcGVyYXRpb24oKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0SUQoKSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0SUQoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlzdXBlci5kaXNwb3NlKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwcm90ZWN0ZWRUZXN0KCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHkoSU5URUdFUik7Ci0JCQlzdXBlci5zZXRQcm9wZXJ0eShJTlRFR0VSLCBuZXcgSW50ZWdlcigxKSk7Ci0JCQlzdXBlci5nZXRCb29sZWFuUHJvcGVydHkoQk9PTEVBTik7Ci0JCQlzdXBlci5zZXRCb29sZWFuUHJvcGVydHkoQk9PTEVBTiwgdHJ1ZSk7Ci0JCQlzdXBlci5nZXRJbnRQcm9wZXJ0eShJTlRFR0VSKTsKLQkJCXN1cGVyLnNldEludFByb3BlcnR5KElOVEVHRVIsIDEpOwotCQkJc3VwZXIuZ2V0U3RyaW5nUHJvcGVydHkoU1RSSU5HKTsKLQkJCXN1cGVyLmlzUHJvcGVydHlTZXQoSU5URUdFUik7Ci0JCX0KLQl9Ci0KLQlJRGF0YU1vZGVsUHJvdmlkZXIgaWRtcCA9IG51bGw7Ci0JQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlciBkbXAgPSBudWxsOwotCUlEYXRhTW9kZWwgZG0gPSBudWxsOwotCi0JSURhdGFNb2RlbE9wZXJhdGlvbiBpZG1vID0gbnVsbDsKLQlBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiBkbW8gPSBudWxsOwotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJZG1wID0gbmV3IERNUHJvdmlkZXIoKTsKLQkJaWRtcCA9IGRtcDsKLQkJZG0gPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChkbXApOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyKCkgewotCQlkbXAuc2V0RGF0YU1vZGVsKGRtKTsKLQkJYXNzZXJ0VHJ1ZShkbSA9PSBkbXAuZ2V0RGF0YU1vZGVsKCkpOwotCQlhc3NlcnROb3ROdWxsKGRtcC5nZXRQcm9wZXJ0eU5hbWVzKCkpOwotCQlkbXAuaW5pdCgpOwotCQlhc3NlcnROdWxsKGRtcC5nZXREZWZhdWx0UHJvcGVydHkoSU5URUdFUikpOwotCQlhc3NlcnRUcnVlKGRtcC5pc1Byb3BlcnR5RW5hYmxlZChJTlRFR0VSKSk7Ci0JCWFzc2VydE51bGwoZG1wLnZhbGlkYXRlKElOVEVHRVIpKTsKLQkJYXNzZXJ0VHJ1ZShkbXAucHJvcGVydHlTZXQoSU5URUdFUiwgbmV3IEludGVnZXIoMSkpKTsKLQkJYXNzZXJ0TnVsbChkbXAuZ2V0UHJvcGVydHlEZXNjcmlwdG9yKElOVEVHRVIpKTsKLQkJYXNzZXJ0TnVsbChkbXAuZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKElOVEVHRVIpKTsKLQkJYXNzZXJ0TnVsbChkbXAuZ2V0RXh0ZW5kZWRDb250ZXh0KCkpOwotCQlhc3NlcnROdWxsKGRtcC5nZXREZWZhdWx0T3BlcmF0aW9uKCkpOwotCQlhc3NlcnRUcnVlKGRtcC5nZXRJRCgpLmVxdWFscyhkbXAuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKLQkJKChETVByb3ZpZGVyKSBkbXApLnByb3RlY3RlZFRlc3QoKTsKLQkJZG1wLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SURhdGFNb2RlbFByb3ZpZGVyKCkgewotCQlpZG1wLnNldERhdGFNb2RlbChkbSk7Ci0JCWFzc2VydFRydWUoZG0gPT0gaWRtcC5nZXREYXRhTW9kZWwoKSk7Ci0JCWFzc2VydE5vdE51bGwoaWRtcC5nZXRQcm9wZXJ0eU5hbWVzKCkpOwotCQlpZG1wLmluaXQoKTsKLQkJYXNzZXJ0TnVsbChpZG1wLmdldERlZmF1bHRQcm9wZXJ0eShJTlRFR0VSKSk7Ci0JCWFzc2VydFRydWUoaWRtcC5pc1Byb3BlcnR5RW5hYmxlZChJTlRFR0VSKSk7Ci0JCWFzc2VydE51bGwoaWRtcC52YWxpZGF0ZShJTlRFR0VSKSk7Ci0JCWFzc2VydFRydWUoaWRtcC5wcm9wZXJ0eVNldChJTlRFR0VSLCBuZXcgSW50ZWdlcigxKSkpOwotCQlhc3NlcnROdWxsKGlkbXAuZ2V0UHJvcGVydHlEZXNjcmlwdG9yKElOVEVHRVIpKTsKLQkJYXNzZXJ0TnVsbChpZG1wLmdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhJTlRFR0VSKSk7Ci0JCWFzc2VydE51bGwoaWRtcC5nZXRFeHRlbmRlZENvbnRleHQoKSk7Ci0JCWFzc2VydE51bGwoaWRtcC5nZXREZWZhdWx0T3BlcmF0aW9uKCkpOwotCQlhc3NlcnRUcnVlKGlkbXAuZ2V0SUQoKS5lcXVhbHMoaWRtcC5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotCQlpZG1wLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24oKSB7Ci0JCWRtbyA9IG5ldyBETU9wKCk7Ci0JCWRtbyA9IG5ldyBETU9wKGRtKTsKLQkJaWRtbyA9IGRtbzsKLQkJZG1vLnNldElEKCJmb28iKTsKLQkJYXNzZXJ0VHJ1ZShkbW8uZ2V0SUQoKS5lcXVhbHMoImZvbyIpKTsKLQkJZG1vLnNldERhdGFNb2RlbChkbSk7Ci0JCWFzc2VydFRydWUoZG0gPT0gZG1vLmdldERhdGFNb2RlbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElEYXRhTW9kZWxPcGVyYXRpb24oKSB7Ci0JCWRtbyA9IG5ldyBETU9wKCk7Ci0JCWlkbW8gPSBkbW87Ci0JCWlkbW8uc2V0SUQoImZvbyIpOwotCQlhc3NlcnRUcnVlKGlkbW8uZ2V0SUQoKS5lcXVhbHMoImZvbyIpKTsKLQkJaWRtby5zZXREYXRhTW9kZWwoZG0pOwotCQlhc3NlcnRUcnVlKGRtID09IGlkbW8uZ2V0RGF0YU1vZGVsKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL1Rlc3REYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL1Rlc3REYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTIzZjkwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9UZXN0RGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlcjsKLQotcHVibGljIGNsYXNzIFRlc3REYXRhTW9kZWxQcm92aWRlciBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGVzdERhdGFNb2RlbCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgaW5zdGFuY2VDb3VudCA9IDA7Ci0KLQlwdWJsaWMgc3RhdGljIGludCBnZXRJbnN0YW5jZUNvdW50KCkgewotCQlyZXR1cm4gaW5zdGFuY2VDb3VudDsKLQl9Ci0KLQotCXB1YmxpYyBUZXN0RGF0YU1vZGVsUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCWluc3RhbmNlQ291bnQrKzsKLQl9Ci0KLQlwdWJsaWMgU2V0IGdldFByb3BlcnR5TmFtZXMoKSB7Ci0JCVNldCBwcm9wZXJ0eU5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChJVGVzdERhdGFNb2RlbC5GT08pOwotCQlyZXR1cm4gcHJvcGVydHlOYW1lczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldElEKCkgewotCQlyZXR1cm4gSVRlc3REYXRhTW9kZWwuY2xhc3MuZ2V0TmFtZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL1Rlc3RMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL1Rlc3RMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWRlYjE5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9UZXN0TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsTGlzdGVuZXI7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0TGlzdGVuZXIgaW1wbGVtZW50cyBJRGF0YU1vZGVsTGlzdGVuZXIgewotCi0JcHJpdmF0ZSBBcnJheUxpc3QgZXZlbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHVibGljIHZvaWQgY2xlYXJFdmVudHMoKSB7Ci0JCWV2ZW50cy5jbGVhcigpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEV2ZW50cygpIHsKLQkJcmV0dXJuIGV2ZW50czsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoRGF0YU1vZGVsRXZlbnQgZXZlbnQpIHsKLQkJZXZlbnRzLmFkZChldmVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL1ZhbGlkYXRpb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvVmFsaWRhdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFmOGFiMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvVmFsaWRhdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLkNvbW1vblRlc3RzUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQSA9ICJBIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQiA9ICJCIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQyA9ICJDIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGFsbFByb3BlcnRpZXMgPSBuZXcgU3RyaW5nW117QSwgQiwgQ307Ci0KLQotCXByaXZhdGUgY2xhc3MgUCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXIgewotCi0KLQkJcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCl7Ci0JCQlTZXQgcHJvcGVydHlOYW1lcyA9IHN1cGVyLmdldFByb3BlcnR5TmFtZXMoKTsKLQkJCXByb3BlcnR5TmFtZXMuYWRkKEEpOwotCQkJcHJvcGVydHlOYW1lcy5hZGQoQik7Ci0JCQlwcm9wZXJ0eU5hbWVzLmFkZChDKTsKLQkJCXJldHVybiBwcm9wZXJ0eU5hbWVzOwotCQl9Ci0KLQkJcHVibGljIElTdGF0dXMgdmFsaWRhdGUoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQkJdmFsaWRhdGlvbkxpc3QuYWRkKHByb3BlcnR5TmFtZSk7Ci0JCQlyZXR1cm4gc3RhdHVzOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJU3RhdHVzIGVycm9yU3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDb21tb25UZXN0c1BsdWdpbi5QTFVHSU5fSUQsIDAsICJlcnJvciIsIG51bGwpOwotCXByaXZhdGUgSVN0YXR1cyBva1N0YXR1cyA9IElEYXRhTW9kZWxQcm92aWRlci5PS19TVEFUVVM7Ci0KLQlwcml2YXRlIElTdGF0dXMgc3RhdHVzOwotCi0JcHJpdmF0ZSBMaXN0IHZhbGlkYXRpb25MaXN0OwotCi0JcHJpdmF0ZSBJRGF0YU1vZGVsIGRtOwotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJZG0gPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgUCgpKTsKLQkJc3RhdHVzID0gb2tTdGF0dXM7Ci0JCXZhbGlkYXRpb25MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIF90ZXN0QmFzaWNWYWxpZGF0aW9uKCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgewotCQkJYm9vbGVhbiBvayA9IGkgPT0gMDsKLQkJCXN0YXR1cyA9IG9rID8gb2tTdGF0dXMgOiBlcnJvclN0YXR1czsKLQotCQkJdmFsaWRhdGlvbkxpc3QuY2xlYXIoKTsKLQkJCWFzc2VydFRydWUoZG0uaXNWYWxpZCgpID09IG9rKTsKLQkJCWFzc2VydEVxdWFscyhvayA/IDUgOiAxLCB2YWxpZGF0aW9uTGlzdC5zaXplKCkpOwotCQkJYXNzZXJ0VHJ1ZSh2YWxpZGF0aW9uTGlzdC5jb250YWlucyhBKSB8fCB2YWxpZGF0aW9uTGlzdC5jb250YWlucyhJRGF0YU1vZGVsUHJvcGVydGllcy5BTExPV19FWFRFTlNJT05TKSB8fCB2YWxpZGF0aW9uTGlzdC5jb250YWlucyhJRGF0YU1vZGVsUHJvcGVydGllcy5SRVNUUklDVF9FWFRFTlNJT05TKSk7Ci0JCQlpZiAob2spIHsKLQkJCQlhc3NlcnRUcnVlKHZhbGlkYXRpb25MaXN0LmNvbnRhaW5zKEIpKTsKLQkJCQlhc3NlcnRUcnVlKHZhbGlkYXRpb25MaXN0LmNvbnRhaW5zKEMpKTsKLQkJCX0KLQkJCXZhbGlkYXRpb25MaXN0LmNsZWFyKCk7Ci0KLQkJCWFzc2VydFRydWUoZG0udmFsaWRhdGUoKS5pc09LKCkgPT0gb2spOwotCQkJLy8gVE9ETwotCQkJLy9hc3NlcnRFcXVhbHMob2sgPyAzIDogMSwgdmFsaWRhdGlvbkxpc3Quc2l6ZSgpKTsKLQkJCWFzc2VydFRydWUodmFsaWRhdGlvbkxpc3QuY29udGFpbnMoQSkgfHwgdmFsaWRhdGlvbkxpc3QuY29udGFpbnMoSURhdGFNb2RlbFByb3BlcnRpZXMuQUxMT1dfRVhURU5TSU9OUykgfHwgdmFsaWRhdGlvbkxpc3QuY29udGFpbnMoSURhdGFNb2RlbFByb3BlcnRpZXMuUkVTVFJJQ1RfRVhURU5TSU9OUykpOwotCQkJaWYgKG9rKSB7Ci0JCQkJYXNzZXJ0VHJ1ZSh2YWxpZGF0aW9uTGlzdC5jb250YWlucyhCKSk7Ci0JCQkJYXNzZXJ0VHJ1ZSh2YWxpZGF0aW9uTGlzdC5jb250YWlucyhDKSk7Ci0JCQl9Ci0JCQl2YWxpZGF0aW9uTGlzdC5jbGVhcigpOwotCi0JCQlhc3NlcnRUcnVlKGRtLnZhbGlkYXRlKHRydWUpLmlzT0soKSA9PSBvayk7Ci0JCQlhc3NlcnRFcXVhbHMob2sgPyA1IDogMSwgdmFsaWRhdGlvbkxpc3Quc2l6ZSgpKTsKLQkJCXZhbGlkYXRpb25MaXN0LmNsZWFyKCk7Ci0KLQkJCWFzc2VydFRydWUoZG0udmFsaWRhdGUoZmFsc2UpLmlzT0soKSA9PSBvayk7Ci0JCQlhc3NlcnRFcXVhbHMoNSwgdmFsaWRhdGlvbkxpc3Quc2l6ZSgpKTsKLQkJCWFzc2VydFRydWUodmFsaWRhdGlvbkxpc3QuY29udGFpbnMoQSkpOwotCQkJYXNzZXJ0VHJ1ZSh2YWxpZGF0aW9uTGlzdC5jb250YWlucyhCKSk7Ci0JCQlhc3NlcnRUcnVlKHZhbGlkYXRpb25MaXN0LmNvbnRhaW5zKEMpKTsKLQkJCXZhbGlkYXRpb25MaXN0LmNsZWFyKCk7Ci0KLQkJCWZvciAoaW50IGogPSAwOyBqIDwgYWxsUHJvcGVydGllcy5sZW5ndGg7IGorKykgewotCQkJCWFzc2VydFRydWUoZG0uaXNQcm9wZXJ0eVZhbGlkKGFsbFByb3BlcnRpZXNbal0pID09IG9rKTsKLQkJCQlhc3NlcnRFcXVhbHMoMSwgdmFsaWRhdGlvbkxpc3Quc2l6ZSgpKTsKLQkJCQlhc3NlcnRUcnVlKHZhbGlkYXRpb25MaXN0LmNvbnRhaW5zKGFsbFByb3BlcnRpZXNbal0pKTsKLQkJCQl2YWxpZGF0aW9uTGlzdC5jbGVhcigpOwotCQkJCWFzc2VydFRydWUoZG0udmFsaWRhdGVQcm9wZXJ0eShhbGxQcm9wZXJ0aWVzW2pdKS5pc09LKCkgPT0gb2spOwotCQkJCWFzc2VydEVxdWFscygxLCB2YWxpZGF0aW9uTGlzdC5zaXplKCkpOwotCQkJCWFzc2VydFRydWUodmFsaWRhdGlvbkxpc3QuY29udGFpbnMoYWxsUHJvcGVydGllc1tqXSkpOwotCQkJCXZhbGlkYXRpb25MaXN0LmNsZWFyKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkVmFsaWRhdGlvbigpIHsKLQkJZG0uYWRkTmVzdGVkTW9kZWwoImEiLCBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgQSgpKSk7Ci0JCWRtLmFkZE5lc3RlZE1vZGVsKCJiIiwgRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEIoKSkpOwotCQlkbS5hZGROZXN0ZWRNb2RlbCgiYyIsIERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBDKCkpKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewotCQkJdmFsaWRhdGlvbkxpc3QuY2xlYXIoKTsKLQkJCXN3aXRjaCAoaSkgewotCQkJCWNhc2UgMCA6Ci0JCQkJCWFzc2VydFRydWUoZG0uaXNWYWxpZCgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAxIDoKLQkJCQkJYXNzZXJ0VHJ1ZShkbS52YWxpZGF0ZSgpLmlzT0soKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMiA6Ci0JCQkJCWFzc2VydFRydWUoZG0udmFsaWRhdGUodHJ1ZSkuaXNPSygpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAzIDoKLQkJCQkJYXNzZXJ0VHJ1ZShkbS52YWxpZGF0ZShmYWxzZSkuaXNPSygpKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlhc3NlcnRFcXVhbHMoOCwgdmFsaWRhdGlvbkxpc3Quc2l6ZSgpKTsKLQkJCWFzc2VydFRydWUodmFsaWRhdGlvbkxpc3QuY29udGFpbnMoQSkpOwotCQkJYXNzZXJ0VHJ1ZSh2YWxpZGF0aW9uTGlzdC5jb250YWlucyhCKSk7Ci0JCQlhc3NlcnRUcnVlKHZhbGlkYXRpb25MaXN0LmNvbnRhaW5zKEMpKTsKLQkJCWFzc2VydFRydWUodmFsaWRhdGlvbkxpc3QuY29udGFpbnMoImEiKSk7Ci0JCQlhc3NlcnRUcnVlKHZhbGlkYXRpb25MaXN0LmNvbnRhaW5zKCJiIikpOwotCQkJYXNzZXJ0VHJ1ZSh2YWxpZGF0aW9uTGlzdC5jb250YWlucygiYyIpKTsKLQkJCXZhbGlkYXRpb25MaXN0LmNsZWFyKCk7Ci0JCX0KLQkJc3RhdHVzID0gZXJyb3JTdGF0dXM7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0JCQl2YWxpZGF0aW9uTGlzdC5jbGVhcigpOwotCQkJc3dpdGNoIChpKSB7Ci0JCQkJY2FzZSAwIDoKLQkJCQkJYXNzZXJ0VHJ1ZSghZG0uaXNWYWxpZCgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAxIDoKLQkJCQkJYXNzZXJ0VHJ1ZSghZG0udmFsaWRhdGUoKS5pc09LKCkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDIgOgotCQkJCQlhc3NlcnRUcnVlKCFkbS52YWxpZGF0ZSh0cnVlKS5pc09LKCkpOwotCQkJCQlicmVhazsKLQkJCX0KLQkJCS8vIFRPRE8KLQkJCS8vYXNzZXJ0RXF1YWxzKDEsIHZhbGlkYXRpb25MaXN0LnNpemUoKSk7Ci0JCQkvL2Fzc2VydFRydWUoIXZhbGlkYXRpb25MaXN0LmNvbnRhaW5zKCJhIikpOwotCQkJLy9hc3NlcnRUcnVlKCF2YWxpZGF0aW9uTGlzdC5jb250YWlucygiYiIpKTsKLQkJCS8vYXNzZXJ0VHJ1ZSghdmFsaWRhdGlvbkxpc3QuY29udGFpbnMoImMiKSk7Ci0JCQl2YWxpZGF0aW9uTGlzdC5jbGVhcigpOwotCQl9Ci0KLQkJYXNzZXJ0VHJ1ZSghZG0udmFsaWRhdGUoZmFsc2UpLmlzT0soKSk7Ci0JCWFzc2VydEVxdWFscyg4LCB2YWxpZGF0aW9uTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKHZhbGlkYXRpb25MaXN0LmNvbnRhaW5zKEEpKTsKLQkJYXNzZXJ0VHJ1ZSh2YWxpZGF0aW9uTGlzdC5jb250YWlucyhCKSk7Ci0JCWFzc2VydFRydWUodmFsaWRhdGlvbkxpc3QuY29udGFpbnMoQykpOwotCQlhc3NlcnRUcnVlKHZhbGlkYXRpb25MaXN0LmNvbnRhaW5zKCJhIikpOwotCQlhc3NlcnRUcnVlKHZhbGlkYXRpb25MaXN0LmNvbnRhaW5zKCJiIikpOwotCQlhc3NlcnRUcnVlKHZhbGlkYXRpb25MaXN0LmNvbnRhaW5zKCJjIikpOwotCQl2YWxpZGF0aW9uTGlzdC5jbGVhcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL2V4dGVuZGVkL0EuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9leHRlbmRlZC9BLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ODIwZTYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL2V4dGVuZGVkL0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzLmV4dGVuZGVkOwotCi0KLXB1YmxpYyBjbGFzcyBBIGV4dGVuZHMgQWJzdHJhY3RJRGF0YU1vZGVsVGVzdE9wZXJhdGlvbiB7Ci0KLQlwdWJsaWMgQSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvZXh0ZW5kZWQvQWJzdHJhY3RJRGF0YU1vZGVsVGVzdE9wZXJhdGlvbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL2V4dGVuZGVkL0Fic3RyYWN0SURhdGFNb2RlbFRlc3RPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRlMWEzOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvZXh0ZW5kZWQvQWJzdHJhY3RJRGF0YU1vZGVsVGVzdE9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuZXh0ZW5kZWQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotcHVibGljIGNsYXNzIEFic3RyYWN0SURhdGFNb2RlbFRlc3RPcGVyYXRpb24gZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiB7Ci0KLQlwdWJsaWMgQWJzdHJhY3RJRGF0YU1vZGVsVGVzdE9wZXJhdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQWJzdHJhY3RJRGF0YU1vZGVsVGVzdE9wZXJhdGlvbihJRGF0YU1vZGVsIGRtKSB7Ci0JCXN1cGVyKGRtKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJRXh0ZW5kZWRPcGVyYXRpb25UZXN0cy5leGVjdXRpb25MaXN0LmFkZChnZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0JCXJldHVybiBPS19TVEFUVVM7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgcmVkbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCUV4dGVuZGVkT3BlcmF0aW9uVGVzdHMuZXhlY3V0aW9uTGlzdC5hZGQoZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCQlyZXR1cm4gT0tfU1RBVFVTOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHVuZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlFeHRlbmRlZE9wZXJhdGlvblRlc3RzLmV4ZWN1dGlvbkxpc3QuYWRkKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQkJcmV0dXJuIE9LX1NUQVRVUzsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvZXh0ZW5kZWQvQi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL2V4dGVuZGVkL0IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FkNDdhMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvZXh0ZW5kZWQvQi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuZXh0ZW5kZWQ7Ci0KLQotcHVibGljIGNsYXNzIEIgZXh0ZW5kcyBBYnN0cmFjdElEYXRhTW9kZWxUZXN0T3BlcmF0aW9uIHsKLQotCXB1YmxpYyBCKCkgewotCQlzdXBlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9leHRlbmRlZC9DLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvZXh0ZW5kZWQvQy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzUxYzYwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9leHRlbmRlZC9DLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0cy5leHRlbmRlZDsKLQotCi1wdWJsaWMgY2xhc3MgQyBleHRlbmRzIEFic3RyYWN0SURhdGFNb2RlbFRlc3RPcGVyYXRpb24gewotCi0JcHVibGljIEMoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL2V4dGVuZGVkL0QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9leHRlbmRlZC9ELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNjcwYTUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL2V4dGVuZGVkL0QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzLmV4dGVuZGVkOwotCi1wdWJsaWMgY2xhc3MgRCBleHRlbmRzIEFic3RyYWN0SURhdGFNb2RlbFRlc3RPcGVyYXRpb24gewotCi0JcHVibGljIEQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvZXh0ZW5kZWQvRS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL2V4dGVuZGVkL0UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNiZWY3My4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvZXh0ZW5kZWQvRS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuZXh0ZW5kZWQ7Ci0KLXB1YmxpYyBjbGFzcyBFIGV4dGVuZHMgQWJzdHJhY3RJRGF0YU1vZGVsVGVzdE9wZXJhdGlvbiB7Ci0KLQlwdWJsaWMgRSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9leHRlbmRlZC9FeHRlbmRlZE9wZXJhdGlvblRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvZXh0ZW5kZWQvRXh0ZW5kZWRPcGVyYXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGFiODU3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9leHRlbmRlZC9FeHRlbmRlZE9wZXJhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuZXh0ZW5kZWQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLklEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLklEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwuSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXI7Ci0KLXB1YmxpYyBjbGFzcyBFeHRlbmRlZE9wZXJhdGlvblRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIHN0YXRpYyBMaXN0IGV4ZWN1dGlvbkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBhID0gQS5jbGFzcy5nZXROYW1lKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgYiA9IEIuY2xhc3MuZ2V0TmFtZSgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGMgPSBDLmNsYXNzLmdldE5hbWUoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBkID0gRC5jbGFzcy5nZXROYW1lKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZSA9IEUuY2xhc3MuZ2V0TmFtZSgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGYgPSBGLmNsYXNzLmdldE5hbWUoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnID0gRy5jbGFzcy5nZXROYW1lKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgaCA9IEguY2xhc3MuZ2V0TmFtZSgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIHIgPSBSLmNsYXNzLmdldE5hbWUoKTsKLQotCXByb3RlY3RlZCBjbGFzcyBQYXVzZUxpc3RlbmVyIGltcGxlbWVudHMgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXIgewotCi0JCXB1YmxpYyBMaXN0IHBhdXNlZE9wZXJhdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJcHVibGljIGludCBub3RpZnkoSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCVN0cmluZyBvcElEID0gZXZlbnQuZ2V0T3BlcmF0aW9uKCkuZ2V0SUQoKTsKLQkJCWlmIChwYXVzZWRPcGVyYXRpb25zLmNvbnRhaW5zKG9wSUQpKSB7Ci0JCQkJcmV0dXJuIENPTlRJTlVFOwotCQkJfQotCQkJcGF1c2VkT3BlcmF0aW9ucy5hZGQob3BJRCk7Ci0JCQlyZXR1cm4gUEFVU0U7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgUGF1c2VMaXN0ZW5lciBwYXVzZUxpc3RlbmVyID0gbmV3IFBhdXNlTGlzdGVuZXIoKTsKLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCWV4ZWN1dGlvbkxpc3QuY2xlYXIoKTsKLQkJcGF1c2VMaXN0ZW5lci5wYXVzZWRPcGVyYXRpb25zLmNsZWFyKCk7Ci0JCUlQcm9qZWN0IHAgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoImZvbyIpOyAvLyROT04tTkxTLTEkCi0JCWlmICghcC5leGlzdHMoKSkgewotCQkJcC5jcmVhdGUobnVsbCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWxsT24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSURhdGFNb2RlbCBkbSA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBSb290RE1Qcm92aWRlcigpKTsKLQkJU3RyaW5nW10gZm9yd2FyZEV4cGVjdGVkUmVzdWx0cyA9IG5ldyBTdHJpbmdbXXtjLCBhLCBkLCByLCBlLCBiLCBmLCBnLCBofTsKLQkJU3RyaW5nW10gZm9yd2FyZEV4cGVjdGVkUGF1c2VPcmRlciA9IG5ldyBTdHJpbmdbXXtyLCBhLCBjLCBkLCBiLCBlLCBmLCBoLCBnfTsKLQkJY2hlY2tBbGwoZG0sIGZvcndhcmRFeHBlY3RlZFJlc3VsdHMsIGZvcndhcmRFeHBlY3RlZFBhdXNlT3JkZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbGxPZmYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSURhdGFNb2RlbCBkbSA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBSb290RE1Qcm92aWRlcigpKTsKLQkJZG0uc2V0Qm9vbGVhblByb3BlcnR5KElEYXRhTW9kZWxQcm9wZXJ0aWVzLkFMTE9XX0VYVEVOU0lPTlMsIGZhbHNlKTsKLQkJU3RyaW5nW10gZm9yd2FyZEV4cGVjdGVkUmVzdWx0cyA9IG5ldyBTdHJpbmdbXXtyfTsKLQkJU3RyaW5nW10gZm9yd2FyZEV4cGVjdGVkUGF1c2VPcmRlciA9IG5ldyBTdHJpbmdbXXtyfTsKLQkJY2hlY2tBbGwoZG0sIGZvcndhcmRFeHBlY3RlZFJlc3VsdHMsIGZvcndhcmRFeHBlY3RlZFBhdXNlT3JkZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBT2ZmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlEYXRhTW9kZWwgZG0gPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgUm9vdERNUHJvdmlkZXIoKSk7Ci0JCUxpc3QgcmVzdHJpY3RlZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJlc3RyaWN0ZWRMaXN0LmFkZChhKTsKLQkJZG0uc2V0UHJvcGVydHkoSURhdGFNb2RlbFByb3BlcnRpZXMuUkVTVFJJQ1RfRVhURU5TSU9OUywgcmVzdHJpY3RlZExpc3QpOwotCQlTdHJpbmdbXSBmb3J3YXJkRXhwZWN0ZWRSZXN1bHRzID0gbmV3IFN0cmluZ1tde3IsIGUsIGIsIGYsIGcsIGh9OwotCQlTdHJpbmdbXSBmb3J3YXJkRXhwZWN0ZWRQYXVzZU9yZGVyID0gbmV3IFN0cmluZ1tde3IsIGIsIGUsIGYsIGgsIGd9OwotCQljaGVja0FsbChkbSwgZm9yd2FyZEV4cGVjdGVkUmVzdWx0cywgZm9yd2FyZEV4cGVjdGVkUGF1c2VPcmRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJPZmYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSURhdGFNb2RlbCBkbSA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBSb290RE1Qcm92aWRlcigpKTsKLQkJTGlzdCByZXN0cmljdGVkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmVzdHJpY3RlZExpc3QuYWRkKGIpOwotCQlkbS5zZXRQcm9wZXJ0eShJRGF0YU1vZGVsUHJvcGVydGllcy5SRVNUUklDVF9FWFRFTlNJT05TLCByZXN0cmljdGVkTGlzdCk7Ci0JCVN0cmluZ1tdIGZvcndhcmRFeHBlY3RlZFJlc3VsdHMgPSBuZXcgU3RyaW5nW117YywgYSwgZCwgcn07Ci0JCVN0cmluZ1tdIGZvcndhcmRFeHBlY3RlZFBhdXNlT3JkZXIgPSBuZXcgU3RyaW5nW117ciwgYSwgYywgZH07Ci0JCWNoZWNrQWxsKGRtLCBmb3J3YXJkRXhwZWN0ZWRSZXN1bHRzLCBmb3J3YXJkRXhwZWN0ZWRQYXVzZU9yZGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q09mZigpIHRocm93cyBFeGNlcHRpb24gewotCQlJRGF0YU1vZGVsIGRtID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IFJvb3RETVByb3ZpZGVyKCkpOwotCQlMaXN0IHJlc3RyaWN0ZWRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXN0cmljdGVkTGlzdC5hZGQoYyk7Ci0JCWRtLnNldFByb3BlcnR5KElEYXRhTW9kZWxQcm9wZXJ0aWVzLlJFU1RSSUNUX0VYVEVOU0lPTlMsIHJlc3RyaWN0ZWRMaXN0KTsKLQkJU3RyaW5nW10gZm9yd2FyZEV4cGVjdGVkUmVzdWx0cyA9IG5ldyBTdHJpbmdbXXthLCBkLCByLCBlLCBiLCBmLCBnLCBofTsKLQkJU3RyaW5nW10gZm9yd2FyZEV4cGVjdGVkUGF1c2VPcmRlciA9IG5ldyBTdHJpbmdbXXtyLCBhLCBkLCBiLCBlLCBmLCBoLCBnfTsKLQkJY2hlY2tBbGwoZG0sIGZvcndhcmRFeHBlY3RlZFJlc3VsdHMsIGZvcndhcmRFeHBlY3RlZFBhdXNlT3JkZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDRk9mZigpIHRocm93cyBFeGNlcHRpb24gewotCQlJRGF0YU1vZGVsIGRtID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IFJvb3RETVByb3ZpZGVyKCkpOwotCQlMaXN0IHJlc3RyaWN0ZWRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXN0cmljdGVkTGlzdC5hZGQoYyk7Ci0JCXJlc3RyaWN0ZWRMaXN0LmFkZChmKTsKLQkJZG0uc2V0UHJvcGVydHkoSURhdGFNb2RlbFByb3BlcnRpZXMuUkVTVFJJQ1RfRVhURU5TSU9OUywgcmVzdHJpY3RlZExpc3QpOwotCQlTdHJpbmdbXSBmb3J3YXJkRXhwZWN0ZWRSZXN1bHRzID0gbmV3IFN0cmluZ1tde2EsIGQsIHIsIGUsIGJ9OwotCQlTdHJpbmdbXSBmb3J3YXJkRXhwZWN0ZWRQYXVzZU9yZGVyID0gbmV3IFN0cmluZ1tde3IsIGEsIGQsIGIsIGV9OwotCQljaGVja0FsbChkbSwgZm9yd2FyZEV4cGVjdGVkUmVzdWx0cywgZm9yd2FyZEV4cGVjdGVkUGF1c2VPcmRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENCT2ZmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlEYXRhTW9kZWwgZG0gPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgUm9vdERNUHJvdmlkZXIoKSk7Ci0JCUxpc3QgcmVzdHJpY3RlZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJlc3RyaWN0ZWRMaXN0LmFkZChjKTsKLQkJcmVzdHJpY3RlZExpc3QuYWRkKGIpOwotCQlkbS5zZXRQcm9wZXJ0eShJRGF0YU1vZGVsUHJvcGVydGllcy5SRVNUUklDVF9FWFRFTlNJT05TLCByZXN0cmljdGVkTGlzdCk7Ci0JCVN0cmluZ1tdIGZvcndhcmRFeHBlY3RlZFJlc3VsdHMgPSBuZXcgU3RyaW5nW117YSwgZCwgcn07Ci0JCVN0cmluZ1tdIGZvcndhcmRFeHBlY3RlZFBhdXNlT3JkZXIgPSBuZXcgU3RyaW5nW117ciwgYSwgZH07Ci0JCWNoZWNrQWxsKGRtLCBmb3J3YXJkRXhwZWN0ZWRSZXN1bHRzLCBmb3J3YXJkRXhwZWN0ZWRQYXVzZU9yZGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QUVGT2ZmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlEYXRhTW9kZWwgZG0gPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgUm9vdERNUHJvdmlkZXIoKSk7Ci0JCUxpc3QgcmVzdHJpY3RlZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJlc3RyaWN0ZWRMaXN0LmFkZChhKTsKLQkJcmVzdHJpY3RlZExpc3QuYWRkKGUpOwotCQlyZXN0cmljdGVkTGlzdC5hZGQoZik7Ci0JCWRtLnNldFByb3BlcnR5KElEYXRhTW9kZWxQcm9wZXJ0aWVzLlJFU1RSSUNUX0VYVEVOU0lPTlMsIHJlc3RyaWN0ZWRMaXN0KTsKLQkJU3RyaW5nW10gZm9yd2FyZEV4cGVjdGVkUmVzdWx0cyA9IG5ldyBTdHJpbmdbXXtyLCBifTsKLQkJU3RyaW5nW10gZm9yd2FyZEV4cGVjdGVkUGF1c2VPcmRlciA9IG5ldyBTdHJpbmdbXXtyLCBifTsKLQkJY2hlY2tBbGwoZG0sIGZvcndhcmRFeHBlY3RlZFJlc3VsdHMsIGZvcndhcmRFeHBlY3RlZFBhdXNlT3JkZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBQk9mZigpIHRocm93cyBFeGNlcHRpb24gewotCQlJRGF0YU1vZGVsIGRtID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IFJvb3RETVByb3ZpZGVyKCkpOwotCQlMaXN0IHJlc3RyaWN0ZWRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXN0cmljdGVkTGlzdC5hZGQoYSk7Ci0JCXJlc3RyaWN0ZWRMaXN0LmFkZChiKTsKLQkJZG0uc2V0UHJvcGVydHkoSURhdGFNb2RlbFByb3BlcnRpZXMuUkVTVFJJQ1RfRVhURU5TSU9OUywgcmVzdHJpY3RlZExpc3QpOwotCQlTdHJpbmdbXSBmb3J3YXJkRXhwZWN0ZWRSZXN1bHRzID0gbmV3IFN0cmluZ1tde3J9OwotCQlTdHJpbmdbXSBmb3J3YXJkRXhwZWN0ZWRQYXVzZU9yZGVyID0gbmV3IFN0cmluZ1tde3J9OwotCQljaGVja0FsbChkbSwgZm9yd2FyZEV4cGVjdGVkUmVzdWx0cywgZm9yd2FyZEV4cGVjdGVkUGF1c2VPcmRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrQWxsKElEYXRhTW9kZWwgZG0sIFN0cmluZ1tdIGZvcndhcmRFeHBlY3RlZFJlc3VsdHMsIFN0cmluZ1tdIGV4cGVjdGVkUGF1c2VPcmRlcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZ1tdIHVuZG9FeHBlY3RlZFJlc3VsdHMgPSByZXZlcnNlU3RyaW5nKGZvcndhcmRFeHBlY3RlZFJlc3VsdHMpOwotCQlib29sZWFuIHNob3VsZFJvbGxCYWNrID0gZmFsc2U7Ci0KLQkJLy8gQ2hlY2sgcmVndWxhciBleGVjdXRpb25zCi0JCUlEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbiBvcCA9IChJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb24pZG0uZ2V0RGVmYXVsdE9wZXJhdGlvbigpOwotCQljaGVja0V4ZWN1dGlvbihvcCwgZm9yd2FyZEV4cGVjdGVkUmVzdWx0cywgbnVsbCwgc2hvdWxkUm9sbEJhY2spOwotCQljaGVja1VuZG8ob3AsIHVuZG9FeHBlY3RlZFJlc3VsdHMsIG51bGwpOwotCQljaGVja1JlZG8ob3AsIGZvcndhcmRFeHBlY3RlZFJlc3VsdHMsIG51bGwpOwotCQljaGVja1VuZG8ob3AsIHVuZG9FeHBlY3RlZFJlc3VsdHMsIG51bGwpOwotCi0JCS8vIENoZWNrIGV4ZWN1dGlvbnMgd2l0aCBwYXVzaW5nICYgcmVzdW1pbmcKLQkJb3AgPSAoSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uKWRtLmdldERlZmF1bHRPcGVyYXRpb24oKTsKLQkJb3AuYWRkT3BlcmF0aW9uTGlzdGVuZXIocGF1c2VMaXN0ZW5lcik7Ci0JCWNoZWNrRXhlY3V0aW9uKG9wLCBmb3J3YXJkRXhwZWN0ZWRSZXN1bHRzLCBleHBlY3RlZFBhdXNlT3JkZXIsIHNob3VsZFJvbGxCYWNrKTsKLQkJY2hlY2tVbmRvKG9wLCB1bmRvRXhwZWN0ZWRSZXN1bHRzLCB1bmRvRXhwZWN0ZWRSZXN1bHRzKTsKLQkJY2hlY2tSZWRvKG9wLCBmb3J3YXJkRXhwZWN0ZWRSZXN1bHRzLCBmb3J3YXJkRXhwZWN0ZWRSZXN1bHRzKTsKLQkJY2hlY2tVbmRvKG9wLCB1bmRvRXhwZWN0ZWRSZXN1bHRzLCB1bmRvRXhwZWN0ZWRSZXN1bHRzKTsKLQotCQkvLyBDaGVjayBleGVjdXRpb25zIHdpdGggcGF1c2luZywgcmVzdW1pbmcgJiByb2xsaW5nIGJhY2suCi0JCW9wID0gKElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbilkbS5nZXREZWZhdWx0T3BlcmF0aW9uKCk7Ci0JCW9wLmFkZE9wZXJhdGlvbkxpc3RlbmVyKHBhdXNlTGlzdGVuZXIpOwotCQlzaG91bGRSb2xsQmFjayA9IHRydWU7Ci0JCWNoZWNrRXhlY3V0aW9uKG9wLCBmb3J3YXJkRXhwZWN0ZWRSZXN1bHRzLCBleHBlY3RlZFBhdXNlT3JkZXIsIHNob3VsZFJvbGxCYWNrKTsKLQkJY2hlY2tVbmRvKG9wLCB1bmRvRXhwZWN0ZWRSZXN1bHRzLCB1bmRvRXhwZWN0ZWRSZXN1bHRzKTsKLQkJY2hlY2tSZWRvKG9wLCBmb3J3YXJkRXhwZWN0ZWRSZXN1bHRzLCBmb3J3YXJkRXhwZWN0ZWRSZXN1bHRzKTsKLQkJY2hlY2tVbmRvKG9wLCB1bmRvRXhwZWN0ZWRSZXN1bHRzLCB1bmRvRXhwZWN0ZWRSZXN1bHRzKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZ1tdIHJldmVyc2VTdHJpbmcoU3RyaW5nW10gZm9yd2FyZFN0cmluZykgewotCQlTdHJpbmdbXSByZXZlcnNlU3RyaW5nID0gbmV3IFN0cmluZ1tmb3J3YXJkU3RyaW5nLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmV2ZXJzZVN0cmluZy5sZW5ndGg7IGkrKykgewotCQkJcmV2ZXJzZVN0cmluZ1tpXSA9IGZvcndhcmRTdHJpbmdbZm9yd2FyZFN0cmluZy5sZW5ndGggLSBpIC0gMV07Ci0JCX0KLQkJcmV0dXJuIHJldmVyc2VTdHJpbmc7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrRXhlY3V0aW9uKElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbiBvcCwgU3RyaW5nW10gZXhwZWN0ZWRSZXN1bHRzLCBTdHJpbmdbXSBleHBlY3RlZFBhdXNlT3JkZXIsIGJvb2xlYW4gcm9sbGJhY2spIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uLk5PVF9TVEFSVEVELCBvcC5nZXRFeGVjdXRpb25TdGF0ZSgpKTsKLQkJb3AuZXhlY3V0ZShudWxsLCBudWxsKTsKLQkJaWYgKG51bGwgIT0gZXhwZWN0ZWRQYXVzZU9yZGVyKSB7Ci0JCQlpZiAocm9sbGJhY2spIHsKLQkJCQlMaXN0IGNhY2hlZEV4ZWN1dGlvbkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZFJlc3VsdHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJY2FjaGVkRXhlY3V0aW9uTGlzdC5jbGVhcigpOwotCQkJCQljYWNoZWRFeGVjdXRpb25MaXN0LmFkZEFsbChleGVjdXRpb25MaXN0KTsKLQkJCQkJYXNzZXJ0RXF1YWxzKElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbi5QQVVTRURfRVhFQ1VURSwgb3AuZ2V0RXhlY3V0aW9uU3RhdGUoKSk7Ci0JCQkJCW9wLnJvbGxCYWNrKG51bGwsIG51bGwpOwotCQkJCQlhc3NlcnRFcXVhbHMoSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uLkNPTVBMRVRFX1JPTExCQUNLLCBvcC5nZXRFeGVjdXRpb25TdGF0ZSgpKTsKLQkJCQkJY2hlY2tSb2xsQmFja1Jlc3VsdHMoY2FjaGVkRXhlY3V0aW9uTGlzdCwgZXhwZWN0ZWRSZXN1bHRzKTsKLQkJCQkJb3AucmVzdW1lKG51bGwsIG51bGwpOwotCQkJCX0KLQkJCQlhc3NlcnRFcXVhbHMoSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uLkNPTVBMRVRFX0VYRUNVVEUsIG9wLmdldEV4ZWN1dGlvblN0YXRlKCkpOwotCQkJCWNoZWNrUmVzdWx0cyhleHBlY3RlZFJlc3VsdHMsIGV4cGVjdGVkUGF1c2VPcmRlcik7CQotCQkJCQotCQkJCXBhdXNlTGlzdGVuZXIucGF1c2VkT3BlcmF0aW9ucy5jbGVhcigpOwotCQkJCWV4ZWN1dGlvbkxpc3QuY2xlYXIoKTsKLQkJCQlvcC5leGVjdXRlKG51bGwsIG51bGwpOwotCQkJfQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZFJlc3VsdHMubGVuZ3RoOyBpKyspIHsKLQkJCQlhc3NlcnRFcXVhbHMoSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uLlBBVVNFRF9FWEVDVVRFLCBvcC5nZXRFeGVjdXRpb25TdGF0ZSgpKTsKLQkJCQlvcC5yZXN1bWUobnVsbCwgbnVsbCk7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbi5DT01QTEVURV9FWEVDVVRFLCBvcC5nZXRFeGVjdXRpb25TdGF0ZSgpKTsKLQkJY2hlY2tSZXN1bHRzKGV4cGVjdGVkUmVzdWx0cywgZXhwZWN0ZWRQYXVzZU9yZGVyKTsKLQkJZXhlY3V0aW9uTGlzdC5jbGVhcigpOwotCQlwYXVzZUxpc3RlbmVyLnBhdXNlZE9wZXJhdGlvbnMuY2xlYXIoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tVbmRvKElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbiBvcCwgU3RyaW5nW10gZXhwZWN0ZWRSZXN1bHRzLCBTdHJpbmdbXSBleHBlY3RlZFBhdXNlT3JkZXIpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAob3AuZ2V0RXhlY3V0aW9uU3RhdGUoKSAhPSBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb24uQ09NUExFVEVfRVhFQ1VURSAmJiBvcC5nZXRFeGVjdXRpb25TdGF0ZSgpICE9IElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbi5DT01QTEVURV9SRURPKSB7Ci0JCQlmYWlsKCJPcGVyYXRpb24gZXhlY3V0aW9uIHN0YXRlIGludmFsaWQgIiArIG9wLmdldEV4ZWN1dGlvblN0YXRlKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJb3AudW5kbyhudWxsLCBudWxsKTsKLQkJaWYgKG51bGwgIT0gZXhwZWN0ZWRQYXVzZU9yZGVyKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkUmVzdWx0cy5sZW5ndGg7IGkrKykgewotCQkJCWFzc2VydEVxdWFscyhJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb24uUEFVU0VEX1VORE8sIG9wLmdldEV4ZWN1dGlvblN0YXRlKCkpOwotCQkJCW9wLnJlc3VtZShudWxsLCBudWxsKTsKLQkJCX0KLQkJfQotCQlhc3NlcnRFcXVhbHMoSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uLkNPTVBMRVRFX1VORE8sIG9wLmdldEV4ZWN1dGlvblN0YXRlKCkpOwotCQljaGVja1Jlc3VsdHMoZXhwZWN0ZWRSZXN1bHRzLCBleHBlY3RlZFBhdXNlT3JkZXIpOwotCQlleGVjdXRpb25MaXN0LmNsZWFyKCk7Ci0JCXBhdXNlTGlzdGVuZXIucGF1c2VkT3BlcmF0aW9ucy5jbGVhcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja1JlZG8oSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uIG9wLCBTdHJpbmdbXSBleHBlY3RlZFJlc3VsdHMsIFN0cmluZ1tdIGV4cGVjdGVkUGF1c2VPcmRlcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscyhJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb24uQ09NUExFVEVfVU5ETywgb3AuZ2V0RXhlY3V0aW9uU3RhdGUoKSk7Ci0JCW9wLnJlZG8obnVsbCwgbnVsbCk7Ci0JCWlmIChudWxsICE9IGV4cGVjdGVkUGF1c2VPcmRlcikgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZFJlc3VsdHMubGVuZ3RoOyBpKyspIHsKLQkJCQlhc3NlcnRFcXVhbHMoSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uLlBBVVNFRF9SRURPLCBvcC5nZXRFeGVjdXRpb25TdGF0ZSgpKTsKLQkJCQlvcC5yZXN1bWUobnVsbCwgbnVsbCk7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbi5DT01QTEVURV9SRURPLCBvcC5nZXRFeGVjdXRpb25TdGF0ZSgpKTsKLQkJY2hlY2tSZXN1bHRzKGV4cGVjdGVkUmVzdWx0cywgZXhwZWN0ZWRQYXVzZU9yZGVyKTsKLQkJZXhlY3V0aW9uTGlzdC5jbGVhcigpOwotCQlwYXVzZUxpc3RlbmVyLnBhdXNlZE9wZXJhdGlvbnMuY2xlYXIoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tSb2xsQmFja1Jlc3VsdHMoTGlzdCBjYWNoZWRFeGVjdXRpb25MaXN0LCBTdHJpbmcgW10gZXhwZWN0ZWRSZXN1bHRzKSB7Ci0JCWFzc2VydEVxdWFscyhjYWNoZWRFeGVjdXRpb25MaXN0LnNpemUoKSAqIDIsIGV4ZWN1dGlvbkxpc3Quc2l6ZSgpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYWNoZWRFeGVjdXRpb25MaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRSZXN1bHRzW2ldLCAoU3RyaW5nKWV4ZWN1dGlvbkxpc3QuZ2V0KGkpKTsKLQkJCWFzc2VydEVxdWFscygoU3RyaW5nKWNhY2hlZEV4ZWN1dGlvbkxpc3QuZ2V0KGkpLCAoU3RyaW5nKSBleGVjdXRpb25MaXN0LmdldChleGVjdXRpb25MaXN0LnNpemUoKSAtIDEgLSBpKSk7Ci0JCX0KLQkJZXhlY3V0aW9uTGlzdC5jbGVhcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja1Jlc3VsdHMoU3RyaW5nW10gZXhwZWN0ZWRSZXN1bHRzLCBTdHJpbmdbXSBleHBlY3RlZFBhdXNlT3JkZXIpIHsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkUmVzdWx0cy5sZW5ndGgsIGV4ZWN1dGlvbkxpc3Quc2l6ZSgpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZFJlc3VsdHMubGVuZ3RoOyBpKyspIHsKLQkJCWFzc2VydEVxdWFscyhleHBlY3RlZFJlc3VsdHNbaV0sIChTdHJpbmcpIGV4ZWN1dGlvbkxpc3QuZ2V0KGkpKTsKLQkJfQotCQlpZiAobnVsbCA9PSBleHBlY3RlZFBhdXNlT3JkZXIpIHsKLQkJCWFzc2VydEVxdWFscygwLCBwYXVzZUxpc3RlbmVyLnBhdXNlZE9wZXJhdGlvbnMuc2l6ZSgpKTsKLQkJfSBlbHNlIHsKLQkJCWFzc2VydEVxdWFscyhleHBlY3RlZFBhdXNlT3JkZXIubGVuZ3RoLCBwYXVzZUxpc3RlbmVyLnBhdXNlZE9wZXJhdGlvbnMuc2l6ZSgpKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWRQYXVzZU9yZGVyLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkUGF1c2VPcmRlcltpXSwgKFN0cmluZykgcGF1c2VMaXN0ZW5lci5wYXVzZWRPcGVyYXRpb25zLmdldChpKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9leHRlbmRlZC9GLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvZXh0ZW5kZWQvRi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmIwOTljLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9leHRlbmRlZC9GLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0cy5leHRlbmRlZDsKLQotcHVibGljIGNsYXNzIEYgZXh0ZW5kcyBBYnN0cmFjdElEYXRhTW9kZWxUZXN0T3BlcmF0aW9uIHsKLQotCXB1YmxpYyBGKCkgewotCQlzdXBlcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL2V4dGVuZGVkL0cuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9leHRlbmRlZC9HLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwM2I2MDguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL2V4dGVuZGVkL0cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzLmV4dGVuZGVkOwotCi1wdWJsaWMgY2xhc3MgRyBleHRlbmRzIEFic3RyYWN0SURhdGFNb2RlbFRlc3RPcGVyYXRpb24gewotCi0JcHVibGljIEcoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvZXh0ZW5kZWQvSC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL2V4dGVuZGVkL0guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIzY2NkZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvZXh0ZW5kZWQvSC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuZXh0ZW5kZWQ7Ci0KLXB1YmxpYyBjbGFzcyBIIGV4dGVuZHMgQWJzdHJhY3RJRGF0YU1vZGVsVGVzdE9wZXJhdGlvbiB7Ci0KLQlwdWJsaWMgSCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvZXh0ZW5kZWQvUi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL2V4dGVuZGVkL1IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjcxZTE0Yy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvZXh0ZW5kZWQvUi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuZXh0ZW5kZWQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLQotcHVibGljIGNsYXNzIFIgZXh0ZW5kcyBBYnN0cmFjdElEYXRhTW9kZWxUZXN0T3BlcmF0aW9uIHsKLQotCXB1YmxpYyBSKElEYXRhTW9kZWwgZG0pewotCQlzdXBlcihkbSk7Ci0JfQotCQotCXB1YmxpYyBSKCkgewotCQlzdXBlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9leHRlbmRlZC9Sb290RE1Qcm92aWRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL2V4dGVuZGVkL1Jvb3RETVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5Y2MxZDQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL2V4dGVuZGVkL1Jvb3RETVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0cy5leHRlbmRlZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgUm9vdERNUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyIHsKLQotCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldERlZmF1bHRPcGVyYXRpb24oKSB7Ci0JCXJldHVybiBuZXcgUihtb2RlbCk7Ci0JfQotCi0JcHVibGljIElQcm9qZWN0IGdldFRhcmdldFByb2plY3QoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoImZvbyIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvdGVzdHMvYnZ0L0F1dG9tYXRlZEJWVC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvdGVzdHMvYnZ0L0F1dG9tYXRlZEJWVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2UxNzhlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL3Rlc3RzL2J2dC9BdXRvbWF0ZWRCVlQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEFwciAxLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudGVzdHMuYnZ0OwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGx1Z2luRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC50ZXN0cy5FbnZpcm9ubWVudFRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5hcnRpZmFjdGVkaXQudGVzdHMuQXJ0aWZhY3RFZGl0QVBJVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmNvbXBvbmVudGNvcmUudGVzdHMuQWxsVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0cy5EYXRhTW9kZWxBUElUZXN0czsKLQotCi0vKioKLSAqIEBhdXRob3IganNob2xsCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQXV0b21hdGVkQlZUIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJhc2VEaXJlY3RvcnkgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIikgKyBqYXZhLmlvLkZpbGUuc2VwYXJhdG9yQ2hhciArICJUZXN0RGF0YSIgKyBqYXZhLmlvLkZpbGUuc2VwYXJhdG9yQ2hhcjsKLQotCXN0YXRpYyB7Ci0JCXRyeSB7Ci0JCQlJUGx1Z2luRGVzY3JpcHRvciBwbHVnaW5EZXNjcmlwdG9yID0gUGxhdGZvcm0uZ2V0UGx1Z2luUmVnaXN0cnkoKS5nZXRQbHVnaW5EZXNjcmlwdG9yKCJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzIik7Ci0JCQlVUkwgdXJsID0gcGx1Z2luRGVzY3JpcHRvci5nZXRJbnN0YWxsVVJMKCk7Ci0JCQlBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSA9IFBsYXRmb3JtLmFzTG9jYWxVUkwodXJsKS5nZXRGaWxlKCkgKyAiVGVzdERhdGEiICsgamF2YS5pby5GaWxlLnNlcGFyYXRvckNoYXI7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oIlVzaW5nIHdvcmtpbmcgZGlyZWN0b3J5IHNpbmNlIGEgd29ya3NwYWNlIFVSTCBjb3VsZCBub3QgYmUgbG9jYXRlZC4iKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgaW50IHVuaW1wbGVtZW50ZWRNZXRob2RzOwotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQl1bmltcGxlbWVudGVkTWV0aG9kcyA9IDA7Ci0JCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotCQlpZiAodW5pbXBsZW1lbnRlZE1ldGhvZHMgPiAwKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxuQ2FsbHMgdG8gd2FyblVuaW1wbDogIiArIHVuaW1wbGVtZW50ZWRNZXRob2RzKTsKLQkJfQotCX0KLQotCXB1YmxpYyBBdXRvbWF0ZWRCVlQoKSB7Ci0JCXN1cGVyKCk7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IChUZXN0U3VpdGUpIEF1dG9tYXRlZEJWVC5zdWl0ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHN1aXRlLnRlc3RDb3VudCgpOyBpKyspIHsKLQkJCWFkZFRlc3Qoc3VpdGUudGVzdEF0KGkpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgiVGVzdCBmb3Igb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0LmJ2dCIpOwotCQlzdWl0ZS5hZGRUZXN0KG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIudGVzdHMuQWxsVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoQWxsVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoRGF0YU1vZGVsQVBJVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoQXJ0aWZhY3RFZGl0QVBJVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoRW52aXJvbm1lbnRUZXN0cy5zdWl0ZSgpKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL3Rlc3RzL2J2dC9BdXRvbWF0ZWRCVlRFY2xpcHNlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy90ZXN0cy9idnQvQXV0b21hdGVkQlZURWNsaXBzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzg0YTg5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL3Rlc3RzL2J2dC9BdXRvbWF0ZWRCVlRFY2xpcHNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMjUsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy50ZXN0cy5idnQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGx1Z2luRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqLwotcHVibGljIGNsYXNzIEF1dG9tYXRlZEJWVEVjbGlwc2UgZXh0ZW5kcyBBdXRvbWF0ZWRCVlQgewotCQotCXB1YmxpYyBBdXRvbWF0ZWRCVlRFY2xpcHNlKCl7Ci0JCXN1cGVyKCk7Ci0JCUlQbHVnaW5EZXNjcmlwdG9yIHBsdWdpbkRlc2NyaXB0b3IgPSBQbGF0Zm9ybS5nZXRQbHVnaW5SZWdpc3RyeSgpLmdldFBsdWdpbkRlc2NyaXB0b3IoIm9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMiKTsKLSAgICAgICAgVVJMIHVybCA9IHBsdWdpbkRlc2NyaXB0b3IuZ2V0SW5zdGFsbFVSTCgpOwotICAgICAgICB0cnkgewotICAgICAgICAJQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgPSBQbGF0Zm9ybS5hc0xvY2FsVVJMKHVybCkuZ2V0RmlsZSgpICsgIlRlc3REYXRhIisgamF2YS5pby5GaWxlLnNlcGFyYXRvckNoYXI7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA2MzNmMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jUHJvcGVydGllcyBmaWxlIGZvciBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzCi1CdW5kbGUtVmVuZG9yLjAgPSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotQnVuZGxlLU5hbWUuMCA9IG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL3BsdWdpbi54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNTQzMmMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICAgIDxleHRlbnNpb24tcG9pbnQgaWQ9IkRhdGFNb2RlbFZlcmlmaWVyIiBuYW1lPSJEYXRhIE1vZGVsIFZlcmlmaWVyIEZhY3RvcnkgRXh0ZW5zaW9uIiBzY2hlbWE9InNjaGVtYS9kYXRhTW9kZWxWZXJpZmllci5leHNkIi8+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3Rvci5zdWl0ZXMiPgotICAgICAgICAgPHN1aXRlCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0cy5EYXRhTW9kZWxBUElUZXN0cyIKLSAgICAgICAgICAgIG5hbWU9IklEYXRhTW9kZWwgQVBJIFRlc3RzIj4KLSAgICAgICAgIDwvc3VpdGU+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuRGF0YU1vZGVsUHJvdmlkZXJFeHRlbnNpb24iPgotICAgICAgPERhdGFNb2RlbFByb3ZpZGVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0cy5UZXN0RGF0YU1vZGVsUHJvdmlkZXIiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0cy5JVGVzdERhdGFNb2RlbCIvPgotICAgICAgPERhdGFNb2RlbFByb3ZpZGVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLm9wZXJhdGlvbnMudGVzdHMubWFuYWdlci5UZXN0UHJvdmlkZXIxIgotICAgICAgICAgICAgaWQ9InRlc3Rwcm92aWRlcjEiLz4KLSAgICAgIDxEYXRhTW9kZWxQcm92aWRlcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5vcGVyYXRpb25zLnRlc3RzLm1hbmFnZXIuVGVzdFByb3ZpZGVyMiIKLSAgICAgICAgICAgIGlkPSJ0ZXN0cHJvdmlkZXIyIi8+Ci0gICAgICA8RGF0YU1vZGVsUHJvdmlkZXIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mub3BlcmF0aW9ucy50ZXN0cy5tYW5hZ2VyLlRlc3RFeHRlbmRlZFByb3ZpZGVyIgotICAgICAgICAgICAgaWQ9InRlc3RFeHRlbmRlZFByb3ZpZGVyIi8+Ci0gICAgICA8RGF0YU1vZGVsUHJvdmlkZXIKLSAgICAgICAgICAgIGNsYXNzPSJib2d1c0NsYXNzIgotICAgICAgICAgICAgaWQ9ImJvZ3VzIi8+Ci0gICAgICA8UHJvdmlkZXJEZWZpbmVzVHlwZQotICAgICAgCQlwcm92aWRlclR5cGU9InRlc3RQcm92aWRlckJhc2UiCi0gICAgICAJCXByb3ZpZGVySUQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuSVRlc3REYXRhTW9kZWwiLz4KLSAgICAgIDxQcm92aWRlckRlZmluZXNUeXBlCi0gICAgICAJCXByb3ZpZGVyVHlwZT0idGVzdFByb3ZpZGVyQm9ndXMiCi0gICAgICAJCXByb3ZpZGVySUQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuSVRlc3REYXRhTW9kZWwiLz4KLSAgICAgIDxQcm92aWRlckltcGxlbWVudHNUeXBlCi0gICAgICAJCXByb3ZpZGVyVHlwZT0idGVzdFByb3ZpZGVyQm9ndXMiCi0gICAgICAJCXByb3ZpZGVySUQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuSVRlc3REYXRhTW9kZWxCb2d1cyIvPgkJCi0gICAgICA8UHJvdmlkZXJJbXBsZW1lbnRzVHlwZQotICAgICAgCQlwcm92aWRlclR5cGU9InRlc3RQcm92aWRlckJvZ3VzIgotICAgICAgCQlwcm92aWRlcklEPSJmYWtlLm5vbnJlZ2lzdGVyZWQuZnVuY3Rpb25ncm91cC5JVGVzdERhdGFNb2RlbCIKLQkgLz4JICAgCQkKLQkgIDwhLS0gVGVzdCBmb3IgaW5jb21wbGV0ZSBpZCdzLCBjbGFzc2VzJyBhbmQgZHVwbGljYXRlcwotICAgICAgPERhdGFNb2RlbFByb3ZpZGVyCi0gICAgICAgICAgICBjbGFzcz0iIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuSVRlc3REYXRhTW9kZWwiLz4KLSAgICAgIDxEYXRhTW9kZWxQcm92aWRlcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuVGVzdERhdGFNb2RlbFByb3ZpZGVyIgotICAgICAgICAgICAgaWQ9IiIvPgotICAgICAgPERhdGFNb2RlbFByb3ZpZGVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0cy5UZXN0RGF0YU1vZGVsUHJvdmlkZXIiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0cy5JVGVzdERhdGFNb2RlbCIvPgotICAgICAgLS0+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3Rvci5zdWl0ZXMiPgotICAgICAgPHN1aXRlCi0gICAgICAgICAgICBjbGFzcz0iIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy50ZXN0cy5idnQuQXV0b21hdGVkQlZUIgotICAgICAgICAgICAgbmFtZT0iQ29tbW9uIEZyYW1ld29yayBCVlQgVGVzdHMiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8IS0tCi0gICAJCUEgcGljdHVyZSBvZiB0aGUgb3BlcmF0aW9uIHRyZWUKLSAgIAotICAgICAgICAgICAgICAgICAgICAgICAgUgotICAgICAgICAgICAgICAgICAgICAgICAvIFwKLSAgICAgICAgICAgICAgICAgICAgICAvICAgXAotICAgICAgICAgICAgICAgICAgICAgLyAgICAgXAotICAgICAgICAgICAgICAgICAgICBBICAgICAgIEIKLSAgICAgICAgICAgICAgICAgICAvIFwgICAgIC8gXAotICAgICAgICAgICAgICAgICAgLyAgIFwgICAvICAgXAotICAgICAgICAgICAgICAgICBDICAgICBEIEUgICAgIEYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRwotICAgLS0+Ci0gICAKLSAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5PcGVyYXRpb25FeHRlbnNpb24iCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0cy5leHRlbmRlZCI+Ci0gICAgICA8b3BlcmF0aW9uRXh0ZW5zaW9uCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0cy5leHRlbmRlZC5SIgotICAgICAgICAgICAgcG9zdE9wZXJhdGlvbkNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzLmV4dGVuZGVkLkIiCi0gICAgICAgICAgICBwcmVPcGVyYXRpb25DbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0cy5leHRlbmRlZC5BIi8+Ci0gICAgICA8b3BlcmF0aW9uRXh0ZW5zaW9uCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0cy5leHRlbmRlZC5BIgotICAgICAgICAgICAgcG9zdE9wZXJhdGlvbkNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzLmV4dGVuZGVkLkQiCi0gICAgICAgICAgICBwcmVPcGVyYXRpb25DbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0cy5leHRlbmRlZC5DIi8+Ci0gICAgICA8b3BlcmF0aW9uRXh0ZW5zaW9uCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0cy5leHRlbmRlZC5CIgotICAgICAgICAgICAgcG9zdE9wZXJhdGlvbkNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzLmV4dGVuZGVkLkYiCi0gICAgICAgICAgICBwcmVPcGVyYXRpb25DbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0cy5leHRlbmRlZC5FIi8+Ci0gICAgICA8b3BlcmF0aW9uRXh0ZW5zaW9uCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0cy5leHRlbmRlZC5GIgotICAgICAgICAgICAgcG9zdE9wZXJhdGlvbkNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzLmV4dGVuZGVkLkgiLz4KLSAgICAgIDxvcGVyYXRpb25FeHRlbnNpb24KLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzLmV4dGVuZGVkLkgiCi0gICAgICAgICAgICBwcmVPcGVyYXRpb25DbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0cy5leHRlbmRlZC5HIi8+Ci0gICAgICA8b3BlcmF0aW9uRXh0ZW5zaW9uCi0gICAgICAgICAgICBpZD0iQVByZTIiCi0gICAgICAgICAgICBwcmVPcGVyYXRpb25DbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLm9wZXJhdGlvbnMudGVzdHMubWFuYWdlci5UZXN0RXh0ZW5kZWRPcGVyYXRpb24iLz4KLSAgICAgIDxvcGVyYXRpb25FeHRlbnNpb24KLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzLmV4dGVuZGVkLkgiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICAKLSAgIDwhLS0gVW5jb21tZW50IHRoZSBiZWxvdyBob29rIHRvIHRlc3Qgc3BlY2lmaWMgb3BlcmF0aW9uIGV4dGVuc2lvbiBpZHMgd2hlbiBuZWVkZWQgLS0+Ci0gICA8IS0tCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLk9wZXJhdGlvbkV4dGVuc2lvbiIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzLmV4dGVuZGVkIj4KLSAgICAgIDxvcGVyYXRpb25FeHRlbnNpb24KLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIuYXJjaGl2ZS5vcGVyYXRpb25zLldlYkNvbXBvbmVudEV4cG9ydE9wZXJhdGlvbiIKLSAgICAgICAgICAgIHByZU9wZXJhdGlvbkNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzLkhlbGxvUHJlT3BlcmF0aW9uRXh0ZW5zaW9uIgotICAgICAgICAgICAgcG9zdE9wZXJhdGlvbkNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzLkhlbGxvUG9zdE9wZXJhdGlvbkV4dGVuc2lvbiIvPgotICAgPC9leHRlbnNpb24+Ci0gICAtLT4KLSAgCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvc2NoZW1hL2RhdGFNb2RlbFZlcmlmaWVyLmV4c2QgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL3NjaGVtYS9kYXRhTW9kZWxWZXJpZmllci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjIyOGE1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvc2NoZW1hL2RhdGFNb2RlbFZlcmlmaWVyLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzIiBpZD0iZGF0YU1vZGVsVmVyaWZpZXIiIG5hbWU9IkRhdGEgTW9kZWwgVmVyaWZpZXIgRmFjdG9yeSBFeHRlbnNpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGRlc2NyaXB0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImRhdGFNb2RlbFZlcmlmZXJMaXN0Ij4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibGlzdENsYXNzIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgdGhlIGZpcnN0IHJlbGVhc2UgaW4gd2hpY2ggdGhpcyBleHRlbnNpb24gcG9pbnQgYXBwZWFycy5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy90ZXN0LnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvdGVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3MWU0MTIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy90ZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08cHJvamVjdCBuYW1lPSJ0ZXN0c3VpdGUiIGRlZmF1bHQ9InJ1biIgYmFzZWRpcj0iLiI+Ci0gIDwhLS0gVGhlIHByb3BlcnR5ICR7ZWNsaXBzZS1ob21lfSBzaG91bGQgYmUgcGFzc2VkIGludG8gdGhpcyBzY3JpcHQgLS0+Ci0gIDwhLS0gU2V0IGEgbWVhbmluZ2Z1bCBkZWZhdWx0IHZhbHVlIGZvciB3aGVuIGl0IGlzIG5vdC4gLS0+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJlY2xpcHNlLWhvbWUiIHZhbHVlPSIke2Jhc2VkaXJ9XC4uXC4uIi8+Ci0KLSAgPCEtLSBzZXRzIHRoZSBwcm9wZXJ0aWVzIGVjbGlwc2UtaG9tZSwgYW5kIGxpYnJhcnktZmlsZSAtLT4KLSAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cyIvPgotICA8cHJvcGVydHkgbmFtZT0ibGlicmFyeS1maWxlIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3BsdWdpbnMvb3JnLmVjbGlwc2UudGVzdF8zLjEuMC9saWJyYXJ5LnhtbCIvPgotICA8cHJvcGVydHkgbmFtZT0iZXh0cmFWTWFyZ3MiIHZhbHVlPSItRG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuam9uYXMuNDMyPSR7am9uYXM0MzJEaXJ9Ii8+IAotICAgICAgICAgICAgCi0gIDxwcm9wZXJ0eSBuYW1lPSJ3b3Jrc3BhY2UiIHZhbHVlPSIke2Jhc2VkaXJ9LyR7cGx1Z2luLW5hbWV9Ii8+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBob2xkcyBhbGwgaW5pdGlhbGl6YXRpb24gY29kZSB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgZm9yIC0tPgotICA8IS0tIGFsbCB0ZXN0cyB0aGF0IGFyZSB0byBiZSBydW4uIEluaXRpYWxpemF0aW9uIGZvciBpbmRpdmlkdWFsIHRlc3RzIC0tPgotICA8IS0tIHNob3VsZCBiZSBkb25lIHdpdGhpbiB0aGUgYm9keSBvZiB0aGUgc3VpdGUgdGFyZ2V0LiAtLT4KLSAgPHRhcmdldCBuYW1lPSJpbml0Ij4KLSAgICA8dHN0YW1wLz4KLSAgICA8ZGVsZXRlPgotICAgICAgPGZpbGVzZXQgZGlyPSIke2VjbGlwc2UtaG9tZX0iIGluY2x1ZGVzPSJvcmcqLnhtbCIvPgotICAgIDwvZGVsZXRlPgotICA8L3RhcmdldD4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IGRlZmluZXMgdGhlIHRlc3RzIHRoYXQgbmVlZCB0byBiZSBydW4uIC0tPgotICA8dGFyZ2V0IG5hbWU9InN1aXRlIj4KLSAgICA8ZGVsZXRlIGRpcj0iJHt3b3Jrc3BhY2V9IiBxdWlldD0idHJ1ZSIvPgotICAgIAotICAgIDxhbnQgdGFyZ2V0PSJjb3JlLXRlc3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImRhdGEtZGlyIiB2YWx1ZT0iJHt3b3Jrc3BhY2V9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy50ZXN0cy5idnQuQXV0b21hdGVkQlZUIi8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iZXh0cmFWTWFyZ3MiIHZhbHVlPSIke2V4dHJhVk1hcmdzfSIvPgotICAgIDwvYW50PgotICA8L3RhcmdldD4KLSAgICAKLSAgPCEtLSBUaGlzIHRhcmdldCBob2xkcyBjb2RlIHRvIGNsZWFudXAgdGhlIHRlc3RpbmcgZW52aXJvbm1lbnQgYWZ0ZXIgLS0+Ci0gIDwhLS0gYWZ0ZXIgYWxsIG9mIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuLiBZb3UgY2FuIHVzZSB0aGlzIHRhcmdldCB0byAtLT4KLSAgPCEtLSBkZWxldGUgdGVtcG9yYXJ5IGZpbGVzIHRoYXQgaGF2ZSBiZWVuIGNyZWF0ZWQuIC0tPgotICA8dGFyZ2V0IG5hbWU9ImNsZWFudXAiPgotCTxkZWxldGUgZGlyPSIke3dvcmtzcGFjZX0iIHF1aWV0PSJ0cnVlIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgcnVucyB0aGUgdGVzdCBzdWl0ZS4gQW55IGFjdGlvbnMgdGhhdCBuZWVkIHRvIGhhcHBlbiAtLT4KLSAgPCEtLSBhZnRlciBhbGwgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4gc2hvdWxkIGdvIGhlcmUuIC0tPgotICA8dGFyZ2V0IG5hbWU9InJ1biIgZGVwZW5kcz0iaW5pdCxzdWl0ZSxjbGVhbnVwIj4KLSAgICA8YW50IHRhcmdldD0iY29sbGVjdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iaW5jbHVkZXMiIHZhbHVlPSJvcmcqLnhtbCIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9Im91dHB1dC1maWxlIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0ueG1sIi8+Ci0gICAgPC9hbnQ+Ci0gIDwvdGFyZ2V0PgotCi08L3Byb2plY3Q+Ci0KLQotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL3Rlc3REYXRhL1Rlc3RBcnRpZmFjdEVkaXQuemlwIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy90ZXN0RGF0YS9UZXN0QXJ0aWZhY3RFZGl0LnppcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY3Y2UyMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL3Rlc3REYXRhL1Rlc3RBcnRpZmFjdEVkaXQuemlwCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy90ZXN0RGF0YS9UZXN0VmlydHVhbEFQSS56aXAgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL3Rlc3REYXRhL1Rlc3RWaXJ0dWFsQVBJLnppcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDEyMmQ0OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL3Rlc3REYXRhL1Rlc3RWaXJ0dWFsQVBJLnppcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvdGVzdERhdGEvYmFzZURhdGFfMDEueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy90ZXN0RGF0YS9iYXNlRGF0YV8wMS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkODM3NjYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy90ZXN0RGF0YS9iYXNlRGF0YV8wMS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGFwcGxpY2F0aW9uIFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEoyRUUgQXBwbGljYXRpb24gMS4zLy9FTiIgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2FwcGxpY2F0aW9uXzFfMy5kdGQiPgotPGFwcGxpY2F0aW9uIGlkPSJBcHBsaWNhdGlvbl9JRCI+Ci0JPGRpc3BsYXktbmFtZT50ZXN0PC9kaXNwbGF5LW5hbWU+Ci0JPG1vZHVsZSBpZD0iSmF2YUNsaWVudE1vZHVsZV8xMDQ5MTM5ODQ5NzcyIj4KLQkJPGphdmE+dGVzdENsaWVudC5qYXI8L2phdmE+Ci0JPC9tb2R1bGU+Ci0JPG1vZHVsZSBpZD0iRWpiTW9kdWxlXzEwNDkxMzk4NDk3ODIiPgotCQk8ZWpiPnRlc3RFSkIuamFyPC9lamI+Ci0JPC9tb2R1bGU+Ci0JPG1vZHVsZSBpZD0iV2ViTW9kdWxlXzEwNDkxMzk4NDk4MTIiPgotCQk8d2ViPgotCQkJPHdlYi11cmk+dGVzdFdlYi53YXI8L3dlYi11cmk+Ci0JCQk8Y29udGV4dC1yb290PnRlc3RXZWI8L2NvbnRleHQtcm9vdD4KLQkJPC93ZWI+Ci0JPC9tb2R1bGU+Ci08L2FwcGxpY2F0aW9uPgotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL3Rlc3REYXRhL2VxdWFsVG9fMDFfY2FzZV8wMS54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL3Rlc3REYXRhL2VxdWFsVG9fMDFfY2FzZV8wMS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3OWM2MmUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy90ZXN0RGF0YS9lcXVhbFRvXzAxX2Nhc2VfMDEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGFwcGxpY2F0aW9uIFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEoyRUUgQXBwbGljYXRpb24gMS4zLy9FTiIgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2FwcGxpY2F0aW9uXzFfMy5kdGQiPgotPGFwcGxpY2F0aW9uIGlkPSJBcHBsaWNhdGlvbl9JRCI+Ci0JPGRpc3BsYXktbmFtZT50ZXN0PC9kaXNwbGF5LW5hbWU+PG1vZHVsZSBpZD0iSmF2YUNsaWVudE1vZHVsZV8xMDQ5MTM5ODQ5NzcyIj48amF2YT50ZXN0Q2xpZW50LmphcjwvamF2YT48L21vZHVsZT4KLQk8bW9kdWxlIGlkPSJFamJNb2R1bGVfMTA0OTEzOTg0OTc4MiI+PGVqYj50ZXN0RUpCLmphcjwvZWpiPjwvbW9kdWxlPjxtb2R1bGUgaWQ9IldlYk1vZHVsZV8xMDQ5MTM5ODQ5ODEyIj48d2ViPjx3ZWItdXJpPnRlc3RXZWIud2FyPC93ZWItdXJpPjxjb250ZXh0LXJvb3Q+dGVzdFdlYjwvY29udGV4dC1yb290Pjwvd2ViPjwvbW9kdWxlPjwvYXBwbGljYXRpb24+Ci0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvdGVzdERhdGEvZXF1YWxUb18wMV9jYXNlXzAyLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvdGVzdERhdGEvZXF1YWxUb18wMV9jYXNlXzAyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJmZjc0NS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL3Rlc3REYXRhL2VxdWFsVG9fMDFfY2FzZV8wMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGFwcGxpY2F0aW9uIFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEoyRUUgQXBwbGljYXRpb24gMS4zLy9FTiIgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2FwcGxpY2F0aW9uXzFfMy5kdGQiPgotPGFwcGxpY2F0aW9uIGlkPSJBcHBsaWNhdGlvbl9JRAotIj4gIDwhLS0gYSBjb21tZW50IHRvIGlnbm9yZQotCi0KLQotICAgIC0tPgotCTxkaXNwbGF5LW5hbWU+Ci0gICAgdGVzdDwvZGlzcGxheS1uYW1lPjxtb2R1bGUgaWQ9IgotICAgIEphdmFDbGllbnRNb2R1bGVfMTA0OTEzOTg0OTc3MgotICAgICI+PGphdmE+dGVzdENsaWVudC5qYXI8L2phdmE+PC9tb2R1bGU+PCEtLSBhIGNvbW1lbnQgdG8gaWdub3JlIC0tPgotCTxtb2R1bGUgaWQ9IkVqYk1vZHVsZV8xMDQ5MTM5ODQ5NzgyIj48ZWpiPnRlc3RFSkIuamFyPC9lamI+PC9tb2R1bGU+PG1vZHVsZSBpZD0iV2ViTW9kdWxlXzEwNDkxMzk4NDk4MTIKLSAgICAiPjx3ZWI+PHdlYi11cmk+dGVzdFdlYi53YXI8L3dlYi11cmk+PGNvbnRleHQtcm9vdD50ZXN0V2ViPC9jb250ZXh0LXJvb3Q+PC93ZWI+PC9tb2R1bGU+PC9hcHBsaWNhdGlvbj4KLSAgICAgICA8IS0tIGEgY29tbWVudCB0byBpZ25vcmUgLS0+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL3Rlc3REYXRhL3VuZXF1YWxUb18wMV9jYXNlXzAxLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvdGVzdERhdGEvdW5lcXVhbFRvXzAxX2Nhc2VfMDEueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDEwNDBjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvdGVzdERhdGEvdW5lcXVhbFRvXzAxX2Nhc2VfMDEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBhcHBsaWNhdGlvbiBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKMkVFIEFwcGxpY2F0aW9uIDEuMy8vRU4iICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9hcHBsaWNhdGlvbl8xXzMuZHRkIj4KLTxhcHBsaWNhdGlvbiBpZD0iQXBwbGljYXRpb25fSUQiPgotCTxkaXNwbGF5LW5hbWU+dGVzdDwvZGlzcGxheS1uYW1lPgotCTxtb2R1bGUgaWQ9IkphdmFDbGllbnRNb2R1bGVfMTA0OTEzOTg0OTc3Ij4KLQkJPGphdmE+dGVzdENsaWVudC5qYXI8L2phdmE+Ci0JPC9tb2R1bGU+Ci0JPG1vZHVsZSBpZD0iRWpiTW9kdWxlXzEwNDkxMzk4NDk3ODIiPgotCQk8ZWpiPnRlc3RFSkIuamFyPC9lamI+Ci0JPC9tb2R1bGU+Ci0JPG1vZHVsZSBpZD0iV2ViTW9kdWxlXzEwNDkxMzk4NDk4MTIiPgotCQk8d2ViPgotCQkJPHdlYi11cmk+dGVzdFdlYi53YXI8L3dlYi11cmk+Ci0JCQk8Y29udGV4dC1yb290PnRlc3RXZWI8L2NvbnRleHQtcm9vdD4KLQkJPC93ZWI+Ci0JPC9tb2R1bGU+Ci08L2FwcGxpY2F0aW9uPgotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL3Rlc3REYXRhL3VuZXF1YWxUb18wMV9jYXNlXzAyLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvdGVzdERhdGEvdW5lcXVhbFRvXzAxX2Nhc2VfMDIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmVhMDI4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvdGVzdERhdGEvdW5lcXVhbFRvXzAxX2Nhc2VfMDIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBhcHBsaWNhdGlvbiBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKMkVFIEFwcGxpY2F0aW9uIDEuMy8vRU4iICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9hcHBsaWNhdGlvbl8xXzMuZHRkIj4KLTxhcHBsaWNhdGlvbiBpZD0iQXBwbGljYXRpb25fSUQiPgotCTxkaXNwbGF5LW5hbWU+dGVzdDwvZGlzcGxheS1uYW1lPgotCTxtb2R1bGUgaWQ9IkphdmFDbGllbnRNb2R1bGVfMTA0OTEzOTg0OTc3MiI+Ci0JCTxqYXZhPnRlc3RDbGllbnQuamFyPC9qYXZhPgotCTwvbW9kdWxlPgotCTxtb2R1bGUgaWQ9IkVqYk1vZHVsZV8xMDQ5MTM5ODQ5NzgyIj4KLQkJPGVqYj50ZXN0RUpCLmphcjwvZWpiPgotCTwvbW9kdWxlPgotCTxtb2R1bGUgaWQ9IldlYk1vZHVsZV8xMDQ5MTM5ODQ5ODEyIj4KLQkJPHdlYj4KLQkJCTxjb250ZXh0LXJvb3Q+dGVzdFdlYjwvY29udGV4dC1yb290PgotCQk8L3dlYj4KLQk8L21vZHVsZT4KLTwvYXBwbGljYXRpb24+Ci0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvdGVzdERhdGEvdW5lcXVhbFRvXzAxX2Nhc2VfMDMueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy90ZXN0RGF0YS91bmVxdWFsVG9fMDFfY2FzZV8wMy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMjljMmUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy90ZXN0RGF0YS91bmVxdWFsVG9fMDFfY2FzZV8wMy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGFwcGxpY2F0aW9uIFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEoyRUUgQXBwbGljYXRpb24gMS4zLy9FTiIgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2FwcGxpY2F0aW9uXzFfMy5kdGQiPgotPGFwcGxpY2F0aW9uIGlkPSJBcHBsaWNhdGlvbl9JRCI+Ci0JPGRpc3BsYXktbmFtZT50ZXN0PC9kaXNwbGF5LW5hbWU+Ci0JPG1vZHVsZSBpZD0iSmF2YUNsaWVudE1vZHVsZV8xMDQ5MTM5ODQ5NzcyIj4KLQkJPGphdmE+dGVzdENsaWVudC5qYXI8L2phdmE+Ci0JPC9tb2R1bGU+Ci0JPG1vZHVsZSBpZD0iRWpiTW9kdWxlXzEwNDkxMzk4NDk3ODIiPgotCQk8ZWpiPnRlc3RFSkI8L2VqYj4KLQk8L21vZHVsZT4KLQk8bW9kdWxlIGlkPSJXZWJNb2R1bGVfMTA0OTEzOTg0OTgxMiI+Ci0JCTx3ZWI+Ci0JCQk8d2ViLXVyaT50ZXN0V2ViLndhcjwvd2ViLXVyaT4KLQkJCTxjb250ZXh0LXJvb3Q+dGVzdFdlYjwvY29udGV4dC1yb290PgotCQk8L3dlYj4KLQk8L21vZHVsZT4KLTwvYXBwbGljYXRpb24+Ci0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvdGVzdERhdGEvdW5lcXVhbFRvXzAxX2Nhc2VfMDQueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy90ZXN0RGF0YS91bmVxdWFsVG9fMDFfY2FzZV8wNC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0MGJkMDMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy90ZXN0RGF0YS91bmVxdWFsVG9fMDFfY2FzZV8wNC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGFwcGxpY2F0aW9uIFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcyBJbmMuLy9EVEQgSjJFRSBBcHBsaWNhdGlvbiAxLjMvL0VOIiAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvYXBwbGljYXRpb25fMV8zLmR0ZCI+Ci08YXBwbGljYXRpb24gaWQ9IkFwcGxpY2F0aW9uX0lEIj4KLQk8ZGlzcGxheS1uYW1lPnRlc3Q8L2Rpc3BsYXktbmFtZT4KLQk8bW9kdWxlIGlkPSJKYXZhQ2xpZW50TW9kdWxlXzEwNDkxMzk4NDk3NzIiPgotCQk8amF2YT50ZXN0Q2xpZW50LmphcjwvamF2YT4KLQk8L21vZHVsZT4KLQk8bW9kdWxlIGlkPSJFamJNb2R1bGVfMTA0OTEzOTg0OTc4MiI+Ci0JCTxlamI+dGVzdEVKQi5qYXI8L2VqYj4KLQk8L21vZHVsZT4KLQk8bW9kdWxlIGlkPSJXZWJNb2R1bGVfMTA0OTEzOTg0OTgxMiI+Ci0JCTx3ZWI+Ci0JCQk8d2ViLXVyaT50ZXN0V2ViLndhcjwvd2ViLXVyaT4KLQkJCTxjb250ZXh0LXJvb3Q+dGVzdFdlYjwvY29udGV4dC1yb290PgotCQk8L3dlYj4KLQk8L21vZHVsZT4KLTwvYXBwbGljYXRpb24+Ci0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvdGVzdERhdGEvdW5lcXVhbFRvXzAxX2Nhc2VfMDUueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy90ZXN0RGF0YS91bmVxdWFsVG9fMDFfY2FzZV8wNS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNmI4YmYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy90ZXN0RGF0YS91bmVxdWFsVG9fMDFfY2FzZV8wNS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtIj8+Ci08IURPQ1RZUEUgYXBwbGljYXRpb24gUFVCTElDICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSjJFRSBBcHBsaWNhdGlvbiAxLjMvL0VOIiAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvYXBwbGljYXRpb25fMV8zLmR0ZCI+Ci08YXBwbGljYXRpb24gaWQ9IkFwcGxpY2F0aW9uX0lEIj4KLQk8ZGlzcGxheS1uYW1lPnRlc3Q8L2Rpc3BsYXktbmFtZT4KLQk8bW9kdWxlIGlkPSJKYXZhQ2xpZW50TW9kdWxlXzEwNDkxMzk4NDk3NzIiPgotCQk8amF2YT50ZXN0Q2xpZW50LmphcjwvamF2YT4KLQk8L21vZHVsZT4KLQk8bW9kdWxlIGlkPSJFamJNb2R1bGVfMTA0OTEzOTg0OTc4MiI+Ci0JCTxlamI+dGVzdEVKQi5qYXI8L2VqYj4KLQk8L21vZHVsZT4KLQk8bW9kdWxlIGlkPSJXZWJNb2R1bGVfMTA0OTEzOTg0OTgxMiI+Ci0JCTx3ZWI+Ci0JCQk8d2ViLXVyaT50ZXN0V2ViLndhcjwvd2ViLXVyaT4KLQkJCTxjb250ZXh0LXJvb3Q+dGVzdFdlYjwvY29udGV4dC1yb290PgotCQk8L3dlYj4KLQk8L21vZHVsZT4KLTwvYXBwbGljYXRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLnRlc3RzLy5jbGFzc3BhdGggYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLnRlc3RzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0YzVlMzEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci50ZXN0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIudGVzdHMvLnByb2plY3QgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLnRlc3RzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODgwYWI1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIudGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLnRlc3RzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMDg1MzMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSNNb24gRmViIDA4IDAyOjAzOjU2IEVTVCAyMDEwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxOTY2YjIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLnRlc3RzO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmllciAKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIsCi0gb3JnLmp1bml0LAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci50ZXN0cywKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLnRlc3RzLnV0aWwKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIudGVzdHMvT1NHSS1JTkYvbDEwbi9idW5kbGUucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIudGVzdHMvT1NHSS1JTkYvbDEwbi9idW5kbGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY0MjE1Ni4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLnRlc3RzL09TR0ktSU5GL2wxMG4vYnVuZGxlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNQcm9wZXJ0aWVzIGZpbGUgZm9yIG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIudGVzdHMKLUJ1bmRsZS1OYW1lID0gVVJJIFJlc29sdmVyIFRlc3RzCi1CdW5kbGUtTmFtZS4wID0gVVJJIFJlc29sdmVyIFVuaXQgVGVzdHMKLUJ1bmRsZS1WZW5kb3IgPSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIudGVzdHMvYWJvdXQuaHRtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIudGVzdHMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLnRlc3RzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIudGVzdHMvYnVpbGQucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIudGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM5ZGYwZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIE9TR0ktSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci50ZXN0cy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUxYjVkMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1CdW5kbGUtVmVuZG9yLjAgPSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotQnVuZGxlLU5hbWUuMCA9IFVSSSBSZXNvbHZlciBUZXN0cyBQbHVnLWluClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci50ZXN0cy9wbHVnaW4ueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci50ZXN0cy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTgzZWE5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIudGVzdHMvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy40Ij8+Ci08cGx1Z2luPgotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5yZXNvbHZlckV4dGVuc2lvbnMiPgotICAgICAgPHJlc29sdmVyRXh0ZW5zaW9uCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci50ZXN0cy51dGlsLlJlc29sdmVyRXh0ZW5zaW9uRm9yVGV4dCIKLSAgICAgICAgICAgIHN0YWdlPSJwb3N0bm9ybWFsaXphdGlvbiI+Ci0gICAgICAgICAgICA8cHJvamVjdE5hdHVyZSB2YWx1ZT0iYSIvPgotICAgICAgICAgICAgPHByb2plY3ROYXR1cmUgdmFsdWU9ImIiLz4KLSAgICAgICAgICAgIDxwcm9qZWN0TmF0dXJlIHZhbHVlPSJjIi8+Ci0gICAgICAgICAgICA8cHJvamVjdE5hdHVyZSB2YWx1ZT0iZCIvPgotICAgICAgPC9yZXNvbHZlckV4dGVuc2lvbj4KLSAgIDwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VyaXJlc29sdmVyL3Rlc3RzL0FsbFRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VyaXJlc29sdmVyL3Rlc3RzL0FsbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NDFkNWEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91cmlyZXNvbHZlci90ZXN0cy9BbGxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBBbGxUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHRlc3RTdWl0ZSA9IG5ldyBUZXN0U3VpdGUoIkFsbCBVUkkgUmVzb2x2ZXIgVGVzdHMiKTsKLQkJdGVzdFN1aXRlLmFkZFRlc3RTdWl0ZShFeHRlbnNpYmxlVVJJUmVzb2x2ZXJUZXN0LmNsYXNzKTsKLQkJcmV0dXJuIHRlc3RTdWl0ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VyaXJlc29sdmVyL3Rlc3RzL0V4dGVuc2libGVVUklSZXNvbHZlclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdXJpcmVzb2x2ZXIvdGVzdHMvRXh0ZW5zaWJsZVVSSVJlc29sdmVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjhmOTYyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdXJpcmVzb2x2ZXIvdGVzdHMvRXh0ZW5zaWJsZVVSSVJlc29sdmVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5FeHRlbnNpYmxlVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIudGVzdHMudXRpbC5BdXhpbGlhcnlDb3VudGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIudGVzdHMudXRpbC5SZXNvbHZlckV4dGVuc2lvbkZvclRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBFeHRlbnNpYmxlVVJJUmVzb2x2ZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0RXh0ZW5zaWJsZVVSSVJlc29sdmVyKCkgewotCi0JCVVSSVJlc29sdmVyIHJlc29sdmVyID0gVVJJUmVzb2x2ZXJQbHVnaW4uY3JlYXRlUmVzb2x2ZXIoKTsKLQkJaWYgKHJlc29sdmVyIGluc3RhbmNlb2YgRXh0ZW5zaWJsZVVSSVJlc29sdmVyKSB7Ci0JCQlFeHRlbnNpYmxlVVJJUmVzb2x2ZXIgZXh0ZW5zaWJsZVVSSVJlc29sdmVyID0gKEV4dGVuc2libGVVUklSZXNvbHZlcikgcmVzb2x2ZXI7Ci0KLQkJCS8vIFJlc2V0IGNvdW50ZXIKLQkJCUF1eGlsaWFyeUNvdW50ZXIuZ2V0SW5zdGFuY2UoKS5yZXNldENvdW50ZXIoKTsKLQotCQkJLy8gUmVzb2x2ZSB1c2luZyBwdWJsaWMgaWQKLQkJCVN0cmluZyBwdWJsaWNSZXNvbHZlID0gZXh0ZW5zaWJsZVVSSVJlc29sdmVyLnJlc29sdmUobnVsbCwgUmVzb2x2ZXJFeHRlbnNpb25Gb3JUZXh0LlBVQkxJQ19JRF9VUkwsIG51bGwpOwotCQkJYXNzZXJ0RXF1YWxzKFJlc29sdmVyRXh0ZW5zaW9uRm9yVGV4dC5QVUJMSUNfSURfTE9DQVRJT04sIHB1YmxpY1Jlc29sdmUpOwotCi0JCQkvLyBSZXNvbHZlIHVzaW5nIHN5c3RlbSBpZAotCQkJU3RyaW5nIHN5c3RlbVJlc29sdmUgPSBleHRlbnNpYmxlVVJJUmVzb2x2ZXIucmVzb2x2ZShudWxsLCBudWxsLCBSZXNvbHZlckV4dGVuc2lvbkZvclRleHQuU1lTVEVNX0lEX1VSTCk7Ci0JCQlhc3NlcnRFcXVhbHMoUmVzb2x2ZXJFeHRlbnNpb25Gb3JUZXh0LlNZU1RFTV9JRF9MT0NBVElPTiwgc3lzdGVtUmVzb2x2ZSk7Ci0KLQkJCS8vIFZlcmlmeSB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSByZXNvbHZlcnMgaGF2ZSBiZWVuIGNhbGxlZAotCQkJaW50IGNvdW50ID0gQXV4aWxpYXJ5Q291bnRlci5nZXRJbnN0YW5jZSgpLmdldENvdW50KCk7Ci0JCQlhc3NlcnRFcXVhbHMoMiwgY291bnQpOwotCQl9Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdXJpcmVzb2x2ZXIvdGVzdHMvdXRpbC9BdXhpbGlhcnlDb3VudGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VyaXJlc29sdmVyL3Rlc3RzL3V0aWwvQXV4aWxpYXJ5Q291bnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzM1MzFmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdXJpcmVzb2x2ZXIvdGVzdHMvdXRpbC9BdXhpbGlhcnlDb3VudGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIudGVzdHMudXRpbDsKLQotcHVibGljIGNsYXNzIEF1eGlsaWFyeUNvdW50ZXIgewotCQotCXByaXZhdGUgc3RhdGljIEF1eGlsaWFyeUNvdW50ZXIgYXV4aWxpYXJ5Q291bnRlciA9IG51bGw7OwotCXByaXZhdGUgaW50IGNvdW50ZXIgPSAwOwotCQotCXB1YmxpYyBzdGF0aWMgQXV4aWxpYXJ5Q291bnRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYoYXV4aWxpYXJ5Q291bnRlciA9PSBudWxsKSB7Ci0JCQlhdXhpbGlhcnlDb3VudGVyID0gbmV3IEF1eGlsaWFyeUNvdW50ZXIoKTsKLQkJfQotCQlyZXR1cm4gYXV4aWxpYXJ5Q291bnRlcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVzZXRDb3VudGVyKCkgewotCQljb3VudGVyID0gMDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5jcmVtZW50Q291bnRlcigpIHsKLQkJY291bnRlcisrOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldENvdW50KCkgewotCQlyZXR1cm4gY291bnRlcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdXJpcmVzb2x2ZXIvdGVzdHMvdXRpbC9SZXNvbHZlckV4dGVuc2lvbkZvclRleHQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdXJpcmVzb2x2ZXIvdGVzdHMvdXRpbC9SZXNvbHZlckV4dGVuc2lvbkZvclRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFkYjgzYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VyaXJlc29sdmVyL3Rlc3RzL3V0aWwvUmVzb2x2ZXJFeHRlbnNpb25Gb3JUZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIudGVzdHMudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJFeHRlbnNpb247Ci0KLXB1YmxpYyBjbGFzcyBSZXNvbHZlckV4dGVuc2lvbkZvclRleHQgaW1wbGVtZW50cyBVUklSZXNvbHZlckV4dGVuc2lvbiB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElDX0lEX1VSTCA9ICJodHRwOi8vd3d3LnB1YmxpYy5vcmciOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJQ19JRF9MT0NBVElPTiA9ICIvZm9sZGVyL3B1YmxpYy5leHRlbnNpb24iOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNZU1RFTV9JRF9VUkwgPSAiaHR0cDovL3d3dy5zeXN0ZW0ub3JnIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWVNURU1fSURfTE9DQVRJT04gPSAiL2ZvbGRlci9zeXN0ZW0uZXh0ZW5zaW9uIjsKLQkKLQlwdWJsaWMgU3RyaW5nIHJlc29sdmUoSUZpbGUgZmlsZSwgU3RyaW5nIGJhc2VMb2NhdGlvbiwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHsKLQkJQXV4aWxpYXJ5Q291bnRlci5nZXRJbnN0YW5jZSgpLmluY3JlbWVudENvdW50ZXIoKTsKLQkJaWYoUFVCTElDX0lEX1VSTC5lcXVhbHMocHVibGljSWQpKSB7Ci0JCQlyZXR1cm4gUFVCTElDX0lEX0xPQ0FUSU9OOwotCQl9IGVsc2UgaWYoU1lTVEVNX0lEX1VSTC5lcXVhbHMoc3lzdGVtSWQpKSB7Ci0JCQlyZXR1cm4gU1lTVEVNX0lEX0xPQ0FUSU9OOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLnRlc3RzLy5jbGFzc3BhdGggYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U3MzkzMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvLmN2c2lnbm9yZSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS50ZXN0cy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Nzk2OGJkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS50ZXN0cy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotdGVtcC5mb2xkZXIKLXRlc3RzLmphcgotamF2YUNvbXBpbGVyLnRlc3RzLmphci5hcmdzCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvLnByb2plY3QgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNGIwNjcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLnRlc3RzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLnRlc3RzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGViYWE3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNTdW4gSnVuIDAzIDAwOjM0OjA5IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1MzNhOWEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjAKLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS50ZXN0cwotQnVuZGxlLVZlcnNpb246IDEuMC4xMDAucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NQYXRoOiB0ZXN0cy5qYXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS50ZXN0cy5pbnRlcm5hbC5DYWNoZVRlc3RzUGx1Z2luCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmp1bml0O2J1bmRsZS12ZXJzaW9uPSIzLjguMiIsCi0gb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLnRlc3RzLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNAotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLnRlc3RzL2Fib3V0Lmh0bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZlMDM1MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotc291cmNlLnRlc3RzLmphciA9IHNyYy8KLW91dHB1dC50ZXN0cy5qYXIgPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgdGVzdHMuamFyLFwKLSAgICAgICAgICAgICAgIHRlc3QueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRmMTlkMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLUJ1bmRsZS1WZW5kb3IuMCA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi1CdW5kbGUtTmFtZS4wID0gQ2FjaGUgVGVzdHMgUGx1Zy1pbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0NhY2hlRW50cnlUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9DYWNoZUVudHJ5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTgzMDhjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0NhY2hlRW50cnlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS5pbnRlcm5hbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIFRlc3RzIGZvciB0aGUgQ2FjaGVFbnRyeSBjbGFzcy4KLSAqLwotcHVibGljIGNsYXNzIENhY2hlRW50cnlUZXN0IGV4dGVuZHMgVGVzdENhc2UKLXsKLQkvKioKLQkgICogQ3JlYXRlIGEgdGVzdHMgc3VpdGUgZnJvbSB0aGlzIHRlc3QgY2xhc3MuCi0JICAqIAotCSAgKiBAcmV0dXJuIEEgdGVzdCBzdWl0ZSBjb250YWluaW5nIHRoaXMgdGVzdCBjbGFzcy4KLQkgICovCi0JICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotCSAgewotCSAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShDYWNoZUVudHJ5VGVzdC5jbGFzcyk7Ci0JICB9Ci0JCi0JLyoqCi0JICogVGVzdCB0aGF0IHRoZSBlbnRyeSBpcyBub3QgY29uc2lkZXJlZCBleHBpcmVkIHdoZW4gLTEgaXMgc3BlY2lmaWVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3ROb3RFeHBpcmVkV2hlbk1pbnVzT25lKCkKLQl7Ci0JCUNhY2hlRW50cnkgY2FjaGVFbnRyeSA9IG5ldyBDYWNoZUVudHJ5KG51bGwsIG51bGwsIDAsIC0xKTsKLQkJYXNzZXJ0RmFsc2UoIlRoZSBjYWNoZSBlbnRyeSBpcyBleHBpcmVkIHdoZW4gLTEgaXMgc3BlY2lmaWVkLiIsIGNhY2hlRW50cnkuaGFzRXhwaXJlZCgpKTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdCB0aGF0IHRoZSBlbnRyeSBpcyBub3QgY29uc2lkZXJlZCBleHBpcmVkIHdoZW4gdGhlIHNldCBleHBpcmF0aW9uCi0JICogdGltZSBpcyBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQgc3lzdGVtIHRpbWUuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdE5vdEV4cGlyZWRXaGVuR3JlYXRlclRoYW5TeXN0ZW1UaW1lKCkKLQl7Ci0JCUNhY2hlRW50cnkgY2FjaGVFbnRyeSA9IG5ldyBDYWNoZUVudHJ5KG51bGwsIG51bGwsIDAsIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgNjAwMDApOwotCQlhc3NlcnRGYWxzZSgiVGhlIGNhY2hlIGVudHJ5IGlzIGV4cGlyZWQgd2hlbiBncmVhdGVyIHRoYW4gdGhlIGN1cnJuZXQgc3lzdGVtIHRpbWUuIiwgY2FjaGVFbnRyeS5oYXNFeHBpcmVkKCkpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0IHRoYXQgdGhlIGVudHJ5IGlzIGNvbnNpZGVyZWQgZXhwaXJlZCB3aGVuIHRoZSBzZXQgZXhwaXJhdGlvbgotCSAqIHRpbWUgaXMgbGVzcyB0aGFuIHRoZSBjdXJyZW50IHN5c3RlbSB0aW1lLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RFeHBpcmVkV2hlbkxlc3NUaGFuU3lzdGVtVGltZSgpCi0JewotCQlDYWNoZUVudHJ5IGNhY2hlRW50cnkgPSBuZXcgQ2FjaGVFbnRyeShudWxsLCBudWxsLCAwLCBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIDYwMDAwKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIGNhY2hlIGVudHJ5IGlzIG5vdCBleHBpcmVkIHdoZW4gbGVzcyB0aGFuIHRoZSBjdXJybmV0IHN5c3RlbSB0aW1lLiIsIGNhY2hlRW50cnkuaGFzRXhwaXJlZCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9DYWNoZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0NhY2hlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWY0OTZmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0NhY2hlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogVGVzdHMgZm9yIHRoZSBDYWNoZSBjbGFzcy4KLSAqLwotcHVibGljIGNsYXNzIENhY2hlVGVzdCBleHRlbmRzIFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBDYWNoZSBjYWNoZTsKLQkKLQkvKioKLQkgICogQ3JlYXRlIGEgdGVzdHMgc3VpdGUgZnJvbSB0aGlzIHRlc3QgY2xhc3MuCi0JICAqIAotCSAgKiBAcmV0dXJuIEEgdGVzdCBzdWl0ZSBjb250YWluaW5nIHRoaXMgdGVzdCBjbGFzcy4KLQkgICovCi0JICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotCSAgewotCSAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShDYWNoZVRlc3QuY2xhc3MpOwotCSAgfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJY2FjaGUgPSBDYWNoZS5nZXRJbnN0YW5jZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCQotCQotCS8qKgotCSAqIFRlc3QgdHJ5aW5nIHRvIGNhY2hlIGEgcmVzb3VyY2UgdGhhdCBkb2Vzbid0IGV4aXN0Ci0JICogb24gYSBzZXJ2ZXIgdGhhdCBkb2VzIGV4aXN0LgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RHZXROb25FeGlzdGFudFJlc291cmNlKCkKLQl7Ci0JCVN0cmluZyByZXNvdXJjZSA9ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzL25vbmV4aXN0YW50ZmlsZSI7Ci0JCVN0cmluZyByZXN1bHQgPSBjYWNoZS5nZXRSZXNvdXJjZShyZXNvdXJjZSk7Ci0JCWNhY2hlLmNsZWFyKCk7Ci0JCWFzc2VydE51bGwoIlRoZSByZXN1bHQgcmV0dXJuZWQgZm9yIHJlc291cmNlICIgKyByZXNvdXJjZSArICIgaXMgbm90IG51bGwuIiwgcmVzdWx0KTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdCB0cnlpbmcgdG8gY2FjaGUgYSByZXNvdXJjZSB0aGF0IGRvZXNuJ3QgZXhpc3QKLQkgKiBiZWNhdXNlIHRoZSBzZXJ2ZXIgZG9lc24ndCBleGlzdC4KLQkgKi8KLS8vCXB1YmxpYyB2b2lkIHRlc3RHZXROb25FeGlzdGFudFNlcnZlcigpCi0vLwl7Ci0vLwkJU3RyaW5nIHJlc291cmNlID0gImh0dHA6Ly93d3cuZWNsaXBzZS5iYWQvd2VidG9vbHMvbm9uZXhpc3RhbnRmaWxlIjsKLS8vCQlTdHJpbmcgcmVzdWx0ID0gY2FjaGUuZ2V0UmVzb3VyY2UocmVzb3VyY2UpOwotLy8JCWNhY2hlLmNsZWFyKCk7Ci0vLwkJYXNzZXJ0TnVsbCgiVGhlIHJlc3VsdCByZXR1cm5lZCBmb3IgcmVzb3VyY2UgIiArIHJlc291cmNlICsgIiBpcyBub3QgbnVsbC4iLCByZXN1bHQpOwotLy8JfQotCQotCS8qKgotCSAqIFRlc3QgdHJ5aW5nIHRvIGdldCBhIHJlc291cmNlIHNwZWNpZmllZCBieSBudWxsLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RHZXROdWxsUmVzb3VyY2UoKQotCXsKLQkJU3RyaW5nIHJlc291cmNlID0gbnVsbDsKLQkJU3RyaW5nIHJlc3VsdCA9IGNhY2hlLmdldFJlc291cmNlKHJlc291cmNlKTsKLQkJY2FjaGUuY2xlYXIoKTsKLQkJYXNzZXJ0TnVsbCgiVGhlIHJlc3VsdCByZXR1cm5lZCBmb3IgcmVzb3VyY2UgIiArIHJlc291cmNlICsgIiBpcyBub3QgbnVsbC4iLCByZXN1bHQpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0IHRyeWluZyB0byBjYWNoZSBhIHJlc291cmNlIHRoYXQgZG9lcyBleGlzdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UmVzb3VyY2VUaGF0RXhpc3RzKCkKLQl7Ci0JCVN0cmluZyByZXNvdXJjZSA9ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzIjsKLQkJU3RyaW5nIHJlc3VsdCA9IGNhY2hlLmdldFJlc291cmNlKHJlc291cmNlKTsKLQkJY2FjaGUuY2xlYXIoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiVGhlIHJlc3VsdCByZXR1cm5lZCBmb3IgcmVzb3VyY2UgIiArIHJlc291cmNlICsgIiB3YXMgbnVsbC4iLCByZXN1bHQpOwotCQlhc3NlcnRUcnVlKCJUaGUgcmVzdWx0IGFuZCByZXNvdXJjZSBhcmUgdGhlIHNhbWUuIiwgIXJlc291cmNlLmVxdWFscyhyZXN1bHQpKTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdCB0byBlbnN1cmUgdGhlIHJlc3VsdCB0aGF0IGlzIHJldHVybmVkIHN0YXJ0cyB3aXRoIGZpbGU6Ly8vCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFJlc3VsdFN0YXJ0c1dpdGhGaWxlKCkKLQl7Ci0JCVN0cmluZyByZXNvdXJjZSA9ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzIjsKLQkJU3RyaW5nIHJlc3VsdCA9IGNhY2hlLmdldFJlc291cmNlKHJlc291cmNlKTsKLQkJY2FjaGUuY2xlYXIoKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHJlc3VsdCBkb2VzIG5vdCBzdGFydCB3aXRoIGZpbGU6Ly8vLiIsIHJlc3VsdC5zdGFydHNXaXRoKCJmaWxlOi8vLyIpKTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdCB0byBlbnN1cmUgZGVsZXRpbmcgYSBjYWNoZSBlbnRyeSBkZWxldGVzIGl0IGZyb20gdGhlIGNhY2hlIGFuZAotCSAqIGZyb20gdGhlIGZpbGUgc3lzdGVtLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3REZWxldGVDYWNoZUVudHJ5KCkKLQl7Ci0JCVN0cmluZyByZXNvdXJjZSA9ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzIjsKLQkJU3RyaW5nIHJlc3VsdCA9IGNhY2hlLmdldFJlc291cmNlKHJlc291cmNlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiVGhlIGxvY2FsIGNhY2hlIGZpbGUgaXMgbnVsbC4iLCByZXN1bHQpOwotCQkvLyBSZW1vdmUgZmlsZTovLy8gZnJvbSB0aGUgcmVzdWx0LgotCQlyZXN1bHQgPSByZXN1bHQuc3Vic3RyaW5nKDgpOwotCQlhc3NlcnRUcnVlKCJUaGUgY2FjaGUgZmlsZSAiICsgcmVzdWx0ICsgIiBkb2VzIG5vdCBleGlzdC4iLCBuZXcgRmlsZShyZXN1bHQpLmV4aXN0cygpKTsKLQkJY2FjaGUuZGVsZXRlRW50cnkocmVzb3VyY2UpOwotCQlhc3NlcnRGYWxzZSgiVGhlIGNhY2hlIGZpbGUgd2FzIG5vdCBkZWxldGVkLiIsIG5ldyBGaWxlKHJlc3VsdCkuZXhpc3RzKCkpOwotCQlhc3NlcnRUcnVlKCJUaGUgY2FjaGUgc3RpbGwgY29udGFpbnMgdGhlIGRlbGV0ZWQgZW50cnkuIiwgY2FjaGUuZ2V0Q2FjaGVkVVJJcygpLmxlbmd0aCA9PSAwKTsKLQkJY2FjaGUuY2xlYXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdCB0byBlbnN1cmUgZGVsZXRpbmcgYSBudWxsIGNhY2hlIGVudHJ5IHNpbXBseSByZXR1cm5zLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3REZWxldGVOdWxsQ2FjaGVFbnRyeSgpCi0JewotCQlTdHJpbmcgcmVzb3VyY2UgPSAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scyI7Ci0JCWNhY2hlLmdldFJlc291cmNlKHJlc291cmNlKTsKLQkJY2FjaGUuZGVsZXRlRW50cnkobnVsbCk7Ci0JCWFzc2VydEZhbHNlKCJUaGUgY2FjaGUgbm8gbG9uZ2VyIGNvbnRhaW5zIHRoZSBlbnRyeSBhZnRlciBkZWxldGluZyBudWxsLiIsIGNhY2hlLmdldENhY2hlZFVSSXMoKS5sZW5ndGggPT0gMCk7Ci0JCWNhY2hlLmNsZWFyKCk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3QgdG8gZW5zdXJlIGNsZWFyaW5nIHRoZSBjYWNoZSB3aXRoIGEgc2luZ2xlIGVudHJ5IGRlbGV0ZXMgdGhlIGVudHJ5Ci0JICogZnJvbSB0aGUgY2FjaGUgYW5kIGRlbGV0ZXMgdGhlIGZpbGUgZnJvbSB0aGUgZmlsZSBzeXN0ZW0uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdENsZWFyQ2FjaGVXaXRoU2luZ2xlRW50cnkoKQotCXsKLQkJU3RyaW5nIHJlc291cmNlMSA9ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzIjsKLQkJU3RyaW5nIHJlc3VsdDEgPSBjYWNoZS5nZXRSZXNvdXJjZShyZXNvdXJjZTEpOwotCQlhc3NlcnROb3ROdWxsKCJUaGUgbG9jYWwgY2FjaGUgZmlsZSBpcyBudWxsIGZvciByZXNvdXJjZTEuIiwgcmVzdWx0MSk7Ci0JCS8vIFJlbW92ZSBmaWxlOi8vLyBmcm9tIHRoZSByZXN1bHQuCi0JCXJlc3VsdDEgPSByZXN1bHQxLnN1YnN0cmluZyg4KTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIGNhY2hlIGZpbGUgIiArIHJlc3VsdDEgKyAiIGRvZXMgbm90IGV4aXN0LiIsIG5ldyBGaWxlKHJlc3VsdDEpLmV4aXN0cygpKTsKLQkJY2FjaGUuY2xlYXIoKTsKLQkJYXNzZXJ0RmFsc2UoIlRoZSBjYWNoZSBmaWxlIGZvciByZXNvdXJjZTEgd2FzIG5vdCBkZWxldGVkLiIsIG5ldyBGaWxlKHJlc3VsdDEpLmV4aXN0cygpKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIGNhY2hlIHN0aWxsIGNvbnRhaW5zIHRoZSBkZWxldGVkIGVudHJpZXMuIiwgY2FjaGUuZ2V0Q2FjaGVkVVJJcygpLmxlbmd0aCA9PSAwKTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdCB0byBlbnN1cmUgY2xlYXJpbmcgdGhlIGNhY2hlIHdpdGggbXVsdGlwbGUgZW50cmllcyBkZWxldGVzIHRoZSBlbnRyaWVzCi0JICogZnJvbSB0aGUgY2FjaGUgYW5kIGRlbGV0ZXMgdGhlIGZpbGVzIGZyb20gdGhlIGZpbGUgc3lzdGVtLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RDbGVhckNhY2hlV2l0aE11bHRpcGxlRW50cmllcygpCi0JewotCQlTdHJpbmcgcmVzb3VyY2UxID0gImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMiOwotCQlTdHJpbmcgcmVzb3VyY2UyID0gImh0dHA6Ly93d3cuZWNsaXBzZS5vcmciOwotCQlTdHJpbmcgcmVzdWx0MSA9IGNhY2hlLmdldFJlc291cmNlKHJlc291cmNlMSk7Ci0JCVN0cmluZyByZXN1bHQyID0gY2FjaGUuZ2V0UmVzb3VyY2UocmVzb3VyY2UyKTsKLQkJYXNzZXJ0Tm90TnVsbCgiVGhlIGxvY2FsIGNhY2hlIGZpbGUgaXMgbnVsbCBmb3IgcmVzb3VyY2UxLiIsIHJlc3VsdDEpOwotCQlhc3NlcnROb3ROdWxsKCJUaGUgbG9jYWwgY2FjaGUgZmlsZSBpcyBudWxsIGZvciByZXNvdXJjZTIuIiwgcmVzdWx0Mik7Ci0JCS8vIFJlbW92ZSBmaWxlOi8vLyBmcm9tIHRoZSByZXN1bHQuCi0JCXJlc3VsdDEgPSByZXN1bHQxLnN1YnN0cmluZyg4KTsKLQkJcmVzdWx0MiA9IHJlc3VsdDIuc3Vic3RyaW5nKDgpOwotCQlhc3NlcnRUcnVlKCJUaGUgY2FjaGUgZmlsZSAiICsgcmVzdWx0MSArICIgZG9lcyBub3QgZXhpc3QuIiwgbmV3IEZpbGUocmVzdWx0MSkuZXhpc3RzKCkpOwotCQlhc3NlcnRUcnVlKCJUaGUgY2FjaGUgZmlsZSAiICsgcmVzdWx0MiArICIgZG9lcyBub3QgZXhpc3QuIiwgbmV3IEZpbGUocmVzdWx0MikuZXhpc3RzKCkpOwotCQljYWNoZS5jbGVhcigpOwotCQlhc3NlcnRGYWxzZSgiVGhlIGNhY2hlIGZpbGUgZm9yIHJlc291cmNlMSB3YXMgbm90IGRlbGV0ZWQuIiwgbmV3IEZpbGUocmVzdWx0MSkuZXhpc3RzKCkpOwotCQlhc3NlcnRGYWxzZSgiVGhlIGNhY2hlIGZpbGUgZm9yIHJlc291cmNlMiB3YXMgbm90IGRlbGV0ZWQuIiwgbmV3IEZpbGUocmVzdWx0MikuZXhpc3RzKCkpOwotCQlhc3NlcnRUcnVlKCJUaGUgY2FjaGUgc3RpbGwgY29udGFpbnMgdGhlIGRlbGV0ZWQgZW50cmllcy4iLCBjYWNoZS5nZXRDYWNoZWRVUklzKCkubGVuZ3RoID09IDApOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0IHRvIGVuc3VyZSBkZWxldGluZyBhIG51bGwgY2FjaGUgZW50cnkgc2ltcGx5IHJldHVybnMuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEdldEluc3RhbmNlKCkKLQl7Ci0JCWFzc2VydE5vdE51bGwoIlRoZSBjYWNoZSBvYmplY3QgaXMgbnVsbC4iLCBjYWNoZSk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3QgdG8gZW5zdXJlIGdldENhY2hlRW50cmllcyByZXR1cm5zIGFsbCBvZiB0aGUgY2FjaGUgZW50cmllcyBhbmQgbm90IGVudHJpZXMgdGhhdCAKLSAgICogaGF2ZW4ndCBiZWVuIGNhY2hlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q2FjaGVFbnRyaWVzKCkKLQl7Ci0JCVN0cmluZyByZXNvdXJjZTEgPSAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scyI7Ci0JCVN0cmluZyByZXNvdXJjZTIgPSAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI7Ci0JCVN0cmluZyByZXNvdXJjZTMgPSAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scy9ub25leGlzdGFudGZpbGUiOwotCQljYWNoZS5nZXRSZXNvdXJjZShyZXNvdXJjZTEpOwotCQljYWNoZS5nZXRSZXNvdXJjZShyZXNvdXJjZTIpOwotCQljYWNoZS5nZXRSZXNvdXJjZShyZXNvdXJjZTMpOwotCQlTdHJpbmdbXSB1cmlzID0gY2FjaGUuZ2V0Q2FjaGVkVVJJcygpOwotCQlhc3NlcnRUcnVlKCJUaGVyZSBhcmUgbm90IDIgZW50cmllcyBpbiB0aGUgY2FjaGUuIiwgdXJpcy5sZW5ndGggPT0gMik7Ci0JCQotCQlmb3IoaW50IGkgPSAwOyBpIDwgdXJpcy5sZW5ndGggLTE7IGkrKykKLQkJewotCQkgIFN0cmluZyB1cmkgPSB1cmlzW2ldOwotCQkgIGlmKCEodXJpLmVxdWFscyhyZXNvdXJjZTEpIHx8IHVyaS5lcXVhbHMocmVzb3VyY2UyKSB8fCB1cmkuZXF1YWxzKHJlc291cmNlMykpKQotCQkgIHsKLQkJCWZhaWwoIlRoZSBVUkkgIiArIHVyaSArICIgaXMgbm90IGVxdWFsIHRvIGFueSBvZiB0aGUgcmVzb3VyY2VzIHB1dCBpbiB0aGUgY2FjaGUuIik7ICAKLQkJICB9Ci0JCX0KLQkJY2FjaGUuY2xlYXIoKTsKLQkJCi0JfQotCQotCQotCQotCQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9DYWNoZVVSSVJlc29sdmVyRXh0ZW5zaW9uVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvQ2FjaGVVUklSZXNvbHZlckV4dGVuc2lvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFmMTYxNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9DYWNoZVVSSVJlc29sdmVyRXh0ZW5zaW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogVGVzdHMgZm9yIHRoZSBDYWNoZVVSSVJlc29sdmVyRXh0ZW5zaW9uIGNsYXNzLgotICovCi1wdWJsaWMgY2xhc3MgQ2FjaGVVUklSZXNvbHZlckV4dGVuc2lvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZQotewotCXByaXZhdGUgQ2FjaGVVUklSZXNvbHZlckV4dGVuc2lvbiBjYWNoZVJlc29sdmVyOwotCQotCS8qKgotCSAgKiBDcmVhdGUgYSB0ZXN0cyBzdWl0ZSBmcm9tIHRoaXMgdGVzdCBjbGFzcy4KLQkgICogCi0JICAqIEByZXR1cm4gQSB0ZXN0IHN1aXRlIGNvbnRhaW5pbmcgdGhpcyB0ZXN0IGNsYXNzLgotCSAgKi8KLQkgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0JICB7Ci0JICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKENhY2hlVVJJUmVzb2x2ZXJFeHRlbnNpb25UZXN0LmNsYXNzKTsKLQkgIH0KLQkgIAotCSAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIAotCSAgewotCQlzdXBlci5zZXRVcCgpOwotCQljYWNoZVJlc29sdmVyID0gbmV3IENhY2hlVVJJUmVzb2x2ZXJFeHRlbnNpb24oKTsKLQkJLy8gVGhlIGNhY2hlIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuIFdlIG5lZWQgdG8gZW5hYmxlIGl0IGZvciB0aGUgdGVzdHMuCi0JCUNhY2hlUGx1Z2luLmdldERlZmF1bHQoKS5zZXRDYWNoZUVuYWJsZWQodHJ1ZSk7Ci0JICB9Ci0KLQkgIC8qKgotCSAgICogVGVzdCB0aGF0IHRoZSByZXN1bHQgcmV0dXJuZWQgd2hlbiBhIG51bGwgc3lzdGVtSWQgaXMgZ2l2ZW4gaXMgbnVsbC4KLQkgICAqLwotCSAgcHVibGljIHZvaWQgdGVzdFJlc29sdmVOdWxsU3lzdGVtSWQoKQotCSAgewotCSAgICBTdHJpbmcgcmVzdWx0ID0gY2FjaGVSZXNvbHZlci5yZXNvbHZlKG51bGwsImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMiLCBudWxsLCBudWxsKTsKLQkJYXNzZXJ0TnVsbCgiVGhlIHJlc3VsdCBpcyBub3QgbnVsbC4iLCByZXN1bHQpOwotCSAgfQotCSAgCi0JICAvKioKLQkgICAqIFRlc3QgdGhhdCB0aGUgcmVzdWx0IHJldHVybmVkIHdoZW4gYSBudWxsIHN5c3RlbUlkIGFuZCBhIG51bGwgYmFzZWxvY2F0aW9uCi0JICAgKiBhcmUgZ2l2ZW4gaXMgbnVsbC4KLQkgICAqLwotCSAgcHVibGljIHZvaWQgdGVzdFJlc29sdmVOdWxsU3lzdGVtSWRBbmRCYXNlbG9jYXRpb24oKQotCSAgewotCSAgICBTdHJpbmcgcmVzdWx0ID0gY2FjaGVSZXNvbHZlci5yZXNvbHZlKG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotCQlhc3NlcnROdWxsKCJUaGUgcmVzdWx0IGlzIG5vdCBudWxsLiIsIHJlc3VsdCk7Ci0JICB9Ci0JICAKLQkgIC8qKgotCSAgICogVGVzdCB0aGF0IHRoZSByZXN1bHQgaXMgc3VjZXNzZnVsbHkgY2FjaGVkIHdoZW4gYW4gYWJzb2x1dGUgc3lzdGVtSWQKLQkgICAqIGlzIGdpdmVuLgotCSAgICovCi0JICBwdWJsaWMgdm9pZCB0ZXN0QWJzb2x1dGVTeXN0ZW1JZCgpCi0JICB7Ci0JICAgIFN0cmluZyByZXN1bHQgPSBjYWNoZVJlc29sdmVyLnJlc29sdmUobnVsbCwiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scyIsIG51bGwsICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIik7Ci0JCWFzc2VydE5vdE51bGwoIlRoZSByZXN1bHQgaXMgbnVsbC4iLCByZXN1bHQpOwotCSAgfQotCSAgCi0JICAvKioKLQkgICAqIFRlc3QgdGhhdCB0aGUgcmVzdWx0IGlzIHN1Y2Vzc2Z1bGx5IGNhY2hlZCB3aGVuIGFuIGFic29sdXRlIHN5c3RlbUlkCi0JICAgKiBpcyBnaXZlbiBhbmQgYSBudWxsIGJhc2UgbG9jYXRpb24gaXMgZ2l2ZW4KLQkgICAqLwotCSAgcHVibGljIHZvaWQgdGVzdEFic29sdXRlU3lzdGVtSWROdWxsQmFzZWxvY2F0aW9uKCkKLQkgIHsKLQkgICAgU3RyaW5nIHJlc3VsdCA9IGNhY2hlUmVzb2x2ZXIucmVzb2x2ZShudWxsLCBudWxsLCBudWxsLCAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZyIpOwotCQlhc3NlcnROb3ROdWxsKCJUaGUgcmVzdWx0IGlzIG51bGwuIiwgcmVzdWx0KTsKLQkgIH0KLQkgIAotCSAgLyoqCi0JICAgKiBUZXN0IHRoYXQgdGhlIHJlc3VsdCBpcyBzdWNlc3NmdWxseSBjYWNoZWQgd2hlbiBhIHJlbGF0aXZlIHN5c3RlbUlkCi0JICAgKiBpcyBnaXZlbi4KLQkgICAqLwotCSAgcHVibGljIHZvaWQgdGVzdFJlbGF0aXZlU3lzdGVtSWQoKQotCSAgewotCSAgICBTdHJpbmcgcmVzdWx0ID0gY2FjaGVSZXNvbHZlci5yZXNvbHZlKG51bGwsImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMvY29tbXVuaXR5L3NvbWVmaWxlLnhtbCIsIG51bGwsICJpbmRleC5waHAiKTsKLQkJYXNzZXJ0Tm90TnVsbCgiVGhlIHJlc3VsdCBpcyBudWxsLiIsIHJlc3VsdCk7Ci0JICB9Ci0JICAKLQkgIC8qKgotCSAgICogVGVzdCB0aGF0IHRoZSByZXN1bHQgaXMgdW5zdWNlc3NmdWxseSBjYWNoZWQgd2hlbiBhIHJlbGF0aXZlIHN5c3RlbUlkCi0JICAgKiBpcyBnaXZlbiBhbmQgYSBudWxsIGJhc2UgbG9jYXRpb24gaXMgZ2l2ZW4uCi0JICAgKi8KLQkgIHB1YmxpYyB2b2lkIHRlc3RSZWxhdGl2ZVN5c3RlbUlkV2lsbE51bGxCYXNlbG9jYXRpb24oKQotCSAgewotCSAgICBTdHJpbmcgcmVzdWx0ID0gY2FjaGVSZXNvbHZlci5yZXNvbHZlKG51bGwsIG51bGwsIG51bGwsICJjb21tdW5pdHkuaHRtbCIpOwotCQlhc3NlcnROdWxsKCJUaGUgcmVzdWx0IGlzIG5vdCBudWxsLiIsIHJlc3VsdCk7Ci0JICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGVzdCB0aGF0IG51bGwgaXMgcmV0dXJuZWQgd2hlbiB0aGUgY2FjaGUgaXMgZGlzYWJsZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFJldHVybnNOdWxsV2hlbkRpc2FibGVkKCkKLSAgICB7Ci0gICAgICBDYWNoZVBsdWdpbi5nZXREZWZhdWx0KCkuc2V0Q2FjaGVFbmFibGVkKGZhbHNlKTsKLSAgICAgIFN0cmluZyByZXN1bHQgPSBjYWNoZVJlc29sdmVyLnJlc29sdmUobnVsbCwgImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMvIiwgbnVsbCwgImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMvIik7Ci0gICAgICBhc3NlcnROdWxsKCJUaGUgcmVzdWx0IGlzIG5vdCBudWxsLiIsIHJlc3VsdCk7Ci0gICAgICBDYWNoZVBsdWdpbi5nZXREZWZhdWx0KCkuc2V0Q2FjaGVFbmFibGVkKHRydWUpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9MaWNlbnNlUmVnaXN0cnlUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9MaWNlbnNlUmVnaXN0cnlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlYmQwMTAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvTGljZW5zZVJlZ2lzdHJ5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBMaWNlbnNlUmVnaXN0cnlUZXN0IGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgLyoqCi0gICAqIENyZWF0ZSBhIHRlc3RzIHN1aXRlIGZyb20gdGhpcyB0ZXN0IGNsYXNzLgotICAgKiAgCi0gICAqIEByZXR1cm4gQSB0ZXN0IHN1aXRlIGNvbnRhaW5pbmcgdGhpcyB0ZXN0IGNsYXNzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgewotICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKExpY2Vuc2VSZWdpc3RyeVRlc3QuY2xhc3MpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIAotICB7Ci0Jc3VwZXIuc2V0VXAoKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiAKLSAgewotCXN1cGVyLnRlYXJEb3duKCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUZXN0IGFkZGluZyBhIGxpY2Vuc2UgdG8gdGhlIHJlZ2lzdHJ5LiBXaGVuIGFkZGVkIHRoZSByZWdpc3RyeSBzaG91bGQgY29udGFpbiB0aGUgbGljZW5zZQotICAgKiBhbmQgdGhlIGxpY2Vuc2Ugc2hvdWxkIGhhdmUgdGhlIHVuc3BlY2lmaWVkIHZhbHVlLgotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdEFkZExpY2Vuc2VUb1JlZ2lzdHJ5KCkKLSAgewotCVN0cmluZyBsaWNlbnNlVVJMID0gImh0dHA6Ly9zb21lbGljZW5zZSI7Ci0JTGljZW5zZVJlZ2lzdHJ5V3JhcHBlciByZWdpc3RyeSA9IG5ldyBMaWNlbnNlUmVnaXN0cnlXcmFwcGVyKCk7Ci0JcmVnaXN0cnkuYWRkTGljZW5zZShsaWNlbnNlVVJMKTsKLQlhc3NlcnRFcXVhbHMoIlRoZSByZWdpc3RyeSBkb2VzIG5vdCBoYXZlIDEgbGljZW5zZS4iLCAxLCByZWdpc3RyeS5nZXRMaWNlbnNlc0hhc2h0YWJsZSgpLnNpemUoKSk7Ci0JYXNzZXJ0VHJ1ZSgiVGhlIHJlZ2lzdHJ5IGRvZXMgbm90IGNvbmFpbiB0aGUgbGljZW5zZSAiICsgbGljZW5zZVVSTCwgcmVnaXN0cnkuZ2V0TGljZW5zZXNIYXNodGFibGUoKS5jb250YWluc0tleShsaWNlbnNlVVJMKSk7Ci0JYXNzZXJ0RXF1YWxzKCJUaGUgcmVnaXN0cnkgZG9lcyBub3QgaGF2ZSB0aGUgY29ycmVjdCB2YWx1ZSBmb3IgdGhlIGxpY2Vuc2UuIiwgTGljZW5zZVJlZ2lzdHJ5V3JhcHBlci5MSUNFTlNFX1VOU1BFQ0lGSUVELCByZWdpc3RyeS5nZXRMaWNlbnNlc0hhc2h0YWJsZSgpLmdldChsaWNlbnNlVVJMKSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUZXN0IGFkZGluZyBhIGxpY2Vuc2UgdG8gdGhlIHJlZ2lzdHJ5IHR3aWNlLiBUaGUgcmVnaXN0cnkgc2hvdWxkIG9ubHkgaGF2ZSBhIHNpbmdsZSBlbnRyeQotICAgKiBmb3IgdGhlIGxpY2Vuc2UuCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0QWRkTGljZW5zZVRvUmVnaXN0cnlUd2ljZSgpCi0gIHsKLQlTdHJpbmcgbGljZW5zZVVSTCA9ICJodHRwOi8vc29tZWxpY2Vuc2UiOwotCUxpY2Vuc2VSZWdpc3RyeVdyYXBwZXIgcmVnaXN0cnkgPSBuZXcgTGljZW5zZVJlZ2lzdHJ5V3JhcHBlcigpOwotCXJlZ2lzdHJ5LmFkZExpY2Vuc2UobGljZW5zZVVSTCk7Ci0JcmVnaXN0cnkuYWRkTGljZW5zZShsaWNlbnNlVVJMKTsKLQlhc3NlcnRFcXVhbHMoIlRoZSByZWdpc3RyeSBjb250YWlucyBtb3JlIHRoYW4gb25lIGxpY2Vuc2UuIiwgMSwgcmVnaXN0cnkuZ2V0TGljZW5zZXNIYXNodGFibGUoKS5zaXplKCkpOwotICB9Ci0gIAotICAvKioKLSAgICogVGVzdCBhZ3JlZSB0byBsaWNlbnNlIG1ldGhvZC4gVGhlIHJlZ2lzdHJ5IHNob3VsZCBoYXZlICdhZ3JlZScgcmVnaXN0ZXJlZCBmb3IgdGhlIGxpY2Vuc2UuCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0QWdyZWVUb0xpY2Vuc2UoKQotICB7Ci0gICAgU3RyaW5nIGxpY2Vuc2VVUkwgPSAiaHR0cDovL3NvbWVsaWNlbnNlIjsKLQlMaWNlbnNlUmVnaXN0cnlXcmFwcGVyIHJlZ2lzdHJ5ID0gbmV3IExpY2Vuc2VSZWdpc3RyeVdyYXBwZXIoKTsKLQlyZWdpc3RyeS5hZGRMaWNlbnNlKGxpY2Vuc2VVUkwpOwotCXJlZ2lzdHJ5LmFncmVlTGljZW5zZShsaWNlbnNlVVJMKTsKLQlhc3NlcnRFcXVhbHMoIlRoZSByZWdpc3RyeSBkb2VzIG5vdCBoYXZlIHRoZSBjb3JyZWN0IHZhbHVlIGZvciB0aGUgbGljZW5zZS4iLCBMaWNlbnNlUmVnaXN0cnlXcmFwcGVyLkxJQ0VOU0VfQUdSRUUsIHJlZ2lzdHJ5LmdldExpY2Vuc2VzSGFzaHRhYmxlKCkuZ2V0KGxpY2Vuc2VVUkwpKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRlc3QgYWdyZWUgdG8gbGljZW5zZSB0aGF0IGlzIG5vdCBpbiB0aGUgcmVnaXN0cnkuIFRoZSByZWdpc3RyeSBzaG91bGQgbm90IGNyZWF0ZQotICAgKiBhbiBlbnRyeSBmb3IgdGhlIGxpY2Vuc2UuCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0QWdyZWVUb0xpY2Vuc2VOb3RJblJlZ2lzdHJ5KCkKLSAgewotICAgIFN0cmluZyBsaWNlbnNlVVJMID0gImh0dHA6Ly9zb21lbGljZW5zZSI7Ci0JTGljZW5zZVJlZ2lzdHJ5V3JhcHBlciByZWdpc3RyeSA9IG5ldyBMaWNlbnNlUmVnaXN0cnlXcmFwcGVyKCk7Ci0JcmVnaXN0cnkuYWdyZWVMaWNlbnNlKGxpY2Vuc2VVUkwpOwotCWFzc2VydEVxdWFscygiVGhlIHJlZ2lzdHJ5IHJlZ2lzdGVyZWQgdGhlIGxpY2Vuc2UgYnV0IGl0IHNob3VsZCBub3QgaGF2ZS4iLCAwLCByZWdpc3RyeS5nZXRMaWNlbnNlc0hhc2h0YWJsZSgpLnNpemUoKSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUZXN0IGRpc2FncmVlIHRvIGxpY2Vuc2UgbWV0aG9kLiBUaGUgcmVnaXN0cnkgc2hvdWxkIGhhdmUgJ2Rpc2FncmVlJyByZWdpc3RlcmVkIGZvciB0aGUgbGljZW5zZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3REaXNncmVlVG9MaWNlbnNlKCkKLSAgewotICAgIFN0cmluZyBsaWNlbnNlVVJMID0gImh0dHA6Ly9zb21lbGljZW5zZSI7Ci0JTGljZW5zZVJlZ2lzdHJ5V3JhcHBlciByZWdpc3RyeSA9IG5ldyBMaWNlbnNlUmVnaXN0cnlXcmFwcGVyKCk7Ci0JcmVnaXN0cnkuYWRkTGljZW5zZShsaWNlbnNlVVJMKTsKLQlyZWdpc3RyeS5kaXNhZ3JlZUxpY2Vuc2UobGljZW5zZVVSTCk7Ci0JYXNzZXJ0RXF1YWxzKCJUaGUgcmVnaXN0cnkgZG9lcyBub3QgaGF2ZSB0aGUgY29ycmVjdCB2YWx1ZSBmb3IgdGhlIGxpY2Vuc2UuIiwgTGljZW5zZVJlZ2lzdHJ5V3JhcHBlci5MSUNFTlNFX0RJU0FHUkVFLCByZWdpc3RyeS5nZXRMaWNlbnNlc0hhc2h0YWJsZSgpLmdldChsaWNlbnNlVVJMKSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUZXN0IGRpc2FncmVlIHRvIGxpY2Vuc2UgdGhhdCBpcyBub3QgaW4gdGhlIHJlZ2lzdHJ5LiBUaGUgcmVnaXN0cnkgc2hvdWxkIG5vdCBjcmVhdGUKLSAgICogYW4gZW50cnkgZm9yIHRoZSBsaWNlbnNlLgotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdERpc2FncmVlVG9MaWNlbnNlTm90SW5SZWdpc3RyeSgpCi0gIHsKLSAgICBTdHJpbmcgbGljZW5zZVVSTCA9ICJodHRwOi8vc29tZWxpY2Vuc2UiOwotCUxpY2Vuc2VSZWdpc3RyeVdyYXBwZXIgcmVnaXN0cnkgPSBuZXcgTGljZW5zZVJlZ2lzdHJ5V3JhcHBlcigpOwotCXJlZ2lzdHJ5LmFncmVlTGljZW5zZShsaWNlbnNlVVJMKTsKLQlhc3NlcnRFcXVhbHMoIlRoZSByZWdpc3RyeSByZWdpc3RlcmVkIHRoZSBsaWNlbnNlIGJ1dCBpdCBzaG91bGQgbm90IGhhdmUuIiwgMCwgcmVnaXN0cnkuZ2V0TGljZW5zZXNIYXNodGFibGUoKS5zaXplKCkpOwotICB9Ci0gIAotICAvKioKLSAgICogVGVzdCBwcm9tcHQgZm9yIGFncmVlIGZvciBsaWNlbnNlIG5vdCBpbiByZWdpc3RyeS4KLSAgICogVE9ETzogVGhpcyB0ZXN0IGRvZXMgbm90IHRlc3Qgd2hhdCBpdCBpcyBzdXBwb3NlZCB0by4KLSAgICogVGhpcyB0ZXN0IHNob3VsZCBiZSBjb3JyZWN0ZWQgaWYgcG9zc2libGUuCi0gICAqLwotLy8gIHB1YmxpYyB2b2lkIHRlc3RQcm9tcHRGb3JMaWNlbnNlTm90SW5SZWdpc3RyeSgpCi0vLyAgewotLy8gICAgU3RyaW5nIGxpY2Vuc2VVUkwgPSAiaHR0cDovL3NvbWVsaWNlbnNlIjsKLS8vCUxpY2Vuc2VSZWdpc3RyeVdyYXBwZXIgcmVnaXN0cnkgPSBuZXcgTGljZW5zZVJlZ2lzdHJ5V3JhcHBlcigpOwotLy8JYXNzZXJ0VHJ1ZSgiVGhlIHByb21wdCBmb3IgYWdyZWVtZW50IG1ldGhvZCBkb2VzIG5vdCByZXR1cm4gdHJ1ZSBmb3IgYSBsaWNlbnNlIG5vdCBpbiB0aGUgcmVnaXN0cnkuIiwgcmVnaXN0cnkucHJvbXB0VG9BY2NlcHRMaWNlbnNlKGxpY2Vuc2VVUkwsIGxpY2Vuc2VVUkwpKTsKLS8vICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9MaWNlbnNlUmVnaXN0cnlXcmFwcGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9MaWNlbnNlUmVnaXN0cnlXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NGIxZWEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvTGljZW5zZVJlZ2lzdHJ5V3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi0vKioKLSAqIEEgd3JhcHBlciBmb3Igb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsLkxpY2Vuc2VSZWdpc3RyeQotICogdGhhdCBhbGxvd3MgZm9yIHRlc3Rpbmcgb2YgcHJvdGVjdGVkIG1ldGhvZHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWNlbnNlUmVnaXN0cnlXcmFwcGVyIGV4dGVuZHMgTGljZW5zZVJlZ2lzdHJ5IAotewotICBwcm90ZWN0ZWQgc3RhdGljIEludGVnZXIgTElDRU5TRV9VTlNQRUNJRklFRCA9IExpY2Vuc2VSZWdpc3RyeS5MSUNFTlNFX1VOU1BFQ0lGSUVEOwotICBwcm90ZWN0ZWQgc3RhdGljIEludGVnZXIgTElDRU5TRV9BR1JFRSA9IExpY2Vuc2VSZWdpc3RyeS5MSUNFTlNFX0FHUkVFOwotICBwcm90ZWN0ZWQgc3RhdGljIEludGVnZXIgTElDRU5TRV9ESVNBR1JFRSA9IExpY2Vuc2VSZWdpc3RyeS5MSUNFTlNFX0RJU0FHUkVFOwotICBwcm90ZWN0ZWQgTGljZW5zZVJlZ2lzdHJ5V3JhcHBlcigpCi0gIHsKLQlzdXBlcigpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgSGFzaHRhYmxlIGdldExpY2Vuc2VzSGFzaHRhYmxlKCkKLSAgewotCXJldHVybiBsaWNlbnNlczsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGFncmVlTGljZW5zZShTdHJpbmcgdXJsKSAKLSAgewotCXN1cGVyLmFncmVlTGljZW5zZSh1cmwpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgZGlzYWdyZWVMaWNlbnNlKFN0cmluZyB1cmwpIAotICB7Ci0Jc3VwZXIuZGlzYWdyZWVMaWNlbnNlKHVybCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgaW50IHByb21wdFRvQWNjZXB0TGljZW5zZShTdHJpbmcgdXJsLCBTdHJpbmcgbGljZW5zZVVSTCkgCi0gIHsKLQlyZXR1cm4gc3VwZXIucHJvbXB0VG9BY2NlcHRMaWNlbnNlKHVybCwgbGljZW5zZVVSTCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL3Rlc3RzL2ludGVybmFsL0FsbENhY2hlVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL3Rlc3RzL2ludGVybmFsL0FsbENhY2hlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY5ODcyZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS90ZXN0cy9pbnRlcm5hbC9BbGxDYWNoZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS50ZXN0cy5pbnRlcm5hbDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS5pbnRlcm5hbC5DYWNoZUVudHJ5VGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuaW50ZXJuYWwuQ2FjaGVUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS5pbnRlcm5hbC5DYWNoZVVSSVJlc29sdmVyRXh0ZW5zaW9uVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuaW50ZXJuYWwuTGljZW5zZVJlZ2lzdHJ5VGVzdDsKLS8qKgotICogVGhlIHJvb3QgdGVzdCBzdWl0ZSB0aGF0IGNvbnRhaW5zIGFsbCBvdGhlciBDYWNoZSB0ZXN0IHN1aXRlcy4KLSAqLwotcHVibGljIGNsYXNzIEFsbENhY2hlVGVzdHMgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlCi17Ci0gIC8qKgotICAgKiBDcmVhdGUgdGhpcyB0ZXN0IHN1aXRlLgotICAgKiAKLSAgICogQHJldHVybiBUaGlzIHRlc3Qgc3VpdGUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBBbGxDYWNoZVRlc3RzKCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvcgotICAgKi8KLSAgcHVibGljIEFsbENhY2hlVGVzdHMoKQotICB7Ci0gICAgc3VwZXIoIkFsbENhY2hlVGVzdHMiKTsKLQlhZGRUZXN0KENhY2hlVGVzdC5zdWl0ZSgpKTsKLQlhZGRUZXN0KENhY2hlRW50cnlUZXN0LnN1aXRlKCkpOwotCWFkZFRlc3QoQ2FjaGVVUklSZXNvbHZlckV4dGVuc2lvblRlc3Quc3VpdGUoKSk7Ci0JYWRkVGVzdChMaWNlbnNlUmVnaXN0cnlUZXN0LnN1aXRlKCkpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvdGVzdHMvaW50ZXJuYWwvQ2FjaGVUZXN0c1BsdWdpbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvdGVzdHMvaW50ZXJuYWwvQ2FjaGVUZXN0c1BsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDA0YTNkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL3Rlc3RzL2ludGVybmFsL0NhY2hlVGVzdHNQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC4qOwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgQ2FjaGVUZXN0c1BsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCS8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBDYWNoZVRlc3RzUGx1Z2luIHBsdWdpbjsKLQkvL1Jlc291cmNlIGJ1bmRsZS4KLQlwcml2YXRlIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgQ2FjaGVUZXN0c1BsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBwbHVnLWluIGFjdGl2YXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcGx1Zy1pbiBpcyBzdG9wcGVkCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCQlyZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2FjaGVUZXN0c1BsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyBmcm9tIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICogb3IgJ2tleScgaWYgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gQ2FjaGVUZXN0c1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJdHJ5IHsKLQkJCXJldHVybiAoYnVuZGxlICE9IG51bGwpID8gYnVuZGxlLmdldFN0cmluZyhrZXkpIDoga2V5OwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCXRyeSB7Ci0JCQlpZiAocmVzb3VyY2VCdW5kbGUgPT0gbnVsbCkKLQkJCQlyZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgib3JnLmVjbGlwc2Uud3N0LmludGVybmFsLmNhY2hlLnRlc3RzLkNhY2hlVGVzdHNQbHVnaW5SZXNvdXJjZXMiKTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJCXJlc291cmNlQnVuZGxlID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBpbWFnZSBkZXNjcmlwdG9yIGZvciB0aGUgaW1hZ2UgZmlsZSBhdCB0aGUgZ2l2ZW4KLQkgKiBwbHVnLWluIHJlbGF0aXZlIHBhdGguCi0JICoKLQkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aAotCSAqIEByZXR1cm4gdGhlIGltYWdlIGRlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHBhdGgpIHsKLQkJcmV0dXJuIEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbigib3JnLmVjbGlwc2Uud3N0LmludGVybmFsLmNhY2hlLnRlc3RzIiwgcGF0aCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLnRlc3RzL3Rlc3QueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLnRlc3RzL3Rlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWE1MjJiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS50ZXN0cy90ZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3QKLSAgICBuYW1lPSJ0ZXN0c3VpdGUiCi0gICAgZGVmYXVsdD0icnVuIgotICAgIGJhc2VkaXI9Ii4iPgotCi0gICAgPCEtLSAKLSAgICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAotICAgICAgICAgVGhlcmUgc2hvdWxkIGJlIG5vIG5lZWQgdG8gY2hhbmdlIHdoYXQncyBhYm92ZS4KLSAgICAgICAgIChpZiB0aGVyZSBpcywgbGV0IHVzIGtub3cgaWYgdGhlIHNjcmlwdCBjYW4gYmUgaW1wcm92ZWQuKQotICAgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gCi0gICAgLS0+Ci0KLSAgICA8IS0tIAotICAgICAgICAgRXZlcnkgc3VpdGUgbmVlZHMgdG8gc3BlY2lmeSB0aHJlZSB0aGluZzogCi0gICAgICAgICAgICAgcGx1Z2luLW5hbWUsIAotICAgICAgICAgICAgIGNsYXNzbmFtZSAtIHRoYXQgcHJvdmlkZXMgdGhlIHN1aXRlIHRvIHRlc3QsIGFuZCAKLSAgICAgICAgICAgICB0ZXN0VHlwZSAtIGVpdGhlciBjb3JlLXRlc3QsIG9yIHVpLXRlc3QuIAotICAgICAgICAgVGhlcmUgaXMgYW4gb3B0aW9uYWwgZXh0cmFWTWFyZ3MgcHJvcGVydHkgdGhhdCBzb21lIHRlc3RzIG5lZWQgdG8gdXNlIGluIG9yZGVyIHRvIHNwZWNpZnkgIAotICAgICAgICAgZXh0cmEsIG5vbi1zdGFuZGFyZCBwcm9wZXJ0aWVzIHRvIHRoZSBWTSB3aGVuIGl0IHJ1bnMuIElmIG5vdCBuZWVkLCBubyBuZWVkIHRvIHNwZWNpZnkgaXQuIAotICAgIC0tPgotICAgIDxwcm9wZXJ0eQotICAgICAgICBuYW1lPSJwbHVnaW4tbmFtZSIKLSAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS50ZXN0cyIgLz4KLSAgICA8cHJvcGVydHkKLSAgICAgICAgbmFtZT0iY2xhc3NuYW1lIgotICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLnRlc3RzLmludGVybmFsLkFsbENhY2hlVGVzdHMiIC8+Ci0gICAgPHByb3BlcnR5Ci0gICAgICAgIG5hbWU9InRlc3RUeXBlIgotICAgICAgICB2YWx1ZT0iY29yZS10ZXN0IiAvPgotCi0gICAgPCEtLSBzb21lIHRlc3Qgc3VpdGVzIG5lZWQgdG8gYWRkIHNwZWNpYWwgdm0gYXJndW1lbnRzIHdoZW4gdGhleSBydW4uIFRoaXMgaXMganVzdCBhbiBleGFtcGxlLgotICAgIDxwcm9wZXJ0eQotICAgICAgICBuYW1lPSJleHRyYVZNYXJncyIKLSAgICAgICAgdmFsdWU9Ii1EanNmUnVudGltZUphcnNEaXJlY3RvcnlWMS4xPSR7dGVzdERpcn0vJHtqc2YxLjFEaXJ9IiAvPgotICAgIDxlY2hvCi0gICAgICAgIG1lc3NhZ2U9ImV4dHJhVk1hcmdzICR7ZXh0cmFWTWFyZ3N9IiAvPgotICAgIC0tPgotICAgIAotICAgIDwhLS0gCi0gICAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAKLSAgICAgICAgIFRoZXJlIHNob3VsZCBiZSBubyBuZWVkIHRvIGNoYW5nZSB3aGF0J3MgYmVsb3cuCi0gICAgICAgICAoaWYgdGhlcmUgaXMsIGxldCB1cyBrbm93IGlmIHRoZSBzY3JpcHQgY2FuIGJlIGltcHJvdmVkLikKLSAgICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAotICAgIC0tPgotICAgIAotICAgIDxmYWlsCi0gICAgICAgIG1lc3NhZ2U9IkVycm9yOiBtaXNzaW5nIHByb3BlcnR5LiBlY2xpcHNlLWhvbWUgbXVzdCBiZSBwcm92ZWQiCi0gICAgICAgIHVubGVzcz0iZWNsaXBzZS1ob21lIiAvPgotICAgIDxmYWlsCi0gICAgICAgIG1lc3NhZ2U9IkVycm9yOiBtaXNzaW5nIHByb3BlcnR5LiBidWlsZERpcmVjdG9yeSBtdXN0IGJlIHByb3ZlZCIKLSAgICAgICAgdW5sZXNzPSJidWlsZERpcmVjdG9yeSIgLz4KLSAgICA8ZmFpbAotICAgICAgICBtZXNzYWdlPSJFcnJvcjogbWlzc2luZyBwcm9wZXJ0eS4gYnVpbGRMYWJlbCBtdXN0IGJlIHByb3ZlZCIKLSAgICAgICAgdW5sZXNzPSJidWlsZExhYmVsIiAvPgotICAgIDxlY2hvCi0gICAgICAgIG1lc3NhZ2U9ImJhc2VkaXI6ICR7YmFzZWRpcn0iIC8+Ci0gICAgPGVjaG8KLSAgICAgICAgbWVzc2FnZT0iZWNsaXBzZS1ob21lOiAke2VjbGlwc2UtaG9tZX0iIC8+Ci0gICAgPGVjaG8KLSAgICAgICAgbWVzc2FnZT0iYnVpbGREaXJlY3Rvcnk6ICR7YnVpbGREaXJlY3Rvcnl9IiAvPgotICAgIDxlY2hvCi0gICAgICAgIG1lc3NhZ2U9InBsdWdpbi1uYW1lOiAke3BsdWdpbi1uYW1lfSIgLz4KLSAgICA8ZWNobwotICAgICAgICBtZXNzYWdlPSJjbGFzc25hbWU6ICR7Y2xhc3NuYW1lfSIgLz4KLSAgICA8ZWNobwotICAgICAgICBtZXNzYWdlPSJ0ZXN0VHlwZSAke3Rlc3RUeXBlfSIgLz4KLSAgICA8cHJvcGVydHkKLSAgICAgICAgbmFtZT0ibGlicmFyeS1maWxlIgotICAgICAgICB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3BsdWdpbnMvb3JnLmVjbGlwc2UudGVzdF8zLjEuMC9saWJyYXJ5LnhtbCIgLz4KLSAgICA8cHJvcGVydHkKLSAgICAgICAgbmFtZT0id29ya3NwYWNlIgotICAgICAgICB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L2p1bml0d29ya3NwYWNlcy8ke3BsdWdpbi1uYW1lfSIgLz4KLQotICAgICAgPCEtLSAKLSAgICBUaGlzIGluaXQgdGFyZ2V0IGhvbGRzIGFsbCBpbml0aWFsaXphdGlvbiBjb2RlIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSBmb3IKLSAgICAgIGFsbCB0ZXN0cyB0aGF0IGFyZSB0byBiZSBydW4uIEluaXRpYWxpemF0aW9uIGZvciBpbmRpdmlkdWFsIHRlc3RzCi0gICAgICBzaG91bGQgYmUgZG9uZSB3aXRoaW4gdGhlIGJvZHkgb2YgdGhlIHN1aXRlIHRhcmdldC4gSGVyZSBpdCdzIGEgZ29vZCBpZGVhIAotICAgIHRvIGRlbGV0ZSB0aGluZ3MgdGhhdCBtaWdodCBoYXZlIGJlZW4gY3JlYXRlZCBpZiB0aGUgdGVzdCBoYXMgYWxyZWFkeSBiZWVuIAotICAgIHJhbiwganVzdCBpbiBjYXNlIHRoZSB0ZXN0IGlzIGJlaW5nIHJlLXJhbi4gCi0gICAgLS0+Ci0gICAgPHRhcmdldAotICAgICAgICBuYW1lPSJpbml0Ij4KLSAgICAgICAgPHRzdGFtcCAvPgotICAgICAgICA8ZGVsZXRlPgotICAgICAgICAgICAgPGZpbGVzZXQKLSAgICAgICAgICAgICAgICBkaXI9IiR7ZWNsaXBzZS1ob21lfSIKLSAgICAgICAgICAgICAgICBpbmNsdWRlcz0iJHtwbHVnaW4tbmFtZX0uKnhtbCIgLz4KLSAgICAgICAgPC9kZWxldGU+Ci0gICAgICAgIAotICAgICAgICA8IS0tIAotICAgICAgICAgbWFrZSB0aGUgd29ya3NwYWNlIGRpcmVjdG9yeSwgaW4gY2FzZSBwYXRoIGRvZXNuJ3QgZXhpc3QgeWV0Ci0gICAgICAgICBidXQgZGVsZXRlIHRvIG1ha2Ugc3VyZSBmcmVzaCBjb250ZW50cywgaWYgaXQgZG9lcyBleGlzdAotICAgICAgICAtLT4KLSAgICAgICAgPGRlbGV0ZQotICAgICAgICAgICAgZGlyPSIke3dvcmtzcGFjZX0iCi0gICAgICAgICAgICBxdWlldD0idHJ1ZSIgLz4KLSAgICAgICAgPG1rZGlyCi0gICAgICAgICAgICBkaXI9IiR7d29ya3NwYWNlfSIgLz4KLSAgICA8L3RhcmdldD4KLQotICAgIDwhLS0gCi0gICAgICBUaGlzIHN1aXRlIHRhcmdldCBkZWZpbmVzIHRoZSB0ZXN0cyB0aGF0IG5lZWQgdG8gYmUgcnVuLgotICAgIC0tPgotICAgIDx0YXJnZXQKLSAgICAgICAgbmFtZT0ic3VpdGUiPgotICAgICAgICA8YW50Ci0gICAgICAgICAgICB0YXJnZXQ9IiR7dGVzdFR5cGV9IgotICAgICAgICAgICAgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IgotICAgICAgICAgICAgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotICAgICAgICAgICAgPHByb3BlcnR5Ci0gICAgICAgICAgICAgICAgbmFtZT0iZGF0YS1kaXIiCi0gICAgICAgICAgICAgICAgdmFsdWU9IiR7d29ya3NwYWNlfSIgLz4KLSAgICAgICAgICAgIDxwcm9wZXJ0eQotICAgICAgICAgICAgICAgIG5hbWU9InBsdWdpbi1uYW1lIgotICAgICAgICAgICAgICAgIHZhbHVlPSIke3BsdWdpbi1uYW1lfSIgLz4KLSAgICAgICAgICAgIDxwcm9wZXJ0eQotICAgICAgICAgICAgICAgIG5hbWU9ImNsYXNzbmFtZSIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iJHtjbGFzc25hbWV9IiAvPgotICAgICAgICAgICAgPHByb3BlcnR5Ci0gICAgICAgICAgICAgICAgbmFtZT0icGx1Z2luLXBhdGgiCi0gICAgICAgICAgICAgICAgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zLyR7cGx1Z2luLW5hbWV9IiAvPgotICAgICAgICA8L2FudD4KLSAgICAgICAgPGNvcHkKLSAgICAgICAgICAgIGZhaWxvbmVycm9yPSJmYWxzZSIKLSAgICAgICAgICAgIGZpbGU9IiR7d29ya3NwYWNlfS8ubWV0YWRhdGEvLmxvZyIKLSAgICAgICAgICAgIHRvZmlsZT0iJHtidWlsZERpcmVjdG9yeX0vJHtidWlsZExhYmVsfS90ZXN0UmVzdWx0cy9jb25zb2xlbG9ncy8ke3BsdWdpbi1uYW1lfS5jb25zb2xlbG9nLnR4dCIgLz4KLSAgICA8L3RhcmdldD4KLQotICAgICA8IS0tIAotICAgICBUaGlzIGNsZWFuIHRhcmdldCBob2xkcyBjb2RlIHRvIGNsZWFudXAgdGhlIHRlc3RpbmcgZW52aXJvbm1lbnQgYWZ0ZXIKLSAgICAgYWZ0ZXIgYWxsIG9mIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuLiBZb3UgY2FuIHVzZSB0aGlzIHRhcmdldCB0byAKLSAgICAgZGVsZXRlIHRlbXBvcmFyeSBmaWxlcyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkLCBpZiByZXF1aXJlZC4gQnV0LCAKLSAgICAgaXQncyB1c3VhbGx5IGJlc3QgdG8gbGVhdmUgaXQgYWxsLCBpbiBjYXNlIHlvdSdkIGxpa2UgdG8gaW5zcGVjdCBpdCAKLSAgICAgYWZ0ZXIgYSBmYWlsZWQgcnVuLiBJdCB3aWxsIGJlIGRlbGV0ZWQgZXZlbnR1YWxseSBieSB0aGUgbmV4dCBjbGVhbiBidWlsZC4gCi0gICAgLS0+Ci0gICAgPHRhcmdldAotICAgICAgICBuYW1lPSJjbGVhbnVwIj4KLQotICAgIDwvdGFyZ2V0PgotCi0gICAgPCEtLSAKLSAgICAgICBUaGlzIHJ1biB0YXJnZXQgaXMgdGhlIG1hc3RlciB0YXJnZXQgdGhhdCBnZXQncyBhbGwgdGhlIHdvcmsgZG9uZS4gCi0gICAgICAgTW9zdCBhY3Rpdml0eSBpcyBhY3R1YWxseSBkb25lIGluIHRoZSAnZGVwZW5kcycgdGFza3MsIGJ1dCBhbnkgCi0gICAgICAgYWN0aW9ucyB0aGF0IG5lZWQgdG8gaGFwcGVuIGFmdGVyIGFsbCB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1biAKLSAgICAgICBzaG91bGQgZ28gaGVyZSwgc3VjaCBhcyBjb3B5aW5nIHRoZSByZXN1bHRzIHRvIGEgY29tbW9uICdzYXZlJyAKLSAgICAgICBkaXJlY3RvcnkuIAotICAgIC0tPgotICAgIDx0YXJnZXQKLSAgICAgICAgbmFtZT0icnVuIgotICAgICAgICBkZXBlbmRzPSJpbml0LHN1aXRlLGNsZWFudXAiPgotICAgICAgICA8YW50Ci0gICAgICAgICAgICB0YXJnZXQ9ImNvbGxlY3QiCi0gICAgICAgICAgICBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iCi0gICAgICAgICAgICBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICAgICAgICA8cHJvcGVydHkKLSAgICAgICAgICAgICAgICBuYW1lPSJpbmNsdWRlcyIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0uKnhtbCIgLz4KLSAgICAgICAgICAgIDxwcm9wZXJ0eQotICAgICAgICAgICAgICAgIG5hbWU9Im91dHB1dC1maWxlIgotICAgICAgICAgICAgICAgIHZhbHVlPSIke3BsdWdpbi1uYW1lfS54bWwiIC8+Ci0gICAgICAgIDwvYW50PgotICAgIDwvdGFyZ2V0PgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUK